ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/protocol.xml
Revision: 1.7
Committed: Thu Jun 5 16:40:52 2003 UTC (21 years ago) by pcg
Content type: text/xml
Branch: MAIN
Changes since 1.6: +2 -2 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="komi16" type="I16" multiplier="2"/>
89 <type name="komi32" type="I32" multiplier="2"/>
90 <type name="result" type="I32" multiplier="2"/>
91 <type name="score" type="I32" multiplier="4"/>
92 <type name="time" type="U32" multiplier="1000"/>
93
94 <h2>Constants, enumeration and set types used in the protocol.</h2>
95
96 <p>Baaah... not yet.</p>
97
98 <h2>Structs used in send &amp; receive messages</h2>
99
100 <struct name="user" class="KGS::User">
101 <member name="name" type="username"/>
102 <member name="flags" type="U32" default="1"/>
103 </struct>
104
105 <struct name="rules" class="KGS::Rules">
106 <member name="ruleset" type="U8"/>
107 <member name="size" type="U8"/>
108 <member name="handicap" type="U8"/>
109 <member name="komi" type="komi16"/>
110 <member name="timesys" type="U8"/>
111 <member name="time" type="U32"/>
112 <member name="interval" type="U32"/>
113 byo-yomi time / canadian time
114 <member name="count" type="U16"/>
115 periods / moves
116 </struct>
117
118 <h2>Structs used in send messages</h2>
119
120 <message type="0000" name="login" send="yes">
121 <member name="ver_major" type="U32" default="2"/>
122 <member name="ver_minor" type="U32" default="4"/>
123 <member name="ver_micro" type="U32" default="67"/>
124 <member name="name" type="username"/>
125 <member name="password " type="U64" default="0"/>
126 Password is a number calculated as follows (VERY insecure, basically plaintext!):
127 password = 0; for char in characters do password ← password * 1055 + ascii_code (char);
128 <member name="guest" type="flag" default="1"/>
129 <member name="_unknown3" type="U16" default="0"/>
130 <member name="locale" type="locale" default='"en_US"'/>
131 <member name="clientver" type="DATA" default='"1.4.1_01:Swing app:Sun Microsystems Inc."'/>
132 The "default" is the java vm version, not exactly he client version. However,
133 you should always send a tetx like "Jonathan's C client bersion 0.6" or somesuch,
134 so the server can, if necessary, block broken clients or client versions.
135 </message>
136
137 <message type="0014" name="server_stats" send="yes">
138 Request server statistics.
139 </message>
140
141 <message type="0021" name="pic_req" send="yes">
142 Request a user picture from the server.
143 <member name="name" type="username"/>
144 </message>
145
146 <message type="0021" name="pic_upload" send="yes">
147 Same code as pic_req, but with an additional data section that
148 must contain a JPEG image that is &lt;=7KB. It must have 141×200 pixels.
149 <member name="name" type="username"/>
150 <member name="data" type="DATA"/>
151 </message>
152
153 <message type="0100" name="gnotice" send="yes">
154 Send a global message. Maybe. Never tried, for obvious reasons :/
155 <member name="notice" type="STRING"/>
156 </message>
157
158 <message type="0318" name="list_rooms" send="yes">
159 List the rooms in a specific group/category.
160 <member name="group" type="U8"/>
161 </message>
162
163 <message type="031a" name="new_room" send="yes">
164 Create a new room. Not verified.
165 <member name="name" type="username"/>
166 <member name="i1" type="U32" default="0"/>
167 <member name="b1" type="U8" default="0"/>
168 <member name="b2" type="U8" default="255"/>
169 <member name="b3" type="U8" default="255"/>
170 <member name="group" type="U8" default="1"/>
171 <member name="name" type="STRING"/>
172 <member name="description" type="STRING"/>
173 <member name="flags" type="U8"/>
174 0x10 .. private room etc.. see code
175 </message>
176
177 <message type="4300" name="join_room" send="yes">
178 <member name="channel" type="U16"/>
179 <member name="user" type="user"/>
180 </message>
181
182 <message type="4301" name="msg_room" send="yes">
183 <member name="channel" type="U16"/>
184 <member name="name" type="username"/>
185 <member name="message" type="STRING"/>
186 </message>
187
188 <message type="4302" name="part_room" send="yes">
189 <member name="channel" type="U16"/>
190 <member name="name" type="username"/>
191 </message>
192
193 <message type="4305" name="new_game" send="yes">
194 <member name="channel" type="U16"/>
195 <member name="id" type="U16"/>
196 <member name="gametype" type="U32"/>
197 <member name="rules" type="rules"/>
198 <member name="notes" type="STRING"/>
199 </message>
200
201 <message type="430b" name="req_games" send="yes">
202 request to update room game list (send once per minute)
203 <member name="channel" type="U16"/>
204 </message>
205
206 <message type="4319" name="req_desc" send="yes">
207 Request room description.
208 <member name="channel" type="U16"/>
209 </message>
210
211 <message type="4400" name="send_chal" send="yes">
212 No idea.
213 <member name="channel" type="U16"/>
214 <member name="black" type="username"/>
215 <member name="white" type="username"/>
216 More following... TREE or challenge.
217 </message>
218
219 <message type="4403" name="join_game" send="yes">
220 <member name="channel" type="U16"/>
221 <member name="user" type="user"/>
222 </message>
223
224 <message type="4404" name="part_game" send="yes">
225 <member name="channel" type="U16"/>
226 <member name="name" type="username"/>
227 </message>
228
229 <message type="4405" name="set_tree" send="yes">
230 <member name="channel" type="U16"/>
231 <member name="tree" type="TREE"/>
232 </message>
233
234 <message type="4408" name="get_tree" send="yes">
235 <member name="channel" type="U16"/>
236 <member name="node" type="U32"/>
237 </message>
238
239 <message type="440c" name="claim_win" send="yes">
240 <member name="channel" type="U16"/>
241 <member name="_byte" type="U8 "/>
242 Player colour maybe? Unclear.
243 </message>
244
245 <message type="440d" name="add_time" send="yes">
246 <member name="channel" type="U16"/>
247 <member name="time" type="U32"/>
248 <member name="player" type="U8"/>
249 </message>
250
251 <message type="440f" name="grant_undo" send="yes">
252 <member name="channel" type="U16"/>
253 </message>
254
255 <message type="4410" name="resign_game" send="yes">
256 <member name="channel" type="U16"/>
257 <member name="player" type="U8"/>
258 </message>
259
260 <message type="441a" name="set_teacher" send="yes">
261 <member name="channel" type="U16"/>
262 <member name="name" type="username"/>
263 </message>
264
265 <message type="4422" name="add_user" send="yes">
266 <member name="channel" type="U16"/>
267 <member name="othername" type="username"/>
268 <member name="name" type="username"/>; # gives user access to the game (to what? ;)
269 </message>
270
271 <message type="4423" name="set_privacy" send="yes">
272 <member name="channel" type="U16"/>
273 <member name="private" type="U8"/>
274 </message>
275
276 <message type="4429" name="reject_chal" send="yes">
277 <member name="channel" type="U16"/>
278 <member name="name" type="username"/>
279 </message>
280
281 <message type="4433" name="req_result" send="yes">
282 <member name="channel" type="U16"/>
283 </message>
284
285 <h2>Structs mainly used in receive messages</h2>
286
287 <struct name="challenge_defaults">
288 <member name="gametype" type="U32"/>
289 <member name="size" type="U32"/>
290 <member name="timesys" type="U32"/>
291 <member name="time" type="U32"/>
292 <member name="byo_time" type="U32"/>
293 <member name="byo_periods" type="U32"/>
294 <member name="can_time" type="U32"/>
295 <member name="can_stones" type="U32"/>
296 </struct>
297
298 <struct name="challenge" class="KGS::Challenge">
299 <member name="user1" type="user"/>
300 <member name="user2" type="user"/>
301 <member name="gametype" type="U32"/>
302 <member name="rules" type="rules"/>
303 Maybe the rules" are in TREE format. I forgot.
304 </struct>
305
306 <struct name="game" class="KGS::Game">
307 <member name="channel" type="U16"/>
308 <member name="type" type="U32"/>
309 <member name="user1" type="user"/>
310 White
311 <member name="user2" type="user"/>
312 Black
313 <member name="user3" type="user"/>
314 Owner
315 <member name="size" type="U32"/>
316 <member name="handicap" type="I32"/>
317 &lt; 0 not fully setup
318 <member name="komi" type="komi32"/>
319 <member name="moves" type="U16"/>
320 <member name="flags" type="U16"/>
321 <member name="observers" type="U32"/>
322 <member name="saved" type="flag"/>
323 <member name="notes" type="STRING" guard-member="handicap" guard-cond="&lt; 0"/>
324 </struct>
325
326 <struct name="room_obs">
327 <member name="name" type="roomname"/>
328 <member name="channel" type="U16"/>
329 <member name="flags" type="U32"/>
330 <member name="users" type="U32"/>
331 </struct>
332
333 <struct name="room" class="KGS::Room">
334 <member name="channel" type="U16"/>
335 <member name="flags" type="U8"/>
336 <member name="group" type="U8"/>
337 <member name="users" type="U16"/>
338 <member name="games" type="U16"/>
339 <member name="name" type="STRING"/>
340 </struct>
341
342 <struct name="score" class="KGS::Score">
343 <member name="score" type="score"/>
344 <member name="territory" type="U32"/>
345 <member name="captures" type="U32"/>
346 <member name="i3" type="U32"/>
347 <member name="f2" type="U32"/>
348 <member name="komi" type="komi32"/>
349 <member name="i4" type="U32"/>
350 Apparently the i3, f2, i4 are zero.
351 </struct>
352
353 <h2>Receive messages</h2>
354
355 <message type="0001" name="login" recv="yes">
356 <member name="result" type="CONSTANT" default='"login ok"'/>
357 <member name="success" type="CONSTANT" default="1"/>
358 </message>
359
360 <message type="0002" name="login" recv="yes">
361 <member name="result" type="CONSTANT" default='"guest login ok"'/>
362 <member name="success" type="CONSTANT" default="1"/>
363 </message>
364
365 <message type="0003" name="login" recv="yes">
366 <member name="result" type="CONSTANT" default='"login error 3"'/>
367 ** maybe more following? **
368 </message>
369
370 <message type="0004" name="login" recv="yes">
371 <member name="result" type="CONSTANT" default='"wrong password"'/>
372 ** maybe more following? **
373 </message>
374
375 <message type="0005" name="login" recv="yes">
376 <member name="result" type="CONSTANT" default='"user unknown"'/>
377 ** maybe more following? **
378 </message>
379
380 <message type="0006" name="login" recv="yes">
381 <member name="result" type="CONSTANT" default='"user exists"'/>
382 ** maybe more following? **
383 </message>
384
385 <message type="0018" name="login" recv="yes">
386 <member name="result" type="CONSTANT" default='"login error 18"'/>
387 ** maybe more following? **
388 </message>
389
390 <message type="0022" name="login" recv="yes">
391 <!-- "thanks" to jyem for blocking me ;)-->
392 <member name="result" type="CONSTANT" default='"user or ip blocked"'/>
393 <member name="reason" type="STRING"/>
394 </message>
395
396 <message type="0013" name="msg_chat" recv="yes">
397 <member name="user1" type="username"/>
398 <member name="user2" type="username"/>
399 <member name="message" type="STRING"/>
400 </message>
401
402 <message type="0015" name="stats" recv="yes">
403 <member name="ver_major" type="U16"/>
404 <member name="ver_minor" type="U16"/>
405 <member name="ver_micro" type="U16"/>
406 <member name="boot_time" type="U64"/>
407 <member name="users_cur" type="U32"/>
408 <member name="users_max" type="U32"/>
409 <member name="users_lim" type="U32"/>
410 <member name="accts_cur" type="U32"/>
411 <member name="accts_max" type="U32"/>
412 <member name="unknown1" type="U32"/>
413 <member name="work_max" type="U32"/>
414 <member name="rooms_cur" type="U32"/>
415 <member name="rooms_max" type="U32"/>
416 <member name="rooms_lim" type="U32"/>
417 <member name="games_cur" type="U32"/>
418 <member name="games_max" type="U32"/>
419 <member name="games_lim" type="U32"/>
420 <member name="results_cur" type="U32"/>
421 <member name="results_max" type="U32"/>
422 <member name="unknown2" type="U32"/>
423 <member name="params_cur" type="U32"/>
424 <member name="params_max" type="U32"/>
425 <member name="bytes_in" type="U64"/>
426 <member name="packets_in" type="U64"/>
427 <member name="bytes_out" type="U64"/>
428 <member name="packets_out" type="U64"/>
429 </message>
430
431 <message type="0016" name="idle_warn" recv="yes">
432 idle warning, autologout soon (10 minutes...)
433 </message>
434
435 <message type="001b" name="timewarning_default" recv="yes">
436 WILD guess
437 <member name="channel" type="U16"/>
438 <member name="time" type="U16"/>
439 </message>
440
441 <message type="001c" name="idle_err" recv="yes">
442 autologout
443 </message>
444
445 <message type="001d" name="ping" recv="yes">
446 </message>
447
448 <message type="0021" name="userpic" recv="yes">
449 <member name="name" type="username"/>
450 Reply to pic_req, contains an image in jpeg format.
451 <member name="data" type="DATA"/>
452 </message>
453
454 <message type="0100" name="gnotice" recv="yes">
455 global notice, sent to everybody
456 <member name="notice" type="STRING"/>
457 </message>
458
459
460 <message type="0310" name="priv_room" recv="yes">
461 "permission denied" when joining a room
462 <member name="name" type="STRING"/>
463 </message>
464
465 <message type="0318" name="upd_rooms" recv="yes">
466 <member name="rooms" type="room" array="yes"/>
467 </message>
468
469 <message type="041c" name="upd_game2" recv="yes">
470 <member name="channel_junk" type="U16"/>
471 <member name="game" type="game"/>
472 </message>
473
474 <message type="0202" name="upd_user" recv="yes">
475 # loc 0" type="chat(?) loc 1 => gameinfo?, loc 2 => game result (more data)
476 <member name="location" type="U32"/>
477 <member name="user" type="user"/>
478 <member name="lotsofinfo" type="DATA" guard-member="location" guard-cond="== 2"/>
479 </message>
480
481 <h3>Room messages</h3>
482
483 <p>Not all room messages are for rooms only, and rooms need to parse
484 not only these messages. Orthogonality, what for?</p>
485
486 <message type="4300" name="join_room" recv="yes">
487 <member name="channel" type="U16"/>
488 <member name="users" type="user" array="yes"/>
489 </message>
490
491 <message type="4301" name="msg_room" recv="yes">
492 <member name="channel" type="U16"/>
493 <member name="name" type="username"/>
494 <member name="message" type="STRING"/>
495 </message>
496
497 <message type="4302" name="part_room" recv="yes">
498 <member name="channel" type="U16"/>
499 <member name="user" type="user"/>
500 </message>
501
502 <message type="4303" name="del_room" recv="yes">
503 <member name="channel" type="U16"/>
504
505 </message>
506
507 <message type="4304" name="upd_games" recv="yes">
508 <member name="channel" type="U16"/>
509 <member name="games" type="game" array="yes"/>
510 </message>
511
512 <message type="4319" name="desc_room" recv="yes">
513 <member name="channel" type="U16"/>
514 <member name="owner" type="username"/>
515 <member name="description" type="STRING"/>
516 </message>
517
518
519 <message type="0411" name="chal_defaults" recv="yes">
520 <member name="channel" type="U16"/>
521 <member name="defaults" type="challenge_defaults"/>
522 </message>
523
524 <h3>Game messages</h3>
525
526 <message type="4400" name="upd_chal" recv="yes">
527 Unclear.
528 <member name="channel" type="U16"/>
529 <member name="challenge" type="challenge"/>
530 </message>
531
532 <message type="4401" name="upd_game" recv="yes">
533 <member name="channel" type="U16"/>
534 <member name="game" type="game"/>
535 </message>
536
537 <message type="4402" name="del_game" recv="yes">
538 <member name="channel" type="U16"/>
539 </message>
540
541 <message type="4403" name="upd_observers" recv="yes">
542 <member name="channel" type="U16"/>
543 <member name="users" type="user" array="yes"/>
544 </message>
545
546 <message type="4404" name="del_observer" recv="yes">
547 <member name="channel" type="U16"/>
548 <member name="name" type="username"/>
549 </message>
550
551 <message type="4405" name="set_tree" recv="yes">
552 <member name="channel" type="U16"/>
553 <member name="tree" type="TREE"/>
554 </message>
555
556 <message type="4406" name="upd_tree" recv="yes">
557 <member name="channel" type="U16"/>
558 <member name="tree" type="TREE"/>
559 </message>
560
561 <message type="4407" name="set_node" recv="yes">
562 <member name="channel" type="U16"/>
563 <member name="node" type="U32"/>
564 </message>
565
566 <message type="4409" name="superko" recv="yes">
567 Superko-warning.
568 <member name="channel" type="U16"/>
569 </message>
570
571 <message type="440b" name="final_result" recv="yes">
572 <member name="channel" type="U16"/>
573 <member name="blackscore" type="score"/>
574 <member name="whitescore" type="score"/>
575 </message>
576
577 <message type="440e" name="req_undo" recv="yes">
578 <member name="channel" type="U16"/>
579
580 </message>
581
582 <message type="4410" name="resign_game" recv="yes">
583 <member name="channel" type="U16"/>
584 <member name="player" type="U8"/>
585 </message>
586
587 <message type="441a" name="set_teacher" recv="yes">
588 <member name="channel" type="U16"/>
589 <member name="name" type="username"/>
590 </message>
591
592 <message type="441d" name="owner_left" recv="yes">
593 Unclear.
594 <member name="channel" type="U16"/>
595 </message>
596
597 <message type="441e" name="teacher_left" recv="yes">
598 Unclear.
599 <member name="channel" type="U16"/>
600 </message>
601
602 <message type="4422" name="unknown4422" recv="yes">
603 change teacher? something to do with editing?
604 <member name="channel" type="U16"/>
605 <member name="name1" type="username"/>
606 <member name="name2" type="username"/>
607 </message>
608
609 <message type="4433" name="req_result" recv="yes">
610 Unclear.
611 <member name="channel" type="U16"/>
612 # # recv_result(?)
613 </message>
614
615 <message type="4434" name="unknown4434" recv="yes">
616 <member name="channel" type="U16"/>
617 <member name="b1" type="U8"/>
618 ?? !demonstration game??
619 </message>
620
621 </body>
622 </html>
623