ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/doc/protocol.xml
Revision: 1.6
Committed: Thu Jun 5 10:40:17 2003 UTC (20 years, 11 months ago) by pcg
Content type: text/xml
Branch: MAIN
Changes since 1.5: +17 -16 lines
Log Message:
*** empty log message ***

File Contents

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