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