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