Changes

Jump to navigation Jump to search
1,844 bytes added ,  13:24, 10 June 2019
→‎How to help: Added note regarding Maniaplanet
Line 3: Line 3:  
== Basic concepts ==
 
== Basic concepts ==
   −
TrackMania uses a XML-RPC based API to authenticate players, load server lists, load rankings, etc. Below is some documentation about what has been reversed engineered. A lot is still left to be documented, as logged on the [[Web_API/Progress|Progress]] page.
+
TrackMania uses a XML-RPC based protocol to authenticate players, load server lists, load rankings, etc. Below is some documentation about what has been reversed engineered. A lot is still left to be documented, as logged on the [[Web_API/Progress|Progress]] page.
   −
The game sends HTTP(s) POST requests to
+
The client sends HTTP(S) POST requests to
 
* [http://game.trackmaniaforever.com/online_game/request.php http://game.trackmaniaforever.com/online_game/request.php]
 
* [http://game.trackmaniaforever.com/online_game/request.php http://game.trackmaniaforever.com/online_game/request.php]
 
* [http://game2.trackmaniaforever.com/online_game/request.php http://game2.trackmaniaforever.com/online_game/request.php]
 
* [http://game2.trackmaniaforever.com/online_game/request.php http://game2.trackmaniaforever.com/online_game/request.php]
 
* [http://nations.trackmaniaforever.com/online_game/request.php http://nations.trackmaniaforever.com/online_game/request.php]
 
* [http://nations.trackmaniaforever.com/online_game/request.php http://nations.trackmaniaforever.com/online_game/request.php]
to communicate with the API, using the headers: <code>User-Agent: GameBox</code> and <code>Accept: */*</code>
+
to communicate with the master server, using the headers:
 +
User-Agent: GameBox
 +
Accept: */*
 +
Content-Type: application/binary
 +
Connection: Keep-Alive
 +
Pragma: no-cache
   −
=== Request ===
+
=== Request body ===
 
<pre>
 
<pre>
 
<?xml version="1.0" encoding="UTF-8"?>
 
<?xml version="1.0" encoding="UTF-8"?>
Line 20: Line 25:  
     <distro>MOLUX</distro>
 
     <distro>MOLUX</distro>
 
     <lang>fr</lang>
 
     <lang>fr</lang>
 +
    <sd>2011-02-21</sd> <!-- Only sent by dedicated server, see below -->
 
   </game>
 
   </game>
 
   <author>
 
   <author>
Line 42: Line 48:  
*** '''name''' The client you are using. Known values: TmForever
 
*** '''name''' The client you are using. Known values: TmForever
 
*** '''version''' Version of the client.
 
*** '''version''' Version of the client.
*** '''distro''' Unknown. Set to MOLUX for TMNF or TAHOR for TMUF.
+
*** '''distro''' Software distribution. E.g. MOLUX for TMNF or ORTIC for TMUF.
*** '''lang''' Language of the client, as ISO 639-1.
+
*** '''lang''' Language of the client, as ISO 639-1. Dedicated server sets it to "xx".
 +
*** '''sd''' Dedicated Server release date as YYYY-MM-DD, only sent by server.
 
** '''author''' ''See [[#Author]]''.
 
** '''author''' ''See [[#Author]]''.
 
** '''request'''
 
** '''request'''
*** '''name''' Name of the requested function.
+
*** '''name''' Name of the remote procedure.
 
*** '''param''' Parameters for the call.
 
*** '''param''' Parameters for the call.
 
** '''auth''' ''Optional. Only seen on Connect and Disconnect''.
 
** '''auth''' ''Optional. Only seen on Connect and Disconnect''.
Line 52: Line 59:     
==== Author ====
 
==== Author ====
The author tag identifies the user sending the request. In this documentation, three cases are possible for the author tag:
+
The author tag identifies the user for whom the request is sent. In this documentation, three cases are possible for the author tag:
    
<ul>
 
<ul>
Line 63: Line 70:  
<li>The method requires user name (denoted as "No (Set to 1)"), the author tag is filled with following content:
 
<li>The method requires user name (denoted as "No (Set to 1)"), the author tag is filled with following content:
 
<pre>
 
<pre>
<login>the user's name</login>
+
<login>the user's login</login>
 
<session>1</session>
 
<session>1</session>
 
</pre>
 
</pre>
Line 69: Line 76:  
<li>The method requires authentication (denoted as "Yes"), the author tag is filled with following content:
 
<li>The method requires authentication (denoted as "Yes"), the author tag is filled with following content:
 
<pre>
 
<pre>
<login>the user's name</login>
+
<login>the user's login</login>
 
<session>the session's id</session>
 
<session>the session's id</session>
 
</pre>
 
</pre>
Line 75: Line 82:  
</ul>
 
</ul>
   −
=== Response ===
+
=== Response body ===
 
<pre>
 
<pre>
 
<?xml version="1.0" encoding="UTF-8"?>
 
<?xml version="1.0" encoding="UTF-8"?>
Line 91: Line 98:  
Here is a description of the returned xml:
 
Here is a description of the returned xml:
   −
* '''r'''
+
* '''r''' The [r]oot element
** '''r'''
+
** '''r''' The [r]esponse element
*** '''n''' The name of the called function.
+
*** '''n''' The [n]ame of the called procedure.
*** '''c''' The returned data.
+
*** '''c''' The returned [c]ontent.
** '''e''' A string giving the execution time.
+
** '''e''' A string giving the [e]xecution time.
    
== Functions calls ==
 
== Functions calls ==
Line 116: Line 123:     
=== AddBuddy ===
 
=== AddBuddy ===
''Add a friend to the friends list''
+
''Adds a player to the friends list.''
 
{|class="wikitable"
 
{|class="wikitable"
 
  ! Session required?
 
  ! Session required?
Line 124: Line 131:  
  | Yes
 
  | Yes
 
  |
 
  |
* '''l''' Friend's login.
+
* '''l''' Friend's login. Present if the "Add buddy" button is used.
 +
* '''e''' Friend's email. Present if the "share" button is used.
 
  |
 
  |
* '''c''' Is present but empty when ok
+
* '''c''' Is present but empty when ok.
 
* '''v''' Error code, see below.
 
* '''v''' Error code, see below.
 
  |}
 
  |}
Line 140: Line 148:  
  |-
 
  |-
 
  | 143
 
  | 143
  | You must wait before adding back a deleted friend.
+
  | You must wait before adding back a deleted friend
 
  |}
 
  |}
   Line 187: Line 195:     
=== GetBuddies ===
 
=== GetBuddies ===
''Get friends list.''
+
''Gets the friends list.''
 
{|class="wikitable"
 
{|class="wikitable"
 
  ! Session required?
 
  ! Session required?
Line 195: Line 203:  
  | Yes
 
  | Yes
 
  |
 
  |
* '''u''' Current UTC time, as YYYY:MM:DD:hh:mm:ss
+
* '''u''' Current UTC timestamp, as YYYY:MM:DD:hh:mm:ss.
 
  |
 
  |
 
''Left to document''
 
''Left to document''
* '''c''' Current UTC time as YYYYMMDDhhmmss
+
* '''c''' Current UTC timestamp, as YYYYMMDDhhmmss.
* '''b''' ''Represents one friend, can have multiple of them''
+
* '''b''' ''Represents one friend, can have multiple of them:''
** '''a''' Friends' login
+
** '''a''' Friend's login.
** '''x''' Set to 1 when friend online, 0 when offline
+
** '''x''' Set to 1 when friend online, 0 when offline.
** '''y''' Set to 1 wile waiting for confirmation, 0 when accepted
+
** '''y''' Set to 1 wile waiting for confirmation, 0 when accepted.
 
  |}
 
  |}
    
=== GetManialinkInfos ===
 
=== GetManialinkInfos ===
''Gets infos about a manialink.''
+
''Gets info about a manialink.''
 
{|class="wikitable"
 
{|class="wikitable"
 
  ! Session required?
 
  ! Session required?
Line 216: Line 224:  
* '''manialink''' Name of the manialink
 
* '''manialink''' Name of the manialink
 
  |
 
  |
* '''c''' Price of the manialink
+
* '''c''' Price of the manialink.
* '''l''' Player's copper amount
+
* '''l''' Player's coppers amount.
* '''a''' ? Set to 1 or 0
+
* '''a''' ? Set to 1 or 0.
* '''m''' Name of the manialink
+
* '''m''' Name of the manialink.
* '''u''' URL of the page corresponding to the manialink
+
* '''u''' URL of the page corresponding to the manialink.
* '''t''' ? Maybe a {{wp|Time_to_live|TTL}}
+
* '''t''' ? Maybe a {{wp|Time to live|TTL}}.
* '''rl''' ''Represents distribution of amount in c. Only set when c is != 0''
+
* '''rl''' ''Represents distribution of amount in c. Only set when c is != 0:''
** '''r''' ''Represents one player. At least two in rl''
+
** '''r''' ''Represents one player. At least two in rl:''
*** '''l''' Player login (nadeo for the 5% tax)
+
*** '''l''' Player login (nadeo for the 5% tax).
*** '''c''' Amount of copper going to the player
+
*** '''c''' Amount of coppers going to the player.
 
  |}
 
  |}
    
=== GetManialinkResource ===
 
=== GetManialinkResource ===
''Gets info about a maniacode''
+
''Gets info about a maniacode.''
 
{|class="wikitable"
 
{|class="wikitable"
 
  ! Session required?
 
  ! Session required?
Line 237: Line 245:  
  | Yes
 
  | Yes
 
  |
 
  |
* '''manialink''' Name of the maniacode
+
* '''manialink''' Name of the maniacode.
 
  |
 
  |
* '''m''' Name of the maniacode
+
* '''m''' Name of the maniacode.
* '''u''' URL of the page corresponding to the maniacode
+
* '''u''' URL of the page corresponding to the maniacode.
 
  |}
 
  |}
    
=== GetOnlineProfile ===
 
=== GetOnlineProfile ===
''Gets infos about the player.''
+
''Gets info about the player.''
 
{|class="wikitable"
 
{|class="wikitable"
 
  ! Session required?
 
  ! Session required?
Line 256: Line 264:  
  |
 
  |
 
''A lot is left to document here''
 
''A lot is left to document here''
* '''a''' ''General infos about the player''
+
* '''a''' ''General info about the player:''
** '''a''' Player's login
+
** '''a''' Player's login.
 
** '''b''' Player's display name.
 
** '''b''' Player's display name.
** '''c''' Player's region
+
** '''c''' Player's region.
** '''d''' ? Set to 0
+
** '''d''' ? Set to 0.
** '''e''' ? Set to 0
+
** '''e''' ? Set to 0.
 
** '''j''' ?
 
** '''j''' ?
 
** '''k''' ?
 
** '''k''' ?
* '''b'''
+
* '''b''' ?
* '''h''' ''Describes the splash screen to display after login''
+
* '''h''' ''Describes the splash screen to display after login:''
** '''a''' Unix timestamp, current date (unknown purpose)
+
** '''a''' Unix timestamp, current date (unknown purpose).
** '''c''' Full '''HTTP''' URL of the manialink to display.
+
** '''c''' Full HTTP URL of the manialink to display.
 
  |}
 
  |}
   Line 281: Line 289:  
''Empty parameters''
 
''Empty parameters''
 
  |
 
  |
* '''l''' ''Multiple of them, one per region''
+
* '''l''' ''Multiple of them, one per region:''
 
** '''a''' Region name.
 
** '''a''' Region name.
 
** '''b''' Parent regions (separated with "|", eg. "France|Alsace").
 
** '''b''' Parent regions (separated with "|", eg. "France|Alsace").
Line 309: Line 317:     
=== RemoveBuddy ===
 
=== RemoveBuddy ===
''Remove a friend from the friends list''
+
''Removes a player from the friends list.''
 
{|class="wikitable"
 
{|class="wikitable"
 
  ! Session required?
 
  ! Session required?
Line 320: Line 328:  
  |
 
  |
 
''Empty response''
 
''Empty response''
 +
|}
 +
 +
=== ReceiveMessages ===
 +
''Checks for messages.''
 +
{|class="wikitable"
 +
! Session required?
 +
! Parameters
 +
! Response
 +
|-
 +
| Yes
 +
|
 +
* '''f''' Current UTC timestamp, as YYYY:MM:DD:hh:mm:ss.
 +
|
 +
* '''r''' ''Represents a message, can have multiple of them:''
 +
** '''s''' Sender's login.
 +
** '''d''' UTC timestamp of sending, as YYYYMMDDhhmmss.
 +
** '''u''' Subject.
 +
** '''t''' Content.
 +
** '''o''' Amount of coppers in the message.
 +
* '''l''' New coppers amount.
 +
* '''n''' Current UTC timestamp, as YYYYMMDDhhmmss.
 +
|}
 +
 +
=== RequestAllowed ===
 +
''Checks if a request is allowed.''
 +
{|class="wikitable"
 +
! Session required?
 +
! Parameters
 +
! Response
 +
|-
 +
| Yes
 +
|
 +
* '''r''' Request type.
 +
* '''m''' Unknown. Set to 1.
 +
|
 +
* '''r''' Request type (same as r in parameters).
 +
* '''c''' Cost in coppers.
 +
* '''l''' Current coppers amount.
 +
* '''a''' 1 if allowed, 0 if not.
 +
|}
 +
 +
=== SendMessages ===
 +
''Sends a message to a player.''
 +
{|class="wikitable"
 +
! Session required?
 +
! Parameters
 +
! Response
 +
|-
 +
| Yes
 +
|
 +
* '''r1''' Destination's login.
 +
* '''s1''' Subject of the message.
 +
* '''m1''' Content of the message.
 +
* '''d1''' Amount of coppers attached to the message.
 +
|
 +
* '''c''' ?
 
  |}
 
  |}
   Line 334: Line 398:  
* '''ik''' ?. Seems caps hexadecimal.
 
* '''ik''' ?. Seems caps hexadecimal.
 
* '''email''' Supplied email.
 
* '''email''' Supplied email.
* '''cp''' ?. Empty
+
* '''cp''' ?. Empty.
 
* '''np''' Region.
 
* '''np''' Region.
 
* '''an''' If the user accepts to receive Nadeo news on his email address.
 
* '''an''' If the user accepts to receive Nadeo news on his email address.
Line 390: Line 454:  
== How to help ==
 
== How to help ==
 
Use a {{wp|packet analyzer}} to see the game's communication while experimenting with client features, and describe requests and responses in as much detail as possible.
 
Use a {{wp|packet analyzer}} to see the game's communication while experimenting with client features, and describe requests and responses in as much detail as possible.
 +
 +
Note: For Maniaplanet it's required that the address of the debugging proxy is entered in the launcher (e.g. 127.0.0.1:8888 for Fiddler) and the proxy is configured to decrypt HTTPS traffic.
    
[[Category:Specifications]]
 
[[Category:Specifications]]

Navigation menu