ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/protocol.xml
Revision: 1.20
Committed: Mon Jun 16 18:59:12 2003 UTC (20 years, 11 months ago) by pcg
Content type: text/xml
Branch: MAIN
Changes since 1.19: +4 -3 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 <?xml version="1.0" encoding="utf-8"?>
2     <html>
3     <head>
4     <title>KGS Protocol Description</title>
5     <!--
6     Copyright (C) 2003 Marc Lehmannn &lt;pcg@goof.com&gt;
7    
8     You can redistribute and/or modify this document under the terms of
9     the GNU General Public License as published by the Free Software
10     Foundation; either version 2 of the License, or (at your option) any
11     later version.
12    
13     This document is distributed in the hope that it will be useful,
14     but WITHOUT ANY WARRANTY; without even the implied warranty of
15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16     General Public License for more details.
17    
18     You should have received a copy of the GNU General Public License
19     along with this program; if not, write to the Free Software
20     Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21     -->
22     </head>
23     <body>
24    
25 pcg 1.20 <h1>$Revision: 1.19 $</h1>
26 pcg 1.10
27 pcg 1.1 <h1>KGS Protocol Description</h1>
28    
29     <p>This XML document describes the KGS protocol. It is also used
30     to automatically generate the perl parser for all the messages and
31     structures in the protocol. Adapting it to other languages should be
32     trivial.</p>
33 pcg 1.10
34     <p><b>Please note that the author of KGS has told me that he will
35     change the protocol in response to my efforts. This does not
36     necessarily mean that he will change the protocol just to make it
37     difficult to reverse-engineer the protocol, but if this happens,
38     I might not have the resources the track them, if they are too
39     extensive. Anyway, he made it clear that no help whatsoever is to be
40     expected.</b></p>
41 pcg 1.1
42 pcg 1.4 <p>If you feel you need to update the visual appearance of this
43 pcg 1.11 document, feel free to look <tt>doc/doc2html.xsl</tt> and improve
44 pcg 1.4 it.</p>
45    
46 pcg 1.8 <p>The current version of this document can always be found at
47     <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/kgsueme/kgsueme/doc/protocol.xml?rev=HEAD&amp;content-type=text/xml">here</a>, while
48     the HTML version of it can be found
49     <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/kgsueme/kgsueme/doc/protocol.html?rev=HEAD&amp;content-type=text/html">here</a>.
50     </p>
51    
52 pcg 1.1 <h2>Structure and conventions of this document and the protocol</h2>
53    
54     <p>"Send" means messages send from the client to the server, while
55     "received" means messages send by the server to the client.</p>
56    
57 pcg 1.4 <p>Everything on the wire is in little-endian format (what a shame).</p>
58 pcg 1.1
59 pcg 1.4 <p>Primitive types are mostly integers (signed
60     "<code>I</code>&lt;bits&gt;", unsigned "<code>U</code>&lt;bits&gt;"),
61     ascii strings ("<code>username</code>"), or zero-terminated
62     UCS2-Strings ("<code>STRING</code>"). Yes, I know java is supposed to
63     do UTF-16, but no implementation seems to care...</p>
64 pcg 1.1
65 pcg 1.17 <p>For the rest, go figure or bug me, <a href="mailto:pcg@goof.com">Marc Lehmann &lt;pcg@goof.com&gt;</a></p>
66 pcg 1.1
67     <h2>Stream and message structure.</h2>
68    
69 pcg 1.4 <p>After connecting to the server, a handshake byte is sent. It's
70     the major version number of the protocol the client expects to
71     receive. Version 3 and 4 are mostly the same, except that Version 4
72     clients expect server messages to be compressed, version 3 clients
73     not.</p>
74    
75     <p>The server sends back his protocol number, which is always 3 in
76     the current protocol. Most of the protocol variation is determined by
77     the server using the client version that is used in the initial login
78     message, not the initial handshake byte.</p>
79 pcg 1.1
80     <p>After the initial handshake, the client sends uncompressed
81     messages, while the server sends back a zlib-compressed
82     stream (<a href="http://rfc1950.x42.com/">rfc1950</a> and <a
83     href="http://rfc1950.x42.com/">rfc1951</a>).</p>
84    
85     <p>All messages have the same header:</p>
86    
87 pcg 1.3 <struct name="message_header" send="yes" recv="yes">
88     <member name="_unknown" type="U16"/>
89     <member name="length" type="U16"/>
90 pcg 1.18 <p>The length is the length of the full message including the header.</p>
91 pcg 1.3 <member name="type" type="U16"/>
92 pcg 1.18 <p>If the type is &gt;= 0x4000 this is a message for a specific channel. The channel
93     number is always the next U16.</p>
94 pcg 1.3 </struct>
95    
96     <h2>Primitive types used in the protocol.</h2>
97    
98 pcg 1.9 <p>Apart from the basic types, I need to define some extra types to
99     deal with fixed-point values (based on integer types) or fixed-length
100     strings (either 7-bit-ascii or more limited (<code>A</code>), or UCS-2
101     based (<code>S</code>)).</p>
102 pcg 1.3
103     <type name="username" type="A" length="12"/>
104 pcg 1.9
105     <p>The basic user or login name, used throughout the protocol
106     as a handle to the user.</p>
107    
108 pcg 1.3 <type name="roomname" type="S" length="25"/><!-- argh, how horribly broken -->
109 pcg 1.9
110     <p>Many strings in the protocol are fixed-width for no good reason
111 pcg 1.18 (maybe this is one reason for using compression in newer versions, as
112 pcg 1.9 the packets itself are wasting lots of space.</p>
113    
114 pcg 1.16 <type name="realname" type="S" length="50"/>
115     <type name="email" type="S" length="70"/>
116     <type name="userinfo" type="S" length="1000"/>
117     <type name="url" type="A" length="100"/>
118    
119     <p>Used in user_record.</p>
120    
121 pcg 1.3 <type name="locale" type="A" length="5"/>
122 pcg 1.9
123     <p>A kind of locale specifier. It seems the general format seems to be
124     lowercase language, underscore, uppercase location, e.g. en_US. More
125     fancy specifications don't fit.</p>
126    
127 pcg 1.3 <type name="flag" type="U8" multiplier="1"/>
128 pcg 1.9
129     <p>Just a simple boolean value. 0 means false, and 1 generally true,
130     but I suggest ccepting != 0 as true.</p>
131    
132 pcg 1.6 <type name="komi16" type="I16" multiplier="2"/>
133     <type name="komi32" type="I32" multiplier="2"/>
134 pcg 1.20 <type name="komi324" type="I32" multiplier="4"/>
135 pcg 1.9
136     <p>Komi values are multiplied by 2 to make them integer in the
137 pcg 1.20 protocol. Well, *most* of the time at least...</p>
138 pcg 1.9
139 pcg 1.3 <type name="result" type="I32" multiplier="2"/>
140 pcg 1.9
141 pcg 1.15 <p>The game result is also multiplied by two to give it higher
142     resolution. There are also special values for wins by time etc., either
143     in result or in the score* types, or both :)</p>
144 pcg 1.9
145 pcg 1.13 <type name="score16" type="I16" multiplier="4"/>
146     <type name="score32" type="I32" multiplier="4"/>
147 pcg 1.9
148     <p>A score value (used for displaying the score at the end of a game)
149 pcg 1.15 are multiplied by four for a change (the 0.25 resolution is not
150     used). In game structures it is encoded by dividing by two, though, so
151     watch out!</p>
152 pcg 1.9
153 pcg 1.7 <type name="time" type="U32" multiplier="1000"/>
154 pcg 1.1
155 pcg 1.9 <p>Time values are multiplied by 1000, giving them millisecond
156     accuracy.</p>
157    
158 pcg 1.16 <type name="timestamp" type="U64" multiplier="1000"/>
159    
160     <p>64 bit timeval, milliseconds since posix epoch, e.g. <code>my
161     ($year, $month, $day) = (gmtime $date * 0.001)[5,4,3];</code></p>
162    
163 pcg 1.17 <type name="password" type="U64"/>
164    
165     <p>Password is a number calculated as follows (VERY insecure, basically
166     plaintext!): <code>password = 0; for char in characters do password ←
167     password * 1055 + ascii_code (char)</code></p>
168    
169 pcg 1.2 <h2>Constants, enumeration and set types used in the protocol.</h2>
170 pcg 1.1
171     <p>Baaah... not yet.</p>
172    
173 pcg 1.3 <h2>Structs used in send &amp; receive messages</h2>
174 pcg 1.1
175 pcg 1.3 <struct name="user" class="KGS::User">
176 pcg 1.9
177 pcg 1.18 <p>Everywhere a user + flags is required, even used in some places
178 pcg 1.9 where only a username is required. I see no general rule on when a
179 pcg 1.18 complete user and when a partial user is required.</p>
180 pcg 1.9
181 pcg 1.3 <member name="name" type="username"/>
182     <member name="flags" type="U32" default="1"/>
183     </struct>
184 pcg 1.1
185 pcg 1.6 <struct name="rules" class="KGS::Rules">
186 pcg 1.9
187 pcg 1.18 <p>This structure is used for challanges as well as in the special
188     TREE "subprotocol". It tightly encodes the game parameters.</p>
189 pcg 1.9
190 pcg 1.6 <member name="ruleset" type="U8"/>
191     <member name="size" type="U8"/>
192     <member name="handicap" type="U8"/>
193     <member name="komi" type="komi16"/>
194     <member name="timesys" type="U8"/>
195     <member name="time" type="U32"/>
196     <member name="interval" type="U32"/>
197     byo-yomi time / canadian time
198     <member name="count" type="U16"/>
199     periods / moves
200     </struct>
201    
202 pcg 1.3 <h2>Structs used in send messages</h2>
203 pcg 1.1
204 pcg 1.18 <h2>Send messages</h2>
205    
206 pcg 1.1 <message type="0000" name="login" send="yes">
207 pcg 1.9
208 pcg 1.18 <p>Sent to login, usually the first message sent. The password needs to be set when the
209 pcg 1.9 guest flag is true.
210 pcg 1.18 Possible replies: <ref reply="login"/>. Followed by: <ref reply="timewarning_default"/> <ref reply="chal_defaults"/>
211     </p>
212 pcg 1.9
213 pcg 1.3 <member name="ver_major" type="U32" default="2"/>
214     <member name="ver_minor" type="U32" default="4"/>
215     <member name="ver_micro" type="U32" default="67"/>
216     <member name="name" type="username"/>
217 pcg 1.17 <member name="password" type="password" default="0"/>
218 pcg 1.3 <member name="guest" type="flag" default="1"/>
219     <member name="_unknown3" type="U16" default="0"/>
220     <member name="locale" type="locale" default='"en_US"'/>
221     <member name="clientver" type="DATA" default='"1.4.1_01:Swing app:Sun Microsystems Inc."'/>
222 pcg 1.4 The "default" is the java vm version, not exactly he client version. However,
223 pcg 1.18 you should always send a text like "Jonathan's C client bersion 0.6" or somesuch,
224 pcg 1.4 so the server can, if necessary, block broken clients or client versions.
225 pcg 1.1 </message>
226    
227 pcg 1.17 <message type="0007" name="req_userinfo" send="yes">
228 pcg 1.18 <p>Request info about a certain user. Possible reply: <ref reply="userinfo"/></p>
229 pcg 1.17 <member name="name" type="username"/>
230     </message>
231    
232 pcg 1.18 <message type="0007" name="update_userinfo" send="yes">
233     <p>Update user info. Message structure is very similar
234     to <ref ref="userinfo"/>.</p>
235 pcg 1.17 <member name="setpass" type="flag"/>
236     Should the password be updated?
237     <member name="password" type="password" default="0"/>
238     <member name="realname" type="realname"/>
239     <member name="email" type="email"/>
240     <member name="info" type="userinfo"/>
241     <member name="homepage" type="url"/>
242     <member name="_unused" type="U64" default="0"/>
243     <member name="_unused" type="U64" default="0"/>
244     </message>
245    
246 pcg 1.18 <message type="0014" name="req_stats" send="yes">
247     <p>Request server statistics. Replied with <ref reply="stats"/></p>
248 pcg 1.19 </message>
249    
250     <message type="001d" name="ping" recv="yes">
251     <p>Wild guess, I send it in <ref ref="idle_warn"/>.</p>
252 pcg 1.1 </message>
253    
254 pcg 1.17 <message type="001e" name="req_usergraph" send="yes">
255 pcg 1.18 <p>Request user graph data, replied with <ref reply="usergraph"/>.</p>
256 pcg 1.17 <member name="name" type="username"/>
257     </message>
258    
259     <message type="001f" name="fetch_memos" send="yes">
260 pcg 1.18 <p>Unclear. Fetch all outstanding memos? Replied with <ref reply="memo"/></p>
261 pcg 1.17 </message>
262    
263     <message type="0021" name="req_pic" send="yes">
264 pcg 1.18 <p>Request a user picture from the server. Results in a <ref reply="userpic"/>
265     or a timeout.</p>
266 pcg 1.3 <member name="name" type="username"/>
267 pcg 1.1 </message>
268    
269 pcg 1.17 <message type="0021" name="upload_pic" send="yes">
270 pcg 1.1 Same code as pic_req, but with an additional data section that
271 pcg 1.4 must contain a JPEG image that is &lt;=7KB. It must have 141×200 pixels.
272 pcg 1.3 <member name="name" type="username"/>
273 pcg 1.1 <member name="data" type="DATA"/>
274     </message>
275    
276 pcg 1.2 <message type="0100" name="gnotice" send="yes">
277 pcg 1.18 <p>Send a global message. Maybe. Never tried, for obvious reasons :/. Results
278     in a <ref reply="gnotice"/> sent to all users.</p>
279 pcg 1.1 <member name="notice" type="STRING"/>
280     </message>
281    
282 pcg 1.2 <message type="0318" name="list_rooms" send="yes">
283 pcg 1.18 <p>List the rooms in a specific group/category. Results in a <ref reply="upd_rooms"/> message.</p>
284 pcg 1.3 <member name="group" type="U8"/>
285 pcg 1.1 </message>
286    
287 pcg 1.2 <message type="031a" name="new_room" send="yes">
288 pcg 1.1 Create a new room. Not verified.
289 pcg 1.3 <member name="name" type="username"/>
290     <member name="i1" type="U32" default="0"/>
291     <member name="b1" type="U8" default="0"/>
292     <member name="b2" type="U8" default="255"/>
293     <member name="b3" type="U8" default="255"/>
294     <member name="group" type="U8" default="1"/>
295 pcg 1.1 <member name="name" type="STRING"/>
296     <member name="description" type="STRING"/>
297 pcg 1.3 <member name="flags" type="U8"/>
298 pcg 1.1 0x10 .. private room etc.. see code
299     </message>
300    
301 pcg 1.17 <message type="0413" name="req_game_record" send="yes">
302 pcg 1.18 <p>Requests part of the users game record to be sent. Results in a <ref reply="game_record"/> or maybe a timeout.</p>
303 pcg 1.16 <member name="name" type="username"/>
304     <member name="timestamp" type="timestamp"/>
305     If zero, start at the newest games, else only send games
306     before the given timestap.
307     </message>
308    
309 pcg 1.1 <message type="4300" name="join_room" send="yes">
310 pcg 1.18 <p>Joins the given room. <ref reply="join_room"/> messages for yourself
311 pcg 1.9 and all users in that room, as well as the initial gamelist, are
312 pcg 1.18 send if the room exists. If not, timeout...</p>
313 pcg 1.3 <member name="channel" type="U16"/>
314 pcg 1.1 <member name="user" type="user"/>
315     </message>
316    
317     <message type="4301" name="msg_room" send="yes">
318 pcg 1.9 Send a message to the room.
319 pcg 1.3 <member name="channel" type="U16"/>
320     <member name="name" type="username"/>
321 pcg 1.9 Must be the login-name of the user.
322 pcg 1.1 <member name="message" type="STRING"/>
323     </message>
324    
325     <message type="4302" name="part_room" send="yes">
326 pcg 1.9 Remove yourself (or maybe others as admin) from a room.
327 pcg 1.3 <member name="channel" type="U16"/>
328     <member name="name" type="username"/>
329 pcg 1.1 </message>
330    
331     <message type="4305" name="new_game" send="yes">
332 pcg 1.17 Unclear. Start a new game.
333 pcg 1.3 <member name="channel" type="U16"/>
334     <member name="id" type="U16"/>
335     <member name="gametype" type="U32"/>
336 pcg 1.1 <member name="rules" type="rules"/>
337     <member name="notes" type="STRING"/>
338     </message>
339    
340     <message type="430b" name="req_games" send="yes">
341 pcg 1.9 Request to update room game list (send this once per minute to get
342     updated). Results in upd_games messages.
343 pcg 1.3 <member name="channel" type="U16"/>
344 pcg 1.1 </message>
345    
346     <message type="4319" name="req_desc" send="yes">
347     Request room description.
348 pcg 1.3 <member name="channel" type="U16"/>
349 pcg 1.1 </message>
350    
351     <message type="4400" name="send_chal" send="yes">
352 pcg 1.9 Unclear.
353 pcg 1.3 <member name="channel" type="U16"/>
354     <member name="black" type="username"/>
355     <member name="white" type="username"/>
356 pcg 1.1 More following... TREE or challenge.
357     </message>
358    
359     <message type="4403" name="join_game" send="yes">
360 pcg 1.9 Join a game. See join_room.
361 pcg 1.5 <member name="channel" type="U16"/>
362 pcg 1.1 <member name="user" type="user"/>
363     </message>
364    
365     <message type="4404" name="part_game" send="yes">
366 pcg 1.9 Leave (or kick as admin?) a certain user from a game.
367 pcg 1.3 <member name="channel" type="U16"/>
368     <member name="name" type="username"/>
369 pcg 1.1 </message>
370    
371     <message type="4405" name="set_tree" send="yes">
372 pcg 1.9 Upload a partial game tree to the server. This is used
373     to send moves and even in-game comments to the server. For the comments,
374     the server prepends the username and rank.
375 pcg 1.3 <member name="channel" type="U16"/>
376 pcg 1.1 <member name="tree" type="TREE"/>
377     </message>
378    
379     <message type="4408" name="get_tree" send="yes">
380 pcg 1.9 Request the game tree starting at a given node. This is used
381     when the server only sends a partial tree (with end code "more").
382 pcg 1.3 <member name="channel" type="U16"/>
383     <member name="node" type="U32"/>
384 pcg 1.1 </message>
385    
386     <message type="440c" name="claim_win" send="yes">
387 pcg 1.9 Unclear.
388 pcg 1.3 <member name="channel" type="U16"/>
389     <member name="_byte" type="U8 "/>
390 pcg 1.1 Player colour maybe? Unclear.
391     </message>
392    
393     <message type="440d" name="add_time" send="yes">
394 pcg 1.9 Not checked.
395    
396 pcg 1.3 <member name="channel" type="U16"/>
397     <member name="time" type="U32"/>
398     <member name="player" type="U8"/>
399 pcg 1.1 </message>
400    
401     <message type="440f" name="grant_undo" send="yes">
402 pcg 1.9 Can be send after a req_undo message was received to grant the undo.
403 pcg 1.3 <member name="channel" type="U16"/>
404 pcg 1.1 </message>
405    
406     <message type="4410" name="resign_game" send="yes">
407 pcg 1.9 Resign the game.
408 pcg 1.3 <member name="channel" type="U16"/>
409     <member name="player" type="U8"/>
410 pcg 1.1 </message>
411    
412     <message type="441a" name="set_teacher" send="yes">
413 pcg 1.9 Change the teacher to somebody else (or possibly yourself == take it).
414 pcg 1.3 <member name="channel" type="U16"/>
415     <member name="name" type="username"/>
416 pcg 1.1 </message>
417    
418     <message type="4422" name="add_user" send="yes">
419 pcg 1.9 Unclear. Maybe allow users to talk? No idea, really.
420    
421 pcg 1.3 <member name="channel" type="U16"/>
422     <member name="othername" type="username"/>
423     <member name="name" type="username"/>; # gives user access to the game (to what? ;)
424 pcg 1.1 </message>
425    
426     <message type="4423" name="set_privacy" send="yes">
427 pcg 1.9 Probably sets the "quiet" flag. Not checked.
428 pcg 1.3 <member name="channel" type="U16"/>
429     <member name="private" type="U8"/>
430 pcg 1.1 </message>
431    
432     <message type="4429" name="reject_chal" send="yes">
433 pcg 1.9 Reject a challenge from a given user. Not checked.
434    
435 pcg 1.3 <member name="channel" type="U16"/>
436     <member name="name" type="username"/>
437 pcg 1.1 </message>
438    
439     <message type="4433" name="req_result" send="yes">
440 pcg 1.9 I forgot.
441    
442 pcg 1.3 <member name="channel" type="U16"/>
443 pcg 1.1 </message>
444    
445 pcg 1.3 <h2>Structs mainly used in receive messages</h2>
446 pcg 1.1
447 pcg 1.3 <struct name="challenge_defaults">
448 pcg 1.9 Send soon after log-in to set the defaults for game challenges.
449 pcg 1.3 <member name="gametype" type="U32"/>
450     <member name="size" type="U32"/>
451     <member name="timesys" type="U32"/>
452     <member name="time" type="U32"/>
453     <member name="byo_time" type="U32"/>
454     <member name="byo_periods" type="U32"/>
455     <member name="can_time" type="U32"/>
456     <member name="can_stones" type="U32"/>
457     </struct>
458    
459     <struct name="challenge" class="KGS::Challenge">
460 pcg 1.9 A challenge.
461    
462 pcg 1.1 <member name="user1" type="user"/>
463     <member name="user2" type="user"/>
464 pcg 1.3 <member name="gametype" type="U32"/>
465 pcg 1.1 <member name="rules" type="rules"/>
466     Maybe the rules" are in TREE format. I forgot.
467 pcg 1.3 </struct>
468 pcg 1.1
469 pcg 1.3 <struct name="game" class="KGS::Game">
470 pcg 1.9 Basic information about a game. Used in rooms for the gamelist and
471     in games to detect when a game is saved, changed type (e.g. R => D)
472     etc.
473    
474 pcg 1.3 <member name="channel" type="U16"/>
475     <member name="type" type="U32"/>
476 pcg 1.1 <member name="user1" type="user"/>
477     White
478     <member name="user2" type="user"/>
479     Black
480     <member name="user3" type="user"/>
481     Owner
482 pcg 1.3 <member name="size" type="U32"/>
483 pcg 1.1 <member name="handicap" type="I32"/>
484     &lt; 0 not fully setup
485 pcg 1.6 <member name="komi" type="komi32"/>
486 pcg 1.15 <member name="moves" type="I16"/>
487 pcg 1.14 This field reflects either the movenum or the score, sorry, not even guards help, as
488 pcg 1.15 the flags to determine that are _after_ the field. Arg. Divide by two to get the actual
489     score (NOT score16!).
490 pcg 1.3 <member name="flags" type="U16"/>
491     <member name="observers" type="U32"/>
492     <member name="saved" type="flag"/>
493     <member name="notes" type="STRING" guard-member="handicap" guard-cond="&lt; 0"/>
494     </struct>
495    
496     <struct name="room_obs">
497 pcg 1.9 Obsolete.
498    
499 pcg 1.3 <member name="name" type="roomname"/>
500     <member name="channel" type="U16"/>
501     <member name="flags" type="U32"/>
502 pcg 1.4 <member name="users" type="U32"/>
503 pcg 1.3 </struct>
504    
505     <struct name="room" class="KGS::Room">
506     <member name="channel" type="U16"/>
507     <member name="flags" type="U8"/>
508     <member name="group" type="U8"/>
509     <member name="users" type="U16"/>
510     <member name="games" type="U16"/>
511 pcg 1.4 <member name="name" type="STRING"/>
512 pcg 1.3 </struct>
513 pcg 1.1
514 pcg 1.12 <struct name="scorevalues" class="KGS::Score">
515 pcg 1.13 <member name="score" type="score32"/>
516 pcg 1.3 <member name="territory" type="U32"/>
517     <member name="captures" type="U32"/>
518     <member name="i3" type="U32"/>
519     <member name="f2" type="U32"/>
520 pcg 1.20 <member name="komi" type="komi324"/>
521 pcg 1.4 <member name="i4" type="U32"/>
522 pcg 1.3 Apparently the i3, f2, i4 are zero.
523     </struct>
524 pcg 1.1
525 pcg 1.16 <struct name="game_record" class="KGS::GameRecord">
526 pcg 1.18 <p>A single game record entry, as seen in <ref ref="userinfo"/>.</p>
527 pcg 1.16
528     <member name="timestamp" type="timestamp"/>
529     Time this game was played.
530     <member name="flags" type="U8"/>
531     High four bits are handicap, low four bits are gametype (encoded strangely? unclear).
532     <member name="user1" type="user"/>
533     White, flags contain low 8 bits of revision (bits 16-23).
534     <member name="user2" type="user"/>
535     Black, flags contain high 8 bits of revision (bits 16-23).
536     <member name="user3" type="user"/>
537     Owner (or empty)
538     <member name="komi" type="komi16"/>
539     <member name="score" type="score16"/>
540     <member name="status" type="U8"/>
541     0x80 inprogress
542     </struct>
543    
544 pcg 1.1 <h2>Receive messages</h2>
545    
546     <message type="0001" name="login" recv="yes">
547 pcg 1.3 <member name="result" type="CONSTANT" default='"login ok"'/>
548 pcg 1.1 <member name="success" type="CONSTANT" default="1"/>
549     </message>
550    
551     <message type="0002" name="login" recv="yes">
552 pcg 1.3 <member name="result" type="CONSTANT" default='"guest login ok"'/>
553 pcg 1.1 <member name="success" type="CONSTANT" default="1"/>
554     </message>
555    
556     <message type="0003" name="login" recv="yes">
557 pcg 1.3 <member name="result" type="CONSTANT" default='"login error 3"'/>
558 pcg 1.1 ** maybe more following? **
559     </message>
560    
561     <message type="0004" name="login" recv="yes">
562 pcg 1.3 <member name="result" type="CONSTANT" default='"wrong password"'/>
563 pcg 1.1 ** maybe more following? **
564     </message>
565    
566     <message type="0005" name="login" recv="yes">
567 pcg 1.3 <member name="result" type="CONSTANT" default='"user unknown"'/>
568 pcg 1.1 ** maybe more following? **
569     </message>
570    
571     <message type="0006" name="login" recv="yes">
572 pcg 1.3 <member name="result" type="CONSTANT" default='"user exists"'/>
573 pcg 1.1 ** maybe more following? **
574     </message>
575    
576 pcg 1.17 <message type="0008" name="userinfo" recv="yes">
577     User info.
578 pcg 1.16 <member name="user" type="user"/>
579 pcg 1.17 <member name="_unused" type="U64"/>
580 pcg 1.16 <member name="realname" type="realname"/>
581     <member name="email" type="email"/>
582     <member name="info" type="userinfo"/>
583     <member name="homepage" type="url"/>
584     <member name="regdate" type="timestamp"/>
585     When the user registered (0 == never registered).
586     <member name="lastlogin" type="timestamp"/>
587     When the user logged in for the last time.
588     <!-- maybe more? -->
589     </message>
590    
591 pcg 1.1 <message type="0018" name="login" recv="yes">
592 pcg 1.3 <member name="result" type="CONSTANT" default='"login error 18"'/>
593 pcg 1.1 ** maybe more following? **
594     </message>
595    
596     <message type="0022" name="login" recv="yes">
597 pcg 1.7 <!-- "thanks" to jyem for blocking me ;)-->
598 pcg 1.3 <member name="result" type="CONSTANT" default='"user or ip blocked"'/>
599 pcg 1.1 <member name="reason" type="STRING"/>
600     </message>
601    
602     <message type="0013" name="msg_chat" recv="yes">
603 pcg 1.3 <member name="user1" type="username"/>
604     <member name="user2" type="username"/>
605 pcg 1.1 <member name="message" type="STRING"/>
606     </message>
607    
608     <message type="0015" name="stats" recv="yes">
609 pcg 1.3 <member name="ver_major" type="U16"/>
610     <member name="ver_minor" type="U16"/>
611     <member name="ver_micro" type="U16"/>
612 pcg 1.16 <member name="boot_time" type="timestamp"/>
613 pcg 1.3 <member name="users_cur" type="U32"/>
614     <member name="users_max" type="U32"/>
615     <member name="users_lim" type="U32"/>
616     <member name="accts_cur" type="U32"/>
617     <member name="accts_max" type="U32"/>
618     <member name="unknown1" type="U32"/>
619     <member name="work_max" type="U32"/>
620     <member name="rooms_cur" type="U32"/>
621     <member name="rooms_max" type="U32"/>
622     <member name="rooms_lim" type="U32"/>
623     <member name="games_cur" type="U32"/>
624     <member name="games_max" type="U32"/>
625     <member name="games_lim" type="U32"/>
626     <member name="results_cur" type="U32"/>
627     <member name="results_max" type="U32"/>
628     <member name="unknown2" type="U32"/>
629     <member name="params_cur" type="U32"/>
630     <member name="params_max" type="U32"/>
631     <member name="bytes_in" type="U64"/>
632     <member name="packets_in" type="U64"/>
633     <member name="bytes_out" type="U64"/>
634 pcg 1.4 <member name="packets_out" type="U64"/>
635 pcg 1.1 </message>
636    
637     <message type="0016" name="idle_warn" recv="yes">
638     idle warning, autologout soon (10 minutes...)
639     </message>
640    
641     <message type="001b" name="timewarning_default" recv="yes">
642     WILD guess
643 pcg 1.3 <member name="channel" type="U16"/>
644     <member name="time" type="U16"/>
645 pcg 1.1 </message>
646    
647     <message type="001c" name="idle_err" recv="yes">
648     autologout
649     </message>
650    
651     <message type="001d" name="ping" recv="yes">
652 pcg 1.16 Sent by the server regularly, but not answering them
653     isn't valid. Strange form of keepalive?
654 pcg 1.1 </message>
655    
656 pcg 1.17 <message type="001e" name="usergraph" recv="yes">
657     User graph data.
658     <member name="data" type="I16" array="yes"/>
659     If empty, no graph is available. The unit seems to
660     be centi-kyu, with 1 dan == 0, 2 dan == 100, 1 kyu == -100.
661     There is probably one entry per day, the newest one last.
662     </message>
663    
664     <message type="001f" name="memo" recv="yes">
665     Unclear. "Leave Message"?
666     6 strings following.
667     <member name="s1" type="STRING"/>
668     <member name="s2" type="STRING"/>
669     <member name="s3" type="STRING"/>
670     <member name="s4" type="STRING"/>
671     <member name="s5" type="STRING"/>
672     <member name="s6" type="STRING"/>
673     </message>
674    
675 pcg 1.1 <message type="0021" name="userpic" recv="yes">
676 pcg 1.3 <member name="name" type="username"/>
677 pcg 1.1 Reply to pic_req, contains an image in jpeg format.
678     <member name="data" type="DATA"/>
679     </message>
680    
681     <message type="0100" name="gnotice" recv="yes">
682     global notice, sent to everybody
683     <member name="notice" type="STRING"/>
684     </message>
685    
686 pcg 1.16 <message type="0202" name="upd_user" recv="yes">
687 pcg 1.17 # maybe soe notify? Totally unclear.
688 pcg 1.16 # loc 0" type="chat(?) loc 1 => gameinfo?, loc 2 => game result (more data)
689     <member name="location" type="U32"/>
690     <member name="user" type="user"/>
691     <member name="lotsofinfo" type="DATA" guard-member="location" guard-cond="== 2"/>
692     </message>
693 pcg 1.1
694     <message type="0310" name="priv_room" recv="yes">
695     "permission denied" when joining a room
696     <member name="name" type="STRING"/>
697     </message>
698    
699     <message type="0318" name="upd_rooms" recv="yes">
700     <member name="rooms" type="room" array="yes"/>
701     </message>
702    
703 pcg 1.16 <message type="0411" name="chal_defaults" recv="yes">
704     <member name="channel" type="U16"/>
705     <member name="defaults" type="challenge_defaults"/>
706     </message>
707    
708 pcg 1.17 <message type="0412" name="rej_game" send="yes">
709     Unable to create challenge. The channel might be optional.
710     <member name="channel" type="U16"/>
711     </message>
712    
713 pcg 1.16 <message type="0414" name="game_record" recv="yes">
714     The users game record.
715     <member name="name" type="username"/>
716     <member name="more" type="flag"/>
717     Wether more games are available (must be requested manually)
718     <member name="games" type="game_record" array="yes"/>
719     </message>
720    
721 pcg 1.1 <message type="041c" name="upd_game2" recv="yes">
722 pcg 1.17 Unclear.
723 pcg 1.3 <member name="channel_junk" type="U16"/>
724 pcg 1.1 <member name="game" type="game"/>
725     </message>
726    
727     <h3>Room messages</h3>
728    
729     <p>Not all room messages are for rooms only, and rooms need to parse
730     not only these messages. Orthogonality, what for?</p>
731    
732     <message type="4300" name="join_room" recv="yes">
733 pcg 1.3 <member name="channel" type="U16"/>
734 pcg 1.1 <member name="users" type="user" array="yes"/>
735     </message>
736    
737     <message type="4301" name="msg_room" recv="yes">
738 pcg 1.3 <member name="channel" type="U16"/>
739     <member name="name" type="username"/>
740 pcg 1.1 <member name="message" type="STRING"/>
741     </message>
742    
743     <message type="4302" name="part_room" recv="yes">
744 pcg 1.3 <member name="channel" type="U16"/>
745 pcg 1.1 <member name="user" type="user"/>
746     </message>
747    
748     <message type="4303" name="del_room" recv="yes">
749 pcg 1.3 <member name="channel" type="U16"/>
750 pcg 1.1 </message>
751    
752     <message type="4304" name="upd_games" recv="yes">
753 pcg 1.3 <member name="channel" type="U16"/>
754 pcg 1.1 <member name="games" type="game" array="yes"/>
755     </message>
756    
757     <message type="4319" name="desc_room" recv="yes">
758 pcg 1.3 <member name="channel" type="U16"/>
759     <member name="owner" type="username"/>
760 pcg 1.1 <member name="description" type="STRING"/>
761     </message>
762    
763     <h3>Game messages</h3>
764    
765     <message type="4400" name="upd_chal" recv="yes">
766     Unclear.
767 pcg 1.3 <member name="channel" type="U16"/>
768 pcg 1.1 <member name="challenge" type="challenge"/>
769     </message>
770    
771     <message type="4401" name="upd_game" recv="yes">
772 pcg 1.3 <member name="channel" type="U16"/>
773 pcg 1.1 <member name="game" type="game"/>
774     </message>
775    
776     <message type="4402" name="del_game" recv="yes">
777 pcg 1.3 <member name="channel" type="U16"/>
778 pcg 1.1 </message>
779    
780     <message type="4403" name="upd_observers" recv="yes">
781 pcg 1.3 <member name="channel" type="U16"/>
782 pcg 1.1 <member name="users" type="user" array="yes"/>
783     </message>
784    
785     <message type="4404" name="del_observer" recv="yes">
786 pcg 1.3 <member name="channel" type="U16"/>
787     <member name="name" type="username"/>
788 pcg 1.1 </message>
789    
790     <message type="4405" name="set_tree" recv="yes">
791 pcg 1.3 <member name="channel" type="U16"/>
792 pcg 1.1 <member name="tree" type="TREE"/>
793     </message>
794    
795     <message type="4406" name="upd_tree" recv="yes">
796 pcg 1.3 <member name="channel" type="U16"/>
797 pcg 1.1 <member name="tree" type="TREE"/>
798     </message>
799    
800     <message type="4407" name="set_node" recv="yes">
801 pcg 1.3 <member name="channel" type="U16"/>
802     <member name="node" type="U32"/>
803 pcg 1.1 </message>
804    
805     <message type="4409" name="superko" recv="yes">
806     Superko-warning.
807 pcg 1.3 <member name="channel" type="U16"/>
808 pcg 1.1 </message>
809    
810     <message type="440b" name="final_result" recv="yes">
811 pcg 1.3 <member name="channel" type="U16"/>
812 pcg 1.12 <member name="blackscore" type="scorevalues"/>
813     <member name="whitescore" type="scorevalues"/>
814 pcg 1.1 </message>
815    
816     <message type="440e" name="req_undo" recv="yes">
817 pcg 1.3 <member name="channel" type="U16"/>
818 pcg 1.1
819     </message>
820    
821     <message type="4410" name="resign_game" recv="yes">
822 pcg 1.3 <member name="channel" type="U16"/>
823     <member name="player" type="U8"/>
824 pcg 1.1 </message>
825    
826     <message type="441a" name="set_teacher" recv="yes">
827 pcg 1.3 <member name="channel" type="U16"/>
828     <member name="name" type="username"/>
829 pcg 1.1 </message>
830    
831     <message type="441d" name="owner_left" recv="yes">
832     Unclear.
833 pcg 1.3 <member name="channel" type="U16"/>
834 pcg 1.1 </message>
835    
836     <message type="441e" name="teacher_left" recv="yes">
837     Unclear.
838 pcg 1.3 <member name="channel" type="U16"/>
839 pcg 1.1 </message>
840    
841     <message type="4422" name="unknown4422" recv="yes">
842     change teacher? something to do with editing?
843 pcg 1.3 <member name="channel" type="U16"/>
844     <member name="name1" type="username"/>
845     <member name="name2" type="username"/>
846 pcg 1.1 </message>
847    
848     <message type="4433" name="req_result" recv="yes">
849     Unclear.
850 pcg 1.3 <member name="channel" type="U16"/>
851 pcg 1.1 # # recv_result(?)
852     </message>
853    
854     <message type="4434" name="unknown4434" recv="yes">
855 pcg 1.3 <member name="channel" type="U16"/>
856     <member name="b1" type="U8"/>
857 pcg 1.1 ?? !demonstration game??
858     </message>
859    
860     </body>
861     </html>
862