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