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