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