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

File Contents

# Content
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 <h1>$Revision: 1.20 $</h1>
26
27 <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
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
42 <p>If you feel you need to update the visual appearance of this
43 document, feel free to look <tt>doc/doc2html.xsl</tt> and improve
44 it.</p>
45
46 <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 <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 <p>Everything on the wire is in little-endian format (what a shame).</p>
58
59 <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
65 <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
67 <h2>Stream and message structure.</h2>
68
69 <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
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 <struct name="message_header" send="yes" recv="yes">
88 <member name="_unknown" type="U16"/>
89 <member name="length" type="U16"/>
90 <p>The length is the length of the full message including the header.</p>
91 <member name="type" type="U16"/>
92 <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 </struct>
95
96 <h2>Primitive types used in the protocol.</h2>
97
98 <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
103 <type name="username" type="A" length="12"/>
104
105 <p>The basic user or login name, used throughout the protocol
106 as a handle to the user.</p>
107
108 <type name="roomname" type="S" length="25"/><!-- argh, how horribly broken -->
109
110 <p>Many strings in the protocol are fixed-width for no good reason
111 (maybe this is one reason for using compression in newer versions, as
112 the packets itself are wasting lots of space.</p>
113
114 <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 <type name="locale" type="A" length="5"/>
122
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 <type name="flag" type="U8" multiplier="1"/>
128
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 <type name="komi16" type="I16" multiplier="2"/>
133 <type name="komi32" type="I32" multiplier="2"/>
134 <type name="komi324" type="I32" multiplier="4"/>
135
136 <p>Komi values are multiplied by 2 to make them integer in the
137 protocol. Well, *most* of the time at least...</p>
138
139 <type name="result" type="I32" multiplier="2"/>
140
141 <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
145 <type name="score16" type="I16" multiplier="4"/>
146 <type name="score32" type="I32" multiplier="4"/>
147
148 <p>A score value (used for displaying the score at the end of a game)
149 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
153 <type name="time" type="U32" multiplier="1000"/>
154
155 <p>Time values are multiplied by 1000, giving them millisecond
156 accuracy.</p>
157
158 <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 <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 <h2>Constants, enumeration and set types used in the protocol.</h2>
170
171 <p>Baaah... not yet.</p>
172
173 <h2>Structs used in send &amp; receive messages</h2>
174
175 <struct name="user" class="KGS::User">
176
177 <p>Everywhere a user + flags is required, even used in some places
178 where only a username is required. I see no general rule on when a
179 complete user and when a partial user is required.</p>
180
181 <member name="name" type="username"/>
182 <member name="flags" type="U32" default="1"/>
183 </struct>
184
185 <struct name="rules" class="KGS::Rules">
186
187 <p>This structure is used for challanges as well as in the special
188 TREE "subprotocol". It tightly encodes the game parameters.</p>
189
190 <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 <h2>Structs used in send messages</h2>
203
204 <h2>Send messages</h2>
205
206 <message type="0000" name="login" send="yes">
207
208 <p>Sent to login, usually the first message sent. The password needs to be set when the
209 guest flag is true.
210 Possible replies: <ref reply="login"/>. Followed by: <ref reply="timewarning_default"/> <ref reply="chal_defaults"/>
211 </p>
212
213 <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 <member name="password" type="password" default="0"/>
218 <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 The "default" is the java vm version, not exactly he client version. However,
223 you should always send a text like "Jonathan's C client bersion 0.6" or somesuch,
224 so the server can, if necessary, block broken clients or client versions.
225 </message>
226
227 <message type="0007" name="req_userinfo" send="yes">
228 <p>Request info about a certain user. Possible reply: <ref reply="userinfo"/></p>
229 <member name="name" type="username"/>
230 </message>
231
232 <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 <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 <message type="0014" name="req_stats" send="yes">
247 <p>Request server statistics. Replied with <ref reply="stats"/></p>
248 </message>
249
250 <message type="001d" name="ping" send="yes">
251 <p>Wild guess, I send it in <ref ref="idle_warn"/>.</p>
252 </message>
253
254 <message type="001e" name="req_usergraph" send="yes">
255 <p>Request user graph data, replied with <ref reply="usergraph"/>.</p>
256 <member name="name" type="username"/>
257 </message>
258
259 <message type="001f" name="fetch_memos" send="yes">
260 <p>Unclear. Fetch all outstanding memos? Replied with <ref reply="memo"/></p>
261 </message>
262
263 <message type="0021" name="req_pic" send="yes">
264 <p>Request a user picture from the server. Results in a <ref reply="userpic"/>
265 or a timeout.</p>
266 <member name="name" type="username"/>
267 </message>
268
269 <message type="0021" name="upload_pic" send="yes">
270 Same code as pic_req, but with an additional data section that
271 must contain a JPEG image that is &lt;=7KB. It must have 141×200 pixels.
272 <member name="name" type="username"/>
273 <member name="data" type="DATA"/>
274 </message>
275
276 <message type="0100" name="gnotice" send="yes">
277 <p>Send a global message. Maybe. Never tried, for obvious reasons :/. Results
278 in a <ref reply="gnotice"/> sent to all users.</p>
279 <member name="notice" type="STRING"/>
280 </message>
281
282 <message type="0318" name="list_rooms" send="yes">
283 <p>List the rooms in a specific group/category. Results in a <ref reply="upd_rooms"/> message.</p>
284 <member name="group" type="U8"/>
285 </message>
286
287 <message type="031a" name="new_room" send="yes">
288 Create a new room. Not verified.
289 <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 <member name="name" type="STRING"/>
296 <member name="description" type="STRING"/>
297 <member name="flags" type="U8"/>
298 0x10 .. private room etc.. see code
299 </message>
300
301 <message type="0413" name="req_game_record" send="yes">
302 <p>Requests part of the users game record to be sent. Results in a <ref reply="game_record"/> or maybe a timeout.</p>
303 <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 <message type="4300" name="join_room" send="yes">
310 <p>Joins the given room. <ref reply="join_room"/> messages for yourself
311 and all users in that room, as well as the initial gamelist, are
312 send if the room exists. If not, timeout...</p>
313 <member name="channel" type="U16"/>
314 <member name="user" type="user"/>
315 </message>
316
317 <message type="4301" name="msg_room" send="yes">
318 Send a message to the room.
319 <member name="channel" type="U16"/>
320 <member name="name" type="username"/>
321 Must be the login-name of the user.
322 <member name="message" type="STRING"/>
323 </message>
324
325 <message type="4302" name="part_room" send="yes">
326 Remove yourself (or maybe others as admin) from a room.
327 <member name="channel" type="U16"/>
328 <member name="name" type="username"/>
329 </message>
330
331 <message type="4305" name="new_game" send="yes">
332 Unclear. Start a new game.
333 <member name="channel" type="U16"/>
334 <member name="id" type="U16"/>
335 <member name="gametype" type="U32"/>
336 <member name="rules" type="rules"/>
337 <member name="notes" type="STRING"/>
338 </message>
339
340 <message type="430b" name="req_games" send="yes">
341 Request to update room game list (send this once per minute to get
342 updated). Results in upd_games messages.
343 <member name="channel" type="U16"/>
344 </message>
345
346 <message type="4319" name="req_desc" send="yes">
347 Request room description.
348 <member name="channel" type="U16"/>
349 </message>
350
351 <message type="4400" name="send_chal" send="yes">
352 Unclear.
353 <member name="channel" type="U16"/>
354 <member name="black" type="username"/>
355 <member name="white" type="username"/>
356 More following... TREE or challenge.
357 </message>
358
359 <message type="4403" name="join_game" send="yes">
360 Join a game. See join_room.
361 <member name="channel" type="U16"/>
362 <member name="user" type="user"/>
363 </message>
364
365 <message type="4404" name="part_game" send="yes">
366 Leave (or kick as admin?) a certain user from a game.
367 <member name="channel" type="U16"/>
368 <member name="name" type="username"/>
369 </message>
370
371 <message type="4405" name="set_tree" send="yes">
372 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 <member name="channel" type="U16"/>
376 <member name="tree" type="TREE"/>
377 </message>
378
379 <message type="4408" name="get_tree" send="yes">
380 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 <member name="channel" type="U16"/>
383 <member name="node" type="U32"/>
384 </message>
385
386 <message type="440c" name="claim_win" send="yes">
387 Unclear.
388 <member name="channel" type="U16"/>
389 <member name="_byte" type="U8 "/>
390 Player colour maybe? Unclear.
391 </message>
392
393 <message type="440d" name="add_time" send="yes">
394 Not checked.
395
396 <member name="channel" type="U16"/>
397 <member name="time" type="U32"/>
398 <member name="player" type="U8"/>
399 </message>
400
401 <message type="440f" name="grant_undo" send="yes">
402 Can be send after a req_undo message was received to grant the undo.
403 <member name="channel" type="U16"/>
404 </message>
405
406 <message type="4410" name="resign_game" send="yes">
407 Resign the game.
408 <member name="channel" type="U16"/>
409 <member name="player" type="U8"/>
410 </message>
411
412 <message type="441a" name="set_teacher" send="yes">
413 Change the teacher to somebody else (or possibly yourself == take it).
414 <member name="channel" type="U16"/>
415 <member name="name" type="username"/>
416 </message>
417
418 <message type="4422" name="add_user" send="yes">
419 Unclear. Maybe allow users to talk? No idea, really.
420
421 <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 </message>
425
426 <message type="4423" name="set_privacy" send="yes">
427 Probably sets the "quiet" flag. Not checked.
428 <member name="channel" type="U16"/>
429 <member name="private" type="U8"/>
430 </message>
431
432 <message type="4429" name="reject_chal" send="yes">
433 Reject a challenge from a given user. Not checked.
434
435 <member name="channel" type="U16"/>
436 <member name="name" type="username"/>
437 </message>
438
439 <message type="4433" name="req_result" send="yes">
440 I forgot.
441
442 <member name="channel" type="U16"/>
443 </message>
444
445 <h2>Structs mainly used in receive messages</h2>
446
447 <struct name="challenge_defaults">
448 Send soon after log-in to set the defaults for game challenges.
449 <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 A challenge.
461
462 <member name="user1" type="user"/>
463 <member name="user2" type="user"/>
464 <member name="gametype" type="U32"/>
465 <member name="rules" type="rules"/>
466 Maybe the rules" are in TREE format. I forgot.
467 </struct>
468
469 <struct name="game" class="KGS::Game">
470 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 <member name="channel" type="U16"/>
475 <member name="type" type="U32"/>
476 <member name="user1" type="user"/>
477 White
478 <member name="user2" type="user"/>
479 Black
480 <member name="user3" type="user"/>
481 Owner
482 <member name="size" type="U32"/>
483 <member name="handicap" type="I32"/>
484 &lt; 0 not fully setup
485 <member name="komi" type="komi32"/>
486 <member name="moves" type="I16"/>
487 This field reflects either the movenum or the score, sorry, not even guards help, as
488 the flags to determine that are _after_ the field. Arg. Divide by two to get the actual
489 score (NOT score16!).
490 <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 Obsolete.
498
499 <member name="name" type="roomname"/>
500 <member name="channel" type="U16"/>
501 <member name="flags" type="U32"/>
502 <member name="users" type="U32"/>
503 </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 <member name="name" type="STRING"/>
512 </struct>
513
514 <struct name="scorevalues" class="KGS::Score">
515 <member name="score" type="score32"/>
516 <member name="territory" type="U32"/>
517 <member name="captures" type="U32"/>
518 <member name="i3" type="U32"/>
519 <member name="f2" type="U32"/>
520 <member name="komi" type="komi324"/>
521 <member name="i4" type="U32"/>
522 Apparently the i3, f2, i4 are zero.
523 </struct>
524
525 <struct name="game_record" class="KGS::GameRecord">
526 <p>A single game record entry, as seen in <ref ref="userinfo"/>.</p>
527
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 <h2>Receive messages</h2>
545
546 <message type="0001" name="login" recv="yes">
547 <member name="result" type="CONSTANT" default='"login ok"'/>
548 <member name="success" type="CONSTANT" default="1"/>
549 </message>
550
551 <message type="0002" name="login" recv="yes">
552 <member name="result" type="CONSTANT" default='"guest login ok"'/>
553 <member name="success" type="CONSTANT" default="1"/>
554 </message>
555
556 <message type="0003" name="login" recv="yes">
557 <member name="result" type="CONSTANT" default='"login error 3"'/>
558 ** maybe more following? **
559 </message>
560
561 <message type="0004" name="login" recv="yes">
562 <member name="result" type="CONSTANT" default='"wrong password"'/>
563 ** maybe more following? **
564 </message>
565
566 <message type="0005" name="login" recv="yes">
567 <member name="result" type="CONSTANT" default='"user unknown"'/>
568 ** maybe more following? **
569 </message>
570
571 <message type="0006" name="login" recv="yes">
572 <member name="result" type="CONSTANT" default='"user exists"'/>
573 ** maybe more following? **
574 </message>
575
576 <message type="0008" name="userinfo" recv="yes">
577 User info.
578 <member name="user" type="user"/>
579 <member name="_unused" type="U64"/>
580 <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 <message type="0018" name="login" recv="yes">
592 <member name="result" type="CONSTANT" default='"login error 18"'/>
593 ** maybe more following? **
594 </message>
595
596 <message type="0022" name="login" recv="yes">
597 <!-- "thanks" to jyem for blocking me ;)-->
598 <member name="result" type="CONSTANT" default='"user or ip blocked"'/>
599 <member name="reason" type="STRING"/>
600 </message>
601
602 <message type="0013" name="msg_chat" recv="yes">
603 <member name="user1" type="username"/>
604 <member name="user2" type="username"/>
605 <member name="message" type="STRING"/>
606 </message>
607
608 <message type="0015" name="stats" recv="yes">
609 <member name="ver_major" type="U16"/>
610 <member name="ver_minor" type="U16"/>
611 <member name="ver_micro" type="U16"/>
612 <member name="boot_time" type="timestamp"/>
613 <member name="users_cur" type="U32"/>
614 <member name="users_max" type="U32"/>
615 <member name="users_lim" type="U32"/>
616 <member name="accts_cur" type="U32"/>
617 <member name="accts_max" type="U32"/>
618 <member name="unknown1" type="U32"/>
619 <member name="work_max" type="U32"/>
620 <member name="rooms_cur" type="U32"/>
621 <member name="rooms_max" type="U32"/>
622 <member name="rooms_lim" type="U32"/>
623 <member name="games_cur" type="U32"/>
624 <member name="games_max" type="U32"/>
625 <member name="games_lim" type="U32"/>
626 <member name="results_cur" type="U32"/>
627 <member name="results_max" type="U32"/>
628 <member name="unknown2" type="U32"/>
629 <member name="params_cur" type="U32"/>
630 <member name="params_max" type="U32"/>
631 <member name="bytes_in" type="U64"/>
632 <member name="packets_in" type="U64"/>
633 <member name="bytes_out" type="U64"/>
634 <member name="packets_out" type="U64"/>
635 </message>
636
637 <message type="0016" name="idle_warn" recv="yes">
638 idle warning, autologout soon (10 minutes...)
639 </message>
640
641 <message type="001b" name="timewarning_default" recv="yes">
642 WILD guess
643 <member name="channel" type="U16"/>
644 <member name="time" type="U16"/>
645 </message>
646
647 <message type="001c" name="idle_err" recv="yes">
648 autologout
649 </message>
650
651 <message type="001d" name="ping" recv="yes">
652 Sent by the server regularly, but not answering them
653 isn't valid. Strange form of keepalive?
654 </message>
655
656 <message type="001e" name="usergraph" recv="yes">
657 User graph data.
658 <member name="data" type="I16" array="yes"/>
659 If empty, no graph is available. The unit seems to
660 be centi-kyu, with 1 dan == 0, 2 dan == 100, 1 kyu == -100.
661 There is probably one entry per day, the newest one last.
662 </message>
663
664 <message type="001f" name="memo" recv="yes">
665 Unclear. "Leave Message"?
666 6 strings following.
667 <member name="s1" type="STRING"/>
668 <member name="s2" type="STRING"/>
669 <member name="s3" type="STRING"/>
670 <member name="s4" type="STRING"/>
671 <member name="s5" type="STRING"/>
672 <member name="s6" type="STRING"/>
673 </message>
674
675 <message type="0021" name="userpic" recv="yes">
676 <member name="name" type="username"/>
677 Reply to pic_req, contains an image in jpeg format.
678 <member name="data" type="DATA"/>
679 </message>
680
681 <message type="0100" name="gnotice" recv="yes">
682 global notice, sent to everybody
683 <member name="notice" type="STRING"/>
684 </message>
685
686 <message type="0202" name="upd_user" recv="yes">
687 # maybe soe notify? Totally unclear.
688 # loc 0" type="chat(?) loc 1 => gameinfo?, loc 2 => game result (more data)
689 <member name="location" type="U32"/>
690 <member name="user" type="user"/>
691 <member name="lotsofinfo" type="DATA" guard-member="location" guard-cond="== 2"/>
692 </message>
693
694 <message type="0310" name="priv_room" recv="yes">
695 "permission denied" when joining a room
696 <member name="name" type="STRING"/>
697 </message>
698
699 <message type="0318" name="upd_rooms" recv="yes">
700 <member name="rooms" type="room" array="yes"/>
701 </message>
702
703 <message type="0411" name="chal_defaults" recv="yes">
704 <member name="channel" type="U16"/>
705 <member name="defaults" type="challenge_defaults"/>
706 </message>
707
708 <message type="0412" name="rej_game" send="yes">
709 Unable to create challenge. The channel might be optional.
710 <member name="channel" type="U16"/>
711 </message>
712
713 <message type="0414" name="game_record" recv="yes">
714 The users game record.
715 <member name="name" type="username"/>
716 <member name="more" type="flag"/>
717 Wether more games are available (must be requested manually)
718 <member name="games" type="game_record" array="yes"/>
719 </message>
720
721 <message type="041c" name="upd_game2" recv="yes">
722 Unclear.
723 <member name="channel_junk" type="U16"/>
724 <member name="game" type="game"/>
725 </message>
726
727 <h3>Room messages</h3>
728
729 <p>Not all room messages are for rooms only, and rooms need to parse
730 not only these messages. Orthogonality, what for?</p>
731
732 <message type="4300" name="join_room" recv="yes">
733 <member name="channel" type="U16"/>
734 <member name="users" type="user" array="yes"/>
735 </message>
736
737 <message type="4301" name="msg_room" recv="yes">
738 <member name="channel" type="U16"/>
739 <member name="name" type="username"/>
740 <member name="message" type="STRING"/>
741 </message>
742
743 <message type="4302" name="part_room" recv="yes">
744 <member name="channel" type="U16"/>
745 <member name="user" type="user"/>
746 </message>
747
748 <message type="4303" name="del_room" recv="yes">
749 <member name="channel" type="U16"/>
750 </message>
751
752 <message type="4304" name="upd_games" recv="yes">
753 <member name="channel" type="U16"/>
754 <member name="games" type="game" array="yes"/>
755 </message>
756
757 <message type="4319" name="desc_room" recv="yes">
758 <member name="channel" type="U16"/>
759 <member name="owner" type="username"/>
760 <member name="description" type="STRING"/>
761 </message>
762
763 <h3>Game messages</h3>
764
765 <message type="4400" name="upd_chal" recv="yes">
766 Unclear.
767 <member name="channel" type="U16"/>
768 <member name="challenge" type="challenge"/>
769 </message>
770
771 <message type="4401" name="upd_game" recv="yes">
772 <member name="channel" type="U16"/>
773 <member name="game" type="game"/>
774 </message>
775
776 <message type="4402" name="del_game" recv="yes">
777 <member name="channel" type="U16"/>
778 </message>
779
780 <message type="4403" name="upd_observers" recv="yes">
781 <member name="channel" type="U16"/>
782 <member name="users" type="user" array="yes"/>
783 </message>
784
785 <message type="4404" name="del_observer" recv="yes">
786 <member name="channel" type="U16"/>
787 <member name="name" type="username"/>
788 </message>
789
790 <message type="4405" name="set_tree" recv="yes">
791 <member name="channel" type="U16"/>
792 <member name="tree" type="TREE"/>
793 </message>
794
795 <message type="4406" name="upd_tree" recv="yes">
796 <member name="channel" type="U16"/>
797 <member name="tree" type="TREE"/>
798 </message>
799
800 <message type="4407" name="set_node" recv="yes">
801 <member name="channel" type="U16"/>
802 <member name="node" type="U32"/>
803 </message>
804
805 <message type="4409" name="superko" recv="yes">
806 Superko-warning.
807 <member name="channel" type="U16"/>
808 </message>
809
810 <message type="440b" name="final_result" recv="yes">
811 <member name="channel" type="U16"/>
812 <member name="blackscore" type="scorevalues"/>
813 <member name="whitescore" type="scorevalues"/>
814 </message>
815
816 <message type="440e" name="req_undo" recv="yes">
817 <member name="channel" type="U16"/>
818
819 </message>
820
821 <message type="4410" name="resign_game" recv="yes">
822 <member name="channel" type="U16"/>
823 <member name="player" type="U8"/>
824 </message>
825
826 <message type="441a" name="set_teacher" recv="yes">
827 <member name="channel" type="U16"/>
828 <member name="name" type="username"/>
829 </message>
830
831 <message type="441d" name="owner_left" recv="yes">
832 Unclear.
833 <member name="channel" type="U16"/>
834 </message>
835
836 <message type="441e" name="teacher_left" recv="yes">
837 Unclear.
838 <member name="channel" type="U16"/>
839 </message>
840
841 <message type="4422" name="unknown4422" recv="yes">
842 change teacher? something to do with editing?
843 <member name="channel" type="U16"/>
844 <member name="name1" type="username"/>
845 <member name="name2" type="username"/>
846 </message>
847
848 <message type="4433" name="req_result" recv="yes">
849 Unclear.
850 <member name="channel" type="U16"/>
851 # # recv_result(?)
852 </message>
853
854 <message type="4434" name="unknown4434" recv="yes">
855 <member name="channel" type="U16"/>
856 <member name="b1" type="U8"/>
857 ?? !demonstration game??
858 </message>
859
860 </body>
861 </html>
862