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