ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/protocol.xml
Revision: 1.11
Committed: Thu Jun 5 20:05:43 2003 UTC (20 years, 11 months ago) by pcg
Content type: text/xml
Branch: MAIN
Changes since 1.10: +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>$Revision: 1.10 $</h1>
26
27 <h1>KGS Protocol Description</h1>
28
29 <p>This XML document describes the KGS protocol. It is also used
30 to automatically generate the perl parser for all the messages and
31 structures in the protocol. Adapting it to other languages should be
32 trivial.</p>
33
34 <p><b>Please note that the author of KGS has told me that he will
35 change the protocol in response to my efforts. This does not
36 necessarily mean that he will change the protocol just to make it
37 difficult to reverse-engineer the protocol, but if this happens,
38 I might not have the resources the track them, if they are too
39 extensive. Anyway, he made it clear that no help whatsoever is to be
40 expected.</b></p>
41
42 <p>If you feel you need to update the visual appearance of this
43 document, feel free to look <tt>doc/doc2html.xsl</tt> and improve
44 it.</p>
45
46 <p>The current version of this document can always be found at
47 <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/kgsueme/kgsueme/doc/protocol.xml?rev=HEAD&amp;content-type=text/xml">here</a>, while
48 the HTML version of it can be found
49 <a href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/kgsueme/kgsueme/doc/protocol.html?rev=HEAD&amp;content-type=text/html">here</a>.
50 </p>
51
52 <h2>Structure and conventions of this document and the protocol</h2>
53
54 <p>"Send" means messages send from the client to the server, while
55 "received" means messages send by the server to the client.</p>
56
57 <p>Everything on the wire is in little-endian format (what a shame).</p>
58
59 <p>Primitive types are mostly integers (signed
60 "<code>I</code>&lt;bits&gt;", unsigned "<code>U</code>&lt;bits&gt;"),
61 ascii strings ("<code>username</code>"), or zero-terminated
62 UCS2-Strings ("<code>STRING</code>"). Yes, I know java is supposed to
63 do UTF-16, but no implementation seems to care...</p>
64
65 <p>For the rest, go figure or bug me, Marc Lehmann &lt;pcg@goof.com&gt;</p>
66
67 <h2>Stream and message structure.</h2>
68
69 <p>After connecting to the server, a handshake byte is sent. It's
70 the major version number of the protocol the client expects to
71 receive. Version 3 and 4 are mostly the same, except that Version 4
72 clients expect server messages to be compressed, version 3 clients
73 not.</p>
74
75 <p>The server sends back his protocol number, which is always 3 in
76 the current protocol. Most of the protocol variation is determined by
77 the server using the client version that is used in the initial login
78 message, not the initial handshake byte.</p>
79
80 <p>After the initial handshake, the client sends uncompressed
81 messages, while the server sends back a zlib-compressed
82 stream (<a href="http://rfc1950.x42.com/">rfc1950</a> and <a
83 href="http://rfc1950.x42.com/">rfc1951</a>).</p>
84
85 <p>All messages have the same header:</p>
86
87 <struct name="message_header" send="yes" recv="yes">
88 <member name="_unknown" type="U16"/>
89 <member name="length" type="U16"/>
90 The length is the length of the full message including the header.
91 <member name="type" type="U16"/>
92 If the type is &gt;= 0x4000 this is a message for a specific channel. The channel
93 number is always the next U16.
94 </struct>
95
96 <h2>Primitive types used in the protocol.</h2>
97
98 <p>Apart from the basic types, I need to define some extra types to
99 deal with fixed-point values (based on integer types) or fixed-length
100 strings (either 7-bit-ascii or more limited (<code>A</code>), or UCS-2
101 based (<code>S</code>)).</p>
102
103 <type name="username" type="A" length="12"/>
104
105 <p>The basic user or login name, used throughout the protocol
106 as a handle to the user.</p>
107
108 <type name="roomname" type="S" length="25"/><!-- argh, how horribly broken -->
109
110 <p>Many strings in the protocol are fixed-width for no good reason
111 (maybe this is one reason for using compression in enwer versions, as
112 the packets itself are wasting lots of space.</p>
113
114 <type name="locale" type="A" length="5"/>
115
116 <p>A kind of locale specifier. It seems the general format seems to be
117 lowercase language, underscore, uppercase location, e.g. en_US. More
118 fancy specifications don't fit.</p>
119
120 <type name="flag" type="U8" multiplier="1"/>
121
122 <p>Just a simple boolean value. 0 means false, and 1 generally true,
123 but I suggest ccepting != 0 as true.</p>
124
125 <type name="komi16" type="I16" multiplier="2"/>
126 <type name="komi32" type="I32" multiplier="2"/>
127
128 <p>Komi values are multiplied by 2 to make them integer in the
129 protocol. Of course, sometimes they are encoded in 16 bits, sometimes
130 in 32. Get used to this.</p>
131
132 <type name="result" type="I32" multiplier="2"/>
133
134 <p>The game result is also multiplied by four to give it higher
135 resolution. There are also special values for wins by time etc.</p>
136
137 <type name="score" type="I32" multiplier="4"/>
138
139 <p>A score value (used for displaying the score at the end of a game)
140 are multiplied by four for a change. I have not yet seen 0.25 scores,
141 please somebody tell me where they happen, or if they happen.</p>
142
143 <type name="time" type="U32" multiplier="1000"/>
144
145 <p>Time values are multiplied by 1000, giving them millisecond
146 accuracy.</p>
147
148 <h2>Constants, enumeration and set types used in the protocol.</h2>
149
150 <p>Baaah... not yet.</p>
151
152 <h2>Structs used in send &amp; receive messages</h2>
153
154 <struct name="user" class="KGS::User">
155
156 Everywhere a user + flags is required, even used in some places
157 where only a username is required. I see no general rule on when a
158 complete user and when a partial user is required.
159
160 <member name="name" type="username"/>
161 <member name="flags" type="U32" default="1"/>
162 </struct>
163
164 <struct name="rules" class="KGS::Rules">
165
166 This structure is used for challanges as well as in the special
167 TREE "subprotocol". It tightly encodes the game parameters.
168
169 <member name="ruleset" type="U8"/>
170 <member name="size" type="U8"/>
171 <member name="handicap" type="U8"/>
172 <member name="komi" type="komi16"/>
173 <member name="timesys" type="U8"/>
174 <member name="time" type="U32"/>
175 <member name="interval" type="U32"/>
176 byo-yomi time / canadian time
177 <member name="count" type="U16"/>
178 periods / moves
179 </struct>
180
181 <h2>Structs used in send messages</h2>
182
183 <message type="0000" name="login" send="yes">
184
185 Send on the initial login. The password needs to be set when the
186 guest flag is true.
187
188 <member name="ver_major" type="U32" default="2"/>
189 <member name="ver_minor" type="U32" default="4"/>
190 <member name="ver_micro" type="U32" default="67"/>
191 <member name="name" type="username"/>
192 <member name="password " type="U64" default="0"/>
193 Password is a number calculated as follows (VERY insecure, basically plaintext!):
194 password = 0; for char in characters do password ← password * 1055 + ascii_code (char);
195 <member name="guest" type="flag" default="1"/>
196 <member name="_unknown3" type="U16" default="0"/>
197 <member name="locale" type="locale" default='"en_US"'/>
198 <member name="clientver" type="DATA" default='"1.4.1_01:Swing app:Sun Microsystems Inc."'/>
199 The "default" is the java vm version, not exactly he client version. However,
200 you should always send a tetx like "Jonathan's C client bersion 0.6" or somesuch,
201 so the server can, if necessary, block broken clients or client versions.
202 </message>
203
204 <message type="0014" name="server_stats" send="yes">
205 Request server statistics.
206 </message>
207
208 <message type="0021" name="pic_req" send="yes">
209 Request a user picture from the server. Results in a userpic-reply
210 or a timeout :/.
211 <member name="name" type="username"/>
212 </message>
213
214 <message type="0021" name="pic_upload" send="yes">
215 Same code as pic_req, but with an additional data section that
216 must contain a JPEG image that is &lt;=7KB. It must have 141×200 pixels.
217 <member name="name" type="username"/>
218 <member name="data" type="DATA"/>
219 </message>
220
221 <message type="0100" name="gnotice" send="yes">
222 Send a global message. Maybe. Never tried, for obvious reasons :/
223 <member name="notice" type="STRING"/>
224 </message>
225
226 <message type="0318" name="list_rooms" send="yes">
227 List the rooms in a specific group/category. Results in a upd_rooms message.
228 <member name="group" type="U8"/>
229 </message>
230
231 <message type="031a" name="new_room" send="yes">
232 Create a new room. Not verified.
233 <member name="name" type="username"/>
234 <member name="i1" type="U32" default="0"/>
235 <member name="b1" type="U8" default="0"/>
236 <member name="b2" type="U8" default="255"/>
237 <member name="b3" type="U8" default="255"/>
238 <member name="group" type="U8" default="1"/>
239 <member name="name" type="STRING"/>
240 <member name="description" type="STRING"/>
241 <member name="flags" type="U8"/>
242 0x10 .. private room etc.. see code
243 </message>
244
245 <message type="4300" name="join_room" send="yes">
246 Joins the given room. join_room messages for yourself
247 and all users in that room, as well as the initial gamelist, are
248 send if the room exists. If not, timeout...
249 <member name="channel" type="U16"/>
250 <member name="user" type="user"/>
251 </message>
252
253 <message type="4301" name="msg_room" send="yes">
254 Send a message to the room.
255 <member name="channel" type="U16"/>
256 <member name="name" type="username"/>
257 Must be the login-name of the user.
258 <member name="message" type="STRING"/>
259 </message>
260
261 <message type="4302" name="part_room" send="yes">
262 Remove yourself (or maybe others as admin) from a room.
263 <member name="channel" type="U16"/>
264 <member name="name" type="username"/>
265 </message>
266
267 <message type="4305" name="new_game" send="yes">
268 Unclear.
269 <member name="channel" type="U16"/>
270 <member name="id" type="U16"/>
271 <member name="gametype" type="U32"/>
272 <member name="rules" type="rules"/>
273 <member name="notes" type="STRING"/>
274 </message>
275
276 <message type="430b" name="req_games" send="yes">
277 Request to update room game list (send this once per minute to get
278 updated). Results in upd_games messages.
279 <member name="channel" type="U16"/>
280 </message>
281
282 <message type="4319" name="req_desc" send="yes">
283 Request room description.
284 <member name="channel" type="U16"/>
285 </message>
286
287 <message type="4400" name="send_chal" send="yes">
288 Unclear.
289 <member name="channel" type="U16"/>
290 <member name="black" type="username"/>
291 <member name="white" type="username"/>
292 More following... TREE or challenge.
293 </message>
294
295 <message type="4403" name="join_game" send="yes">
296 Join a game. See join_room.
297 <member name="channel" type="U16"/>
298 <member name="user" type="user"/>
299 </message>
300
301 <message type="4404" name="part_game" send="yes">
302 Leave (or kick as admin?) a certain user from a game.
303 <member name="channel" type="U16"/>
304 <member name="name" type="username"/>
305 </message>
306
307 <message type="4405" name="set_tree" send="yes">
308 Upload a partial game tree to the server. This is used
309 to send moves and even in-game comments to the server. For the comments,
310 the server prepends the username and rank.
311 <member name="channel" type="U16"/>
312 <member name="tree" type="TREE"/>
313 </message>
314
315 <message type="4408" name="get_tree" send="yes">
316 Request the game tree starting at a given node. This is used
317 when the server only sends a partial tree (with end code "more").
318 <member name="channel" type="U16"/>
319 <member name="node" type="U32"/>
320 </message>
321
322 <message type="440c" name="claim_win" send="yes">
323 Unclear.
324 <member name="channel" type="U16"/>
325 <member name="_byte" type="U8 "/>
326 Player colour maybe? Unclear.
327 </message>
328
329 <message type="440d" name="add_time" send="yes">
330 Not checked.
331
332 <member name="channel" type="U16"/>
333 <member name="time" type="U32"/>
334 <member name="player" type="U8"/>
335 </message>
336
337 <message type="440f" name="grant_undo" send="yes">
338 Can be send after a req_undo message was received to grant the undo.
339 <member name="channel" type="U16"/>
340 </message>
341
342 <message type="4410" name="resign_game" send="yes">
343 Resign the game.
344 <member name="channel" type="U16"/>
345 <member name="player" type="U8"/>
346 </message>
347
348 <message type="441a" name="set_teacher" send="yes">
349 Change the teacher to somebody else (or possibly yourself == take it).
350 <member name="channel" type="U16"/>
351 <member name="name" type="username"/>
352 </message>
353
354 <message type="4422" name="add_user" send="yes">
355 Unclear. Maybe allow users to talk? No idea, really.
356
357 <member name="channel" type="U16"/>
358 <member name="othername" type="username"/>
359 <member name="name" type="username"/>; # gives user access to the game (to what? ;)
360 </message>
361
362 <message type="4423" name="set_privacy" send="yes">
363 Probably sets the "quiet" flag. Not checked.
364 <member name="channel" type="U16"/>
365 <member name="private" type="U8"/>
366 </message>
367
368 <message type="4429" name="reject_chal" send="yes">
369 Reject a challenge from a given user. Not checked.
370
371 <member name="channel" type="U16"/>
372 <member name="name" type="username"/>
373 </message>
374
375 <message type="4433" name="req_result" send="yes">
376 I forgot.
377
378 <member name="channel" type="U16"/>
379 </message>
380
381 <h2>Structs mainly used in receive messages</h2>
382
383 <struct name="challenge_defaults">
384 Send soon after log-in to set the defaults for game challenges.
385 <member name="gametype" type="U32"/>
386 <member name="size" type="U32"/>
387 <member name="timesys" type="U32"/>
388 <member name="time" type="U32"/>
389 <member name="byo_time" type="U32"/>
390 <member name="byo_periods" type="U32"/>
391 <member name="can_time" type="U32"/>
392 <member name="can_stones" type="U32"/>
393 </struct>
394
395 <struct name="challenge" class="KGS::Challenge">
396 A challenge.
397
398 <member name="user1" type="user"/>
399 <member name="user2" type="user"/>
400 <member name="gametype" type="U32"/>
401 <member name="rules" type="rules"/>
402 Maybe the rules" are in TREE format. I forgot.
403 </struct>
404
405 <struct name="game" class="KGS::Game">
406 Basic information about a game. Used in rooms for the gamelist and
407 in games to detect when a game is saved, changed type (e.g. R => D)
408 etc.
409
410 <member name="channel" type="U16"/>
411 <member name="type" type="U32"/>
412 <member name="user1" type="user"/>
413 White
414 <member name="user2" type="user"/>
415 Black
416 <member name="user3" type="user"/>
417 Owner
418 <member name="size" type="U32"/>
419 <member name="handicap" type="I32"/>
420 &lt; 0 not fully setup
421 <member name="komi" type="komi32"/>
422 <member name="moves" type="U16"/>
423 <member name="flags" type="U16"/>
424 <member name="observers" type="U32"/>
425 <member name="saved" type="flag"/>
426 <member name="notes" type="STRING" guard-member="handicap" guard-cond="&lt; 0"/>
427 </struct>
428
429 <struct name="room_obs">
430 Obsolete.
431
432 <member name="name" type="roomname"/>
433 <member name="channel" type="U16"/>
434 <member name="flags" type="U32"/>
435 <member name="users" type="U32"/>
436 </struct>
437
438 <struct name="room" class="KGS::Room">
439 <member name="channel" type="U16"/>
440 <member name="flags" type="U8"/>
441 <member name="group" type="U8"/>
442 <member name="users" type="U16"/>
443 <member name="games" type="U16"/>
444 <member name="name" type="STRING"/>
445 </struct>
446
447 <struct name="score" class="KGS::Score">
448 <member name="score" type="score"/>
449 <member name="territory" type="U32"/>
450 <member name="captures" type="U32"/>
451 <member name="i3" type="U32"/>
452 <member name="f2" type="U32"/>
453 <member name="komi" type="komi32"/>
454 <member name="i4" type="U32"/>
455 Apparently the i3, f2, i4 are zero.
456 </struct>
457
458 <h2>Receive messages</h2>
459
460 <message type="0001" name="login" recv="yes">
461 <member name="result" type="CONSTANT" default='"login ok"'/>
462 <member name="success" type="CONSTANT" default="1"/>
463 </message>
464
465 <message type="0002" name="login" recv="yes">
466 <member name="result" type="CONSTANT" default='"guest login ok"'/>
467 <member name="success" type="CONSTANT" default="1"/>
468 </message>
469
470 <message type="0003" name="login" recv="yes">
471 <member name="result" type="CONSTANT" default='"login error 3"'/>
472 ** maybe more following? **
473 </message>
474
475 <message type="0004" name="login" recv="yes">
476 <member name="result" type="CONSTANT" default='"wrong password"'/>
477 ** maybe more following? **
478 </message>
479
480 <message type="0005" name="login" recv="yes">
481 <member name="result" type="CONSTANT" default='"user unknown"'/>
482 ** maybe more following? **
483 </message>
484
485 <message type="0006" name="login" recv="yes">
486 <member name="result" type="CONSTANT" default='"user exists"'/>
487 ** maybe more following? **
488 </message>
489
490 <message type="0018" name="login" recv="yes">
491 <member name="result" type="CONSTANT" default='"login error 18"'/>
492 ** maybe more following? **
493 </message>
494
495 <message type="0022" name="login" recv="yes">
496 <!-- "thanks" to jyem for blocking me ;)-->
497 <member name="result" type="CONSTANT" default='"user or ip blocked"'/>
498 <member name="reason" type="STRING"/>
499 </message>
500
501 <message type="0013" name="msg_chat" recv="yes">
502 <member name="user1" type="username"/>
503 <member name="user2" type="username"/>
504 <member name="message" type="STRING"/>
505 </message>
506
507 <message type="0015" name="stats" recv="yes">
508 <member name="ver_major" type="U16"/>
509 <member name="ver_minor" type="U16"/>
510 <member name="ver_micro" type="U16"/>
511 <member name="boot_time" type="U64"/>
512 <member name="users_cur" type="U32"/>
513 <member name="users_max" type="U32"/>
514 <member name="users_lim" type="U32"/>
515 <member name="accts_cur" type="U32"/>
516 <member name="accts_max" type="U32"/>
517 <member name="unknown1" type="U32"/>
518 <member name="work_max" type="U32"/>
519 <member name="rooms_cur" type="U32"/>
520 <member name="rooms_max" type="U32"/>
521 <member name="rooms_lim" type="U32"/>
522 <member name="games_cur" type="U32"/>
523 <member name="games_max" type="U32"/>
524 <member name="games_lim" type="U32"/>
525 <member name="results_cur" type="U32"/>
526 <member name="results_max" type="U32"/>
527 <member name="unknown2" type="U32"/>
528 <member name="params_cur" type="U32"/>
529 <member name="params_max" type="U32"/>
530 <member name="bytes_in" type="U64"/>
531 <member name="packets_in" type="U64"/>
532 <member name="bytes_out" type="U64"/>
533 <member name="packets_out" type="U64"/>
534 </message>
535
536 <message type="0016" name="idle_warn" recv="yes">
537 idle warning, autologout soon (10 minutes...)
538 </message>
539
540 <message type="001b" name="timewarning_default" recv="yes">
541 WILD guess
542 <member name="channel" type="U16"/>
543 <member name="time" type="U16"/>
544 </message>
545
546 <message type="001c" name="idle_err" recv="yes">
547 autologout
548 </message>
549
550 <message type="001d" name="ping" recv="yes">
551 </message>
552
553 <message type="0021" name="userpic" recv="yes">
554 <member name="name" type="username"/>
555 Reply to pic_req, contains an image in jpeg format.
556 <member name="data" type="DATA"/>
557 </message>
558
559 <message type="0100" name="gnotice" recv="yes">
560 global notice, sent to everybody
561 <member name="notice" type="STRING"/>
562 </message>
563
564
565 <message type="0310" name="priv_room" recv="yes">
566 "permission denied" when joining a room
567 <member name="name" type="STRING"/>
568 </message>
569
570 <message type="0318" name="upd_rooms" recv="yes">
571 <member name="rooms" type="room" array="yes"/>
572 </message>
573
574 <message type="041c" name="upd_game2" recv="yes">
575 <member name="channel_junk" type="U16"/>
576 <member name="game" type="game"/>
577 </message>
578
579 <message type="0202" name="upd_user" recv="yes">
580 # loc 0" type="chat(?) loc 1 => gameinfo?, loc 2 => game result (more data)
581 <member name="location" type="U32"/>
582 <member name="user" type="user"/>
583 <member name="lotsofinfo" type="DATA" guard-member="location" guard-cond="== 2"/>
584 </message>
585
586 <h3>Room messages</h3>
587
588 <p>Not all room messages are for rooms only, and rooms need to parse
589 not only these messages. Orthogonality, what for?</p>
590
591 <message type="4300" name="join_room" recv="yes">
592 <member name="channel" type="U16"/>
593 <member name="users" type="user" array="yes"/>
594 </message>
595
596 <message type="4301" name="msg_room" recv="yes">
597 <member name="channel" type="U16"/>
598 <member name="name" type="username"/>
599 <member name="message" type="STRING"/>
600 </message>
601
602 <message type="4302" name="part_room" recv="yes">
603 <member name="channel" type="U16"/>
604 <member name="user" type="user"/>
605 </message>
606
607 <message type="4303" name="del_room" recv="yes">
608 <member name="channel" type="U16"/>
609
610 </message>
611
612 <message type="4304" name="upd_games" recv="yes">
613 <member name="channel" type="U16"/>
614 <member name="games" type="game" array="yes"/>
615 </message>
616
617 <message type="4319" name="desc_room" recv="yes">
618 <member name="channel" type="U16"/>
619 <member name="owner" type="username"/>
620 <member name="description" type="STRING"/>
621 </message>
622
623
624 <message type="0411" name="chal_defaults" recv="yes">
625 <member name="channel" type="U16"/>
626 <member name="defaults" type="challenge_defaults"/>
627 </message>
628
629 <h3>Game messages</h3>
630
631 <message type="4400" name="upd_chal" recv="yes">
632 Unclear.
633 <member name="channel" type="U16"/>
634 <member name="challenge" type="challenge"/>
635 </message>
636
637 <message type="4401" name="upd_game" recv="yes">
638 <member name="channel" type="U16"/>
639 <member name="game" type="game"/>
640 </message>
641
642 <message type="4402" name="del_game" recv="yes">
643 <member name="channel" type="U16"/>
644 </message>
645
646 <message type="4403" name="upd_observers" recv="yes">
647 <member name="channel" type="U16"/>
648 <member name="users" type="user" array="yes"/>
649 </message>
650
651 <message type="4404" name="del_observer" recv="yes">
652 <member name="channel" type="U16"/>
653 <member name="name" type="username"/>
654 </message>
655
656 <message type="4405" name="set_tree" recv="yes">
657 <member name="channel" type="U16"/>
658 <member name="tree" type="TREE"/>
659 </message>
660
661 <message type="4406" name="upd_tree" recv="yes">
662 <member name="channel" type="U16"/>
663 <member name="tree" type="TREE"/>
664 </message>
665
666 <message type="4407" name="set_node" recv="yes">
667 <member name="channel" type="U16"/>
668 <member name="node" type="U32"/>
669 </message>
670
671 <message type="4409" name="superko" recv="yes">
672 Superko-warning.
673 <member name="channel" type="U16"/>
674 </message>
675
676 <message type="440b" name="final_result" recv="yes">
677 <member name="channel" type="U16"/>
678 <member name="blackscore" type="score"/>
679 <member name="whitescore" type="score"/>
680 </message>
681
682 <message type="440e" name="req_undo" recv="yes">
683 <member name="channel" type="U16"/>
684
685 </message>
686
687 <message type="4410" name="resign_game" recv="yes">
688 <member name="channel" type="U16"/>
689 <member name="player" type="U8"/>
690 </message>
691
692 <message type="441a" name="set_teacher" recv="yes">
693 <member name="channel" type="U16"/>
694 <member name="name" type="username"/>
695 </message>
696
697 <message type="441d" name="owner_left" recv="yes">
698 Unclear.
699 <member name="channel" type="U16"/>
700 </message>
701
702 <message type="441e" name="teacher_left" recv="yes">
703 Unclear.
704 <member name="channel" type="U16"/>
705 </message>
706
707 <message type="4422" name="unknown4422" recv="yes">
708 change teacher? something to do with editing?
709 <member name="channel" type="U16"/>
710 <member name="name1" type="username"/>
711 <member name="name2" type="username"/>
712 </message>
713
714 <message type="4433" name="req_result" recv="yes">
715 Unclear.
716 <member name="channel" type="U16"/>
717 # # recv_result(?)
718 </message>
719
720 <message type="4434" name="unknown4434" recv="yes">
721 <member name="channel" type="U16"/>
722 <member name="b1" type="U8"/>
723 ?? !demonstration game??
724 </message>
725
726 </body>
727 </html>
728