ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/protocol.xml
Revision: 1.22
Committed: Sat Jun 28 16:44:55 2003 UTC (20 years, 11 months ago) by pcg
Content type: text/xml
Branch: MAIN
Changes since 1.21: +5 -3 lines
Log Message:
*** empty log message ***

File Contents

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