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