ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/protocol.xml
Revision: 1.36
Committed: Mon Aug 4 00:30:08 2003 UTC (20 years, 10 months ago) by pcg
Content type: text/xml
Branch: MAIN
Changes since 1.35: +18 -2 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.36 <h1>$Revision: 1.35 $</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 pcg 1.33 almost trivial.</p>
33 pcg 1.10
34     <p><b>Please note that the author of KGS has told me that he will
35 pcg 1.32 change the protocol in response to my efforts. No problems with
36     changing the protocol for good, but he does this just to make it
37     more difficult to reverse-engineer it, since his changes are neither
38     required, nor useful (they just make the protocol less robust, without
39     adding added value). He doesn't even care that this locks out some
40     users who cannot upgrade (cgoban2 isn't available for their platform
41     anymore). It hurts to see such a waste of time and efforts that could have been used
42     to fix bugs or improve the client...</b></p>
43 pcg 1.1
44 pcg 1.4 <p>If you feel you need to update the visual appearance of this
45 pcg 1.11 document, feel free to look <tt>doc/doc2html.xsl</tt> and improve
46 pcg 1.4 it.</p>
47    
48 pcg 1.8 <p>The current version of this document can always be found at
49     <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
50     the HTML version of it can be found
51     <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>.
52 pcg 1.32 (update: sourceforge is weeks behind on their anonymous cvs servers so the above might be out-of-date. sorry.)</p>
53 pcg 1.23
54 pcg 1.1 <h2>Structure and conventions of this document and the protocol</h2>
55    
56 pcg 1.32 <p>"ORIGIN: CLIENT" means messages send from the client to the server,
57     while "ORIGIN: SERVER" means messages send by the server to the
58     client.</p>
59 pcg 1.1
60 pcg 1.4 <p>Everything on the wire is in little-endian format (what a shame).</p>
61 pcg 1.1
62 pcg 1.4 <p>Primitive types are mostly integers (signed
63     "<code>I</code>&lt;bits&gt;", unsigned "<code>U</code>&lt;bits&gt;"),
64     ascii strings ("<code>username</code>"), or zero-terminated
65     UCS2-Strings ("<code>STRING</code>"). Yes, I know java is supposed to
66     do UTF-16, but no implementation seems to care...</p>
67 pcg 1.1
68 pcg 1.17 <p>For the rest, go figure or bug me, <a href="mailto:pcg@goof.com">Marc Lehmann &lt;pcg@goof.com&gt;</a></p>
69 pcg 1.1
70     <h2>Stream and message structure.</h2>
71    
72 pcg 1.4 <p>After connecting to the server, a handshake byte is sent. It's
73     the major version number of the protocol the client expects to
74     receive. Version 3 and 4 are mostly the same, except that Version 4
75     clients expect server messages to be compressed, version 3 clients
76     not.</p>
77    
78     <p>The server sends back his protocol number, which is always 3 in
79     the current protocol. Most of the protocol variation is determined by
80     the server using the client version that is used in the initial login
81     message, not the initial handshake byte.</p>
82 pcg 1.1
83     <p>After the initial handshake, the client sends uncompressed
84     messages, while the server sends back a zlib-compressed
85     stream (<a href="http://rfc1950.x42.com/">rfc1950</a> and <a
86     href="http://rfc1950.x42.com/">rfc1951</a>).</p>
87    
88     <p>All messages have the same header:</p>
89    
90 pcg 1.28 <struct name="message_header">
91 pcg 1.3 <member name="_unknown" type="U16"/>
92     <member name="length" type="U16"/>
93 pcg 1.23
94 pcg 1.18 <p>The length is the length of the full message including the header.</p>
95 pcg 1.23
96 pcg 1.24 <p>Beginning with version 2.5.x, a number is xored into the low
97     byte of the length in <em>sent</em> packages only, as given by the
98     following recurrence: <code>rand[0] = 0; rand[i+1] = msg[i].length
99     + (rand[i] * 0x04c2af9b + 0xfffffffb); xorbyte = rand &gt;&gt;
100     24</code>, all in 32 bit unsigned iso-c arithmetic.</p>
101 pcg 1.23
102 pcg 1.3 <member name="type" type="U16"/>
103 pcg 1.18 <p>If the type is &gt;= 0x4000 this is a message for a specific channel. The channel
104     number is always the next U16.</p>
105 pcg 1.24
106     <p>Beginning with version 2.5.x, a number is <em>added</em> on <em>received</em>
107     messages only. The algorithm is as follows:
108    
109     <pre>
110     msglen &lt; 44: type = typefield
111     msglen &gt; 44: type = (typefield + rand[i]) % 0x10000
112     rand[0] = 0
113     rand[i+1] = username[type % length username] + rand[i] * (type - 0x6cdd)
114     where username is the user name of the logged-in user. coooool.
115     </pre>
116     </p>
117    
118 pcg 1.3 </struct>
119    
120     <h2>Primitive types used in the protocol.</h2>
121    
122 pcg 1.9 <p>Apart from the basic types, I need to define some extra types to
123     deal with fixed-point values (based on integer types) or fixed-length
124     strings (either 7-bit-ascii or more limited (<code>A</code>), or UCS-2
125     based (<code>S</code>)).</p>
126 pcg 1.3
127 pcg 1.23 <type name="username" type="A" length="10"/>
128 pcg 1.9
129     <p>The basic user or login name, used throughout the protocol
130     as a handle to the user.</p>
131    
132 pcg 1.3 <type name="roomname" type="S" length="25"/><!-- argh, how horribly broken -->
133 pcg 1.9
134     <p>Many strings in the protocol are fixed-width for no good reason
135 pcg 1.18 (maybe this is one reason for using compression in newer versions, as
136 pcg 1.9 the packets itself are wasting lots of space.</p>
137    
138 pcg 1.16 <type name="realname" type="S" length="50"/>
139     <type name="email" type="S" length="70"/>
140     <type name="userinfo" type="S" length="1000"/>
141     <type name="url" type="A" length="100"/>
142    
143     <p>Used in user_record.</p>
144    
145 pcg 1.3 <type name="locale" type="A" length="5"/>
146 pcg 1.9
147     <p>A kind of locale specifier. It seems the general format seems to be
148     lowercase language, underscore, uppercase location, e.g. en_US. More
149     fancy specifications don't fit.</p>
150    
151 pcg 1.3 <type name="flag" type="U8" multiplier="1"/>
152 pcg 1.9
153     <p>Just a simple boolean value. 0 means false, and 1 generally true,
154     but I suggest ccepting != 0 as true.</p>
155    
156 pcg 1.6 <type name="komi16" type="I16" multiplier="2"/>
157     <type name="komi32" type="I32" multiplier="2"/>
158 pcg 1.20 <type name="komi324" type="I32" multiplier="4"/>
159 pcg 1.9
160     <p>Komi values are multiplied by 2 to make them integer in the
161 pcg 1.20 protocol. Well, *most* of the time at least...</p>
162 pcg 1.9
163 pcg 1.3 <type name="result" type="I32" multiplier="2"/>
164 pcg 1.9
165 pcg 1.15 <p>The game result is also multiplied by two to give it higher
166     resolution. There are also special values for wins by time etc., either
167     in result or in the score* types, or both :)</p>
168 pcg 1.9
169 pcg 1.13 <type name="score16" type="I16" multiplier="4"/>
170     <type name="score32" type="I32" multiplier="4"/>
171 pcg 1.27 <type name="score1000" type="I32" multiplier="1000"/>
172 pcg 1.9
173     <p>A score value (used for displaying the score at the end of a game)
174 pcg 1.15 are multiplied by four for a change (the 0.25 resolution is not
175     used). In game structures it is encoded by dividing by two, though, so
176 pcg 1.27 watch out! And in some others, it's encoded by multiplying by 1000...
177     yuck!</p>
178 pcg 1.9
179 pcg 1.7 <type name="time" type="U32" multiplier="1000"/>
180 pcg 1.1
181 pcg 1.9 <p>Time values are multiplied by 1000, giving them millisecond
182     accuracy.</p>
183    
184 pcg 1.16 <type name="timestamp" type="U64" multiplier="1000"/>
185    
186     <p>64 bit timeval, milliseconds since posix epoch, e.g. <code>my
187     ($year, $month, $day) = (gmtime $date * 0.001)[5,4,3];</code></p>
188    
189 pcg 1.17 <type name="password" type="U64"/>
190    
191     <p>Password is a number calculated as follows (VERY insecure, basically
192     plaintext!): <code>password = 0; for char in characters do password ←
193     password * 1055 + ascii_code (char)</code></p>
194    
195 pcg 1.2 <h2>Constants, enumeration and set types used in the protocol.</h2>
196 pcg 1.1
197     <p>Baaah... not yet.</p>
198    
199 pcg 1.3 <h2>Structs used in send &amp; receive messages</h2>
200 pcg 1.1
201 pcg 1.3 <struct name="user" class="KGS::User">
202 pcg 1.9
203 pcg 1.18 <p>Everywhere a user + flags is required, even used in some places
204 pcg 1.9 where only a username is required. I see no general rule on when a
205 pcg 1.18 complete user and when a partial user is required.</p>
206 pcg 1.9
207 pcg 1.3 <member name="name" type="username"/>
208     <member name="flags" type="U32" default="1"/>
209     </struct>
210 pcg 1.1
211 pcg 1.6 <struct name="rules" class="KGS::Rules">
212 pcg 1.9
213 pcg 1.18 <p>This structure is used for challanges as well as in the special
214     TREE "subprotocol". It tightly encodes the game parameters.</p>
215 pcg 1.9
216 pcg 1.6 <member name="ruleset" type="U8"/>
217     <member name="size" type="U8"/>
218     <member name="handicap" type="U8"/>
219     <member name="komi" type="komi16"/>
220     <member name="timesys" type="U8"/>
221     <member name="time" type="U32"/>
222     <member name="interval" type="U32"/>
223     byo-yomi time / canadian time
224     <member name="count" type="U16"/>
225     periods / moves
226     </struct>
227    
228 pcg 1.32 <h2>Structs used in messages from the client</h2>
229 pcg 1.1
230 pcg 1.32 <h2>Client-generated messages</h2>
231 pcg 1.18
232 pcg 1.31 <message type="0000" name="login" src="client">
233 pcg 1.9
234 pcg 1.18 <p>Sent to login, usually the first message sent. The password needs to be set when the
235 pcg 1.9 guest flag is true.
236 pcg 1.18 Possible replies: <ref reply="login"/>. Followed by: <ref reply="timewarning_default"/> <ref reply="chal_defaults"/>
237     </p>
238 pcg 1.9
239 pcg 1.3 <member name="ver_major" type="U32" default="2"/>
240 pcg 1.23 <member name="ver_minor" type="U32" default="5"/>
241     <member name="ver_micro" type="U32" default="1"/>
242 pcg 1.3 <member name="name" type="username"/>
243 pcg 1.17 <member name="password" type="password" default="0"/>
244 pcg 1.3 <member name="guest" type="flag" default="1"/>
245     <member name="_unknown3" type="U16" default="0"/>
246     <member name="locale" type="locale" default='"en_US"'/>
247     <member name="clientver" type="DATA" default='"1.4.1_01:Swing app:Sun Microsystems Inc."'/>
248 pcg 1.4 The "default" is the java vm version, not exactly he client version. However,
249 pcg 1.18 you should always send a text like "Jonathan's C client bersion 0.6" or somesuch,
250 pcg 1.4 so the server can, if necessary, block broken clients or client versions.
251 pcg 1.1 </message>
252    
253 pcg 1.31 <message type="0007" name="req_userinfo" src="client">
254 pcg 1.18 <p>Request info about a certain user. Possible reply: <ref reply="userinfo"/></p>
255 pcg 1.17 <member name="name" type="username"/>
256     </message>
257    
258 pcg 1.31 <message type="0007" name="update_userinfo" src="client">
259 pcg 1.18 <p>Update user info. Message structure is very similar
260     to <ref ref="userinfo"/>.</p>
261 pcg 1.17 <member name="setpass" type="flag"/>
262     Should the password be updated?
263     <member name="password" type="password" default="0"/>
264     <member name="realname" type="realname"/>
265     <member name="email" type="email"/>
266     <member name="info" type="userinfo"/>
267     <member name="homepage" type="url"/>
268     <member name="_unused" type="U64" default="0"/>
269     <member name="_unused" type="U64" default="0"/>
270     </message>
271    
272 pcg 1.36 <message type="0013" name="msg_chat" src="client">
273     <p>This message is sent to initiate or continue a private chat with
274     a user. You'll always receive a copy of what you have sent back
275     from the server (as usual).</p>
276    
277     <member name="name" type="username"/>
278     Name of sender ("yourself").
279     <member name="name2" type="username"/>
280     Name of recipient.
281     <member name="message" type="STRING"/>
282     The message.
283     </message>
284    
285 pcg 1.31 <message type="0014" name="req_stats" src="client">
286 pcg 1.18 <p>Request server statistics. Replied with <ref reply="stats"/></p>
287 pcg 1.19 </message>
288    
289 pcg 1.31 <message type="0016" name="idle_reset" src="client">
290 pcg 1.29 <p>Send in response to <ref reply="idle_warn"/> to keep the server from disconnecting.</p>
291     </message>
292    
293 pcg 1.31 <message type="001d" name="ping" src="client">
294 pcg 1.19 <p>Wild guess, I send it in <ref ref="idle_warn"/>.</p>
295 pcg 1.1 </message>
296    
297 pcg 1.31 <message type="001e" name="req_usergraph" src="client">
298 pcg 1.18 <p>Request user graph data, replied with <ref reply="usergraph"/>.</p>
299 pcg 1.17 <member name="name" type="username"/>
300     </message>
301    
302 pcg 1.31 <message type="001f" name="fetch_memos" src="client">
303 pcg 1.18 <p>Unclear. Fetch all outstanding memos? Replied with <ref reply="memo"/></p>
304 pcg 1.17 </message>
305    
306 pcg 1.31 <message type="0021" name="req_pic" src="client">
307 pcg 1.18 <p>Request a user picture from the server. Results in a <ref reply="userpic"/>
308     or a timeout.</p>
309 pcg 1.3 <member name="name" type="username"/>
310 pcg 1.1 </message>
311    
312 pcg 1.31 <message type="0021" name="upload_pic" src="client">
313 pcg 1.1 Same code as pic_req, but with an additional data section that
314 pcg 1.4 must contain a JPEG image that is &lt;=7KB. It must have 141×200 pixels.
315 pcg 1.3 <member name="name" type="username"/>
316 pcg 1.1 <member name="data" type="DATA"/>
317 pcg 1.29 </message>
318    
319 pcg 1.31 <message type="0023" name="send_memo" src="client">
320 pcg 1.29 <member name="name" type="username"/>
321     <member name="msg" type="STRING"/>
322 pcg 1.1 </message>
323    
324 pcg 1.31 <message type="0100" name="gnotice" src="client">
325 pcg 1.18 <p>Send a global message. Maybe. Never tried, for obvious reasons :/. Results
326     in a <ref reply="gnotice"/> sent to all users.</p>
327 pcg 1.1 <member name="notice" type="STRING"/>
328     </message>
329    
330 pcg 1.33 <message type="0200" name="notify_add" src="client">
331    
332     <p>Probably setting a notifier on a username, to get informed about
333 pcg 1.36 changes using <ref reply="notify_upd"/> messages. sending your own
334     username gives you a disconnect, so don't do that at home, kids!</p>
335 pcg 1.33
336     <member name="name" type="username"/>
337     </message>
338    
339     <message type="0201" name="notify_del" src="client">
340    
341     <p>Probably remove the notifier again.</p>
342    
343     <member name="name" type="username"/>
344     </message>
345    
346 pcg 1.31 <message type="0318" name="list_rooms" src="client">
347 pcg 1.18 <p>List the rooms in a specific group/category. Results in a <ref reply="upd_rooms"/> message.</p>
348 pcg 1.3 <member name="group" type="U8"/>
349 pcg 1.1 </message>
350    
351 pcg 1.31 <message type="031a" name="new_room" src="client">
352 pcg 1.1 Create a new room. Not verified.
353 pcg 1.3 <member name="name" type="username"/>
354     <member name="i1" type="U32" default="0"/>
355     <member name="b1" type="U8" default="0"/>
356     <member name="b2" type="U8" default="255"/>
357     <member name="b3" type="U8" default="255"/>
358     <member name="group" type="U8" default="1"/>
359 pcg 1.1 <member name="name" type="STRING"/>
360     <member name="description" type="STRING"/>
361 pcg 1.3 <member name="flags" type="U8"/>
362 pcg 1.1 0x10 .. private room etc.. see code
363     </message>
364    
365 pcg 1.31 <message type="0413" name="req_game_record" src="client">
366 pcg 1.18 <p>Requests part of the users game record to be sent. Results in a <ref reply="game_record"/> or maybe a timeout.</p>
367 pcg 1.16 <member name="name" type="username"/>
368     <member name="timestamp" type="timestamp"/>
369     If zero, start at the newest games, else only send games
370     before the given timestap.
371     </message>
372    
373 pcg 1.31 <message type="4300" name="join_room" src="client">
374 pcg 1.18 <p>Joins the given room. <ref reply="join_room"/> messages for yourself
375 pcg 1.9 and all users in that room, as well as the initial gamelist, are
376 pcg 1.18 send if the room exists. If not, timeout...</p>
377 pcg 1.3 <member name="channel" type="U16"/>
378 pcg 1.1 <member name="user" type="user"/>
379     </message>
380    
381 pcg 1.31 <message type="4301" name="msg_room" src="client">
382 pcg 1.9 Send a message to the room.
383 pcg 1.3 <member name="channel" type="U16"/>
384     <member name="name" type="username"/>
385 pcg 1.9 Must be the login-name of the user.
386 pcg 1.1 <member name="message" type="STRING"/>
387     </message>
388    
389 pcg 1.31 <message type="4302" name="part_room" src="client">
390 pcg 1.9 Remove yourself (or maybe others as admin) from a room.
391 pcg 1.3 <member name="channel" type="U16"/>
392     <member name="name" type="username"/>
393 pcg 1.1 </message>
394    
395 pcg 1.31 <message type="4305" name="new_game" src="client">
396 pcg 1.17 Unclear. Start a new game.
397 pcg 1.3 <member name="channel" type="U16"/>
398     <member name="id" type="U16"/>
399     <member name="gametype" type="U32"/>
400 pcg 1.1 <member name="rules" type="rules"/>
401     <member name="notes" type="STRING"/>
402     </message>
403    
404 pcg 1.31 <message type="430b" name="req_games" src="client">
405 pcg 1.9 Request to update room game list (send this once per minute to get
406     updated). Results in upd_games messages.
407 pcg 1.3 <member name="channel" type="U16"/>
408 pcg 1.1 </message>
409    
410 pcg 1.31 <message type="4319" name="req_desc" src="client">
411 pcg 1.1 Request room description.
412 pcg 1.3 <member name="channel" type="U16"/>
413 pcg 1.1 </message>
414    
415 pcg 1.31 <message type="4400" name="send_challenge" src="client">
416 pcg 1.9 Unclear.
417 pcg 1.3 <member name="channel" type="U16"/>
418     <member name="black" type="username"/>
419     <member name="white" type="username"/>
420 pcg 1.1 More following... TREE or challenge.
421     </message>
422    
423 pcg 1.31 <message type="4403" name="join_game" src="client">
424 pcg 1.9 Join a game. See join_room.
425 pcg 1.5 <member name="channel" type="U16"/>
426 pcg 1.1 <member name="user" type="user"/>
427     </message>
428    
429 pcg 1.31 <message type="4404" name="part_game" src="client">
430 pcg 1.9 Leave (or kick as admin?) a certain user from a game.
431 pcg 1.3 <member name="channel" type="U16"/>
432     <member name="name" type="username"/>
433 pcg 1.1 </message>
434    
435 pcg 1.35 <message type="4405" name="set_tree" src="client">
436     Possibly upload an initial game to an empty room. Not tested.
437    
438     <member name="channel" type="U16"/>
439     <member name="tree" type="TREE"/>
440     </message>
441    
442 pcg 1.31 <message type="4406" name="upd_tree" src="client">
443 pcg 1.28 Upload a partial game tree to the server. This is used to send moves
444     and even in-game comments to the server. For the comments, the
445     server prepends the username and rank.
446    
447 pcg 1.3 <member name="channel" type="U16"/>
448 pcg 1.1 <member name="tree" type="TREE"/>
449     </message>
450    
451 pcg 1.31 <message type="4408" name="get_tree" src="client">
452 pcg 1.9 Request the game tree starting at a given node. This is used
453     when the server only sends a partial tree (with end code "more").
454 pcg 1.3 <member name="channel" type="U16"/>
455     <member name="node" type="U32"/>
456 pcg 1.1 </message>
457    
458 pcg 1.31 <message type="440c" name="claim_win" src="client">
459 pcg 1.9 Unclear.
460 pcg 1.3 <member name="channel" type="U16"/>
461     <member name="_byte" type="U8 "/>
462 pcg 1.1 Player colour maybe? Unclear.
463     </message>
464    
465 pcg 1.31 <message type="440d" name="add_time" src="client">
466 pcg 1.9 Not checked.
467    
468 pcg 1.3 <member name="channel" type="U16"/>
469     <member name="time" type="U32"/>
470     <member name="player" type="U8"/>
471 pcg 1.1 </message>
472    
473 pcg 1.31 <message type="440f" name="grant_undo" src="client">
474 pcg 1.9 Can be send after a req_undo message was received to grant the undo.
475 pcg 1.3 <member name="channel" type="U16"/>
476 pcg 1.1 </message>
477    
478 pcg 1.31 <message type="4410" name="resign_game" src="client">
479 pcg 1.9 Resign the game.
480 pcg 1.3 <member name="channel" type="U16"/>
481     <member name="player" type="U8"/>
482 pcg 1.1 </message>
483    
484 pcg 1.31 <message type="441a" name="set_teacher" src="client">
485 pcg 1.9 Change the teacher to somebody else (or possibly yourself == take it).
486 pcg 1.3 <member name="channel" type="U16"/>
487     <member name="name" type="username"/>
488 pcg 1.1 </message>
489    
490 pcg 1.31 <message type="4422" name="add_user" src="client">
491 pcg 1.9 Unclear. Maybe allow users to talk? No idea, really.
492    
493 pcg 1.3 <member name="channel" type="U16"/>
494     <member name="othername" type="username"/>
495     <member name="name" type="username"/>; # gives user access to the game (to what? ;)
496 pcg 1.1 </message>
497    
498 pcg 1.31 <message type="4423" name="set_privacy" src="client">
499 pcg 1.9 Probably sets the "quiet" flag. Not checked.
500 pcg 1.3 <member name="channel" type="U16"/>
501     <member name="private" type="U8"/>
502 pcg 1.1 </message>
503    
504 pcg 1.31 <message type="4429" name="reject_challenge" src="client">
505 pcg 1.9 Reject a challenge from a given user. Not checked.
506    
507 pcg 1.3 <member name="channel" type="U16"/>
508     <member name="name" type="username"/>
509 pcg 1.1 </message>
510    
511 pcg 1.31 <message type="4433" name="req_result" src="client">
512 pcg 1.9 I forgot.
513    
514 pcg 1.3 <member name="channel" type="U16"/>
515 pcg 1.35 </message>
516    
517     <message type="4436" name="msg_game" src="client">
518     <member name="channel" type="U16"/>
519     <member name="message" type="STRING"/>
520 pcg 1.1 </message>
521    
522 pcg 1.32 <h2>Structs mainly used in messages send by the server</h2>
523 pcg 1.1
524 pcg 1.3 <struct name="challenge_defaults">
525 pcg 1.9 Send soon after log-in to set the defaults for game challenges.
526 pcg 1.3 <member name="gametype" type="U32"/>
527     <member name="size" type="U32"/>
528     <member name="timesys" type="U32"/>
529     <member name="time" type="U32"/>
530     <member name="byo_time" type="U32"/>
531     <member name="byo_periods" type="U32"/>
532     <member name="can_time" type="U32"/>
533     <member name="can_stones" type="U32"/>
534     </struct>
535    
536     <struct name="challenge" class="KGS::Challenge">
537 pcg 1.9 A challenge.
538    
539 pcg 1.1 <member name="user1" type="user"/>
540     <member name="user2" type="user"/>
541 pcg 1.3 <member name="gametype" type="U32"/>
542 pcg 1.1 <member name="rules" type="rules"/>
543     Maybe the rules" are in TREE format. I forgot.
544 pcg 1.3 </struct>
545 pcg 1.1
546 pcg 1.3 <struct name="game" class="KGS::Game">
547 pcg 1.9 Basic information about a game. Used in rooms for the gamelist and
548     in games to detect when a game is saved, changed type (e.g. R => D)
549     etc.
550    
551 pcg 1.3 <member name="channel" type="U16"/>
552 pcg 1.26 <member name="type" type="U8"/>
553 pcg 1.1 <member name="user1" type="user"/>
554     White
555     <member name="user2" type="user"/>
556     Black
557     <member name="user3" type="user"/>
558     Owner
559 pcg 1.26 <member name="size" type="U8"/>
560     <member name="handicap" type="I8"/>
561 pcg 1.1 &lt; 0 not fully setup
562 pcg 1.26 <member name="komi" type="komi16"/>
563 pcg 1.15 <member name="moves" type="I16"/>
564 pcg 1.14 This field reflects either the movenum or the score, sorry, not even guards help, as
565 pcg 1.15 the flags to determine that are _after_ the field. Arg. Divide by two to get the actual
566 pcg 1.27 score (NOT score16!) (arg²).
567 pcg 1.3 <member name="flags" type="U16"/>
568     <member name="observers" type="U32"/>
569     <member name="saved" type="flag"/>
570     <member name="notes" type="STRING" guard-member="handicap" guard-cond="&lt; 0"/>
571     </struct>
572    
573     <struct name="room_obs">
574 pcg 1.9 Obsolete.
575    
576 pcg 1.3 <member name="name" type="roomname"/>
577     <member name="channel" type="U16"/>
578     <member name="flags" type="U32"/>
579 pcg 1.4 <member name="users" type="U32"/>
580 pcg 1.3 </struct>
581    
582     <struct name="room" class="KGS::Room">
583     <member name="channel" type="U16"/>
584     <member name="flags" type="U8"/>
585     <member name="group" type="U8"/>
586     <member name="users" type="U16"/>
587     <member name="games" type="U16"/>
588 pcg 1.4 <member name="name" type="STRING"/>
589 pcg 1.3 </struct>
590 pcg 1.1
591 pcg 1.12 <struct name="scorevalues" class="KGS::Score">
592 pcg 1.13 <member name="score" type="score32"/>
593 pcg 1.3 <member name="territory" type="U32"/>
594     <member name="captures" type="U32"/>
595     <member name="i3" type="U32"/>
596     <member name="f2" type="U32"/>
597 pcg 1.20 <member name="komi" type="komi324"/>
598 pcg 1.4 <member name="i4" type="U32"/>
599 pcg 1.3 Apparently the i3, f2, i4 are zero.
600     </struct>
601 pcg 1.1
602 pcg 1.16 <struct name="game_record" class="KGS::GameRecord">
603 pcg 1.18 <p>A single game record entry, as seen in <ref ref="userinfo"/>.</p>
604 pcg 1.16
605     <member name="timestamp" type="timestamp"/>
606     Time this game was played.
607 pcg 1.34 <member name="type" type="U8"/>
608 pcg 1.16 High four bits are handicap, low four bits are gametype (encoded strangely? unclear).
609     <member name="user1" type="user"/>
610     White, flags contain low 8 bits of revision (bits 16-23).
611     <member name="user2" type="user"/>
612     Black, flags contain high 8 bits of revision (bits 16-23).
613     <member name="user3" type="user"/>
614 pcg 1.34
615     <p><p>Owner (or empty)</p>
616    
617     <p>The bits 16-24 of user1.flags and user2.flags give the high and
618     low bits of a revision number in case there are multiple similar
619     games.</p></p>
620    
621 pcg 1.16 <member name="komi" type="komi16"/>
622     <member name="score" type="score16"/>
623     <member name="status" type="U8"/>
624 pcg 1.34
625     <p>0x80 game in progress</p>
626    
627 pcg 1.16 </struct>
628    
629 pcg 1.32 <h2>Server-generated messages</h2>
630 pcg 1.1
631 pcg 1.31 <message type="0001" name="login" src="server">
632 pcg 1.3 <member name="result" type="CONSTANT" default='"login ok"'/>
633 pcg 1.1 <member name="success" type="CONSTANT" default="1"/>
634     </message>
635    
636 pcg 1.31 <message type="0002" name="login" src="server">
637 pcg 1.3 <member name="result" type="CONSTANT" default='"guest login ok"'/>
638 pcg 1.1 <member name="success" type="CONSTANT" default="1"/>
639     </message>
640    
641 pcg 1.31 <message type="0003" name="login" src="server">
642 pcg 1.3 <member name="result" type="CONSTANT" default='"login error 3"'/>
643 pcg 1.1 ** maybe more following? **
644     </message>
645    
646 pcg 1.31 <message type="0004" name="login" src="server">
647 pcg 1.3 <member name="result" type="CONSTANT" default='"wrong password"'/>
648 pcg 1.1 ** maybe more following? **
649     </message>
650    
651 pcg 1.31 <message type="0005" name="login" src="server">
652 pcg 1.3 <member name="result" type="CONSTANT" default='"user unknown"'/>
653 pcg 1.1 ** maybe more following? **
654     </message>
655    
656 pcg 1.31 <message type="0006" name="login" src="server">
657 pcg 1.3 <member name="result" type="CONSTANT" default='"user exists"'/>
658 pcg 1.1 ** maybe more following? **
659     </message>
660    
661 pcg 1.31 <message type="0008" name="userinfo" src="server">
662 pcg 1.17 User info.
663 pcg 1.33 <member name="_unused0" type="flag"/>
664 pcg 1.16 <member name="user" type="user"/>
665 pcg 1.33 <member name="_unused1" type="U64"/>
666 pcg 1.16 <member name="realname" type="realname"/>
667     <member name="email" type="email"/>
668     <member name="info" type="userinfo"/>
669     <member name="homepage" type="url"/>
670     <member name="regdate" type="timestamp"/>
671     When the user registered (0 == never registered).
672     <member name="lastlogin" type="timestamp"/>
673     When the user logged in for the last time.
674     <!-- maybe more? -->
675     </message>
676    
677 pcg 1.31 <message type="0013" name="msg_chat" src="server">
678 pcg 1.34 <member name="name" type="username"/>
679 pcg 1.36 Name of sender (either yourself (echo) or other)
680 pcg 1.34 <member name="name2" type="username"/>
681 pcg 1.36 Name of recipient.
682 pcg 1.1 <member name="message" type="STRING"/>
683     </message>
684    
685 pcg 1.31 <message type="0015" name="stats" src="server">
686 pcg 1.3 <member name="ver_major" type="U16"/>
687     <member name="ver_minor" type="U16"/>
688     <member name="ver_micro" type="U16"/>
689 pcg 1.16 <member name="boot_time" type="timestamp"/>
690 pcg 1.3 <member name="users_cur" type="U32"/>
691     <member name="users_max" type="U32"/>
692     <member name="users_lim" type="U32"/>
693     <member name="accts_cur" type="U32"/>
694     <member name="accts_max" type="U32"/>
695     <member name="unknown1" type="U32"/>
696     <member name="work_max" type="U32"/>
697     <member name="rooms_cur" type="U32"/>
698     <member name="rooms_max" type="U32"/>
699     <member name="rooms_lim" type="U32"/>
700     <member name="games_cur" type="U32"/>
701     <member name="games_max" type="U32"/>
702     <member name="games_lim" type="U32"/>
703     <member name="results_cur" type="U32"/>
704     <member name="results_max" type="U32"/>
705     <member name="unknown2" type="U32"/>
706     <member name="params_cur" type="U32"/>
707     <member name="params_max" type="U32"/>
708     <member name="bytes_in" type="U64"/>
709     <member name="packets_in" type="U64"/>
710     <member name="bytes_out" type="U64"/>
711 pcg 1.4 <member name="packets_out" type="U64"/>
712 pcg 1.1 </message>
713    
714 pcg 1.31 <message type="0016" name="idle_warn" src="server">
715 pcg 1.1 idle warning, autologout soon (10 minutes...)
716     </message>
717    
718 pcg 1.34 <message type="0018" name="login" src="server">
719     <member name="result" type="CONSTANT" default='"login error 18"'/>
720     ** maybe more following? **
721     </message>
722    
723     <message type="0022" name="login" src="server">
724     I was blocked sooo many times for developing this client that it was
725     easy to figure out. The KGS admins sure need no extra nazi training
726     :(
727     <member name="reason" type="STRING"/>
728     <member name="result" type="CONSTANT" default='"user or ip blocked"'/>
729     </message>
730    
731 pcg 1.31 <message type="001b" name="timewarning_default" src="server">
732 pcg 1.1 WILD guess
733 pcg 1.3 <member name="channel" type="U16"/>
734     <member name="time" type="U16"/>
735 pcg 1.1 </message>
736    
737 pcg 1.31 <message type="001c" name="idle_err" src="server">
738 pcg 1.1 autologout
739     </message>
740    
741 pcg 1.31 <message type="001d" name="ping" src="server">
742 pcg 1.16 Sent by the server regularly, but not answering them
743     isn't valid. Strange form of keepalive?
744 pcg 1.1 </message>
745    
746 pcg 1.31 <message type="001e" name="usergraph" src="server">
747 pcg 1.17 User graph data.
748 pcg 1.33 <member name="name" type="username"/>
749 pcg 1.17 <member name="data" type="I16" array="yes"/>
750     If empty, no graph is available. The unit seems to
751     be centi-kyu, with 1 dan == 0, 2 dan == 100, 1 kyu == -100.
752     There is probably one entry per day, the newest one last.
753     </message>
754    
755 pcg 1.31 <message type="001f" name="memo" src="server">
756 pcg 1.17 Unclear. "Leave Message"?
757     6 strings following.
758     <member name="s1" type="STRING"/>
759     <member name="s2" type="STRING"/>
760     <member name="s3" type="STRING"/>
761     <member name="s4" type="STRING"/>
762     <member name="s5" type="STRING"/>
763     <member name="s6" type="STRING"/>
764     </message>
765    
766 pcg 1.31 <message type="0021" name="userpic" src="server">
767 pcg 1.3 <member name="name" type="username"/>
768 pcg 1.1 Reply to pic_req, contains an image in jpeg format.
769     <member name="data" type="DATA"/>
770     </message>
771    
772 pcg 1.31 <message type="0100" name="gnotice" src="server">
773 pcg 1.1 global notice, sent to everybody
774     <member name="notice" type="STRING"/>
775     </message>
776    
777 pcg 1.33 <message type="0202" name="notify_event" src="server">
778 pcg 1.17 # maybe soe notify? Totally unclear.
779 pcg 1.16 # loc 0" type="chat(?) loc 1 => gameinfo?, loc 2 => game result (more data)
780 pcg 1.33 <member name="event" type="U32"/>
781 pcg 1.16 <member name="user" type="user"/>
782 pcg 1.34 <member name="gamerecord" type="game_record" guard-member="event" guard-cond="== 2"/>
783 pcg 1.33 <p>Game result record?</p>
784    
785 pcg 1.16 </message>
786 pcg 1.1
787 pcg 1.31 <message type="0310" name="priv_room" src="server">
788 pcg 1.1 "permission denied" when joining a room
789     <member name="name" type="STRING"/>
790     </message>
791    
792 pcg 1.31 <message type="0318" name="upd_rooms" src="server">
793 pcg 1.1 <member name="rooms" type="room" array="yes"/>
794     </message>
795    
796 pcg 1.31 <message type="0411" name="chal_defaults" src="server">
797 pcg 1.16 <member name="channel" type="U16"/>
798     <member name="defaults" type="challenge_defaults"/>
799     </message>
800    
801 pcg 1.31 <message type="0412" name="rej_game" src="server">
802 pcg 1.17 Unable to create challenge. The channel might be optional.
803     <member name="channel" type="U16"/>
804     </message>
805    
806 pcg 1.31 <message type="0414" name="game_record" src="server">
807 pcg 1.16 The users game record.
808     <member name="name" type="username"/>
809     <member name="more" type="flag"/>
810     Wether more games are available (must be requested manually)
811     <member name="games" type="game_record" array="yes"/>
812     </message>
813    
814 pcg 1.31 <message type="041c" name="upd_game2" src="server">
815 pcg 1.17 Unclear.
816 pcg 1.3 <member name="channel_junk" type="U16"/>
817 pcg 1.1 <member name="game" type="game"/>
818     </message>
819    
820     <h3>Room messages</h3>
821    
822     <p>Not all room messages are for rooms only, and rooms need to parse
823     not only these messages. Orthogonality, what for?</p>
824    
825 pcg 1.31 <message type="4300" name="join_room" src="server">
826 pcg 1.3 <member name="channel" type="U16"/>
827 pcg 1.1 <member name="users" type="user" array="yes"/>
828     </message>
829    
830 pcg 1.31 <message type="4301" name="msg_room" src="server">
831 pcg 1.3 <member name="channel" type="U16"/>
832     <member name="name" type="username"/>
833 pcg 1.1 <member name="message" type="STRING"/>
834     </message>
835    
836 pcg 1.31 <message type="4302" name="part_room" src="server">
837 pcg 1.3 <member name="channel" type="U16"/>
838 pcg 1.1 <member name="user" type="user"/>
839     </message>
840    
841 pcg 1.31 <message type="4303" name="del_room" src="server">
842 pcg 1.3 <member name="channel" type="U16"/>
843 pcg 1.1 </message>
844    
845 pcg 1.31 <message type="4304" name="upd_games" src="server">
846 pcg 1.3 <member name="channel" type="U16"/>
847 pcg 1.1 <member name="games" type="game" array="yes"/>
848     </message>
849    
850 pcg 1.31 <message type="4319" name="desc_room" src="server">
851 pcg 1.3 <member name="channel" type="U16"/>
852     <member name="owner" type="username"/>
853 pcg 1.1 <member name="description" type="STRING"/>
854     </message>
855 pcg 1.28
856 pcg 1.1 <h3>Game messages</h3>
857    
858 pcg 1.31 <message type="4400" name="upd_challenge" src="server">
859 pcg 1.1 Unclear.
860 pcg 1.3 <member name="channel" type="U16"/>
861 pcg 1.1 <member name="challenge" type="challenge"/>
862     </message>
863    
864 pcg 1.31 <message type="4401" name="upd_game" src="server">
865 pcg 1.3 <member name="channel" type="U16"/>
866 pcg 1.1 <member name="game" type="game"/>
867     </message>
868    
869 pcg 1.31 <message type="4402" name="del_game" src="server">
870 pcg 1.3 <member name="channel" type="U16"/>
871 pcg 1.1 </message>
872    
873 pcg 1.31 <message type="4403" name="upd_observers" src="server">
874 pcg 1.3 <member name="channel" type="U16"/>
875 pcg 1.1 <member name="users" type="user" array="yes"/>
876     </message>
877    
878 pcg 1.31 <message type="4404" name="del_observer" src="server">
879 pcg 1.3 <member name="channel" type="U16"/>
880     <member name="name" type="username"/>
881 pcg 1.1 </message>
882    
883 pcg 1.31 <message type="4405" name="set_tree" src="server">
884 pcg 1.3 <member name="channel" type="U16"/>
885 pcg 1.1 <member name="tree" type="TREE"/>
886     </message>
887    
888 pcg 1.31 <message type="4406" name="upd_tree" src="server">
889 pcg 1.3 <member name="channel" type="U16"/>
890 pcg 1.1 <member name="tree" type="TREE"/>
891     </message>
892    
893 pcg 1.31 <message type="4409" name="superko" src="server">
894 pcg 1.1 Superko-warning.
895 pcg 1.3 <member name="channel" type="U16"/>
896 pcg 1.1 </message>
897    
898 pcg 1.31 <message type="440b" name="final_result" src="server">
899 pcg 1.3 <member name="channel" type="U16"/>
900 pcg 1.12 <member name="blackscore" type="scorevalues"/>
901     <member name="whitescore" type="scorevalues"/>
902 pcg 1.1 </message>
903    
904 pcg 1.31 <message type="440e" name="req_undo" src="server">
905 pcg 1.3 <member name="channel" type="U16"/>
906 pcg 1.1
907     </message>
908    
909 pcg 1.31 <message type="4410" name="resign_game" src="server">
910 pcg 1.3 <member name="channel" type="U16"/>
911     <member name="player" type="U8"/>
912 pcg 1.1 </message>
913    
914 pcg 1.31 <message type="441a" name="set_teacher" src="server">
915 pcg 1.3 <member name="channel" type="U16"/>
916     <member name="name" type="username"/>
917 pcg 1.1 </message>
918    
919 pcg 1.31 <message type="441d" name="owner_left" src="server">
920 pcg 1.1 Unclear.
921 pcg 1.3 <member name="channel" type="U16"/>
922 pcg 1.1 </message>
923    
924 pcg 1.31 <message type="441e" name="teacher_left" src="server">
925 pcg 1.1 Unclear.
926 pcg 1.3 <member name="channel" type="U16"/>
927 pcg 1.1 </message>
928    
929 pcg 1.31 <message type="4422" name="unknown4422" src="server">
930 pcg 1.1 change teacher? something to do with editing?
931 pcg 1.3 <member name="channel" type="U16"/>
932     <member name="name1" type="username"/>
933     <member name="name2" type="username"/>
934 pcg 1.27 </message>
935    
936 pcg 1.31 <message type="4428" name="add_tree" src="server">
937 pcg 1.27 <p>See <ref ref="set_tree"/>. In addition, flags the tree as being
938     uploaded completely.</p>
939     <member name="channel" type="U16"/>
940     <member name="tree" type="TREE"/>
941 pcg 1.1 </message>
942    
943 pcg 1.31 <message type="4433" name="req_result" src="server">
944 pcg 1.1 Unclear.
945 pcg 1.3 <member name="channel" type="U16"/>
946 pcg 1.1 # # recv_result(?)
947     </message>
948    
949 pcg 1.31 <message type="4434" name="unknown4434" src="server">
950 pcg 1.3 <member name="channel" type="U16"/>
951     <member name="b1" type="U8"/>
952 pcg 1.1 ?? !demonstration game??
953     </message>
954    
955     </body>
956     </html>
957