ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/protocol.xml
Revision: 1.14
Committed: Tue Jun 10 08:01:18 2003 UTC (20 years, 11 months ago) by pcg
Content type: text/xml
Branch: MAIN
Changes since 1.13: +3 -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>$Revision: 1.13 $</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.</p>
130
131 <type name="result" type="I32" multiplier="2"/>
132
133 <p>The game result is also multiplied by four to give it higher
134 resolution. There are also special values for wins by time etc.</p>
135
136 <type name="score16" type="I16" multiplier="4"/>
137 <type name="score32" 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 This field reflects either the movenum or the score, sorry, not even guards help, as
424 the flags to determine that are _after_ the field. Arg. Divide by two to get the score.
425 <member name="flags" type="U16"/>
426 <member name="observers" type="U32"/>
427 <member name="saved" type="flag"/>
428 <member name="notes" type="STRING" guard-member="handicap" guard-cond="&lt; 0"/>
429 </struct>
430
431 <struct name="room_obs">
432 Obsolete.
433
434 <member name="name" type="roomname"/>
435 <member name="channel" type="U16"/>
436 <member name="flags" type="U32"/>
437 <member name="users" type="U32"/>
438 </struct>
439
440 <struct name="room" class="KGS::Room">
441 <member name="channel" type="U16"/>
442 <member name="flags" type="U8"/>
443 <member name="group" type="U8"/>
444 <member name="users" type="U16"/>
445 <member name="games" type="U16"/>
446 <member name="name" type="STRING"/>
447 </struct>
448
449 <struct name="scorevalues" class="KGS::Score">
450 <member name="score" type="score32"/>
451 <member name="territory" type="U32"/>
452 <member name="captures" type="U32"/>
453 <member name="i3" type="U32"/>
454 <member name="f2" type="U32"/>
455 <member name="komi" type="komi32"/>
456 <member name="i4" type="U32"/>
457 Apparently the i3, f2, i4 are zero.
458 </struct>
459
460 <h2>Receive messages</h2>
461
462 <message type="0001" name="login" recv="yes">
463 <member name="result" type="CONSTANT" default='"login ok"'/>
464 <member name="success" type="CONSTANT" default="1"/>
465 </message>
466
467 <message type="0002" name="login" recv="yes">
468 <member name="result" type="CONSTANT" default='"guest login ok"'/>
469 <member name="success" type="CONSTANT" default="1"/>
470 </message>
471
472 <message type="0003" name="login" recv="yes">
473 <member name="result" type="CONSTANT" default='"login error 3"'/>
474 ** maybe more following? **
475 </message>
476
477 <message type="0004" name="login" recv="yes">
478 <member name="result" type="CONSTANT" default='"wrong password"'/>
479 ** maybe more following? **
480 </message>
481
482 <message type="0005" name="login" recv="yes">
483 <member name="result" type="CONSTANT" default='"user unknown"'/>
484 ** maybe more following? **
485 </message>
486
487 <message type="0006" name="login" recv="yes">
488 <member name="result" type="CONSTANT" default='"user exists"'/>
489 ** maybe more following? **
490 </message>
491
492 <message type="0018" name="login" recv="yes">
493 <member name="result" type="CONSTANT" default='"login error 18"'/>
494 ** maybe more following? **
495 </message>
496
497 <message type="0022" name="login" recv="yes">
498 <!-- "thanks" to jyem for blocking me ;)-->
499 <member name="result" type="CONSTANT" default='"user or ip blocked"'/>
500 <member name="reason" type="STRING"/>
501 </message>
502
503 <message type="0013" name="msg_chat" recv="yes">
504 <member name="user1" type="username"/>
505 <member name="user2" type="username"/>
506 <member name="message" type="STRING"/>
507 </message>
508
509 <message type="0015" name="stats" recv="yes">
510 <member name="ver_major" type="U16"/>
511 <member name="ver_minor" type="U16"/>
512 <member name="ver_micro" type="U16"/>
513 <member name="boot_time" type="U64"/>
514 <member name="users_cur" type="U32"/>
515 <member name="users_max" type="U32"/>
516 <member name="users_lim" type="U32"/>
517 <member name="accts_cur" type="U32"/>
518 <member name="accts_max" type="U32"/>
519 <member name="unknown1" type="U32"/>
520 <member name="work_max" type="U32"/>
521 <member name="rooms_cur" type="U32"/>
522 <member name="rooms_max" type="U32"/>
523 <member name="rooms_lim" type="U32"/>
524 <member name="games_cur" type="U32"/>
525 <member name="games_max" type="U32"/>
526 <member name="games_lim" type="U32"/>
527 <member name="results_cur" type="U32"/>
528 <member name="results_max" type="U32"/>
529 <member name="unknown2" type="U32"/>
530 <member name="params_cur" type="U32"/>
531 <member name="params_max" type="U32"/>
532 <member name="bytes_in" type="U64"/>
533 <member name="packets_in" type="U64"/>
534 <member name="bytes_out" type="U64"/>
535 <member name="packets_out" type="U64"/>
536 </message>
537
538 <message type="0016" name="idle_warn" recv="yes">
539 idle warning, autologout soon (10 minutes...)
540 </message>
541
542 <message type="001b" name="timewarning_default" recv="yes">
543 WILD guess
544 <member name="channel" type="U16"/>
545 <member name="time" type="U16"/>
546 </message>
547
548 <message type="001c" name="idle_err" recv="yes">
549 autologout
550 </message>
551
552 <message type="001d" name="ping" recv="yes">
553 </message>
554
555 <message type="0021" name="userpic" recv="yes">
556 <member name="name" type="username"/>
557 Reply to pic_req, contains an image in jpeg format.
558 <member name="data" type="DATA"/>
559 </message>
560
561 <message type="0100" name="gnotice" recv="yes">
562 global notice, sent to everybody
563 <member name="notice" type="STRING"/>
564 </message>
565
566
567 <message type="0310" name="priv_room" recv="yes">
568 "permission denied" when joining a room
569 <member name="name" type="STRING"/>
570 </message>
571
572 <message type="0318" name="upd_rooms" recv="yes">
573 <member name="rooms" type="room" array="yes"/>
574 </message>
575
576 <message type="041c" name="upd_game2" recv="yes">
577 <member name="channel_junk" type="U16"/>
578 <member name="game" type="game"/>
579 </message>
580
581 <message type="0202" name="upd_user" recv="yes">
582 # loc 0" type="chat(?) loc 1 => gameinfo?, loc 2 => game result (more data)
583 <member name="location" type="U32"/>
584 <member name="user" type="user"/>
585 <member name="lotsofinfo" type="DATA" guard-member="location" guard-cond="== 2"/>
586 </message>
587
588 <h3>Room messages</h3>
589
590 <p>Not all room messages are for rooms only, and rooms need to parse
591 not only these messages. Orthogonality, what for?</p>
592
593 <message type="4300" name="join_room" recv="yes">
594 <member name="channel" type="U16"/>
595 <member name="users" type="user" array="yes"/>
596 </message>
597
598 <message type="4301" name="msg_room" recv="yes">
599 <member name="channel" type="U16"/>
600 <member name="name" type="username"/>
601 <member name="message" type="STRING"/>
602 </message>
603
604 <message type="4302" name="part_room" recv="yes">
605 <member name="channel" type="U16"/>
606 <member name="user" type="user"/>
607 </message>
608
609 <message type="4303" name="del_room" recv="yes">
610 <member name="channel" type="U16"/>
611
612 </message>
613
614 <message type="4304" name="upd_games" recv="yes">
615 <member name="channel" type="U16"/>
616 <member name="games" type="game" array="yes"/>
617 </message>
618
619 <message type="4319" name="desc_room" recv="yes">
620 <member name="channel" type="U16"/>
621 <member name="owner" type="username"/>
622 <member name="description" type="STRING"/>
623 </message>
624
625
626 <message type="0411" name="chal_defaults" recv="yes">
627 <member name="channel" type="U16"/>
628 <member name="defaults" type="challenge_defaults"/>
629 </message>
630
631 <h3>Game messages</h3>
632
633 <message type="4400" name="upd_chal" recv="yes">
634 Unclear.
635 <member name="channel" type="U16"/>
636 <member name="challenge" type="challenge"/>
637 </message>
638
639 <message type="4401" name="upd_game" recv="yes">
640 <member name="channel" type="U16"/>
641 <member name="game" type="game"/>
642 </message>
643
644 <message type="4402" name="del_game" recv="yes">
645 <member name="channel" type="U16"/>
646 </message>
647
648 <message type="4403" name="upd_observers" recv="yes">
649 <member name="channel" type="U16"/>
650 <member name="users" type="user" array="yes"/>
651 </message>
652
653 <message type="4404" name="del_observer" recv="yes">
654 <member name="channel" type="U16"/>
655 <member name="name" type="username"/>
656 </message>
657
658 <message type="4405" name="set_tree" recv="yes">
659 <member name="channel" type="U16"/>
660 <member name="tree" type="TREE"/>
661 </message>
662
663 <message type="4406" name="upd_tree" recv="yes">
664 <member name="channel" type="U16"/>
665 <member name="tree" type="TREE"/>
666 </message>
667
668 <message type="4407" name="set_node" recv="yes">
669 <member name="channel" type="U16"/>
670 <member name="node" type="U32"/>
671 </message>
672
673 <message type="4409" name="superko" recv="yes">
674 Superko-warning.
675 <member name="channel" type="U16"/>
676 </message>
677
678 <message type="440b" name="final_result" recv="yes">
679 <member name="channel" type="U16"/>
680 <member name="blackscore" type="scorevalues"/>
681 <member name="whitescore" type="scorevalues"/>
682 </message>
683
684 <message type="440e" name="req_undo" recv="yes">
685 <member name="channel" type="U16"/>
686
687 </message>
688
689 <message type="4410" name="resign_game" recv="yes">
690 <member name="channel" type="U16"/>
691 <member name="player" type="U8"/>
692 </message>
693
694 <message type="441a" name="set_teacher" recv="yes">
695 <member name="channel" type="U16"/>
696 <member name="name" type="username"/>
697 </message>
698
699 <message type="441d" name="owner_left" recv="yes">
700 Unclear.
701 <member name="channel" type="U16"/>
702 </message>
703
704 <message type="441e" name="teacher_left" recv="yes">
705 Unclear.
706 <member name="channel" type="U16"/>
707 </message>
708
709 <message type="4422" name="unknown4422" recv="yes">
710 change teacher? something to do with editing?
711 <member name="channel" type="U16"/>
712 <member name="name1" type="username"/>
713 <member name="name2" type="username"/>
714 </message>
715
716 <message type="4433" name="req_result" recv="yes">
717 Unclear.
718 <member name="channel" type="U16"/>
719 # # recv_result(?)
720 </message>
721
722 <message type="4434" name="unknown4434" recv="yes">
723 <member name="channel" type="U16"/>
724 <member name="b1" type="U8"/>
725 ?? !demonstration game??
726 </message>
727
728 </body>
729 </html>
730