ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/protocol.xml
Revision: 1.5
Committed: Thu Jun 5 10:35:20 2003 UTC (21 years ago) by pcg
Content type: text/xml
Branch: MAIN
Changes since 1.4: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 <?xml version="1.0" encoding="utf-8"?>
2 <html>
3 <head>
4 <title>KGS Protocol Description</title>
5 <!--
6 Copyright (C) 2003 Marc Lehmannn &lt;pcg@goof.com&gt;
7
8 You can redistribute and/or modify this document under the terms of
9 the GNU General Public License as published by the Free Software
10 Foundation; either version 2 of the License, or (at your option) any
11 later version.
12
13 This document is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 -->
22 </head>
23 <body>
24
25 <h1>KGS Protocol Description</h1>
26
27 <p>This XML document describes the KGS protocol. It is also used
28 to automatically generate the perl parser for all the messages and
29 structures in the protocol. Adapting it to other languages should be
30 trivial.</p>
31
32 <p>If you feel you need to update the visual appearance of this
33 document, feel free to look at <tt>doc/doc2html.xsl</tt> and improve
34 it.</p>
35
36 <h2>Structure and conventions of this document and the protocol</h2>
37
38 <p>"Send" means messages send from the client to the server, while
39 "received" means messages send by the server to the client.</p>
40
41 <p>Everything on the wire is in little-endian format (what a shame).</p>
42
43 <p>Primitive types are mostly integers (signed
44 "<code>I</code>&lt;bits&gt;", unsigned "<code>U</code>&lt;bits&gt;"),
45 ascii strings ("<code>username</code>"), or zero-terminated
46 UCS2-Strings ("<code>STRING</code>"). Yes, I know java is supposed to
47 do UTF-16, but no implementation seems to care...</p>
48
49 <p>For the rest, go figure or bug me, Marc Lehmann &lt;pcg@goof.com&gt;</p>
50
51 <h2>Stream and message structure.</h2>
52
53 <p>After connecting to the server, a handshake byte is sent. It's
54 the major version number of the protocol the client expects to
55 receive. Version 3 and 4 are mostly the same, except that Version 4
56 clients expect server messages to be compressed, version 3 clients
57 not.</p>
58
59 <p>The server sends back his protocol number, which is always 3 in
60 the current protocol. Most of the protocol variation is determined by
61 the server using the client version that is used in the initial login
62 message, not the initial handshake byte.</p>
63
64 <p>After the initial handshake, the client sends uncompressed
65 messages, while the server sends back a zlib-compressed
66 stream (<a href="http://rfc1950.x42.com/">rfc1950</a> and <a
67 href="http://rfc1950.x42.com/">rfc1951</a>).</p>
68
69 <p>All messages have the same header:</p>
70
71 <struct name="message_header" send="yes" recv="yes">
72 <member name="_unknown" type="U16"/>
73 <member name="length" type="U16"/>
74 The length is the length of the full message including the header.
75 <member name="type" type="U16"/>
76 If the type is &gt;= 0x4000 this is a message for a specific channel. The channel
77 number is always the next U16.
78 </struct>
79
80 <h2>Primitive types used in the protocol.</h2>
81
82 <p>Baaah... not much yet.</p>
83
84 <type name="username" type="A" length="12"/>
85 <type name="roomname" type="S" length="25"/><!-- argh, how horribly broken -->
86 <type name="locale" type="A" length="5"/>
87 <type name="flag" type="U8" multiplier="1"/>
88 <type name="komi" type="I32" multiplier="2"/>
89 <type name="result" type="I32" multiplier="2"/>
90 <type name="score" type="I32" multiplier="4"/>
91 <type name="time" type="U32" multiplier="100"/>
92
93 <h2>Constants, enumeration and set types used in the protocol.</h2>
94
95 <p>Baaah... not yet.</p>
96
97 <h2>Structs used in send &amp; receive messages</h2>
98
99 <struct name="user" class="KGS::User">
100 <member name="name" type="username"/>
101 <member name="flags" type="U32" default="1"/>
102 </struct>
103
104 <h2>Structs used in send messages</h2>
105
106 <message type="0000" name="login" send="yes">
107 <member name="ver_major" type="U32" default="2"/>
108 <member name="ver_minor" type="U32" default="4"/>
109 <member name="ver_micro" type="U32" default="67"/>
110 <member name="name" type="username"/>
111 <member name="password " type="U64" default="0"/>
112 Password is a number calculated as follows (VERY insecure, basically plaintext!):
113 password = 0; for char in characters do password ← password * 1055 + ascii_code (char);
114 <member name="guest" type="flag" default="1"/>
115 <member name="_unknown3" type="U16" default="0"/>
116 <member name="locale" type="locale" default='"en_US"'/>
117 <member name="clientver" type="DATA" default='"1.4.1_01:Swing app:Sun Microsystems Inc."'/>
118 The "default" is the java vm version, not exactly he client version. However,
119 you should always send a tetx like "Jonathan's C client bersion 0.6" or somesuch,
120 so the server can, if necessary, block broken clients or client versions.
121 </message>
122
123 <message type="0014" name="server_stats" send="yes">
124 Request server statistics.
125 </message>
126
127 <message type="0021" name="pic_req" send="yes">
128 Request a user picture from the server.
129 <member name="name" type="username"/>
130 </message>
131
132 <message type="0021" name="pic_upload" send="yes">
133 Same code as pic_req, but with an additional data section that
134 must contain a JPEG image that is &lt;=7KB. It must have 141×200 pixels.
135 <member name="name" type="username"/>
136 <member name="data" type="DATA"/>
137 </message>
138
139 <message type="0100" name="gnotice" send="yes">
140 Send a global message. Maybe. Never tried, for obvious reasons :/
141 <member name="notice" type="STRING"/>
142 </message>
143
144 <message type="0318" name="list_rooms" send="yes">
145 List the rooms in a specific group/category.
146 <member name="group" type="U8"/>
147 </message>
148
149 <message type="031a" name="new_room" send="yes">
150 Create a new room. Not verified.
151 <member name="name" type="username"/>
152 <member name="i1" type="U32" default="0"/>
153 <member name="b1" type="U8" default="0"/>
154 <member name="b2" type="U8" default="255"/>
155 <member name="b3" type="U8" default="255"/>
156 <member name="group" type="U8" default="1"/>
157 <member name="name" type="STRING"/>
158 <member name="description" type="STRING"/>
159 <member name="flags" type="U8"/>
160 0x10 .. private room etc.. see code
161 </message>
162
163 <message type="4300" name="join_room" send="yes">
164 <member name="channel" type="U16"/>
165 <member name="user" type="user"/>
166 </message>
167
168 <message type="4301" name="msg_room" send="yes">
169 <member name="channel" type="U16"/>
170 <member name="name" type="username"/>
171 <member name="message" type="STRING"/>
172 </message>
173
174 <message type="4302" name="part_room" send="yes">
175 <member name="channel" type="U16"/>
176 <member name="name" type="username"/>
177 </message>
178
179 <message type="4305" name="new_game" send="yes">
180 <member name="channel" type="U16"/>
181 <member name="id" type="U16"/>
182 <member name="gametype" type="U32"/>
183 <member name="rules" type="rules"/>
184 <member name="notes" type="STRING"/>
185 </message>
186
187 <message type="430b" name="req_games" send="yes">
188 request to update room game list (send once per minute)
189 <member name="channel" type="U16"/>
190 </message>
191
192 <message type="4319" name="req_desc" send="yes">
193 Request room description.
194 <member name="channel" type="U16"/>
195 </message>
196
197 <message type="4400" name="send_chal" send="yes">
198 No idea.
199 <member name="channel" type="U16"/>
200 <member name="black" type="username"/>
201 <member name="white" type="username"/>
202 More following... TREE or challenge.
203 </message>
204
205 <message type="4403" name="join_game" send="yes">
206 <member name="channel" type="U16"/>
207 <member name="user" type="user"/>
208 </message>
209
210 <message type="4404" name="part_game" send="yes">
211 <member name="channel" type="U16"/>
212 <member name="name" type="username"/>
213 </message>
214
215 <message type="4405" name="set_tree" send="yes">
216 <member name="channel" type="U16"/>
217 <member name="tree" type="TREE"/>
218 </message>
219
220 <message type="4408" name="get_tree" send="yes">
221 <member name="channel" type="U16"/>
222 <member name="node" type="U32"/>
223 </message>
224
225 <message type="440c" name="claim_win" send="yes">
226 <member name="channel" type="U16"/>
227 <member name="_byte" type="U8 "/>
228 Player colour maybe? Unclear.
229 </message>
230
231 <message type="440d" name="add_time" send="yes">
232 <member name="channel" type="U16"/>
233 <member name="time" type="U32"/>
234 <member name="player" type="U8"/>
235 </message>
236
237 <message type="440f" name="grant_undo" send="yes">
238 <member name="channel" type="U16"/>
239 </message>
240
241 <message type="4410" name="resign_game" send="yes">
242 <member name="channel" type="U16"/>
243 <member name="player" type="U8"/>
244 </message>
245
246 <message type="441a" name="set_teacher" send="yes">
247 <member name="channel" type="U16"/>
248 <member name="name" type="username"/>
249 </message>
250
251 <message type="4422" name="add_user" send="yes">
252 <member name="channel" type="U16"/>
253 <member name="othername" type="username"/>
254 <member name="name" type="username"/>; # gives user access to the game (to what? ;)
255 </message>
256
257 <message type="4423" name="set_privacy" send="yes">
258 <member name="channel" type="U16"/>
259 <member name="private" type="U8"/>
260 </message>
261
262 <message type="4429" name="reject_chal" send="yes">
263 <member name="channel" type="U16"/>
264 <member name="name" type="username"/>
265 </message>
266
267 <message type="4433" name="req_result" send="yes">
268 <member name="channel" type="U16"/>
269 </message>
270
271 <h2>Structs mainly used in receive messages</h2>
272
273 <struct name="challenge_defaults">
274 <member name="gametype" type="U32"/>
275 <member name="size" type="U32"/>
276 <member name="timesys" type="U32"/>
277 <member name="time" type="U32"/>
278 <member name="byo_time" type="U32"/>
279 <member name="byo_periods" type="U32"/>
280 <member name="can_time" type="U32"/>
281 <member name="can_stones" type="U32"/>
282 </struct>
283
284 <struct name="rules" class="KGS::Rules">
285 <member name="ruleset" type="U8"/>
286 <member name="size" type="U8"/>
287 <member name="handicap" type="U8"/>
288 <member name="komi" type="komi"/>
289 <member name="timesys" type="U8"/>
290 <member name="time" type="U32"/>
291 <member name="interval" type="U32"/>
292 byo-yomi time / canadian time
293 <member name="count" type="U16"/>
294 periods / moves
295 </struct>
296
297 <struct name="challenge" class="KGS::Challenge">
298 <member name="user1" type="user"/>
299 <member name="user2" type="user"/>
300 <member name="gametype" type="U32"/>
301 <member name="rules" type="rules"/>
302 Maybe the rules" are in TREE format. I forgot.
303 </struct>
304
305 <struct name="game" class="KGS::Game">
306 <member name="channel" type="U16"/>
307 <member name="type" type="U32"/>
308 <member name="user1" type="user"/>
309 White
310 <member name="user2" type="user"/>
311 Black
312 <member name="user3" type="user"/>
313 Owner
314 <member name="size" type="U32"/>
315 <member name="handicap" type="I32"/>
316 &lt; 0 not fully setup
317 <member name="komi" type="komi"/>
318 <member name="moves" type="U16"/>
319 <member name="flags" type="U16"/>
320 <member name="observers" type="U32"/>
321 <member name="saved" type="flag"/>
322 <member name="notes" type="STRING" guard-member="handicap" guard-cond="&lt; 0"/>
323 </struct>
324
325 <struct name="room_obs">
326 <member name="name" type="roomname"/>
327 <member name="channel" type="U16"/>
328 <member name="flags" type="U32"/>
329 <member name="users" type="U32"/>
330 </struct>
331
332 <struct name="room" class="KGS::Room">
333 <member name="channel" type="U16"/>
334 <member name="flags" type="U8"/>
335 <member name="group" type="U8"/>
336 <member name="users" type="U16"/>
337 <member name="games" type="U16"/>
338 <member name="name" type="STRING"/>
339 </struct>
340
341 <struct name="score" class="KGS::Score">
342 <member name="score" type="score"/>
343 <member name="territory" type="U32"/>
344 <member name="captures" type="U32"/>
345 <member name="i3" type="U32"/>
346 <member name="f2" type="U32"/>
347 <member name="komi" type="komi"/>
348 <member name="i4" type="U32"/>
349 Apparently the i3, f2, i4 are zero.
350 </struct>
351
352 <h2>Receive messages</h2>
353
354 <message type="0001" name="login" recv="yes">
355 <member name="result" type="CONSTANT" default='"login ok"'/>
356 <member name="success" type="CONSTANT" default="1"/>
357 </message>
358
359 <message type="0002" name="login" recv="yes">
360 <member name="result" type="CONSTANT" default='"guest login ok"'/>
361 <member name="success" type="CONSTANT" default="1"/>
362 </message>
363
364 <message type="0003" name="login" recv="yes">
365 <member name="result" type="CONSTANT" default='"login error 3"'/>
366 ** maybe more following? **
367 </message>
368
369 <message type="0004" name="login" recv="yes">
370 <member name="result" type="CONSTANT" default='"wrong password"'/>
371 ** maybe more following? **
372 </message>
373
374 <message type="0005" name="login" recv="yes">
375 <member name="result" type="CONSTANT" default='"user unknown"'/>
376 ** maybe more following? **
377 </message>
378
379 <message type="0006" name="login" recv="yes">
380 <member name="result" type="CONSTANT" default='"user exists"'/>
381 ** maybe more following? **
382 </message>
383
384 <message type="0018" name="login" recv="yes">
385 <member name="result" type="CONSTANT" default='"login error 18"'/>
386 ** maybe more following? **
387 </message>
388
389 <message type="0022" name="login" recv="yes">
390 <!-- "thanks" to jylem for blocking me ;)-->
391 <member name="result" type="CONSTANT" default='"user or ip blocked"'/>
392 <member name="reason" type="STRING"/>
393 </message>
394
395 <message type="0013" name="msg_chat" recv="yes">
396 <member name="user1" type="username"/>
397 <member name="user2" type="username"/>
398 <member name="message" type="STRING"/>
399 </message>
400
401 <message type="0015" name="stats" recv="yes">
402 <member name="ver_major" type="U16"/>
403 <member name="ver_minor" type="U16"/>
404 <member name="ver_micro" type="U16"/>
405 <member name="boot_time" type="U64"/>
406 <member name="users_cur" type="U32"/>
407 <member name="users_max" type="U32"/>
408 <member name="users_lim" type="U32"/>
409 <member name="accts_cur" type="U32"/>
410 <member name="accts_max" type="U32"/>
411 <member name="unknown1" type="U32"/>
412 <member name="work_max" type="U32"/>
413 <member name="rooms_cur" type="U32"/>
414 <member name="rooms_max" type="U32"/>
415 <member name="rooms_lim" type="U32"/>
416 <member name="games_cur" type="U32"/>
417 <member name="games_max" type="U32"/>
418 <member name="games_lim" type="U32"/>
419 <member name="results_cur" type="U32"/>
420 <member name="results_max" type="U32"/>
421 <member name="unknown2" type="U32"/>
422 <member name="params_cur" type="U32"/>
423 <member name="params_max" type="U32"/>
424 <member name="bytes_in" type="U64"/>
425 <member name="packets_in" type="U64"/>
426 <member name="bytes_out" type="U64"/>
427 <member name="packets_out" type="U64"/>
428 </message>
429
430 <message type="0016" name="idle_warn" recv="yes">
431 idle warning, autologout soon (10 minutes...)
432 </message>
433
434 <message type="001b" name="timewarning_default" recv="yes">
435 WILD guess
436 <member name="channel" type="U16"/>
437 <member name="time" type="U16"/>
438 </message>
439
440 <message type="001c" name="idle_err" recv="yes">
441 autologout
442 </message>
443
444 <message type="001d" name="ping" recv="yes">
445 </message>
446
447 <message type="0021" name="userpic" recv="yes">
448 <member name="name" type="username"/>
449 Reply to pic_req, contains an image in jpeg format.
450 <member name="data" type="DATA"/>
451 </message>
452
453 <message type="0100" name="gnotice" recv="yes">
454 global notice, sent to everybody
455 <member name="notice" type="STRING"/>
456 </message>
457
458
459 <message type="0310" name="priv_room" recv="yes">
460 "permission denied" when joining a room
461 <member name="name" type="STRING"/>
462 </message>
463
464 <message type="0318" name="upd_rooms" recv="yes">
465 <member name="rooms" type="room" array="yes"/>
466 </message>
467
468 <message type="041c" name="upd_game2" recv="yes">
469 <member name="channel_junk" type="U16"/>
470 <member name="game" type="game"/>
471 </message>
472
473 <message type="0202" name="upd_user" recv="yes">
474 # loc 0" type="chat(?) loc 1 => gameinfo?, loc 2 => game result (more data)
475 <member name="location" type="U32"/>
476 <member name="user" type="user"/>
477 <member name="lotsofinfo" type="DATA" guard-member="location" guard-cond="== 2"/>
478 </message>
479
480 <h3>Room messages</h3>
481
482 <p>Not all room messages are for rooms only, and rooms need to parse
483 not only these messages. Orthogonality, what for?</p>
484
485 <message type="4300" name="join_room" recv="yes">
486 <member name="channel" type="U16"/>
487 <member name="users" type="user" array="yes"/>
488 </message>
489
490 <message type="4301" name="msg_room" recv="yes">
491 <member name="channel" type="U16"/>
492 <member name="name" type="username"/>
493 <member name="message" type="STRING"/>
494 </message>
495
496 <message type="4302" name="part_room" recv="yes">
497 <member name="channel" type="U16"/>
498 <member name="user" type="user"/>
499 </message>
500
501 <message type="4303" name="del_room" recv="yes">
502 <member name="channel" type="U16"/>
503
504 </message>
505
506 <message type="4304" name="upd_games" recv="yes">
507 <member name="channel" type="U16"/>
508 <member name="games" type="game" array="yes"/>
509 </message>
510
511 <message type="4319" name="desc_room" recv="yes">
512 <member name="channel" type="U16"/>
513 <member name="owner" type="username"/>
514 <member name="description" type="STRING"/>
515 </message>
516
517
518 <message type="0411" name="chal_defaults" recv="yes">
519 <member name="channel" type="U16"/>
520 <member name="defaults" type="challenge_defaults"/>
521 </message>
522
523 <h3>Game messages</h3>
524
525 <message type="4400" name="upd_chal" recv="yes">
526 Unclear.
527 <member name="channel" type="U16"/>
528 <member name="challenge" type="challenge"/>
529 </message>
530
531 <message type="4401" name="upd_game" recv="yes">
532 <member name="channel" type="U16"/>
533 <member name="game" type="game"/>
534 </message>
535
536 <message type="4402" name="del_game" recv="yes">
537 <member name="channel" type="U16"/>
538 </message>
539
540 <message type="4403" name="upd_observers" recv="yes">
541 <member name="channel" type="U16"/>
542 <member name="users" type="user" array="yes"/>
543 </message>
544
545 <message type="4404" name="del_observer" recv="yes">
546 <member name="channel" type="U16"/>
547 <member name="name" type="username"/>
548 </message>
549
550 <message type="4405" name="set_tree" recv="yes">
551 <member name="channel" type="U16"/>
552 <member name="tree" type="TREE"/>
553 </message>
554
555 <message type="4406" name="upd_tree" recv="yes">
556 <member name="channel" type="U16"/>
557 <member name="tree" type="TREE"/>
558 </message>
559
560 <message type="4407" name="set_node" recv="yes">
561 <member name="channel" type="U16"/>
562 <member name="node" type="U32"/>
563 </message>
564
565 <message type="4409" name="superko" recv="yes">
566 Superko-warning.
567 <member name="channel" type="U16"/>
568 </message>
569
570 <message type="440b" name="final_result" recv="yes">
571 <member name="channel" type="U16"/>
572 <member name="blackscore" type="score"/>
573 <member name="whitescore" type="score"/>
574 </message>
575
576 <message type="440e" name="req_undo" recv="yes">
577 <member name="channel" type="U16"/>
578
579 </message>
580
581 <message type="4410" name="resign_game" recv="yes">
582 <member name="channel" type="U16"/>
583 <member name="player" type="U8"/>
584 </message>
585
586 <message type="441a" name="set_teacher" recv="yes">
587 <member name="channel" type="U16"/>
588 <member name="name" type="username"/>
589 </message>
590
591 <message type="441d" name="owner_left" recv="yes">
592 Unclear.
593 <member name="channel" type="U16"/>
594 </message>
595
596 <message type="441e" name="teacher_left" recv="yes">
597 Unclear.
598 <member name="channel" type="U16"/>
599 </message>
600
601 <message type="4422" name="unknown4422" recv="yes">
602 change teacher? something to do with editing?
603 <member name="channel" type="U16"/>
604 <member name="name1" type="username"/>
605 <member name="name2" type="username"/>
606 </message>
607
608 <message type="4433" name="req_result" recv="yes">
609 Unclear.
610 <member name="channel" type="U16"/>
611 # # recv_result(?)
612 </message>
613
614 <message type="4434" name="unknown4434" recv="yes">
615 <member name="channel" type="U16"/>
616 <member name="b1" type="U8"/>
617 ?? !demonstration game??
618 </message>
619
620 </body>
621 </html>
622