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