… | |
… | |
20 | Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
20 | Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
21 | --> |
21 | --> |
22 | </head> |
22 | </head> |
23 | <body> |
23 | <body> |
24 | |
24 | |
25 | <h1>$Revision: 1.27 $</h1> |
25 | <h1>$Revision: 1.28 $</h1> |
26 | |
26 | |
27 | <h1>KGS Protocol Description</h1> |
27 | <h1>KGS Protocol Description</h1> |
28 | |
28 | |
29 | <p>This XML document describes the KGS protocol. It is also used |
29 | <p>This XML document describes the KGS protocol. It is also used |
30 | to automatically generate the perl parser for all the messages and |
30 | to automatically generate the perl parser for all the messages and |
… | |
… | |
99 | stream (<a href="http://rfc1950.x42.com/">rfc1950</a> and <a |
99 | stream (<a href="http://rfc1950.x42.com/">rfc1950</a> and <a |
100 | href="http://rfc1950.x42.com/">rfc1951</a>).</p> |
100 | href="http://rfc1950.x42.com/">rfc1951</a>).</p> |
101 | |
101 | |
102 | <p>All messages have the same header:</p> |
102 | <p>All messages have the same header:</p> |
103 | |
103 | |
104 | <struct name="message_header" send="yes" recv="yes"> |
104 | <struct name="message_header"> |
105 | <member name="_unknown" type="U16"/> |
105 | <member name="_unknown" type="U16"/> |
106 | <member name="length" type="U16"/> |
106 | <member name="length" type="U16"/> |
107 | |
107 | |
108 | <p>The length is the length of the full message including the header.</p> |
108 | <p>The length is the length of the full message including the header.</p> |
109 | |
109 | |
… | |
… | |
241 | |
241 | |
242 | <h2>Structs used in send messages</h2> |
242 | <h2>Structs used in send messages</h2> |
243 | |
243 | |
244 | <h2>Send messages</h2> |
244 | <h2>Send messages</h2> |
245 | |
245 | |
246 | <message type="0000" name="login" send="yes"> |
246 | <message type="0000" name="login" dir="send"> |
247 | |
247 | |
248 | <p>Sent to login, usually the first message sent. The password needs to be set when the |
248 | <p>Sent to login, usually the first message sent. The password needs to be set when the |
249 | guest flag is true. |
249 | guest flag is true. |
250 | Possible replies: <ref reply="login"/>. Followed by: <ref reply="timewarning_default"/> <ref reply="chal_defaults"/> |
250 | Possible replies: <ref reply="login"/>. Followed by: <ref reply="timewarning_default"/> <ref reply="chal_defaults"/> |
251 | </p> |
251 | </p> |
… | |
… | |
262 | The "default" is the java vm version, not exactly he client version. However, |
262 | The "default" is the java vm version, not exactly he client version. However, |
263 | you should always send a text like "Jonathan's C client bersion 0.6" or somesuch, |
263 | you should always send a text like "Jonathan's C client bersion 0.6" or somesuch, |
264 | so the server can, if necessary, block broken clients or client versions. |
264 | so the server can, if necessary, block broken clients or client versions. |
265 | </message> |
265 | </message> |
266 | |
266 | |
267 | <message type="0007" name="req_userinfo" send="yes"> |
267 | <message type="0007" name="req_userinfo" dir="send"> |
268 | <p>Request info about a certain user. Possible reply: <ref reply="userinfo"/></p> |
268 | <p>Request info about a certain user. Possible reply: <ref reply="userinfo"/></p> |
269 | <member name="name" type="username"/> |
269 | <member name="name" type="username"/> |
270 | </message> |
270 | </message> |
271 | |
271 | |
272 | <message type="0007" name="update_userinfo" send="yes"> |
272 | <message type="0007" name="update_userinfo" dir="send"> |
273 | <p>Update user info. Message structure is very similar |
273 | <p>Update user info. Message structure is very similar |
274 | to <ref ref="userinfo"/>.</p> |
274 | to <ref ref="userinfo"/>.</p> |
275 | <member name="setpass" type="flag"/> |
275 | <member name="setpass" type="flag"/> |
276 | Should the password be updated? |
276 | Should the password be updated? |
277 | <member name="password" type="password" default="0"/> |
277 | <member name="password" type="password" default="0"/> |
… | |
… | |
281 | <member name="homepage" type="url"/> |
281 | <member name="homepage" type="url"/> |
282 | <member name="_unused" type="U64" default="0"/> |
282 | <member name="_unused" type="U64" default="0"/> |
283 | <member name="_unused" type="U64" default="0"/> |
283 | <member name="_unused" type="U64" default="0"/> |
284 | </message> |
284 | </message> |
285 | |
285 | |
286 | <message type="0014" name="req_stats" send="yes"> |
286 | <message type="0014" name="req_stats" dir="send"> |
287 | <p>Request server statistics. Replied with <ref reply="stats"/></p> |
287 | <p>Request server statistics. Replied with <ref reply="stats"/></p> |
288 | </message> |
288 | </message> |
289 | |
289 | |
290 | <message type="001d" name="ping" send="yes"> |
290 | <message type="001d" name="ping" dir="send"> |
291 | <p>Wild guess, I send it in <ref ref="idle_warn"/>.</p> |
291 | <p>Wild guess, I send it in <ref ref="idle_warn"/>.</p> |
292 | </message> |
292 | </message> |
293 | |
293 | |
294 | <message type="001e" name="req_usergraph" send="yes"> |
294 | <message type="001e" name="req_usergraph" dir="send"> |
295 | <p>Request user graph data, replied with <ref reply="usergraph"/>.</p> |
295 | <p>Request user graph data, replied with <ref reply="usergraph"/>.</p> |
296 | <member name="name" type="username"/> |
296 | <member name="name" type="username"/> |
297 | </message> |
297 | </message> |
298 | |
298 | |
299 | <message type="001f" name="fetch_memos" send="yes"> |
299 | <message type="001f" name="fetch_memos" dir="send"> |
300 | <p>Unclear. Fetch all outstanding memos? Replied with <ref reply="memo"/></p> |
300 | <p>Unclear. Fetch all outstanding memos? Replied with <ref reply="memo"/></p> |
301 | </message> |
301 | </message> |
302 | |
302 | |
303 | <message type="0021" name="req_pic" send="yes"> |
303 | <message type="0021" name="req_pic" dir="send"> |
304 | <p>Request a user picture from the server. Results in a <ref reply="userpic"/> |
304 | <p>Request a user picture from the server. Results in a <ref reply="userpic"/> |
305 | or a timeout.</p> |
305 | or a timeout.</p> |
306 | <member name="name" type="username"/> |
306 | <member name="name" type="username"/> |
307 | </message> |
307 | </message> |
308 | |
308 | |
309 | <message type="0021" name="upload_pic" send="yes"> |
309 | <message type="0021" name="upload_pic" dir="send"> |
310 | Same code as pic_req, but with an additional data section that |
310 | Same code as pic_req, but with an additional data section that |
311 | must contain a JPEG image that is <=7KB. It must have 141×200 pixels. |
311 | must contain a JPEG image that is <=7KB. It must have 141×200 pixels. |
312 | <member name="name" type="username"/> |
312 | <member name="name" type="username"/> |
313 | <member name="data" type="DATA"/> |
313 | <member name="data" type="DATA"/> |
314 | </message> |
314 | </message> |
315 | |
315 | |
316 | <message type="0100" name="gnotice" send="yes"> |
316 | <message type="0100" name="gnotice" dir="send"> |
317 | <p>Send a global message. Maybe. Never tried, for obvious reasons :/. Results |
317 | <p>Send a global message. Maybe. Never tried, for obvious reasons :/. Results |
318 | in a <ref reply="gnotice"/> sent to all users.</p> |
318 | in a <ref reply="gnotice"/> sent to all users.</p> |
319 | <member name="notice" type="STRING"/> |
319 | <member name="notice" type="STRING"/> |
320 | </message> |
320 | </message> |
321 | |
321 | |
322 | <message type="0318" name="list_rooms" send="yes"> |
322 | <message type="0318" name="list_rooms" dir="send"> |
323 | <p>List the rooms in a specific group/category. Results in a <ref reply="upd_rooms"/> message.</p> |
323 | <p>List the rooms in a specific group/category. Results in a <ref reply="upd_rooms"/> message.</p> |
324 | <member name="group" type="U8"/> |
324 | <member name="group" type="U8"/> |
325 | </message> |
325 | </message> |
326 | |
326 | |
327 | <message type="031a" name="new_room" send="yes"> |
327 | <message type="031a" name="new_room" dir="send"> |
328 | Create a new room. Not verified. |
328 | Create a new room. Not verified. |
329 | <member name="name" type="username"/> |
329 | <member name="name" type="username"/> |
330 | <member name="i1" type="U32" default="0"/> |
330 | <member name="i1" type="U32" default="0"/> |
331 | <member name="b1" type="U8" default="0"/> |
331 | <member name="b1" type="U8" default="0"/> |
332 | <member name="b2" type="U8" default="255"/> |
332 | <member name="b2" type="U8" default="255"/> |
… | |
… | |
336 | <member name="description" type="STRING"/> |
336 | <member name="description" type="STRING"/> |
337 | <member name="flags" type="U8"/> |
337 | <member name="flags" type="U8"/> |
338 | 0x10 .. private room etc.. see code |
338 | 0x10 .. private room etc.. see code |
339 | </message> |
339 | </message> |
340 | |
340 | |
341 | <message type="0413" name="req_game_record" send="yes"> |
341 | <message type="0413" name="req_game_record" dir="send"> |
342 | <p>Requests part of the users game record to be sent. Results in a <ref reply="game_record"/> or maybe a timeout.</p> |
342 | <p>Requests part of the users game record to be sent. Results in a <ref reply="game_record"/> or maybe a timeout.</p> |
343 | <member name="name" type="username"/> |
343 | <member name="name" type="username"/> |
344 | <member name="timestamp" type="timestamp"/> |
344 | <member name="timestamp" type="timestamp"/> |
345 | If zero, start at the newest games, else only send games |
345 | If zero, start at the newest games, else only send games |
346 | before the given timestap. |
346 | before the given timestap. |
347 | </message> |
347 | </message> |
348 | |
348 | |
349 | <message type="4300" name="join_room" send="yes"> |
349 | <message type="4300" name="join_room" dir="send"> |
350 | <p>Joins the given room. <ref reply="join_room"/> messages for yourself |
350 | <p>Joins the given room. <ref reply="join_room"/> messages for yourself |
351 | and all users in that room, as well as the initial gamelist, are |
351 | and all users in that room, as well as the initial gamelist, are |
352 | send if the room exists. If not, timeout...</p> |
352 | send if the room exists. If not, timeout...</p> |
353 | <member name="channel" type="U16"/> |
353 | <member name="channel" type="U16"/> |
354 | <member name="user" type="user"/> |
354 | <member name="user" type="user"/> |
355 | </message> |
355 | </message> |
356 | |
356 | |
357 | <message type="4301" name="msg_room" send="yes"> |
357 | <message type="4301" name="msg_room" dir="send"> |
358 | Send a message to the room. |
358 | Send a message to the room. |
359 | <member name="channel" type="U16"/> |
359 | <member name="channel" type="U16"/> |
360 | <member name="name" type="username"/> |
360 | <member name="name" type="username"/> |
361 | Must be the login-name of the user. |
361 | Must be the login-name of the user. |
362 | <member name="message" type="STRING"/> |
362 | <member name="message" type="STRING"/> |
363 | </message> |
363 | </message> |
364 | |
364 | |
365 | <message type="4302" name="part_room" send="yes"> |
365 | <message type="4302" name="part_room" dir="send"> |
366 | Remove yourself (or maybe others as admin) from a room. |
366 | Remove yourself (or maybe others as admin) from a room. |
367 | <member name="channel" type="U16"/> |
367 | <member name="channel" type="U16"/> |
368 | <member name="name" type="username"/> |
368 | <member name="name" type="username"/> |
369 | </message> |
369 | </message> |
370 | |
370 | |
371 | <message type="4305" name="new_game" send="yes"> |
371 | <message type="4305" name="new_game" dir="send"> |
372 | Unclear. Start a new game. |
372 | Unclear. Start a new game. |
373 | <member name="channel" type="U16"/> |
373 | <member name="channel" type="U16"/> |
374 | <member name="id" type="U16"/> |
374 | <member name="id" type="U16"/> |
375 | <member name="gametype" type="U32"/> |
375 | <member name="gametype" type="U32"/> |
376 | <member name="rules" type="rules"/> |
376 | <member name="rules" type="rules"/> |
377 | <member name="notes" type="STRING"/> |
377 | <member name="notes" type="STRING"/> |
378 | </message> |
378 | </message> |
379 | |
379 | |
380 | <message type="430b" name="req_games" send="yes"> |
380 | <message type="430b" name="req_games" dir="send"> |
381 | Request to update room game list (send this once per minute to get |
381 | Request to update room game list (send this once per minute to get |
382 | updated). Results in upd_games messages. |
382 | updated). Results in upd_games messages. |
383 | <member name="channel" type="U16"/> |
383 | <member name="channel" type="U16"/> |
384 | </message> |
384 | </message> |
385 | |
385 | |
386 | <message type="4319" name="req_desc" send="yes"> |
386 | <message type="4319" name="req_desc" dir="send"> |
387 | Request room description. |
387 | Request room description. |
388 | <member name="channel" type="U16"/> |
388 | <member name="channel" type="U16"/> |
389 | </message> |
389 | </message> |
390 | |
390 | |
391 | <message type="4400" name="send_chal" send="yes"> |
391 | <message type="4400" name="send_chal" dir="send"> |
392 | Unclear. |
392 | Unclear. |
393 | <member name="channel" type="U16"/> |
393 | <member name="channel" type="U16"/> |
394 | <member name="black" type="username"/> |
394 | <member name="black" type="username"/> |
395 | <member name="white" type="username"/> |
395 | <member name="white" type="username"/> |
396 | More following... TREE or challenge. |
396 | More following... TREE or challenge. |
397 | </message> |
397 | </message> |
398 | |
398 | |
399 | <message type="4403" name="join_game" send="yes"> |
399 | <message type="4403" name="join_game" dir="send"> |
400 | Join a game. See join_room. |
400 | Join a game. See join_room. |
401 | <member name="channel" type="U16"/> |
401 | <member name="channel" type="U16"/> |
402 | <member name="user" type="user"/> |
402 | <member name="user" type="user"/> |
403 | </message> |
403 | </message> |
404 | |
404 | |
405 | <message type="4404" name="part_game" send="yes"> |
405 | <message type="4404" name="part_game" dir="send"> |
406 | Leave (or kick as admin?) a certain user from a game. |
406 | Leave (or kick as admin?) a certain user from a game. |
407 | <member name="channel" type="U16"/> |
407 | <member name="channel" type="U16"/> |
408 | <member name="name" type="username"/> |
408 | <member name="name" type="username"/> |
409 | </message> |
409 | </message> |
410 | |
410 | |
411 | <message type="4405" name="set_tree" send="yes"> |
411 | <message type="4406" name="upd_tree" dir="send"> |
412 | Upload a partial game tree to the server. This is used |
412 | Upload a partial game tree to the server. This is used to send moves |
413 | to send moves and even in-game comments to the server. For the comments, |
413 | and even in-game comments to the server. For the comments, the |
414 | the server prepends the username and rank. |
414 | server prepends the username and rank. |
|
|
415 | |
415 | <member name="channel" type="U16"/> |
416 | <member name="channel" type="U16"/> |
416 | <member name="tree" type="TREE"/> |
417 | <member name="tree" type="TREE"/> |
417 | </message> |
418 | </message> |
418 | |
419 | |
419 | <message type="4408" name="get_tree" send="yes"> |
420 | <message type="4408" name="get_tree" dir="send"> |
420 | Request the game tree starting at a given node. This is used |
421 | Request the game tree starting at a given node. This is used |
421 | when the server only sends a partial tree (with end code "more"). |
422 | when the server only sends a partial tree (with end code "more"). |
422 | <member name="channel" type="U16"/> |
423 | <member name="channel" type="U16"/> |
423 | <member name="node" type="U32"/> |
424 | <member name="node" type="U32"/> |
424 | </message> |
425 | </message> |
425 | |
426 | |
426 | <message type="440c" name="claim_win" send="yes"> |
427 | <message type="440c" name="claim_win" dir="send"> |
427 | Unclear. |
428 | Unclear. |
428 | <member name="channel" type="U16"/> |
429 | <member name="channel" type="U16"/> |
429 | <member name="_byte" type="U8 "/> |
430 | <member name="_byte" type="U8 "/> |
430 | Player colour maybe? Unclear. |
431 | Player colour maybe? Unclear. |
431 | </message> |
432 | </message> |
432 | |
433 | |
433 | <message type="440d" name="add_time" send="yes"> |
434 | <message type="440d" name="add_time" dir="send"> |
434 | Not checked. |
435 | Not checked. |
435 | |
436 | |
436 | <member name="channel" type="U16"/> |
437 | <member name="channel" type="U16"/> |
437 | <member name="time" type="U32"/> |
438 | <member name="time" type="U32"/> |
438 | <member name="player" type="U8"/> |
439 | <member name="player" type="U8"/> |
439 | </message> |
440 | </message> |
440 | |
441 | |
441 | <message type="440f" name="grant_undo" send="yes"> |
442 | <message type="440f" name="grant_undo" dir="send"> |
442 | Can be send after a req_undo message was received to grant the undo. |
443 | Can be send after a req_undo message was received to grant the undo. |
443 | <member name="channel" type="U16"/> |
444 | <member name="channel" type="U16"/> |
444 | </message> |
445 | </message> |
445 | |
446 | |
446 | <message type="4410" name="resign_game" send="yes"> |
447 | <message type="4410" name="resign_game" dir="send"> |
447 | Resign the game. |
448 | Resign the game. |
448 | <member name="channel" type="U16"/> |
449 | <member name="channel" type="U16"/> |
449 | <member name="player" type="U8"/> |
450 | <member name="player" type="U8"/> |
450 | </message> |
451 | </message> |
451 | |
452 | |
452 | <message type="441a" name="set_teacher" send="yes"> |
453 | <message type="441a" name="set_teacher" dir="send"> |
453 | Change the teacher to somebody else (or possibly yourself == take it). |
454 | Change the teacher to somebody else (or possibly yourself == take it). |
454 | <member name="channel" type="U16"/> |
455 | <member name="channel" type="U16"/> |
455 | <member name="name" type="username"/> |
456 | <member name="name" type="username"/> |
456 | </message> |
457 | </message> |
457 | |
458 | |
458 | <message type="4422" name="add_user" send="yes"> |
459 | <message type="4422" name="add_user" dir="send"> |
459 | Unclear. Maybe allow users to talk? No idea, really. |
460 | Unclear. Maybe allow users to talk? No idea, really. |
460 | |
461 | |
461 | <member name="channel" type="U16"/> |
462 | <member name="channel" type="U16"/> |
462 | <member name="othername" type="username"/> |
463 | <member name="othername" type="username"/> |
463 | <member name="name" type="username"/>; # gives user access to the game (to what? ;) |
464 | <member name="name" type="username"/>; # gives user access to the game (to what? ;) |
464 | </message> |
465 | </message> |
465 | |
466 | |
466 | <message type="4423" name="set_privacy" send="yes"> |
467 | <message type="4423" name="set_privacy" dir="send"> |
467 | Probably sets the "quiet" flag. Not checked. |
468 | Probably sets the "quiet" flag. Not checked. |
468 | <member name="channel" type="U16"/> |
469 | <member name="channel" type="U16"/> |
469 | <member name="private" type="U8"/> |
470 | <member name="private" type="U8"/> |
470 | </message> |
471 | </message> |
471 | |
472 | |
472 | <message type="4429" name="reject_chal" send="yes"> |
473 | <message type="4429" name="reject_chal" dir="send"> |
473 | Reject a challenge from a given user. Not checked. |
474 | Reject a challenge from a given user. Not checked. |
474 | |
475 | |
475 | <member name="channel" type="U16"/> |
476 | <member name="channel" type="U16"/> |
476 | <member name="name" type="username"/> |
477 | <member name="name" type="username"/> |
477 | </message> |
478 | </message> |
478 | |
479 | |
479 | <message type="4433" name="req_result" send="yes"> |
480 | <message type="4433" name="req_result" dir="send"> |
480 | I forgot. |
481 | I forgot. |
481 | |
482 | |
482 | <member name="channel" type="U16"/> |
483 | <member name="channel" type="U16"/> |
483 | </message> |
484 | </message> |
484 | |
485 | |
… | |
… | |
581 | 0x80 inprogress |
582 | 0x80 inprogress |
582 | </struct> |
583 | </struct> |
583 | |
584 | |
584 | <h2>Receive messages</h2> |
585 | <h2>Receive messages</h2> |
585 | |
586 | |
586 | <message type="0001" name="login" recv="yes"> |
587 | <message type="0001" name="login" dir="recv"> |
587 | <member name="result" type="CONSTANT" default='"login ok"'/> |
588 | <member name="result" type="CONSTANT" default='"login ok"'/> |
588 | <member name="success" type="CONSTANT" default="1"/> |
589 | <member name="success" type="CONSTANT" default="1"/> |
589 | </message> |
590 | </message> |
590 | |
591 | |
591 | <message type="0002" name="login" recv="yes"> |
592 | <message type="0002" name="login" dir="recv"> |
592 | <member name="result" type="CONSTANT" default='"guest login ok"'/> |
593 | <member name="result" type="CONSTANT" default='"guest login ok"'/> |
593 | <member name="success" type="CONSTANT" default="1"/> |
594 | <member name="success" type="CONSTANT" default="1"/> |
594 | </message> |
595 | </message> |
595 | |
596 | |
596 | <message type="0003" name="login" recv="yes"> |
597 | <message type="0003" name="login" dir="recv"> |
597 | <member name="result" type="CONSTANT" default='"login error 3"'/> |
598 | <member name="result" type="CONSTANT" default='"login error 3"'/> |
598 | ** maybe more following? ** |
599 | ** maybe more following? ** |
599 | </message> |
600 | </message> |
600 | |
601 | |
601 | <message type="0004" name="login" recv="yes"> |
602 | <message type="0004" name="login" dir="recv"> |
602 | <member name="result" type="CONSTANT" default='"wrong password"'/> |
603 | <member name="result" type="CONSTANT" default='"wrong password"'/> |
603 | ** maybe more following? ** |
604 | ** maybe more following? ** |
604 | </message> |
605 | </message> |
605 | |
606 | |
606 | <message type="0005" name="login" recv="yes"> |
607 | <message type="0005" name="login" dir="recv"> |
607 | <member name="result" type="CONSTANT" default='"user unknown"'/> |
608 | <member name="result" type="CONSTANT" default='"user unknown"'/> |
608 | ** maybe more following? ** |
609 | ** maybe more following? ** |
609 | </message> |
610 | </message> |
610 | |
611 | |
611 | <message type="0006" name="login" recv="yes"> |
612 | <message type="0006" name="login" dir="recv"> |
612 | <member name="result" type="CONSTANT" default='"user exists"'/> |
613 | <member name="result" type="CONSTANT" default='"user exists"'/> |
613 | ** maybe more following? ** |
614 | ** maybe more following? ** |
614 | </message> |
615 | </message> |
615 | |
616 | |
616 | <message type="0008" name="userinfo" recv="yes"> |
617 | <message type="0008" name="userinfo" dir="recv"> |
617 | User info. |
618 | User info. |
618 | <member name="user" type="user"/> |
619 | <member name="user" type="user"/> |
619 | <member name="_unused" type="U64"/> |
620 | <member name="_unused" type="U64"/> |
620 | <member name="realname" type="realname"/> |
621 | <member name="realname" type="realname"/> |
621 | <member name="email" type="email"/> |
622 | <member name="email" type="email"/> |
… | |
… | |
626 | <member name="lastlogin" type="timestamp"/> |
627 | <member name="lastlogin" type="timestamp"/> |
627 | When the user logged in for the last time. |
628 | When the user logged in for the last time. |
628 | <!-- maybe more? --> |
629 | <!-- maybe more? --> |
629 | </message> |
630 | </message> |
630 | |
631 | |
631 | <message type="0018" name="login" recv="yes"> |
632 | <message type="0018" name="login" dir="recv"> |
632 | <member name="result" type="CONSTANT" default='"login error 18"'/> |
633 | <member name="result" type="CONSTANT" default='"login error 18"'/> |
633 | ** maybe more following? ** |
634 | ** maybe more following? ** |
634 | </message> |
635 | </message> |
635 | |
636 | |
636 | <message type="0022" name="login" recv="yes"> |
637 | <message type="0022" name="login" dir="recv"> |
637 | I was blocked sooo many times for developing this client that it was |
638 | I was blocked sooo many times for developing this client that it was |
638 | easy to figure out. The KGS admins sure need no extra nazi training |
639 | easy to figure out. The KGS admins sure need no extra nazi training |
639 | :( |
640 | :( |
640 | <member name="reason" type="STRING"/> |
641 | <member name="reason" type="STRING"/> |
641 | <member name="result" type="CONSTANT" default='"user or ip blocked"'/> |
642 | <member name="result" type="CONSTANT" default='"user or ip blocked"'/> |
642 | </message> |
643 | </message> |
643 | |
644 | |
644 | <message type="0013" name="msg_chat" recv="yes"> |
645 | <message type="0013" name="msg_chat" dir="recv"> |
645 | <member name="user1" type="username"/> |
646 | <member name="user1" type="username"/> |
646 | <member name="user2" type="username"/> |
647 | <member name="user2" type="username"/> |
647 | <member name="message" type="STRING"/> |
648 | <member name="message" type="STRING"/> |
648 | </message> |
649 | </message> |
649 | |
650 | |
650 | <message type="0015" name="stats" recv="yes"> |
651 | <message type="0015" name="stats" dir="recv"> |
651 | <member name="ver_major" type="U16"/> |
652 | <member name="ver_major" type="U16"/> |
652 | <member name="ver_minor" type="U16"/> |
653 | <member name="ver_minor" type="U16"/> |
653 | <member name="ver_micro" type="U16"/> |
654 | <member name="ver_micro" type="U16"/> |
654 | <member name="boot_time" type="timestamp"/> |
655 | <member name="boot_time" type="timestamp"/> |
655 | <member name="users_cur" type="U32"/> |
656 | <member name="users_cur" type="U32"/> |
… | |
… | |
674 | <member name="packets_in" type="U64"/> |
675 | <member name="packets_in" type="U64"/> |
675 | <member name="bytes_out" type="U64"/> |
676 | <member name="bytes_out" type="U64"/> |
676 | <member name="packets_out" type="U64"/> |
677 | <member name="packets_out" type="U64"/> |
677 | </message> |
678 | </message> |
678 | |
679 | |
679 | <message type="0016" name="idle_warn" recv="yes"> |
680 | <message type="0016" name="idle_warn" dir="recv"> |
680 | idle warning, autologout soon (10 minutes...) |
681 | idle warning, autologout soon (10 minutes...) |
681 | </message> |
682 | </message> |
682 | |
683 | |
683 | <message type="001b" name="timewarning_default" recv="yes"> |
684 | <message type="001b" name="timewarning_default" dir="recv"> |
684 | WILD guess |
685 | WILD guess |
685 | <member name="channel" type="U16"/> |
686 | <member name="channel" type="U16"/> |
686 | <member name="time" type="U16"/> |
687 | <member name="time" type="U16"/> |
687 | </message> |
688 | </message> |
688 | |
689 | |
689 | <message type="001c" name="idle_err" recv="yes"> |
690 | <message type="001c" name="idle_err" dir="recv"> |
690 | autologout |
691 | autologout |
691 | </message> |
692 | </message> |
692 | |
693 | |
693 | <message type="001d" name="ping" recv="yes"> |
694 | <message type="001d" name="ping" dir="recv"> |
694 | Sent by the server regularly, but not answering them |
695 | Sent by the server regularly, but not answering them |
695 | isn't valid. Strange form of keepalive? |
696 | isn't valid. Strange form of keepalive? |
696 | </message> |
697 | </message> |
697 | |
698 | |
698 | <message type="001e" name="usergraph" recv="yes"> |
699 | <message type="001e" name="usergraph" dir="recv"> |
699 | User graph data. |
700 | User graph data. |
700 | <member name="data" type="I16" array="yes"/> |
701 | <member name="data" type="I16" array="yes"/> |
701 | If empty, no graph is available. The unit seems to |
702 | If empty, no graph is available. The unit seems to |
702 | be centi-kyu, with 1 dan == 0, 2 dan == 100, 1 kyu == -100. |
703 | be centi-kyu, with 1 dan == 0, 2 dan == 100, 1 kyu == -100. |
703 | There is probably one entry per day, the newest one last. |
704 | There is probably one entry per day, the newest one last. |
704 | </message> |
705 | </message> |
705 | |
706 | |
706 | <message type="001f" name="memo" recv="yes"> |
707 | <message type="001f" name="memo" dir="recv"> |
707 | Unclear. "Leave Message"? |
708 | Unclear. "Leave Message"? |
708 | 6 strings following. |
709 | 6 strings following. |
709 | <member name="s1" type="STRING"/> |
710 | <member name="s1" type="STRING"/> |
710 | <member name="s2" type="STRING"/> |
711 | <member name="s2" type="STRING"/> |
711 | <member name="s3" type="STRING"/> |
712 | <member name="s3" type="STRING"/> |
712 | <member name="s4" type="STRING"/> |
713 | <member name="s4" type="STRING"/> |
713 | <member name="s5" type="STRING"/> |
714 | <member name="s5" type="STRING"/> |
714 | <member name="s6" type="STRING"/> |
715 | <member name="s6" type="STRING"/> |
715 | </message> |
716 | </message> |
716 | |
717 | |
717 | <message type="0021" name="userpic" recv="yes"> |
718 | <message type="0021" name="userpic" dir="recv"> |
718 | <member name="name" type="username"/> |
719 | <member name="name" type="username"/> |
719 | Reply to pic_req, contains an image in jpeg format. |
720 | Reply to pic_req, contains an image in jpeg format. |
720 | <member name="data" type="DATA"/> |
721 | <member name="data" type="DATA"/> |
721 | </message> |
722 | </message> |
722 | |
723 | |
723 | <message type="0100" name="gnotice" recv="yes"> |
724 | <message type="0100" name="gnotice" dir="recv"> |
724 | global notice, sent to everybody |
725 | global notice, sent to everybody |
725 | <member name="notice" type="STRING"/> |
726 | <member name="notice" type="STRING"/> |
726 | </message> |
727 | </message> |
727 | |
728 | |
728 | <message type="0202" name="upd_user" recv="yes"> |
729 | <message type="0202" name="upd_user" dir="recv"> |
729 | # maybe soe notify? Totally unclear. |
730 | # maybe soe notify? Totally unclear. |
730 | # loc 0" type="chat(?) loc 1 => gameinfo?, loc 2 => game result (more data) |
731 | # loc 0" type="chat(?) loc 1 => gameinfo?, loc 2 => game result (more data) |
731 | <member name="location" type="U32"/> |
732 | <member name="location" type="U32"/> |
732 | <member name="user" type="user"/> |
733 | <member name="user" type="user"/> |
733 | <member name="lotsofinfo" type="DATA" guard-member="location" guard-cond="== 2"/> |
734 | <member name="lotsofinfo" type="DATA" guard-member="location" guard-cond="== 2"/> |
734 | </message> |
735 | </message> |
735 | |
736 | |
736 | <message type="0310" name="priv_room" recv="yes"> |
737 | <message type="0310" name="priv_room" dir="recv"> |
737 | "permission denied" when joining a room |
738 | "permission denied" when joining a room |
738 | <member name="name" type="STRING"/> |
739 | <member name="name" type="STRING"/> |
739 | </message> |
740 | </message> |
740 | |
741 | |
741 | <message type="0318" name="upd_rooms" recv="yes"> |
742 | <message type="0318" name="upd_rooms" dir="recv"> |
742 | <member name="rooms" type="room" array="yes"/> |
743 | <member name="rooms" type="room" array="yes"/> |
743 | </message> |
744 | </message> |
744 | |
745 | |
745 | <message type="0411" name="chal_defaults" recv="yes"> |
746 | <message type="0411" name="chal_defaults" dir="recv"> |
746 | <member name="channel" type="U16"/> |
747 | <member name="channel" type="U16"/> |
747 | <member name="defaults" type="challenge_defaults"/> |
748 | <member name="defaults" type="challenge_defaults"/> |
748 | </message> |
749 | </message> |
749 | |
750 | |
750 | <message type="0412" name="rej_game" send="yes"> |
751 | <message type="0412" name="rej_game" dir="send"> |
751 | Unable to create challenge. The channel might be optional. |
752 | Unable to create challenge. The channel might be optional. |
752 | <member name="channel" type="U16"/> |
753 | <member name="channel" type="U16"/> |
753 | </message> |
754 | </message> |
754 | |
755 | |
755 | <message type="0414" name="game_record" recv="yes"> |
756 | <message type="0414" name="game_record" dir="recv"> |
756 | The users game record. |
757 | The users game record. |
757 | <member name="name" type="username"/> |
758 | <member name="name" type="username"/> |
758 | <member name="more" type="flag"/> |
759 | <member name="more" type="flag"/> |
759 | Wether more games are available (must be requested manually) |
760 | Wether more games are available (must be requested manually) |
760 | <member name="games" type="game_record" array="yes"/> |
761 | <member name="games" type="game_record" array="yes"/> |
761 | </message> |
762 | </message> |
762 | |
763 | |
763 | <message type="041c" name="upd_game2" recv="yes"> |
764 | <message type="041c" name="upd_game2" dir="recv"> |
764 | Unclear. |
765 | Unclear. |
765 | <member name="channel_junk" type="U16"/> |
766 | <member name="channel_junk" type="U16"/> |
766 | <member name="game" type="game"/> |
767 | <member name="game" type="game"/> |
767 | </message> |
768 | </message> |
768 | |
769 | |
769 | <h3>Room messages</h3> |
770 | <h3>Room messages</h3> |
770 | |
771 | |
771 | <p>Not all room messages are for rooms only, and rooms need to parse |
772 | <p>Not all room messages are for rooms only, and rooms need to parse |
772 | not only these messages. Orthogonality, what for?</p> |
773 | not only these messages. Orthogonality, what for?</p> |
773 | |
774 | |
774 | <message type="4300" name="join_room" recv="yes"> |
775 | <message type="4300" name="join_room" dir="recv"> |
775 | <member name="channel" type="U16"/> |
776 | <member name="channel" type="U16"/> |
776 | <member name="users" type="user" array="yes"/> |
777 | <member name="users" type="user" array="yes"/> |
777 | </message> |
778 | </message> |
778 | |
779 | |
779 | <message type="4301" name="msg_room" recv="yes"> |
780 | <message type="4301" name="msg_room" dir="recv"> |
780 | <member name="channel" type="U16"/> |
781 | <member name="channel" type="U16"/> |
781 | <member name="name" type="username"/> |
782 | <member name="name" type="username"/> |
782 | <member name="message" type="STRING"/> |
783 | <member name="message" type="STRING"/> |
783 | </message> |
784 | </message> |
784 | |
785 | |
785 | <message type="4302" name="part_room" recv="yes"> |
786 | <message type="4302" name="part_room" dir="recv"> |
786 | <member name="channel" type="U16"/> |
787 | <member name="channel" type="U16"/> |
787 | <member name="user" type="user"/> |
788 | <member name="user" type="user"/> |
788 | </message> |
789 | </message> |
789 | |
790 | |
790 | <message type="4303" name="del_room" recv="yes"> |
791 | <message type="4303" name="del_room" dir="recv"> |
791 | <member name="channel" type="U16"/> |
792 | <member name="channel" type="U16"/> |
792 | </message> |
793 | </message> |
793 | |
794 | |
794 | <message type="4304" name="upd_games" recv="yes"> |
795 | <message type="4304" name="upd_games" dir="recv"> |
795 | <member name="channel" type="U16"/> |
796 | <member name="channel" type="U16"/> |
796 | <member name="games" type="game" array="yes"/> |
797 | <member name="games" type="game" array="yes"/> |
797 | </message> |
798 | </message> |
798 | |
799 | |
799 | <message type="4319" name="desc_room" recv="yes"> |
800 | <message type="4319" name="desc_room" dir="recv"> |
800 | <member name="channel" type="U16"/> |
801 | <member name="channel" type="U16"/> |
801 | <member name="owner" type="username"/> |
802 | <member name="owner" type="username"/> |
802 | <member name="description" type="STRING"/> |
803 | <member name="description" type="STRING"/> |
803 | </message> |
804 | </message> |
|
|
805 | |
804 | <h3>Game messages</h3> |
806 | <h3>Game messages</h3> |
805 | |
807 | |
806 | <message type="4400" name="upd_chal" recv="yes"> |
808 | <message type="4400" name="upd_chal" dir="recv"> |
807 | Unclear. |
809 | Unclear. |
808 | <member name="channel" type="U16"/> |
810 | <member name="channel" type="U16"/> |
809 | <member name="challenge" type="challenge"/> |
811 | <member name="challenge" type="challenge"/> |
810 | </message> |
812 | </message> |
811 | |
813 | |
812 | <message type="4401" name="upd_game" recv="yes"> |
814 | <message type="4401" name="upd_game" dir="recv"> |
813 | <member name="channel" type="U16"/> |
815 | <member name="channel" type="U16"/> |
814 | <member name="game" type="game"/> |
816 | <member name="game" type="game"/> |
815 | </message> |
817 | </message> |
816 | |
818 | |
817 | <message type="4402" name="del_game" recv="yes"> |
819 | <message type="4402" name="del_game" dir="recv"> |
818 | <member name="channel" type="U16"/> |
820 | <member name="channel" type="U16"/> |
819 | </message> |
821 | </message> |
820 | |
822 | |
821 | <message type="4403" name="upd_observers" recv="yes"> |
823 | <message type="4403" name="upd_observers" dir="recv"> |
822 | <member name="channel" type="U16"/> |
824 | <member name="channel" type="U16"/> |
823 | <member name="users" type="user" array="yes"/> |
825 | <member name="users" type="user" array="yes"/> |
824 | </message> |
826 | </message> |
825 | |
827 | |
826 | <message type="4404" name="del_observer" recv="yes"> |
828 | <message type="4404" name="del_observer" dir="recv"> |
827 | <member name="channel" type="U16"/> |
|
|
828 | <member name="name" type="username"/> |
829 | <member name="channel" type="U16"/> |
|
|
830 | <member name="name" type="username"/> |
829 | </message> |
831 | </message> |
830 | |
832 | |
831 | <message type="4405" name="set_tree" recv="yes"> |
833 | <message type="4405" name="set_tree" dir="recv"> |
832 | <member name="channel" type="U16"/> |
834 | <member name="channel" type="U16"/> |
833 | <member name="tree" type="TREE"/> |
835 | <member name="tree" type="TREE"/> |
834 | </message> |
836 | </message> |
835 | |
837 | |
836 | <message type="4406" name="upd_tree" recv="yes"> |
838 | <message type="4406" name="upd_tree" dir="recv"> |
837 | <member name="channel" type="U16"/> |
839 | <member name="channel" type="U16"/> |
838 | <member name="tree" type="TREE"/> |
840 | <member name="tree" type="TREE"/> |
839 | </message> |
841 | </message> |
840 | |
842 | |
841 | <message type="4409" name="superko" recv="yes"> |
843 | <message type="4409" name="superko" dir="recv"> |
842 | Superko-warning. |
844 | Superko-warning. |
843 | <member name="channel" type="U16"/> |
845 | <member name="channel" type="U16"/> |
844 | </message> |
846 | </message> |
845 | |
847 | |
846 | <message type="440b" name="final_result" recv="yes"> |
848 | <message type="440b" name="final_result" dir="recv"> |
847 | <member name="channel" type="U16"/> |
849 | <member name="channel" type="U16"/> |
848 | <member name="blackscore" type="scorevalues"/> |
850 | <member name="blackscore" type="scorevalues"/> |
849 | <member name="whitescore" type="scorevalues"/> |
851 | <member name="whitescore" type="scorevalues"/> |
850 | </message> |
852 | </message> |
851 | |
853 | |
852 | <message type="440e" name="req_undo" recv="yes"> |
854 | <message type="440e" name="req_undo" dir="recv"> |
853 | <member name="channel" type="U16"/> |
855 | <member name="channel" type="U16"/> |
854 | |
856 | |
855 | </message> |
857 | </message> |
856 | |
858 | |
857 | <message type="4410" name="resign_game" recv="yes"> |
859 | <message type="4410" name="resign_game" dir="recv"> |
858 | <member name="channel" type="U16"/> |
860 | <member name="channel" type="U16"/> |
859 | <member name="player" type="U8"/> |
861 | <member name="player" type="U8"/> |
860 | </message> |
862 | </message> |
861 | |
863 | |
862 | <message type="441a" name="set_teacher" recv="yes"> |
864 | <message type="441a" name="set_teacher" dir="recv"> |
863 | <member name="channel" type="U16"/> |
|
|
864 | <member name="name" type="username"/> |
865 | <member name="channel" type="U16"/> |
|
|
866 | <member name="name" type="username"/> |
865 | </message> |
867 | </message> |
866 | |
868 | |
867 | <message type="441d" name="owner_left" recv="yes"> |
869 | <message type="441d" name="owner_left" dir="recv"> |
868 | Unclear. |
870 | Unclear. |
869 | <member name="channel" type="U16"/> |
871 | <member name="channel" type="U16"/> |
870 | </message> |
872 | </message> |
871 | |
873 | |
872 | <message type="441e" name="teacher_left" recv="yes"> |
874 | <message type="441e" name="teacher_left" dir="recv"> |
873 | Unclear. |
875 | Unclear. |
874 | <member name="channel" type="U16"/> |
876 | <member name="channel" type="U16"/> |
875 | </message> |
877 | </message> |
876 | |
878 | |
877 | <message type="4422" name="unknown4422" recv="yes"> |
879 | <message type="4422" name="unknown4422" dir="recv"> |
878 | change teacher? something to do with editing? |
880 | change teacher? something to do with editing? |
879 | <member name="channel" type="U16"/> |
881 | <member name="channel" type="U16"/> |
880 | <member name="name1" type="username"/> |
882 | <member name="name1" type="username"/> |
881 | <member name="name2" type="username"/> |
883 | <member name="name2" type="username"/> |
882 | </message> |
884 | </message> |
883 | |
885 | |
884 | <message type="4428" name="add_tree" recv="yes"> |
886 | <message type="4428" name="add_tree" dir="recv"> |
885 | <p>See <ref ref="set_tree"/>. In addition, flags the tree as being |
887 | <p>See <ref ref="set_tree"/>. In addition, flags the tree as being |
886 | uploaded completely.</p> |
888 | uploaded completely.</p> |
887 | <member name="channel" type="U16"/> |
889 | <member name="channel" type="U16"/> |
888 | <member name="tree" type="TREE"/> |
890 | <member name="tree" type="TREE"/> |
889 | </message> |
891 | </message> |
890 | |
892 | |
891 | <message type="4433" name="req_result" recv="yes"> |
893 | <message type="4433" name="req_result" dir="recv"> |
892 | Unclear. |
894 | Unclear. |
893 | <member name="channel" type="U16"/> |
895 | <member name="channel" type="U16"/> |
894 | # # recv_result(?) |
896 | # # recv_result(?) |
895 | </message> |
897 | </message> |
896 | |
898 | |
897 | <message type="4434" name="unknown4434" recv="yes"> |
899 | <message type="4434" name="unknown4434" dir="recv"> |
898 | <member name="channel" type="U16"/> |
900 | <member name="channel" type="U16"/> |
899 | <member name="b1" type="U8"/> |
901 | <member name="b1" type="U8"/> |
900 | ?? !demonstration game?? |
902 | ?? !demonstration game?? |
901 | </message> |
903 | </message> |
902 | |
904 | |