… | |
… | |
21 | Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
21 | Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
22 | --> |
22 | --> |
23 | </head> |
23 | </head> |
24 | <body> |
24 | <body> |
25 | |
25 | |
26 | <h1>$Revision: 1.57 $</h1> |
26 | <h1>$Revision: 1.58 $</h1> |
27 | |
27 | |
28 | <h1>KGS Protocol Description</h1> |
28 | <h1>KGS Protocol Description</h1> |
29 | |
29 | |
30 | <p>This XML document describes the KGS protocol. It is also used |
30 | <p>This XML document describes the KGS protocol. It is also used |
31 | to automatically generate the perl parser for all the messages and |
31 | to automatically generate the perl parser for all the messages and |
… | |
… | |
191 | <type name="password" type="U64"/> |
191 | <type name="password" type="U64"/> |
192 | |
192 | |
193 | <p>Password is a number calculated as follows (VERY insecure, basically |
193 | <p>Password is a number calculated as follows (VERY insecure, basically |
194 | plaintext!): <code>password = 0; for char in characters do password ← |
194 | plaintext!): <code>password = 0; for char in characters do password ← |
195 | password * 1055 + ascii_code (char)</code></p> |
195 | password * 1055 + ascii_code (char)</code></p> |
|
|
196 | |
|
|
197 | <type name="clientid" type="U16" multiplier="1"/> |
|
|
198 | |
|
|
199 | <p>An id chosen by the client, usually starting at one, to identify |
|
|
200 | some handshakes initiated by the client, such as new games or memos.</p> |
196 | |
201 | |
197 | <h2>Enumeration and set types used in the protocol.</h2> |
202 | <h2>Enumeration and set types used in the protocol.</h2> |
198 | |
203 | |
199 | <enum name="GAMETYPE"> |
204 | <enum name="GAMETYPE"> |
200 | <member name="DEMONSTRATION" value="0"/> |
205 | <member name="DEMONSTRATION" value="0"/> |
… | |
… | |
367 | <message type="001e" name="req_usergraph" src="client"> |
372 | <message type="001e" name="req_usergraph" src="client"> |
368 | <p>Request user graph data, replied with <ref reply="usergraph"/>.</p> |
373 | <p>Request user graph data, replied with <ref reply="usergraph"/>.</p> |
369 | <member name="name" type="username"/> |
374 | <member name="name" type="username"/> |
370 | </message> |
375 | </message> |
371 | |
376 | |
372 | <message type="001f" name="fetch_memos" src="client"> |
|
|
373 | <p>Unclear. Fetch all outstanding memos? Replied with <ref reply="memo"/></p> |
|
|
374 | </message> |
|
|
375 | |
|
|
376 | <message type="0021" name="req_pic" src="client"> |
377 | <message type="0021" name="req_pic" src="client"> |
377 | <p>Request a user picture from the server. Results in a <ref reply="userpic"/> |
378 | <p>Request a user picture from the server. Results in a <ref reply="userpic"/> |
378 | or a timeout.</p> |
379 | or a timeout.</p> |
379 | <member name="name" type="username"/> |
380 | <member name="name" type="username"/> |
380 | </message> |
381 | </message> |
… | |
… | |
386 | <member name="data" type="DATA"/> |
387 | <member name="data" type="DATA"/> |
387 | </message> |
388 | </message> |
388 | |
389 | |
389 | <message type="0023" name="send_memo" src="client"> |
390 | <message type="0023" name="send_memo" src="client"> |
390 | <member name="name" type="username"/> |
391 | <member name="name" type="username"/> |
|
|
392 | <member name="cid" type="clientid"/> |
|
|
393 | <p>A boolean, probably. Always true for me.</p> |
391 | <member name="msg" type="STRING"/> |
394 | <member name="msg" type="STRING"/> |
|
|
395 | </message> |
|
|
396 | |
|
|
397 | <message type="0024" name="delete_memos" src="client"> |
|
|
398 | <p>Unconditionally deletes all memos.</p> |
392 | </message> |
399 | </message> |
393 | |
400 | |
394 | <message type="0100" name="gnotice" src="client"> |
401 | <message type="0100" name="gnotice" src="client"> |
395 | <p>Send a global message. Maybe. Never tried, for obvious reasons :/. Results |
402 | <p>Send a global message. Maybe. Never tried, for obvious reasons :/. Results |
396 | in a <ref reply="gnotice"/> sent to all users.</p> |
403 | in a <ref reply="gnotice"/> sent to all users.</p> |
… | |
… | |
474 | 00020: 0000ffff ffffffff ffffffff 00000000 ..ÿÿÿÿÿÿÿÿÿÿ....</p> |
481 | 00020: 0000ffff ffffffff ffffffff 00000000 ..ÿÿÿÿÿÿÿÿÿÿ....</p> |
475 | </p> |
482 | </p> |
476 | |
483 | |
477 | <member name="channel" type="U16"/> |
484 | <member name="channel" type="U16"/> |
478 | <p>The room where to start the new game</p> |
485 | <p>The room where to start the new game</p> |
479 | <member name="id" type="U16"/> |
486 | <member name="cid" type="clientid"/> |
480 | <member name="type" type="U8"/> |
487 | <member name="type" type="U8"/> |
481 | <p> |
488 | <p> |
482 | GAMETYPE_UPLOAD probably not allowed. GAMETYPE_PRIVATE |
489 | GAMETYPE_UPLOAD probably not allowed. GAMETYPE_PRIVATE |
483 | only allowd together with GAMETYPE_TEACHING, GAMETYPE_DEMONSTRATION. |
490 | only allowd together with GAMETYPE_TEACHING, GAMETYPE_DEMONSTRATION. |
484 | </p> |
491 | </p> |
… | |
… | |
605 | </message> |
612 | </message> |
606 | |
613 | |
607 | <message type="4423" name="set_privacy" src="client"> |
614 | <message type="4423" name="set_privacy" src="client"> |
608 | Probably sets the "quiet" flag. Not checked. |
615 | Probably sets the "quiet" flag. Not checked. |
609 | <member name="channel" type="U16"/> |
616 | <member name="channel" type="U16"/> |
610 | <member name="private" type="U8"/> |
617 | <member name="private" type="flag"/> |
611 | </message> |
618 | </message> |
612 | |
619 | |
613 | <message type="4429" name="reject_challenge" src="client"> |
620 | <message type="4429" name="reject_challenge" src="client"> |
614 | Reject a challenge from a given user. Not checked. |
621 | Reject a challenge from a given user. Not checked. |
615 | |
622 | |
… | |
… | |
630 | </message> |
637 | </message> |
631 | |
638 | |
632 | <message type="4434" name="set_quiet" src="client"> |
639 | <message type="4434" name="set_quiet" src="client"> |
633 | <p>Sets (or clears) the quiet flag on a game.</p> |
640 | <p>Sets (or clears) the quiet flag on a game.</p> |
634 | <member name="channel" type="U16"/> |
641 | <member name="channel" type="U16"/> |
635 | <member name="quiet" type="U8"/> |
642 | <member name="quiet" type="flag"/> |
636 | </message> |
643 | </message> |
637 | |
644 | |
638 | <message type="4436" name="msg_game" src="client"> |
645 | <message type="4436" name="msg_game" src="client"> |
639 | <member name="channel" type="U16"/> |
646 | <member name="channel" type="U16"/> |
640 | <member name="message" type="STRING"/> |
647 | <member name="message" type="STRING"/> |
… | |
… | |
646 | |
653 | |
647 | <h2>Structs mainly used in messages send by the server</h2> |
654 | <h2>Structs mainly used in messages send by the server</h2> |
648 | |
655 | |
649 | <struct name="challenge_defaults"> |
656 | <struct name="challenge_defaults"> |
650 | Send soon after log-in to set the defaults for game challenges. |
657 | Send soon after log-in to set the defaults for game challenges. |
651 | <member name="gametype" type="U32"/> |
658 | <member name="gametype" type="U16"/> |
652 | <member name="size" type="U32"/> |
659 | <member name="size" type="U32"/> |
653 | <member name="timesys" type="U32"/> |
660 | <member name="timesys" type="U32"/> |
654 | <member name="time" type="U32"/> |
661 | <member name="time" type="U32"/> |
655 | <member name="byo_time" type="U32"/> |
662 | <member name="byo_time" type="U32"/> |
656 | <member name="byo_periods" type="U32"/> |
663 | <member name="byo_periods" type="U32"/> |
657 | <member name="can_time" type="U32"/> |
664 | <member name="can_time" type="U32"/> |
658 | <member name="can_stones" type="U32"/> |
665 | <member name="can_stones" type="U32"/> |
|
|
666 | <member name="notes" type="STRING"/> |
659 | </struct> |
667 | </struct> |
660 | |
668 | |
661 | <struct name="challenge" class="KGS::Challenge"> |
669 | <struct name="challenge" class="KGS::Challenge"> |
662 | A challenge. |
670 | A challenge. |
663 | |
671 | |
664 | <member name="user1" type="user"/> |
672 | <member name="user1" type="user"/> |
665 | <member name="user2" type="user"/> |
673 | <member name="user2" type="user"/> |
666 | <member name="gametype" type="U32"/> |
674 | <member name="gametype" type="U32"/> |
667 | <member name="rules" type="rules"/> |
675 | <member name="rules" type="rules"/> |
668 | Maybe the rules" are in TREE format. I forgot. |
|
|
669 | </struct> |
676 | </struct> |
670 | |
677 | |
671 | <struct name="game" class="KGS::Game"> |
678 | <struct name="game" class="KGS::Game"> |
672 | Basic information about a game. Used in rooms for the gamelist and |
679 | Basic information about a game. Used in rooms for the gamelist and |
673 | in games to detect when a game is saved, changed type (e.g. R => D) |
680 | in games to detect when a game is saved, changed type (e.g. R => D) |
… | |
… | |
901 | If empty, no graph is available. The unit seems to |
908 | If empty, no graph is available. The unit seems to |
902 | be centi-kyu, with 1 dan == 0, 2 dan == 100, 1 kyu == -100. |
909 | be centi-kyu, with 1 dan == 0, 2 dan == 100, 1 kyu == -100. |
903 | There is probably one entry per day, the newest one last. |
910 | There is probably one entry per day, the newest one last. |
904 | </message> |
911 | </message> |
905 | |
912 | |
906 | <message type="001f" name="memo" src="server"> |
|
|
907 | Unclear. "Leave Message"? |
|
|
908 | 6 strings following. |
|
|
909 | <member name="s1" type="ZSTRING"/> |
|
|
910 | <member name="s2" type="ZSTRING"/> |
|
|
911 | <member name="s3" type="ZSTRING"/> |
|
|
912 | <member name="s4" type="ZSTRING"/> |
|
|
913 | <member name="s5" type="ZSTRING"/> |
|
|
914 | <member name="s6" type="ZSTRING"/> |
|
|
915 | </message> |
|
|
916 | |
|
|
917 | <message type="0021" name="userpic" src="server"> |
913 | <message type="0021" name="userpic" src="server"> |
918 | <member name="name" type="username"/> |
914 | <member name="name" type="username"/> |
919 | Reply to pic_req, contains an image in jpeg format. |
915 | Reply to pic_req, contains an image in jpeg format. |
920 | <member name="data" type="DATA"/> |
916 | <member name="data" type="DATA"/> |
|
|
917 | </message> |
|
|
918 | |
|
|
919 | <message type="0025" name="memo_error" src="server"> |
|
|
920 | <p>Account unknown.</p> |
|
|
921 | <member name="name" type="username"/> |
|
|
922 | <member name="cid" type="clientid"/> |
|
|
923 | <member name="message" type="CONSTANT" value='memo send failed: account already exists'/> |
|
|
924 | <member name="subtype" type="CONSTANT" value='25'/> |
|
|
925 | </message> |
|
|
926 | |
|
|
927 | <message type="0026" name="memo_error" src="server"> |
|
|
928 | <p>Just a guess.</p> |
|
|
929 | <member name="name" type="username"/> |
|
|
930 | <member name="cid" type="clientid"/> |
|
|
931 | <member name="message" type="CONSTANT" value='memo send failed: error 26'/> |
|
|
932 | <member name="subtype" type="CONSTANT" value='26'/> |
|
|
933 | </message> |
|
|
934 | |
|
|
935 | <message type="0027" name="memo_error" src="server"> |
|
|
936 | <p>User is currently online, please use chat.</p> |
|
|
937 | <member name="name" type="username"/> |
|
|
938 | <member name="cid" type="clientid"/> |
|
|
939 | <member name="message" type="CONSTANT" value='memo send failed: user is online, use chat'/> |
|
|
940 | <member name="subtype" type="CONSTANT" value='27'/> |
|
|
941 | </message> |
|
|
942 | |
|
|
943 | <message type="0028" name="memo_error" src="server"> |
|
|
944 | <p>Just a guess.</p> |
|
|
945 | <member name="name" type="username"/> |
|
|
946 | <member name="cid" type="clientid"/> |
|
|
947 | <member name="message" type="CONSTANT" value='memo send failed: error 28'/> |
|
|
948 | <member name="subtype" type="CONSTANT" value='28'/> |
|
|
949 | </message> |
|
|
950 | |
|
|
951 | <message type="0029" name="memo" src="server"> |
|
|
952 | <member name="name" type="username"/> |
|
|
953 | <member name="time" type="timestamp"/> |
|
|
954 | <member name="message" type="ZSTRING"/> |
|
|
955 | </message> |
|
|
956 | |
|
|
957 | <message type="002a" name="memo_sent" src="server"> |
|
|
958 | <p>The memo was sent successfully</p> |
|
|
959 | <member name="name" type="username"/> |
|
|
960 | <member name="cid" type="clientid"/> |
921 | </message> |
961 | </message> |
922 | |
962 | |
923 | <message type="0100" name="gnotice" src="server"> |
963 | <message type="0100" name="gnotice" src="server"> |
924 | global notice, sent to everybody |
964 | global notice, sent to everybody |
925 | <member name="notice" type="STRING"/> |
965 | <member name="notice" type="STRING"/> |
… | |
… | |
933 | <member name="gamerecord" type="game_record" guard-member="event" guard-cond="== 2"/> |
973 | <member name="gamerecord" type="game_record" guard-member="event" guard-cond="== 2"/> |
934 | <p>Game result record?</p> |
974 | <p>Game result record?</p> |
935 | |
975 | |
936 | </message> |
976 | </message> |
937 | |
977 | |
|
|
978 | <message type="030c" name="unknown_030c" src="server"> |
|
|
979 | <p>Not the slightest... No payload, either.</p> |
|
|
980 | </message> |
|
|
981 | |
938 | <message type="0310" name="priv_room" src="server"> |
982 | <message type="0310" name="priv_room" src="server"> |
939 | "permission denied" when joining a room |
983 | "permission denied" when joining a room |
940 | <member name="name" type="STRING"/> |
984 | <member name="name" type="STRING"/> |
941 | </message> |
985 | </message> |
942 | |
986 | |
… | |
… | |
1153 | message is sent long *after* upd_games and upd_observers etc. |
1197 | message is sent long *after* upd_games and upd_observers etc. |
1154 | have been received. *sigh*</p> |
1198 | have been received. *sigh*</p> |
1155 | |
1199 | |
1156 | <member name="channel" type="U16"/> |
1200 | <member name="channel" type="U16"/> |
1157 | <p>The newly created game.</p> |
1201 | <p>The newly created game.</p> |
1158 | <member name="id" type="U16"/> |
1202 | <member name="cid" type="clientid"/> |
1159 | <p>The ID sent to the server in new_game.</p> |
1203 | <p>The ID sent to the server in new_game.</p> |
1160 | </message> |
1204 | </message> |
1161 | |
1205 | |
1162 | <message type="4433" name="req_result" src="server"> |
1206 | <message type="4433" name="req_result" src="server"> |
1163 | Unclear. |
1207 | Unclear. |
… | |
… | |
1166 | </message> |
1210 | </message> |
1167 | |
1211 | |
1168 | <message type="4434" name="set_quiet" src="server"> |
1212 | <message type="4434" name="set_quiet" src="server"> |
1169 | <p>Sets (or clears) the quiet flag on a game.</p> |
1213 | <p>Sets (or clears) the quiet flag on a game.</p> |
1170 | <member name="channel" type="U16"/> |
1214 | <member name="channel" type="U16"/> |
1171 | <member name="quiet" type="U8"/> |
1215 | <member name="quiet" type="flag"/> |
1172 | </message> |
1216 | </message> |
1173 | |
1217 | |
1174 | <message type="4437" name="set_gametime" src="server"> |
1218 | <message type="4437" name="set_gametime" src="server"> |
1175 | <p>Sent when joining a game. Gives the remaining time + |
1219 | <p>Sent when joining a game. Gives the remaining time + |
1176 | periods/moves for the players, to correctly initialize the clocks.</p> |
1220 | periods/moves for the players, to correctly initialize the clocks.</p> |