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 113: |
Line 120: |
| | | | | |
| * '''a''' Same as '''a''' from [[#RedirectOnMasterServer]]. | | * '''a''' Same as '''a''' from [[#RedirectOnMasterServer]]. |
| + | |} |
| + | |
| + | === AddBuddy === |
| + | ''Adds a player to the friends list.'' |
| + | {|class="wikitable" |
| + | ! Session required? |
| + | ! Parameters |
| + | ! Response |
| + | |- |
| + | | Yes |
| + | | |
| + | * '''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. |
| + | * '''v''' Error code, see below. |
| + | |} |
| + | |
| + | List of seen error codes: |
| + | |
| + | {|class="wikitable" |
| + | ! ID |
| + | ! Meaning |
| + | |- |
| + | | 14 |
| + | | Unknown username |
| + | |- |
| + | | 143 |
| + | | You must wait before adding back a deleted friend |
| |} | | |} |
| | | |
Line 156: |
Line 192: |
| | | | | |
| ''Empty response'' | | ''Empty response'' |
| + | |} |
| + | |
| + | === GetBuddies === |
| + | ''Gets the friends list.'' |
| + | {|class="wikitable" |
| + | ! Session required? |
| + | ! Parameters |
| + | ! Response |
| + | |- |
| + | | Yes |
| + | | |
| + | * '''u''' Current UTC timestamp, as YYYY:MM:DD:hh:mm:ss. |
| + | | |
| + | ''Left to document'' |
| + | * '''c''' Current UTC timestamp, as YYYYMMDDhhmmss. |
| + | * '''b''' ''Represents one friend, can have multiple of them:'' |
| + | ** '''a''' Friend's login. |
| + | ** '''x''' Set to 1 when friend online, 0 when offline. |
| + | ** '''y''' Set to 1 wile waiting for confirmation, 0 when accepted. |
| + | |} |
| + | |
| + | === GetManialinkInfos === |
| + | ''Gets info about a manialink.'' |
| + | {|class="wikitable" |
| + | ! Session required? |
| + | ! Parameters |
| + | ! Response |
| + | |- |
| + | | Yes |
| + | | |
| + | * '''manialink''' Name of the manialink |
| + | | |
| + | * '''c''' Price of the manialink. |
| + | * '''l''' Player's coppers amount. |
| + | * '''a''' ? Set to 1 or 0. |
| + | * '''m''' Name of the manialink. |
| + | * '''u''' URL of the page corresponding to the manialink. |
| + | * '''t''' ? Maybe a {{wp|Time to live|TTL}}. |
| + | * '''rl''' ''Represents distribution of amount in c. Only set when c is != 0:'' |
| + | ** '''r''' ''Represents one player. At least two in rl:'' |
| + | *** '''l''' Player login (nadeo for the 5% tax). |
| + | *** '''c''' Amount of coppers going to the player. |
| + | |} |
| + | |
| + | === GetManialinkResource === |
| + | ''Gets info about a maniacode.'' |
| + | {|class="wikitable" |
| + | ! Session required? |
| + | ! Parameters |
| + | ! Response |
| + | |- |
| + | | Yes |
| + | | |
| + | * '''manialink''' Name of the maniacode. |
| + | | |
| + | * '''m''' Name of the maniacode. |
| + | * '''u''' URL of the page corresponding to the maniacode. |
| + | |} |
| + | |
| + | === GetOnlineProfile === |
| + | ''Gets info about the player.'' |
| + | {|class="wikitable" |
| + | ! Session required? |
| + | ! Parameters |
| + | ! Response |
| + | |- |
| + | | Yes |
| + | | |
| + | * '''dt''' ? |
| + | * '''cor''' ? |
| + | | |
| + | ''A lot is left to document here'' |
| + | * '''a''' ''General info about the player:'' |
| + | ** '''a''' Player's login. |
| + | ** '''b''' Player's display name. |
| + | ** '''c''' Player's region. |
| + | ** '''d''' ? Set to 0. |
| + | ** '''e''' ? Set to 0. |
| + | ** '''j''' ? |
| + | ** '''k''' ? |
| + | * '''b''' ? |
| + | * '''h''' ''Describes the splash screen to display after login:'' |
| + | ** '''a''' Unix timestamp, current date (unknown purpose). |
| + | ** '''c''' Full HTTP URL of the manialink to display. |
| |} | | |} |
| | | |
Line 169: |
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 195: |
Line 315: |
| 00CdTLu53A3ceuelum2+ui+MmASL3JjmVVOoNURvK7GCt79wLUUSbtTaZPXPr73TioZBCVkPd8chAb8 | | 00CdTLu53A3ceuelum2+ui+MmASL3JjmVVOoNURvK7GCt79wLUUSbtTaZPXPr73TioZBCVkPd8chAb8 |
| EurZtlDp5QQvDCaoCfFJ4V8VJgM0IK0qVIHRP+D03tKgb2WOgK9QIBEQ== | | EurZtlDp5QQvDCaoCfFJ4V8VJgM0IK0qVIHRP+D03tKgb2WOgK9QIBEQ== |
| + | |
| + | === RemoveBuddy === |
| + | ''Removes a player from the friends list.'' |
| + | {|class="wikitable" |
| + | ! Session required? |
| + | ! Parameters |
| + | ! Response |
| + | |- |
| + | | Yes |
| + | | |
| + | * '''b''' Friend's login. |
| + | | |
| + | ''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''' ? |
| + | |} |
| | | |
| === Subscribe === | | === Subscribe === |
Line 208: |
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 264: |
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]] |