ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/protocol.xml
Revision: 1.9
Committed: Thu Jun 5 17:54:18 2003 UTC (20 years, 11 months ago) by pcg
Content type: text/xml
Branch: MAIN
Changes since 1.8: +94 -5 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     <h1>KGS Protocol Description</h1>
26    
27     <p>This XML document describes the KGS protocol. It is also used
28     to automatically generate the perl parser for all the messages and
29     structures in the protocol. Adapting it to other languages should be
30     trivial.</p>
31    
32 pcg 1.4 <p>If you feel you need to update the visual appearance of this
33     document, feel free to look at <tt>doc/doc2html.xsl</tt> and improve
34     it.</p>
35    
36 pcg 1.8 <p>The current version of this document can always be found at
37     <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
38     the HTML version of it can be found
39     <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>.
40     </p>
41    
42 pcg 1.1 <h2>Structure and conventions of this document and the protocol</h2>
43    
44     <p>"Send" means messages send from the client to the server, while
45     "received" means messages send by the server to the client.</p>
46    
47 pcg 1.4 <p>Everything on the wire is in little-endian format (what a shame).</p>
48 pcg 1.1
49 pcg 1.4 <p>Primitive types are mostly integers (signed
50     "<code>I</code>&lt;bits&gt;", unsigned "<code>U</code>&lt;bits&gt;"),
51     ascii strings ("<code>username</code>"), or zero-terminated
52     UCS2-Strings ("<code>STRING</code>"). Yes, I know java is supposed to
53     do UTF-16, but no implementation seems to care...</p>
54 pcg 1.1
55     <p>For the rest, go figure or bug me, Marc Lehmann &lt;pcg@goof.com&gt;</p>
56    
57     <h2>Stream and message structure.</h2>
58    
59 pcg 1.4 <p>After connecting to the server, a handshake byte is sent. It's
60     the major version number of the protocol the client expects to
61     receive. Version 3 and 4 are mostly the same, except that Version 4
62     clients expect server messages to be compressed, version 3 clients
63     not.</p>
64    
65     <p>The server sends back his protocol number, which is always 3 in
66     the current protocol. Most of the protocol variation is determined by
67     the server using the client version that is used in the initial login
68     message, not the initial handshake byte.</p>
69 pcg 1.1
70     <p>After the initial handshake, the client sends uncompressed
71     messages, while the server sends back a zlib-compressed
72     stream (<a href="http://rfc1950.x42.com/">rfc1950</a> and <a
73     href="http://rfc1950.x42.com/">rfc1951</a>).</p>
74    
75     <p>All messages have the same header:</p>
76    
77 pcg 1.3 <struct name="message_header" send="yes" recv="yes">
78     <member name="_unknown" type="U16"/>
79     <member name="length" type="U16"/>
80 pcg 1.1 The length is the length of the full message including the header.
81 pcg 1.3 <member name="type" type="U16"/>
82 pcg 1.1 If the type is &gt;= 0x4000 this is a message for a specific channel. The channel
83 pcg 1.3 number is always the next U16.
84     </struct>
85    
86     <h2>Primitive types used in the protocol.</h2>
87    
88 pcg 1.9 <p>Apart from the basic types, I need to define some extra types to
89     deal with fixed-point values (based on integer types) or fixed-length
90     strings (either 7-bit-ascii or more limited (<code>A</code>), or UCS-2
91     based (<code>S</code>)).</p>
92 pcg 1.3
93     <type name="username" type="A" length="12"/>
94 pcg 1.9
95     <p>The basic user or login name, used throughout the protocol
96     as a handle to the user.</p>
97    
98 pcg 1.3 <type name="roomname" type="S" length="25"/><!-- argh, how horribly broken -->
99 pcg 1.9
100     <p>Many strings in the protocol are fixed-width for no good reason
101     (maybe this is one reason for using compression in enwer versions, as
102     the packets itself are wasting lots of space.</p>
103    
104 pcg 1.3 <type name="locale" type="A" length="5"/>
105 pcg 1.9
106     <p>A kind of locale specifier. It seems the general format seems to be
107     lowercase language, underscore, uppercase location, e.g. en_US. More
108     fancy specifications don't fit.</p>
109    
110 pcg 1.3 <type name="flag" type="U8" multiplier="1"/>
111 pcg 1.9
112     <p>Just a simple boolean value. 0 means false, and 1 generally true,
113     but I suggest ccepting != 0 as true.</p>
114    
115 pcg 1.6 <type name="komi16" type="I16" multiplier="2"/>
116     <type name="komi32" type="I32" multiplier="2"/>
117 pcg 1.9
118     <p>Komi values are multiplied by 2 to make them integer in the
119     protocol. Of course, sometimes they are encoded in 16 bits, sometimes
120     in 32. Get used to this.</p>
121    
122 pcg 1.3 <type name="result" type="I32" multiplier="2"/>
123 pcg 1.9
124     <p>The game result is also multiplied by four to give it higher
125     resolution. There are also special values for wins by time etc.</p>
126    
127 pcg 1.3 <type name="score" type="I32" multiplier="4"/>
128 pcg 1.9
129     <p>A score value (used for displaying the score at the end of a game)
130     are multiplied by four for a change. I have not yet seen 0.25 scores,
131     please somebody tell me where they happen, or if they happen.</p>
132    
133 pcg 1.7 <type name="time" type="U32" multiplier="1000"/>
134 pcg 1.1
135 pcg 1.9 <p>Time values are multiplied by 1000, giving them millisecond
136     accuracy.</p>
137    
138 pcg 1.2 <h2>Constants, enumeration and set types used in the protocol.</h2>
139 pcg 1.1
140     <p>Baaah... not yet.</p>
141    
142 pcg 1.3 <h2>Structs used in send &amp; receive messages</h2>
143 pcg 1.1
144 pcg 1.3 <struct name="user" class="KGS::User">
145 pcg 1.9
146     Everywhere a user + flags is required, even used in some places
147     where only a username is required. I see no general rule on when a
148     complete user and when a partial user is required.
149    
150 pcg 1.3 <member name="name" type="username"/>
151     <member name="flags" type="U32" default="1"/>
152     </struct>
153 pcg 1.1
154 pcg 1.6 <struct name="rules" class="KGS::Rules">
155 pcg 1.9
156     This structure is used for challanges as well as in the special
157     TREE "subprotocol". It tightly encodes the game parameters.
158    
159 pcg 1.6 <member name="ruleset" type="U8"/>
160     <member name="size" type="U8"/>
161     <member name="handicap" type="U8"/>
162     <member name="komi" type="komi16"/>
163     <member name="timesys" type="U8"/>
164     <member name="time" type="U32"/>
165     <member name="interval" type="U32"/>
166     byo-yomi time / canadian time
167     <member name="count" type="U16"/>
168     periods / moves
169     </struct>
170    
171 pcg 1.3 <h2>Structs used in send messages</h2>
172 pcg 1.1
173     <message type="0000" name="login" send="yes">
174 pcg 1.9
175     Send on the initial login. The password needs to be set when the
176     guest flag is true.
177    
178 pcg 1.3 <member name="ver_major" type="U32" default="2"/>
179     <member name="ver_minor" type="U32" default="4"/>
180     <member name="ver_micro" type="U32" default="67"/>
181     <member name="name" type="username"/>
182     <member name="password " type="U64" default="0"/>
183     Password is a number calculated as follows (VERY insecure, basically plaintext!):
184 pcg 1.4 password = 0; for char in characters do password ← password * 1055 + ascii_code (char);
185 pcg 1.3 <member name="guest" type="flag" default="1"/>
186     <member name="_unknown3" type="U16" default="0"/>
187     <member name="locale" type="locale" default='"en_US"'/>
188     <member name="clientver" type="DATA" default='"1.4.1_01:Swing app:Sun Microsystems Inc."'/>
189 pcg 1.4 The "default" is the java vm version, not exactly he client version. However,
190     you should always send a tetx like "Jonathan's C client bersion 0.6" or somesuch,
191     so the server can, if necessary, block broken clients or client versions.
192 pcg 1.1 </message>
193    
194 pcg 1.2 <message type="0014" name="server_stats" send="yes">
195 pcg 1.1 Request server statistics.
196     </message>
197    
198 pcg 1.2 <message type="0021" name="pic_req" send="yes">
199 pcg 1.9 Request a user picture from the server. Results in a userpic-reply
200     or a timeout :/.
201 pcg 1.3 <member name="name" type="username"/>
202 pcg 1.1 </message>
203    
204 pcg 1.2 <message type="0021" name="pic_upload" send="yes">
205 pcg 1.1 Same code as pic_req, but with an additional data section that
206 pcg 1.4 must contain a JPEG image that is &lt;=7KB. It must have 141×200 pixels.
207 pcg 1.3 <member name="name" type="username"/>
208 pcg 1.1 <member name="data" type="DATA"/>
209     </message>
210    
211 pcg 1.2 <message type="0100" name="gnotice" send="yes">
212 pcg 1.1 Send a global message. Maybe. Never tried, for obvious reasons :/
213     <member name="notice" type="STRING"/>
214     </message>
215    
216 pcg 1.2 <message type="0318" name="list_rooms" send="yes">
217 pcg 1.9 List the rooms in a specific group/category. Results in a upd_rooms message.
218 pcg 1.3 <member name="group" type="U8"/>
219 pcg 1.1 </message>
220    
221 pcg 1.2 <message type="031a" name="new_room" send="yes">
222 pcg 1.1 Create a new room. Not verified.
223 pcg 1.3 <member name="name" type="username"/>
224     <member name="i1" type="U32" default="0"/>
225     <member name="b1" type="U8" default="0"/>
226     <member name="b2" type="U8" default="255"/>
227     <member name="b3" type="U8" default="255"/>
228     <member name="group" type="U8" default="1"/>
229 pcg 1.1 <member name="name" type="STRING"/>
230     <member name="description" type="STRING"/>
231 pcg 1.3 <member name="flags" type="U8"/>
232 pcg 1.1 0x10 .. private room etc.. see code
233     </message>
234    
235     <message type="4300" name="join_room" send="yes">
236 pcg 1.9 Joins the given room. join_room messages for yourself
237     and all users in that room, as well as the initial gamelist, are
238     send if the room exists. If not, timeout...
239 pcg 1.3 <member name="channel" type="U16"/>
240 pcg 1.1 <member name="user" type="user"/>
241     </message>
242    
243     <message type="4301" name="msg_room" send="yes">
244 pcg 1.9 Send a message to the room.
245 pcg 1.3 <member name="channel" type="U16"/>
246     <member name="name" type="username"/>
247 pcg 1.9 Must be the login-name of the user.
248 pcg 1.1 <member name="message" type="STRING"/>
249     </message>
250    
251     <message type="4302" name="part_room" send="yes">
252 pcg 1.9 Remove yourself (or maybe others as admin) from a room.
253 pcg 1.3 <member name="channel" type="U16"/>
254     <member name="name" type="username"/>
255 pcg 1.1 </message>
256    
257     <message type="4305" name="new_game" send="yes">
258 pcg 1.9 Unclear.
259 pcg 1.3 <member name="channel" type="U16"/>
260     <member name="id" type="U16"/>
261     <member name="gametype" type="U32"/>
262 pcg 1.1 <member name="rules" type="rules"/>
263     <member name="notes" type="STRING"/>
264     </message>
265    
266     <message type="430b" name="req_games" send="yes">
267 pcg 1.9 Request to update room game list (send this once per minute to get
268     updated). Results in upd_games messages.
269 pcg 1.3 <member name="channel" type="U16"/>
270 pcg 1.1 </message>
271    
272     <message type="4319" name="req_desc" send="yes">
273     Request room description.
274 pcg 1.3 <member name="channel" type="U16"/>
275 pcg 1.1 </message>
276    
277     <message type="4400" name="send_chal" send="yes">
278 pcg 1.9 Unclear.
279 pcg 1.3 <member name="channel" type="U16"/>
280     <member name="black" type="username"/>
281     <member name="white" type="username"/>
282 pcg 1.1 More following... TREE or challenge.
283     </message>
284    
285     <message type="4403" name="join_game" send="yes">
286 pcg 1.9 Join a game. See join_room.
287 pcg 1.5 <member name="channel" type="U16"/>
288 pcg 1.1 <member name="user" type="user"/>
289     </message>
290    
291     <message type="4404" name="part_game" send="yes">
292 pcg 1.9 Leave (or kick as admin?) a certain user from a game.
293 pcg 1.3 <member name="channel" type="U16"/>
294     <member name="name" type="username"/>
295 pcg 1.1 </message>
296    
297     <message type="4405" name="set_tree" send="yes">
298 pcg 1.9 Upload a partial game tree to the server. This is used
299     to send moves and even in-game comments to the server. For the comments,
300     the server prepends the username and rank.
301 pcg 1.3 <member name="channel" type="U16"/>
302 pcg 1.1 <member name="tree" type="TREE"/>
303     </message>
304    
305     <message type="4408" name="get_tree" send="yes">
306 pcg 1.9 Request the game tree starting at a given node. This is used
307     when the server only sends a partial tree (with end code "more").
308 pcg 1.3 <member name="channel" type="U16"/>
309     <member name="node" type="U32"/>
310 pcg 1.1 </message>
311    
312     <message type="440c" name="claim_win" send="yes">
313 pcg 1.9 Unclear.
314 pcg 1.3 <member name="channel" type="U16"/>
315     <member name="_byte" type="U8 "/>
316 pcg 1.1 Player colour maybe? Unclear.
317     </message>
318    
319     <message type="440d" name="add_time" send="yes">
320 pcg 1.9 Not checked.
321    
322 pcg 1.3 <member name="channel" type="U16"/>
323     <member name="time" type="U32"/>
324     <member name="player" type="U8"/>
325 pcg 1.1 </message>
326    
327     <message type="440f" name="grant_undo" send="yes">
328 pcg 1.9 Can be send after a req_undo message was received to grant the undo.
329 pcg 1.3 <member name="channel" type="U16"/>
330 pcg 1.1 </message>
331    
332     <message type="4410" name="resign_game" send="yes">
333 pcg 1.9 Resign the game.
334 pcg 1.3 <member name="channel" type="U16"/>
335     <member name="player" type="U8"/>
336 pcg 1.1 </message>
337    
338     <message type="441a" name="set_teacher" send="yes">
339 pcg 1.9 Change the teacher to somebody else (or possibly yourself == take it).
340 pcg 1.3 <member name="channel" type="U16"/>
341     <member name="name" type="username"/>
342 pcg 1.1 </message>
343    
344     <message type="4422" name="add_user" send="yes">
345 pcg 1.9 Unclear. Maybe allow users to talk? No idea, really.
346    
347 pcg 1.3 <member name="channel" type="U16"/>
348     <member name="othername" type="username"/>
349     <member name="name" type="username"/>; # gives user access to the game (to what? ;)
350 pcg 1.1 </message>
351    
352     <message type="4423" name="set_privacy" send="yes">
353 pcg 1.9 Probably sets the "quiet" flag. Not checked.
354 pcg 1.3 <member name="channel" type="U16"/>
355     <member name="private" type="U8"/>
356 pcg 1.1 </message>
357    
358     <message type="4429" name="reject_chal" send="yes">
359 pcg 1.9 Reject a challenge from a given user. Not checked.
360    
361 pcg 1.3 <member name="channel" type="U16"/>
362     <member name="name" type="username"/>
363 pcg 1.1 </message>
364    
365     <message type="4433" name="req_result" send="yes">
366 pcg 1.9 I forgot.
367    
368 pcg 1.3 <member name="channel" type="U16"/>
369 pcg 1.1 </message>
370    
371 pcg 1.3 <h2>Structs mainly used in receive messages</h2>
372 pcg 1.1
373 pcg 1.3 <struct name="challenge_defaults">
374 pcg 1.9 Send soon after log-in to set the defaults for game challenges.
375 pcg 1.3 <member name="gametype" type="U32"/>
376     <member name="size" type="U32"/>
377     <member name="timesys" type="U32"/>
378     <member name="time" type="U32"/>
379     <member name="byo_time" type="U32"/>
380     <member name="byo_periods" type="U32"/>
381     <member name="can_time" type="U32"/>
382     <member name="can_stones" type="U32"/>
383     </struct>
384    
385     <struct name="challenge" class="KGS::Challenge">
386 pcg 1.9 A challenge.
387    
388 pcg 1.1 <member name="user1" type="user"/>
389     <member name="user2" type="user"/>
390 pcg 1.3 <member name="gametype" type="U32"/>
391 pcg 1.1 <member name="rules" type="rules"/>
392     Maybe the rules" are in TREE format. I forgot.
393 pcg 1.3 </struct>
394 pcg 1.1
395 pcg 1.3 <struct name="game" class="KGS::Game">
396 pcg 1.9 Basic information about a game. Used in rooms for the gamelist and
397     in games to detect when a game is saved, changed type (e.g. R => D)
398     etc.
399    
400 pcg 1.3 <member name="channel" type="U16"/>
401     <member name="type" type="U32"/>
402 pcg 1.1 <member name="user1" type="user"/>
403     White
404     <member name="user2" type="user"/>
405     Black
406     <member name="user3" type="user"/>
407     Owner
408 pcg 1.3 <member name="size" type="U32"/>
409 pcg 1.1 <member name="handicap" type="I32"/>
410     &lt; 0 not fully setup
411 pcg 1.6 <member name="komi" type="komi32"/>
412 pcg 1.3 <member name="moves" type="U16"/>
413     <member name="flags" type="U16"/>
414     <member name="observers" type="U32"/>
415     <member name="saved" type="flag"/>
416     <member name="notes" type="STRING" guard-member="handicap" guard-cond="&lt; 0"/>
417     </struct>
418    
419     <struct name="room_obs">
420 pcg 1.9 Obsolete.
421    
422 pcg 1.3 <member name="name" type="roomname"/>
423     <member name="channel" type="U16"/>
424     <member name="flags" type="U32"/>
425 pcg 1.4 <member name="users" type="U32"/>
426 pcg 1.3 </struct>
427    
428     <struct name="room" class="KGS::Room">
429     <member name="channel" type="U16"/>
430     <member name="flags" type="U8"/>
431     <member name="group" type="U8"/>
432     <member name="users" type="U16"/>
433     <member name="games" type="U16"/>
434 pcg 1.4 <member name="name" type="STRING"/>
435 pcg 1.3 </struct>
436 pcg 1.1
437 pcg 1.3 <struct name="score" class="KGS::Score">
438     <member name="score" type="score"/>
439     <member name="territory" type="U32"/>
440     <member name="captures" type="U32"/>
441     <member name="i3" type="U32"/>
442     <member name="f2" type="U32"/>
443 pcg 1.6 <member name="komi" type="komi32"/>
444 pcg 1.4 <member name="i4" type="U32"/>
445 pcg 1.3 Apparently the i3, f2, i4 are zero.
446     </struct>
447 pcg 1.1
448     <h2>Receive messages</h2>
449    
450     <message type="0001" name="login" recv="yes">
451 pcg 1.3 <member name="result" type="CONSTANT" default='"login ok"'/>
452 pcg 1.1 <member name="success" type="CONSTANT" default="1"/>
453     </message>
454    
455     <message type="0002" name="login" recv="yes">
456 pcg 1.3 <member name="result" type="CONSTANT" default='"guest login ok"'/>
457 pcg 1.1 <member name="success" type="CONSTANT" default="1"/>
458     </message>
459    
460     <message type="0003" name="login" recv="yes">
461 pcg 1.3 <member name="result" type="CONSTANT" default='"login error 3"'/>
462 pcg 1.1 ** maybe more following? **
463     </message>
464    
465     <message type="0004" name="login" recv="yes">
466 pcg 1.3 <member name="result" type="CONSTANT" default='"wrong password"'/>
467 pcg 1.1 ** maybe more following? **
468     </message>
469    
470     <message type="0005" name="login" recv="yes">
471 pcg 1.3 <member name="result" type="CONSTANT" default='"user unknown"'/>
472 pcg 1.1 ** maybe more following? **
473     </message>
474    
475     <message type="0006" name="login" recv="yes">
476 pcg 1.3 <member name="result" type="CONSTANT" default='"user exists"'/>
477 pcg 1.1 ** maybe more following? **
478     </message>
479    
480     <message type="0018" name="login" recv="yes">
481 pcg 1.3 <member name="result" type="CONSTANT" default='"login error 18"'/>
482 pcg 1.1 ** maybe more following? **
483     </message>
484    
485     <message type="0022" name="login" recv="yes">
486 pcg 1.7 <!-- "thanks" to jyem for blocking me ;)-->
487 pcg 1.3 <member name="result" type="CONSTANT" default='"user or ip blocked"'/>
488 pcg 1.1 <member name="reason" type="STRING"/>
489     </message>
490    
491     <message type="0013" name="msg_chat" recv="yes">
492 pcg 1.3 <member name="user1" type="username"/>
493     <member name="user2" type="username"/>
494 pcg 1.1 <member name="message" type="STRING"/>
495     </message>
496    
497     <message type="0015" name="stats" recv="yes">
498 pcg 1.3 <member name="ver_major" type="U16"/>
499     <member name="ver_minor" type="U16"/>
500     <member name="ver_micro" type="U16"/>
501     <member name="boot_time" type="U64"/>
502     <member name="users_cur" type="U32"/>
503     <member name="users_max" type="U32"/>
504     <member name="users_lim" type="U32"/>
505     <member name="accts_cur" type="U32"/>
506     <member name="accts_max" type="U32"/>
507     <member name="unknown1" type="U32"/>
508     <member name="work_max" type="U32"/>
509     <member name="rooms_cur" type="U32"/>
510     <member name="rooms_max" type="U32"/>
511     <member name="rooms_lim" type="U32"/>
512     <member name="games_cur" type="U32"/>
513     <member name="games_max" type="U32"/>
514     <member name="games_lim" type="U32"/>
515     <member name="results_cur" type="U32"/>
516     <member name="results_max" type="U32"/>
517     <member name="unknown2" type="U32"/>
518     <member name="params_cur" type="U32"/>
519     <member name="params_max" type="U32"/>
520     <member name="bytes_in" type="U64"/>
521     <member name="packets_in" type="U64"/>
522     <member name="bytes_out" type="U64"/>
523 pcg 1.4 <member name="packets_out" type="U64"/>
524 pcg 1.1 </message>
525    
526     <message type="0016" name="idle_warn" recv="yes">
527     idle warning, autologout soon (10 minutes...)
528     </message>
529    
530     <message type="001b" name="timewarning_default" recv="yes">
531     WILD guess
532 pcg 1.3 <member name="channel" type="U16"/>
533     <member name="time" type="U16"/>
534 pcg 1.1 </message>
535    
536     <message type="001c" name="idle_err" recv="yes">
537     autologout
538     </message>
539    
540     <message type="001d" name="ping" recv="yes">
541     </message>
542    
543     <message type="0021" name="userpic" recv="yes">
544 pcg 1.3 <member name="name" type="username"/>
545 pcg 1.1 Reply to pic_req, contains an image in jpeg format.
546     <member name="data" type="DATA"/>
547     </message>
548    
549     <message type="0100" name="gnotice" recv="yes">
550     global notice, sent to everybody
551     <member name="notice" type="STRING"/>
552     </message>
553    
554    
555     <message type="0310" name="priv_room" recv="yes">
556     "permission denied" when joining a room
557     <member name="name" type="STRING"/>
558     </message>
559    
560     <message type="0318" name="upd_rooms" recv="yes">
561     <member name="rooms" type="room" array="yes"/>
562     </message>
563    
564     <message type="041c" name="upd_game2" recv="yes">
565 pcg 1.3 <member name="channel_junk" type="U16"/>
566 pcg 1.1 <member name="game" type="game"/>
567     </message>
568    
569     <message type="0202" name="upd_user" recv="yes">
570     # loc 0" type="chat(?) loc 1 => gameinfo?, loc 2 => game result (more data)
571 pcg 1.3 <member name="location" type="U32"/>
572 pcg 1.1 <member name="user" type="user"/>
573 pcg 1.3 <member name="lotsofinfo" type="DATA" guard-member="location" guard-cond="== 2"/>
574 pcg 1.1 </message>
575    
576     <h3>Room messages</h3>
577    
578     <p>Not all room messages are for rooms only, and rooms need to parse
579     not only these messages. Orthogonality, what for?</p>
580    
581     <message type="4300" name="join_room" recv="yes">
582 pcg 1.3 <member name="channel" type="U16"/>
583 pcg 1.1 <member name="users" type="user" array="yes"/>
584     </message>
585    
586     <message type="4301" name="msg_room" recv="yes">
587 pcg 1.3 <member name="channel" type="U16"/>
588     <member name="name" type="username"/>
589 pcg 1.1 <member name="message" type="STRING"/>
590     </message>
591    
592     <message type="4302" name="part_room" recv="yes">
593 pcg 1.3 <member name="channel" type="U16"/>
594 pcg 1.1 <member name="user" type="user"/>
595     </message>
596    
597     <message type="4303" name="del_room" recv="yes">
598 pcg 1.3 <member name="channel" type="U16"/>
599 pcg 1.1
600     </message>
601    
602     <message type="4304" name="upd_games" recv="yes">
603 pcg 1.3 <member name="channel" type="U16"/>
604 pcg 1.1 <member name="games" type="game" array="yes"/>
605     </message>
606    
607     <message type="4319" name="desc_room" recv="yes">
608 pcg 1.3 <member name="channel" type="U16"/>
609     <member name="owner" type="username"/>
610 pcg 1.1 <member name="description" type="STRING"/>
611     </message>
612    
613    
614     <message type="0411" name="chal_defaults" recv="yes">
615 pcg 1.3 <member name="channel" type="U16"/>
616 pcg 1.1 <member name="defaults" type="challenge_defaults"/>
617     </message>
618    
619     <h3>Game messages</h3>
620    
621     <message type="4400" name="upd_chal" recv="yes">
622     Unclear.
623 pcg 1.3 <member name="channel" type="U16"/>
624 pcg 1.1 <member name="challenge" type="challenge"/>
625     </message>
626    
627     <message type="4401" name="upd_game" recv="yes">
628 pcg 1.3 <member name="channel" type="U16"/>
629 pcg 1.1 <member name="game" type="game"/>
630     </message>
631    
632     <message type="4402" name="del_game" recv="yes">
633 pcg 1.3 <member name="channel" type="U16"/>
634 pcg 1.1 </message>
635    
636     <message type="4403" name="upd_observers" recv="yes">
637 pcg 1.3 <member name="channel" type="U16"/>
638 pcg 1.1 <member name="users" type="user" array="yes"/>
639     </message>
640    
641     <message type="4404" name="del_observer" recv="yes">
642 pcg 1.3 <member name="channel" type="U16"/>
643     <member name="name" type="username"/>
644 pcg 1.1 </message>
645    
646     <message type="4405" name="set_tree" recv="yes">
647 pcg 1.3 <member name="channel" type="U16"/>
648 pcg 1.1 <member name="tree" type="TREE"/>
649     </message>
650    
651     <message type="4406" name="upd_tree" recv="yes">
652 pcg 1.3 <member name="channel" type="U16"/>
653 pcg 1.1 <member name="tree" type="TREE"/>
654     </message>
655    
656     <message type="4407" name="set_node" recv="yes">
657 pcg 1.3 <member name="channel" type="U16"/>
658     <member name="node" type="U32"/>
659 pcg 1.1 </message>
660    
661     <message type="4409" name="superko" recv="yes">
662     Superko-warning.
663 pcg 1.3 <member name="channel" type="U16"/>
664 pcg 1.1 </message>
665    
666     <message type="440b" name="final_result" recv="yes">
667 pcg 1.3 <member name="channel" type="U16"/>
668 pcg 1.1 <member name="blackscore" type="score"/>
669     <member name="whitescore" type="score"/>
670     </message>
671    
672     <message type="440e" name="req_undo" recv="yes">
673 pcg 1.3 <member name="channel" type="U16"/>
674 pcg 1.1
675     </message>
676    
677     <message type="4410" name="resign_game" recv="yes">
678 pcg 1.3 <member name="channel" type="U16"/>
679     <member name="player" type="U8"/>
680 pcg 1.1 </message>
681    
682     <message type="441a" name="set_teacher" recv="yes">
683 pcg 1.3 <member name="channel" type="U16"/>
684     <member name="name" type="username"/>
685 pcg 1.1 </message>
686    
687     <message type="441d" name="owner_left" recv="yes">
688     Unclear.
689 pcg 1.3 <member name="channel" type="U16"/>
690 pcg 1.1 </message>
691    
692     <message type="441e" name="teacher_left" recv="yes">
693     Unclear.
694 pcg 1.3 <member name="channel" type="U16"/>
695 pcg 1.1 </message>
696    
697     <message type="4422" name="unknown4422" recv="yes">
698     change teacher? something to do with editing?
699 pcg 1.3 <member name="channel" type="U16"/>
700     <member name="name1" type="username"/>
701     <member name="name2" type="username"/>
702 pcg 1.1 </message>
703    
704     <message type="4433" name="req_result" recv="yes">
705     Unclear.
706 pcg 1.3 <member name="channel" type="U16"/>
707 pcg 1.1 # # recv_result(?)
708     </message>
709    
710     <message type="4434" name="unknown4434" recv="yes">
711 pcg 1.3 <member name="channel" type="U16"/>
712     <member name="b1" type="U8"/>
713 pcg 1.1 ?? !demonstration game??
714     </message>
715    
716     </body>
717     </html>
718