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