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