ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/protocol.xml
Revision: 1.17
Committed: Fri Jun 13 22:11:50 2003 UTC (20 years, 11 months ago) by pcg
Content type: text/xml
Branch: MAIN
Changes since 1.16: +69 -12 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.15 $</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 The length is the length of the full message including the header.
91 <member name="type" type="U16"/>
92 If the type is &gt;= 0x4000 this is a message for a specific channel. The channel
93 number is always the next U16.
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 enwer 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
135 <p>Komi values are multiplied by 2 to make them integer in the
136 protocol.</p>
137
138 <type name="result" type="I32" multiplier="2"/>
139
140 <p>The game result is also multiplied by two to give it higher
141 resolution. There are also special values for wins by time etc., either
142 in result or in the score* types, or both :)</p>
143
144 <type name="score16" type="I16" multiplier="4"/>
145 <type name="score32" type="I32" multiplier="4"/>
146
147 <p>A score value (used for displaying the score at the end of a game)
148 are multiplied by four for a change (the 0.25 resolution is not
149 used). In game structures it is encoded by dividing by two, though, so
150 watch out!</p>
151
152 <type name="time" type="U32" multiplier="1000"/>
153
154 <p>Time values are multiplied by 1000, giving them millisecond
155 accuracy.</p>
156
157 <type name="timestamp" type="U64" multiplier="1000"/>
158
159 <p>64 bit timeval, milliseconds since posix epoch, e.g. <code>my
160 ($year, $month, $day) = (gmtime $date * 0.001)[5,4,3];</code></p>
161
162 <type name="password" type="U64"/>
163
164 <p>Password is a number calculated as follows (VERY insecure, basically
165 plaintext!): <code>password = 0; for char in characters do password ←
166 password * 1055 + ascii_code (char)</code></p>
167
168 <h2>Constants, enumeration and set types used in the protocol.</h2>
169
170 <p>Baaah... not yet.</p>
171
172 <h2>Structs used in send &amp; receive messages</h2>
173
174 <struct name="user" class="KGS::User">
175
176 Everywhere a user + flags is required, even used in some places
177 where only a username is required. I see no general rule on when a
178 complete user and when a partial user is required.
179
180 <member name="name" type="username"/>
181 <member name="flags" type="U32" default="1"/>
182 </struct>
183
184 <struct name="rules" class="KGS::Rules">
185
186 This structure is used for challanges as well as in the special
187 TREE "subprotocol". It tightly encodes the game parameters.
188
189 <member name="ruleset" type="U8"/>
190 <member name="size" type="U8"/>
191 <member name="handicap" type="U8"/>
192 <member name="komi" type="komi16"/>
193 <member name="timesys" type="U8"/>
194 <member name="time" type="U32"/>
195 <member name="interval" type="U32"/>
196 byo-yomi time / canadian time
197 <member name="count" type="U16"/>
198 periods / moves
199 </struct>
200
201 <h2>Structs used in send messages</h2>
202
203 <message type="0000" name="login" send="yes">
204
205 Send on the initial login. The password needs to be set when the
206 guest flag is true.
207
208 <member name="ver_major" type="U32" default="2"/>
209 <member name="ver_minor" type="U32" default="4"/>
210 <member name="ver_micro" type="U32" default="67"/>
211 <member name="name" type="username"/>
212 <member name="password" type="password" default="0"/>
213 <member name="guest" type="flag" default="1"/>
214 <member name="_unknown3" type="U16" default="0"/>
215 <member name="locale" type="locale" default='"en_US"'/>
216 <member name="clientver" type="DATA" default='"1.4.1_01:Swing app:Sun Microsystems Inc."'/>
217 The "default" is the java vm version, not exactly he client version. However,
218 you should always send a tetx like "Jonathan's C client bersion 0.6" or somesuch,
219 so the server can, if necessary, block broken clients or client versions.
220 </message>
221
222 <message type="0007" name="req_userinfo" send="yes">
223 Request info about a certain user.
224 <member name="name" type="username"/>
225 </message>
226
227 <message type="0007" name="req_userinfo" send="yes">
228 Update user info. Message structure is very similar
229 to "userinfo".
230 <member name="setpass" type="flag"/>
231 Should the password be updated?
232 <member name="password" type="password" default="0"/>
233 <member name="realname" type="realname"/>
234 <member name="email" type="email"/>
235 <member name="info" type="userinfo"/>
236 <member name="homepage" type="url"/>
237 <member name="_unused" type="U64" default="0"/>
238 <member name="_unused" type="U64" default="0"/>
239 </message>
240
241 <message type="0014" name="server_stats" send="yes">
242 Request server statistics.
243 </message>
244
245 <message type="001e" name="req_usergraph" send="yes">
246 Request user graph data, (see usergraph).
247 <member name="name" type="username"/>
248 </message>
249
250 <message type="001f" name="fetch_memos" send="yes">
251 Unclear. Fetch all outstanding memos?
252 </message>
253
254 <message type="0021" name="req_pic" send="yes">
255 Request a user picture from the server. Results in a userpic-reply
256 or a timeout :/.
257 <member name="name" type="username"/>
258 </message>
259
260 <message type="0021" name="upload_pic" send="yes">
261 Same code as pic_req, but with an additional data section that
262 must contain a JPEG image that is &lt;=7KB. It must have 141×200 pixels.
263 <member name="name" type="username"/>
264 <member name="data" type="DATA"/>
265 </message>
266
267 <message type="0100" name="gnotice" send="yes">
268 Send a global message. Maybe. Never tried, for obvious reasons :/
269 <member name="notice" type="STRING"/>
270 </message>
271
272 <message type="0318" name="list_rooms" send="yes">
273 List the rooms in a specific group/category. Results in a upd_rooms message.
274 <member name="group" type="U8"/>
275 </message>
276
277 <message type="031a" name="new_room" send="yes">
278 Create a new room. Not verified.
279 <member name="name" type="username"/>
280 <member name="i1" type="U32" default="0"/>
281 <member name="b1" type="U8" default="0"/>
282 <member name="b2" type="U8" default="255"/>
283 <member name="b3" type="U8" default="255"/>
284 <member name="group" type="U8" default="1"/>
285 <member name="name" type="STRING"/>
286 <member name="description" type="STRING"/>
287 <member name="flags" type="U8"/>
288 0x10 .. private room etc.. see code
289 </message>
290
291 <message type="0413" name="req_game_record" send="yes">
292 Requests part of the users game record to be sent (game_record reply).
293 <member name="name" type="username"/>
294 <member name="timestamp" type="timestamp"/>
295 If zero, start at the newest games, else only send games
296 before the given timestap.
297 </message>
298
299 <message type="4300" name="join_room" send="yes">
300 Joins the given room. join_room messages for yourself
301 and all users in that room, as well as the initial gamelist, are
302 send if the room exists. If not, timeout...
303 <member name="channel" type="U16"/>
304 <member name="user" type="user"/>
305 </message>
306
307 <message type="4301" name="msg_room" send="yes">
308 Send a message to the room.
309 <member name="channel" type="U16"/>
310 <member name="name" type="username"/>
311 Must be the login-name of the user.
312 <member name="message" type="STRING"/>
313 </message>
314
315 <message type="4302" name="part_room" send="yes">
316 Remove yourself (or maybe others as admin) from a room.
317 <member name="channel" type="U16"/>
318 <member name="name" type="username"/>
319 </message>
320
321 <message type="4305" name="new_game" send="yes">
322 Unclear. Start a new game.
323 <member name="channel" type="U16"/>
324 <member name="id" type="U16"/>
325 <member name="gametype" type="U32"/>
326 <member name="rules" type="rules"/>
327 <member name="notes" type="STRING"/>
328 </message>
329
330 <message type="430b" name="req_games" send="yes">
331 Request to update room game list (send this once per minute to get
332 updated). Results in upd_games messages.
333 <member name="channel" type="U16"/>
334 </message>
335
336 <message type="4319" name="req_desc" send="yes">
337 Request room description.
338 <member name="channel" type="U16"/>
339 </message>
340
341 <message type="4400" name="send_chal" send="yes">
342 Unclear.
343 <member name="channel" type="U16"/>
344 <member name="black" type="username"/>
345 <member name="white" type="username"/>
346 More following... TREE or challenge.
347 </message>
348
349 <message type="4403" name="join_game" send="yes">
350 Join a game. See join_room.
351 <member name="channel" type="U16"/>
352 <member name="user" type="user"/>
353 </message>
354
355 <message type="4404" name="part_game" send="yes">
356 Leave (or kick as admin?) a certain user from a game.
357 <member name="channel" type="U16"/>
358 <member name="name" type="username"/>
359 </message>
360
361 <message type="4405" name="set_tree" send="yes">
362 Upload a partial game tree to the server. This is used
363 to send moves and even in-game comments to the server. For the comments,
364 the server prepends the username and rank.
365 <member name="channel" type="U16"/>
366 <member name="tree" type="TREE"/>
367 </message>
368
369 <message type="4408" name="get_tree" send="yes">
370 Request the game tree starting at a given node. This is used
371 when the server only sends a partial tree (with end code "more").
372 <member name="channel" type="U16"/>
373 <member name="node" type="U32"/>
374 </message>
375
376 <message type="440c" name="claim_win" send="yes">
377 Unclear.
378 <member name="channel" type="U16"/>
379 <member name="_byte" type="U8 "/>
380 Player colour maybe? Unclear.
381 </message>
382
383 <message type="440d" name="add_time" send="yes">
384 Not checked.
385
386 <member name="channel" type="U16"/>
387 <member name="time" type="U32"/>
388 <member name="player" type="U8"/>
389 </message>
390
391 <message type="440f" name="grant_undo" send="yes">
392 Can be send after a req_undo message was received to grant the undo.
393 <member name="channel" type="U16"/>
394 </message>
395
396 <message type="4410" name="resign_game" send="yes">
397 Resign the game.
398 <member name="channel" type="U16"/>
399 <member name="player" type="U8"/>
400 </message>
401
402 <message type="441a" name="set_teacher" send="yes">
403 Change the teacher to somebody else (or possibly yourself == take it).
404 <member name="channel" type="U16"/>
405 <member name="name" type="username"/>
406 </message>
407
408 <message type="4422" name="add_user" send="yes">
409 Unclear. Maybe allow users to talk? No idea, really.
410
411 <member name="channel" type="U16"/>
412 <member name="othername" type="username"/>
413 <member name="name" type="username"/>; # gives user access to the game (to what? ;)
414 </message>
415
416 <message type="4423" name="set_privacy" send="yes">
417 Probably sets the "quiet" flag. Not checked.
418 <member name="channel" type="U16"/>
419 <member name="private" type="U8"/>
420 </message>
421
422 <message type="4429" name="reject_chal" send="yes">
423 Reject a challenge from a given user. Not checked.
424
425 <member name="channel" type="U16"/>
426 <member name="name" type="username"/>
427 </message>
428
429 <message type="4433" name="req_result" send="yes">
430 I forgot.
431
432 <member name="channel" type="U16"/>
433 </message>
434
435 <h2>Structs mainly used in receive messages</h2>
436
437 <struct name="challenge_defaults">
438 Send soon after log-in to set the defaults for game challenges.
439 <member name="gametype" type="U32"/>
440 <member name="size" type="U32"/>
441 <member name="timesys" type="U32"/>
442 <member name="time" type="U32"/>
443 <member name="byo_time" type="U32"/>
444 <member name="byo_periods" type="U32"/>
445 <member name="can_time" type="U32"/>
446 <member name="can_stones" type="U32"/>
447 </struct>
448
449 <struct name="challenge" class="KGS::Challenge">
450 A challenge.
451
452 <member name="user1" type="user"/>
453 <member name="user2" type="user"/>
454 <member name="gametype" type="U32"/>
455 <member name="rules" type="rules"/>
456 Maybe the rules" are in TREE format. I forgot.
457 </struct>
458
459 <struct name="game" class="KGS::Game">
460 Basic information about a game. Used in rooms for the gamelist and
461 in games to detect when a game is saved, changed type (e.g. R => D)
462 etc.
463
464 <member name="channel" type="U16"/>
465 <member name="type" type="U32"/>
466 <member name="user1" type="user"/>
467 White
468 <member name="user2" type="user"/>
469 Black
470 <member name="user3" type="user"/>
471 Owner
472 <member name="size" type="U32"/>
473 <member name="handicap" type="I32"/>
474 &lt; 0 not fully setup
475 <member name="komi" type="komi32"/>
476 <member name="moves" type="I16"/>
477 This field reflects either the movenum or the score, sorry, not even guards help, as
478 the flags to determine that are _after_ the field. Arg. Divide by two to get the actual
479 score (NOT score16!).
480 <member name="flags" type="U16"/>
481 <member name="observers" type="U32"/>
482 <member name="saved" type="flag"/>
483 <member name="notes" type="STRING" guard-member="handicap" guard-cond="&lt; 0"/>
484 </struct>
485
486 <struct name="room_obs">
487 Obsolete.
488
489 <member name="name" type="roomname"/>
490 <member name="channel" type="U16"/>
491 <member name="flags" type="U32"/>
492 <member name="users" type="U32"/>
493 </struct>
494
495 <struct name="room" class="KGS::Room">
496 <member name="channel" type="U16"/>
497 <member name="flags" type="U8"/>
498 <member name="group" type="U8"/>
499 <member name="users" type="U16"/>
500 <member name="games" type="U16"/>
501 <member name="name" type="STRING"/>
502 </struct>
503
504 <struct name="scorevalues" class="KGS::Score">
505 <member name="score" type="score32"/>
506 <member name="territory" type="U32"/>
507 <member name="captures" type="U32"/>
508 <member name="i3" type="U32"/>
509 <member name="f2" type="U32"/>
510 <member name="komi" type="komi32"/>
511 <member name="i4" type="U32"/>
512 Apparently the i3, f2, i4 are zero.
513 </struct>
514
515 <struct name="game_record" class="KGS::GameRecord">
516 A single game record entry, as seen in userinfo etc.
517
518 <member name="timestamp" type="timestamp"/>
519 Time this game was played.
520 <member name="flags" type="U8"/>
521 High four bits are handicap, low four bits are gametype (encoded strangely? unclear).
522 <member name="user1" type="user"/>
523 White, flags contain low 8 bits of revision (bits 16-23).
524 <member name="user2" type="user"/>
525 Black, flags contain high 8 bits of revision (bits 16-23).
526 <member name="user3" type="user"/>
527 Owner (or empty)
528 <member name="komi" type="komi16"/>
529 <member name="score" type="score16"/>
530 <member name="status" type="U8"/>
531 0x80 inprogress
532 </struct>
533
534 <h2>Receive messages</h2>
535
536 <message type="0001" name="login" recv="yes">
537 <member name="result" type="CONSTANT" default='"login ok"'/>
538 <member name="success" type="CONSTANT" default="1"/>
539 </message>
540
541 <message type="0002" name="login" recv="yes">
542 <member name="result" type="CONSTANT" default='"guest login ok"'/>
543 <member name="success" type="CONSTANT" default="1"/>
544 </message>
545
546 <message type="0003" name="login" recv="yes">
547 <member name="result" type="CONSTANT" default='"login error 3"'/>
548 ** maybe more following? **
549 </message>
550
551 <message type="0004" name="login" recv="yes">
552 <member name="result" type="CONSTANT" default='"wrong password"'/>
553 ** maybe more following? **
554 </message>
555
556 <message type="0005" name="login" recv="yes">
557 <member name="result" type="CONSTANT" default='"user unknown"'/>
558 ** maybe more following? **
559 </message>
560
561 <message type="0006" name="login" recv="yes">
562 <member name="result" type="CONSTANT" default='"user exists"'/>
563 ** maybe more following? **
564 </message>
565
566 <message type="0008" name="userinfo" recv="yes">
567 User info.
568 <member name="user" type="user"/>
569 <member name="_unused" type="U64"/>
570 <member name="realname" type="realname"/>
571 <member name="email" type="email"/>
572 <member name="info" type="userinfo"/>
573 <member name="homepage" type="url"/>
574 <member name="regdate" type="timestamp"/>
575 When the user registered (0 == never registered).
576 <member name="lastlogin" type="timestamp"/>
577 When the user logged in for the last time.
578 <!-- maybe more? -->
579 </message>
580
581 <message type="0018" name="login" recv="yes">
582 <member name="result" type="CONSTANT" default='"login error 18"'/>
583 ** maybe more following? **
584 </message>
585
586 <message type="0022" name="login" recv="yes">
587 <!-- "thanks" to jyem for blocking me ;)-->
588 <member name="result" type="CONSTANT" default='"user or ip blocked"'/>
589 <member name="reason" type="STRING"/>
590 </message>
591
592 <message type="0013" name="msg_chat" recv="yes">
593 <member name="user1" type="username"/>
594 <member name="user2" type="username"/>
595 <member name="message" type="STRING"/>
596 </message>
597
598 <message type="0015" name="stats" recv="yes">
599 <member name="ver_major" type="U16"/>
600 <member name="ver_minor" type="U16"/>
601 <member name="ver_micro" type="U16"/>
602 <member name="boot_time" type="timestamp"/>
603 <member name="users_cur" type="U32"/>
604 <member name="users_max" type="U32"/>
605 <member name="users_lim" type="U32"/>
606 <member name="accts_cur" type="U32"/>
607 <member name="accts_max" type="U32"/>
608 <member name="unknown1" type="U32"/>
609 <member name="work_max" type="U32"/>
610 <member name="rooms_cur" type="U32"/>
611 <member name="rooms_max" type="U32"/>
612 <member name="rooms_lim" type="U32"/>
613 <member name="games_cur" type="U32"/>
614 <member name="games_max" type="U32"/>
615 <member name="games_lim" type="U32"/>
616 <member name="results_cur" type="U32"/>
617 <member name="results_max" type="U32"/>
618 <member name="unknown2" type="U32"/>
619 <member name="params_cur" type="U32"/>
620 <member name="params_max" type="U32"/>
621 <member name="bytes_in" type="U64"/>
622 <member name="packets_in" type="U64"/>
623 <member name="bytes_out" type="U64"/>
624 <member name="packets_out" type="U64"/>
625 </message>
626
627 <message type="0016" name="idle_warn" recv="yes">
628 idle warning, autologout soon (10 minutes...)
629 </message>
630
631 <message type="001b" name="timewarning_default" recv="yes">
632 WILD guess
633 <member name="channel" type="U16"/>
634 <member name="time" type="U16"/>
635 </message>
636
637 <message type="001c" name="idle_err" recv="yes">
638 autologout
639 </message>
640
641 <message type="001d" name="ping" recv="yes">
642 Sent by the server regularly, but not answering them
643 isn't valid. Strange form of keepalive?
644 </message>
645
646 <message type="001e" name="usergraph" recv="yes">
647 User graph data.
648 <member name="data" type="I16" array="yes"/>
649 If empty, no graph is available. The unit seems to
650 be centi-kyu, with 1 dan == 0, 2 dan == 100, 1 kyu == -100.
651 There is probably one entry per day, the newest one last.
652 </message>
653
654 <message type="001f" name="memo" recv="yes">
655 Unclear. "Leave Message"?
656 6 strings following.
657 <member name="s1" type="STRING"/>
658 <member name="s2" type="STRING"/>
659 <member name="s3" type="STRING"/>
660 <member name="s4" type="STRING"/>
661 <member name="s5" type="STRING"/>
662 <member name="s6" type="STRING"/>
663 </message>
664
665 <message type="0021" name="userpic" recv="yes">
666 <member name="name" type="username"/>
667 Reply to pic_req, contains an image in jpeg format.
668 <member name="data" type="DATA"/>
669 </message>
670
671 <message type="0100" name="gnotice" recv="yes">
672 global notice, sent to everybody
673 <member name="notice" type="STRING"/>
674 </message>
675
676 <message type="0202" name="upd_user" recv="yes">
677 # maybe soe notify? Totally unclear.
678 # loc 0" type="chat(?) loc 1 => gameinfo?, loc 2 => game result (more data)
679 <member name="location" type="U32"/>
680 <member name="user" type="user"/>
681 <member name="lotsofinfo" type="DATA" guard-member="location" guard-cond="== 2"/>
682 </message>
683
684 <message type="0310" name="priv_room" recv="yes">
685 "permission denied" when joining a room
686 <member name="name" type="STRING"/>
687 </message>
688
689 <message type="0318" name="upd_rooms" recv="yes">
690 <member name="rooms" type="room" array="yes"/>
691 </message>
692
693 <message type="0411" name="chal_defaults" recv="yes">
694 <member name="channel" type="U16"/>
695 <member name="defaults" type="challenge_defaults"/>
696 </message>
697
698 <message type="0412" name="rej_game" send="yes">
699 Unable to create challenge. The channel might be optional.
700 <member name="channel" type="U16"/>
701 </message>
702
703 <message type="0414" name="game_record" recv="yes">
704 The users game record.
705 <member name="name" type="username"/>
706 <member name="more" type="flag"/>
707 Wether more games are available (must be requested manually)
708 <member name="games" type="game_record" array="yes"/>
709 </message>
710
711 <message type="041c" name="upd_game2" recv="yes">
712 Unclear.
713 <member name="channel_junk" type="U16"/>
714 <member name="game" type="game"/>
715 </message>
716
717 <h3>Room messages</h3>
718
719 <p>Not all room messages are for rooms only, and rooms need to parse
720 not only these messages. Orthogonality, what for?</p>
721
722 <message type="4300" name="join_room" recv="yes">
723 <member name="channel" type="U16"/>
724 <member name="users" type="user" array="yes"/>
725 </message>
726
727 <message type="4301" name="msg_room" recv="yes">
728 <member name="channel" type="U16"/>
729 <member name="name" type="username"/>
730 <member name="message" type="STRING"/>
731 </message>
732
733 <message type="4302" name="part_room" recv="yes">
734 <member name="channel" type="U16"/>
735 <member name="user" type="user"/>
736 </message>
737
738 <message type="4303" name="del_room" recv="yes">
739 <member name="channel" type="U16"/>
740 </message>
741
742 <message type="4304" name="upd_games" recv="yes">
743 <member name="channel" type="U16"/>
744 <member name="games" type="game" array="yes"/>
745 </message>
746
747 <message type="4319" name="desc_room" recv="yes">
748 <member name="channel" type="U16"/>
749 <member name="owner" type="username"/>
750 <member name="description" type="STRING"/>
751 </message>
752
753 <h3>Game messages</h3>
754
755 <message type="4400" name="upd_chal" recv="yes">
756 Unclear.
757 <member name="channel" type="U16"/>
758 <member name="challenge" type="challenge"/>
759 </message>
760
761 <message type="4401" name="upd_game" recv="yes">
762 <member name="channel" type="U16"/>
763 <member name="game" type="game"/>
764 </message>
765
766 <message type="4402" name="del_game" recv="yes">
767 <member name="channel" type="U16"/>
768 </message>
769
770 <message type="4403" name="upd_observers" recv="yes">
771 <member name="channel" type="U16"/>
772 <member name="users" type="user" array="yes"/>
773 </message>
774
775 <message type="4404" name="del_observer" recv="yes">
776 <member name="channel" type="U16"/>
777 <member name="name" type="username"/>
778 </message>
779
780 <message type="4405" name="set_tree" recv="yes">
781 <member name="channel" type="U16"/>
782 <member name="tree" type="TREE"/>
783 </message>
784
785 <message type="4406" name="upd_tree" recv="yes">
786 <member name="channel" type="U16"/>
787 <member name="tree" type="TREE"/>
788 </message>
789
790 <message type="4407" name="set_node" recv="yes">
791 <member name="channel" type="U16"/>
792 <member name="node" type="U32"/>
793 </message>
794
795 <message type="4409" name="superko" recv="yes">
796 Superko-warning.
797 <member name="channel" type="U16"/>
798 </message>
799
800 <message type="440b" name="final_result" recv="yes">
801 <member name="channel" type="U16"/>
802 <member name="blackscore" type="scorevalues"/>
803 <member name="whitescore" type="scorevalues"/>
804 </message>
805
806 <message type="440e" name="req_undo" recv="yes">
807 <member name="channel" type="U16"/>
808
809 </message>
810
811 <message type="4410" name="resign_game" recv="yes">
812 <member name="channel" type="U16"/>
813 <member name="player" type="U8"/>
814 </message>
815
816 <message type="441a" name="set_teacher" recv="yes">
817 <member name="channel" type="U16"/>
818 <member name="name" type="username"/>
819 </message>
820
821 <message type="441d" name="owner_left" recv="yes">
822 Unclear.
823 <member name="channel" type="U16"/>
824 </message>
825
826 <message type="441e" name="teacher_left" recv="yes">
827 Unclear.
828 <member name="channel" type="U16"/>
829 </message>
830
831 <message type="4422" name="unknown4422" recv="yes">
832 change teacher? something to do with editing?
833 <member name="channel" type="U16"/>
834 <member name="name1" type="username"/>
835 <member name="name2" type="username"/>
836 </message>
837
838 <message type="4433" name="req_result" recv="yes">
839 Unclear.
840 <member name="channel" type="U16"/>
841 # # recv_result(?)
842 </message>
843
844 <message type="4434" name="unknown4434" recv="yes">
845 <member name="channel" type="U16"/>
846 <member name="b1" type="U8"/>
847 ?? !demonstration game??
848 </message>
849
850 </body>
851 </html>
852