ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/kgsueme/lib/KGS/Messages.pm
Revision: 1.69
Committed: Sat Jul 2 00:46:24 2005 UTC (18 years, 11 months ago) by root
Branch: MAIN
CVS Tags: HEAD
Changes since 1.68: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# Content
1
2 # This is an automatically generated file.
3 # This is an automatically generated file.
4 # This is an automatically generated file.
5 # This is an automatically generated file.
6 # This is an automatically generated file.
7
8 # See doc/protocol.xml and doc/doc2messages_pm.xsl (and doc/Makefile)
9
10 package KGS::Messages;
11
12 use strict;
13
14 our %type;
15
16 our %dec_client; # decode messages send to server
17 our %enc_client; # encode messages send to server
18 our %dec_server; # decode messages received from server
19 our %enc_server; # encode messages received from server
20
21 {
22
23 use Games::Go::SimpleBoard; # for MARK_xyz
24 use Math::BigInt ();
25
26 my $data; # stores currently processed decoding/encoding packet
27
28 sub _set_data($) { $data = shift } # for debugging or special apps only
29 sub _get_data() { $data } # for debugging or special apps only
30
31 # primitive enc/decoders
32
33 #############################################################################
34
35 sub dec_U8 {
36 (my ($r), $data) = unpack "C a*", $data; $r;
37 }
38
39 sub dec_U16 {
40 (my ($r), $data) = unpack "v a*", $data; $r;
41 }
42
43 sub dec_U32 {
44 (my ($r), $data) = unpack "V a*", $data; $r;
45 }
46
47 sub dec_U64 {
48 # do NOT use Math::BigInt here.
49 my ($lo, $hi) = (dec_U32, dec_U32);
50 $hi * 2**32 + $lo;
51 }
52
53 sub dec_I8 {
54 (my ($r), $data) = unpack "c a*", $data;
55 $r;
56 }
57
58 sub dec_I16 {
59 (my ($r), $data) = unpack "v a*", $data;
60 unpack "s", pack "S", $r;
61 }
62
63 sub dec_I32 {
64 (my ($r), $data) = unpack "V a*", $data;
65 unpack "i", pack "I", $r;
66 }
67
68 sub dec_DATA {
69 (my ($r), $data) = ($data, ""); $r;
70 }
71
72 sub dec_ZSTRING {
73 $data =~ s/^((?:..)*?)(?:\x00\x00|\Z)//s;
74 # use Encode...
75 join "", map chr, unpack "v*", $1;
76 }
77
78 BEGIN { *dec_STRING = \&dec_ZSTRING };
79
80 sub dec_CONSTANT {
81 $_[0];
82 }
83
84 sub dec_password {
85 dec_U64;
86 }
87
88 sub dec_HEX { # for debugging
89 "HEX: " . unpack "H*", $data;#d#
90 }
91
92 #############################################################################
93
94 sub enc_U8 {
95 $data .= pack "C", $_[0];
96 }
97
98 sub enc_U16 {
99 $data .= pack "v", $_[0];
100 }
101
102 sub enc_U32 {
103 $data .= pack "V", $_[0];
104 }
105
106 sub enc_U64 {
107 my $i = new Math::BigInt $_[0];
108
109 enc_U32 $i & 0xffffffff;
110 enc_U32 $i >> 32;
111 }
112
113 sub enc_I8 {
114 $data .= pack "c", $_[0];
115 }
116
117 sub enc_I16 {
118 enc_U16 unpack "S", pack "s", $_[0];
119 }
120
121 sub enc_I32 {
122 enc_U32 unpack "I", pack "i", $_[0];
123 }
124
125 sub enc_DATA {
126 # a dream!
127 $data .= $_[0];
128 }
129
130 sub enc_ZSTRING {
131 # should use encode for speed and clarity ;)
132 $data .= pack "v*", (map ord, split //, $_[0]), 0;
133 }
134
135 sub enc_STRING {
136 # should use encode for speed and clarity ;)
137 $data .= pack "v*", map ord, split //, $_[0];
138 }
139
140 sub enc_CONSTANT {
141 # nop
142 }
143
144 sub enc_password {
145 # $hash must be 64 bit
146 my $hash = new Math::BigInt;
147 $hash = $hash * 1055 + ord for split //, $_[0];
148 enc_U64 $hash & new Math::BigInt "0xffffffffffffffff";
149 }
150
151 sub enc_HEX {
152 die "enc_HEX not defined for good";
153 }
154
155
156
157 #############################################################################
158 # types
159
160 sub dec_username {
161 (my ($r), $data) = unpack "Z10 a*", $data; $r;
162 }
163
164 sub enc_username {
165 $data .= pack "a10", $_[0];
166 }
167
168 sub dec_roomname {
169 my $res = "";
170 my @r = unpack "v25 a*", $data;
171 $data = pop @r;
172 for (@r) {
173 last unless $_;
174 $res .= chr $_;
175 }
176 # dump extra data to file for later analysis
177 #my $x = pack "v*", @r; $x =~ s/^(..)*?\x00\x00//s; open DUMP, ">>/root/kgs-dump"; print DUMP $x; close DUMP;#d#
178 $res;
179 }
180
181 sub enc_roomname {
182 $data .= pack "v25", map ord, split //, $_[0];
183 }
184
185 sub dec_realname {
186 my $res = "";
187 my @r = unpack "v50 a*", $data;
188 $data = pop @r;
189 for (@r) {
190 last unless $_;
191 $res .= chr $_;
192 }
193 # dump extra data to file for later analysis
194 #my $x = pack "v*", @r; $x =~ s/^(..)*?\x00\x00//s; open DUMP, ">>/root/kgs-dump"; print DUMP $x; close DUMP;#d#
195 $res;
196 }
197
198 sub enc_realname {
199 $data .= pack "v50", map ord, split //, $_[0];
200 }
201
202 sub dec_email {
203 my $res = "";
204 my @r = unpack "v70 a*", $data;
205 $data = pop @r;
206 for (@r) {
207 last unless $_;
208 $res .= chr $_;
209 }
210 # dump extra data to file for later analysis
211 #my $x = pack "v*", @r; $x =~ s/^(..)*?\x00\x00//s; open DUMP, ">>/root/kgs-dump"; print DUMP $x; close DUMP;#d#
212 $res;
213 }
214
215 sub enc_email {
216 $data .= pack "v70", map ord, split //, $_[0];
217 }
218
219 sub dec_userinfo {
220 my $res = "";
221 my @r = unpack "v1000 a*", $data;
222 $data = pop @r;
223 for (@r) {
224 last unless $_;
225 $res .= chr $_;
226 }
227 # dump extra data to file for later analysis
228 #my $x = pack "v*", @r; $x =~ s/^(..)*?\x00\x00//s; open DUMP, ">>/root/kgs-dump"; print DUMP $x; close DUMP;#d#
229 $res;
230 }
231
232 sub enc_userinfo {
233 $data .= pack "v1000", map ord, split //, $_[0];
234 }
235
236 sub dec_url {
237 (my ($r), $data) = unpack "Z100 a*", $data; $r;
238 }
239
240 sub enc_url {
241 $data .= pack "a100", $_[0];
242 }
243
244 sub dec_locale {
245 (my ($r), $data) = unpack "Z5 a*", $data; $r;
246 }
247
248 sub enc_locale {
249 $data .= pack "a5", $_[0];
250 }
251
252 sub dec_flag {
253 (1 / 1) * dec_U8;
254 }
255
256 sub enc_flag {
257 enc_U8 $_[0] * 1;
258 }
259
260 sub dec_komi16_2 {
261 (1 / 2) * dec_I16;
262 }
263
264 sub enc_komi16_2 {
265 enc_I16 $_[0] * 2;
266 }
267
268 sub dec_komi16_4 {
269 (1 / 4) * dec_I16;
270 }
271
272 sub enc_komi16_4 {
273 enc_I16 $_[0] * 4;
274 }
275
276 sub dec_komi32_2 {
277 (1 / 2) * dec_I32;
278 }
279
280 sub enc_komi32_2 {
281 enc_I32 $_[0] * 2;
282 }
283
284 sub dec_komi32_4 {
285 (1 / 4) * dec_I32;
286 }
287
288 sub enc_komi32_4 {
289 enc_I32 $_[0] * 4;
290 }
291
292 sub dec_result {
293 (1 / 2) * dec_I32;
294 }
295
296 sub enc_result {
297 enc_I32 $_[0] * 2;
298 }
299
300 sub dec_score16_2 {
301 (1 / 2) * dec_I16;
302 }
303
304 sub enc_score16_2 {
305 enc_I16 $_[0] * 2;
306 }
307
308 sub dec_score16_4 {
309 (1 / 4) * dec_I16;
310 }
311
312 sub enc_score16_4 {
313 enc_I16 $_[0] * 4;
314 }
315
316 sub dec_score32_4 {
317 (1 / 4) * dec_I32;
318 }
319
320 sub enc_score32_4 {
321 enc_I32 $_[0] * 4;
322 }
323
324 sub dec_score32_1000 {
325 (1 / 1000) * dec_I32;
326 }
327
328 sub enc_score32_1000 {
329 enc_I32 $_[0] * 1000;
330 }
331
332 sub dec_time {
333 (1 / 1000) * dec_U32;
334 }
335
336 sub enc_time {
337 enc_U32 $_[0] * 1000;
338 }
339
340 sub dec_timestamp {
341 (1 / 1000) * dec_U64;
342 }
343
344 sub enc_timestamp {
345 enc_U64 $_[0] * 1000;
346 }
347
348 sub dec_CLIENTID16 {
349 (1 / 1) * dec_U16;
350 }
351
352 sub enc_CLIENTID16 {
353 enc_U16 $_[0] * 1;
354 }
355
356 sub dec_CLIENTID8 {
357 (1 / 1) * dec_U8;
358 }
359
360 sub enc_CLIENTID8 {
361 enc_U8 $_[0] * 1;
362 }
363
364
365 #############################################################################
366 # structures
367
368 sub dec_message_header {
369 my $r = {};
370
371 $r->{length} = dec_U16 q||;
372 $r->{type} = dec_U16 q||;
373 $r;
374 }
375
376 sub enc_message_header {
377
378 enc_U16 defined $_[0]{length} ? $_[0]{length} : (q||);
379 enc_U16 defined $_[0]{type} ? $_[0]{type} : (q||);
380 }
381
382 sub dec_user {
383 my $r = {};
384
385 $r->{name} = dec_username q||;
386 $r->{flags} = dec_U32 q|1|;
387 bless $r, KGS::User::;
388
389 $r;
390 }
391
392 sub enc_user {
393
394 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
395 enc_U32 defined $_[0]{flags} ? $_[0]{flags} : (q|1|);
396 }
397
398 sub dec_rules {
399 my $r = {};
400
401 $r->{ruleset} = dec_U8 q||;
402 $r->{size} = dec_U8 q||;
403 $r->{handicap} = dec_U8 q||;
404 $r->{komi} = dec_komi16_2 q||;
405 $r->{timesys} = dec_U8 q||;
406 $r->{time} = dec_U32 q||;
407 $r->{interval} = dec_U32 q||;
408 $r->{count} = dec_U16 q||;
409 bless $r, KGS::Rules::;
410
411 $r;
412 }
413
414 sub enc_rules {
415
416 enc_U8 defined $_[0]{ruleset} ? $_[0]{ruleset} : (q||);
417 enc_U8 defined $_[0]{size} ? $_[0]{size} : (q||);
418 enc_U8 defined $_[0]{handicap} ? $_[0]{handicap} : (q||);
419 enc_komi16_2 defined $_[0]{komi} ? $_[0]{komi} : (q||);
420 enc_U8 defined $_[0]{timesys} ? $_[0]{timesys} : (q||);
421 enc_U32 defined $_[0]{time} ? $_[0]{time} : (q||);
422 enc_U32 defined $_[0]{interval} ? $_[0]{interval} : (q||);
423 enc_U16 defined $_[0]{count} ? $_[0]{count} : (q||);
424 }
425
426 sub dec_challenge_defaults {
427 my $r = {};
428
429 $r->{gametype} = dec_U8 q||;
430 $r->{ruleset} = dec_U8 q||;
431 $r->{size} = dec_U32 q||;
432 $r->{timesys} = dec_U32 q||;
433 $r->{time} = dec_U32 q||;
434 $r->{byo_time} = dec_U32 q||;
435 $r->{byo_periods} = dec_U32 q||;
436 $r->{can_time} = dec_U32 q||;
437 $r->{can_stones} = dec_U32 q||;
438 $r->{notes} = dec_STRING q||;
439 $r;
440 }
441
442 sub enc_challenge_defaults {
443
444 enc_U8 defined $_[0]{gametype} ? $_[0]{gametype} : (q||);
445 enc_U8 defined $_[0]{ruleset} ? $_[0]{ruleset} : (q||);
446 enc_U32 defined $_[0]{size} ? $_[0]{size} : (q||);
447 enc_U32 defined $_[0]{timesys} ? $_[0]{timesys} : (q||);
448 enc_U32 defined $_[0]{time} ? $_[0]{time} : (q||);
449 enc_U32 defined $_[0]{byo_time} ? $_[0]{byo_time} : (q||);
450 enc_U32 defined $_[0]{byo_periods} ? $_[0]{byo_periods} : (q||);
451 enc_U32 defined $_[0]{can_time} ? $_[0]{can_time} : (q||);
452 enc_U32 defined $_[0]{can_stones} ? $_[0]{can_stones} : (q||);
453 enc_STRING defined $_[0]{notes} ? $_[0]{notes} : (q||);
454 }
455
456 sub dec_game {
457 my $r = {};
458
459 $r->{channel} = dec_U16 q||;
460 $r->{type} = dec_U8 q||;
461 $r->{black} = dec_user q||;
462 $r->{white} = dec_user q||;
463 $r->{owner} = dec_user q||;
464 $r->{size} = dec_U8 q||;
465 $r->{handicap} = dec_I8 q||;
466 $r->{komi} = dec_komi16_2 q||;
467 $r->{moves} = dec_I16 q||;
468 $r->{flags} = dec_U16 q||;
469 $r->{observers} = dec_U32 q||;
470 $r->{saved} = dec_flag q||;
471 $r->{notes} = dec_ZSTRING q||
472 if ($r->{handicap} < 0);
473 bless $r, KGS::Game::;
474
475 $r;
476 }
477
478 sub enc_game {
479
480 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
481 enc_U8 defined $_[0]{type} ? $_[0]{type} : (q||);
482 enc_user defined $_[0]{black} ? $_[0]{black} : (q||);
483 enc_user defined $_[0]{white} ? $_[0]{white} : (q||);
484 enc_user defined $_[0]{owner} ? $_[0]{owner} : (q||);
485 enc_U8 defined $_[0]{size} ? $_[0]{size} : (q||);
486 enc_I8 defined $_[0]{handicap} ? $_[0]{handicap} : (q||);
487 enc_komi16_2 defined $_[0]{komi} ? $_[0]{komi} : (q||);
488 enc_I16 defined $_[0]{moves} ? $_[0]{moves} : (q||);
489 enc_U16 defined $_[0]{flags} ? $_[0]{flags} : (q||);
490 enc_U32 defined $_[0]{observers} ? $_[0]{observers} : (q||);
491 enc_flag defined $_[0]{saved} ? $_[0]{saved} : (q||);
492 enc_ZSTRING defined $_[0]{notes} ? $_[0]{notes} : (q||);
493 }
494
495 sub dec_room_game {
496 my $r = {};
497
498 $r->{channel} = dec_U16 q||;
499 $r->{game} = dec_game q||;
500 $r;
501 }
502
503 sub enc_room_game {
504
505 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
506 enc_game defined $_[0]{game} ? $_[0]{game} : (q||);
507 }
508
509 sub dec_room_obs {
510 my $r = {};
511
512 $r->{name} = dec_roomname q||;
513 $r->{channel} = dec_U16 q||;
514 $r->{flags} = dec_U32 q||;
515 $r->{users} = dec_U32 q||;
516 $r;
517 }
518
519 sub enc_room_obs {
520
521 enc_roomname defined $_[0]{name} ? $_[0]{name} : (q||);
522 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
523 enc_U32 defined $_[0]{flags} ? $_[0]{flags} : (q||);
524 enc_U32 defined $_[0]{users} ? $_[0]{users} : (q||);
525 }
526
527 sub dec_room {
528 my $r = {};
529
530 $r->{channel} = dec_U16 q||;
531 $r->{flags} = dec_U8 q||;
532 $r->{group} = dec_U8 q||;
533 $r->{users} = dec_U16 q||;
534 $r->{games} = dec_U16 q||;
535 $r->{name} = dec_STRING q||;
536 bless $r, KGS::Room::;
537
538 $r;
539 }
540
541 sub enc_room {
542
543 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
544 enc_U8 defined $_[0]{flags} ? $_[0]{flags} : (q||);
545 enc_U8 defined $_[0]{group} ? $_[0]{group} : (q||);
546 enc_U16 defined $_[0]{users} ? $_[0]{users} : (q||);
547 enc_U16 defined $_[0]{games} ? $_[0]{games} : (q||);
548 enc_STRING defined $_[0]{name} ? $_[0]{name} : (q||);
549 }
550
551 sub dec_scorevalues {
552 my $r = {};
553
554 $r->{score} = dec_score32_4 q||;
555 $r->{territory} = dec_U32 q||;
556 $r->{captures} = dec_U32 q||;
557 $r->{i3} = dec_U32 q||;
558 $r->{f2} = dec_U32 q||;
559 $r->{komi} = dec_komi32_4 q||;
560 $r->{i4} = dec_U32 q||;
561 bless $r, KGS::Score::;
562
563 $r;
564 }
565
566 sub enc_scorevalues {
567
568 enc_score32_4 defined $_[0]{score} ? $_[0]{score} : (q||);
569 enc_U32 defined $_[0]{territory} ? $_[0]{territory} : (q||);
570 enc_U32 defined $_[0]{captures} ? $_[0]{captures} : (q||);
571 enc_U32 defined $_[0]{i3} ? $_[0]{i3} : (q||);
572 enc_U32 defined $_[0]{f2} ? $_[0]{f2} : (q||);
573 enc_komi32_4 defined $_[0]{komi} ? $_[0]{komi} : (q||);
574 enc_U32 defined $_[0]{i4} ? $_[0]{i4} : (q||);
575 }
576
577 sub dec_game_record {
578 my $r = {};
579
580 $r->{timestamp} = dec_timestamp q||;
581 $r->{type} = dec_U8 q||;
582 $r->{handicap} = dec_U8 q||;
583 $r->{revision} = dec_U16 q||;
584 $r->{black} = dec_user q||;
585 $r->{white} = dec_user q||;
586 $r->{owner} = dec_user q||;
587 $r->{komi} = dec_U16 q||;
588 $r->{score} = dec_score16_2 q||;
589 $r->{size} = dec_U8 q||;
590 $r->{flags} = dec_U8 q||;
591 bless $r, KGS::GameRecord::;
592
593 $r;
594 }
595
596 sub enc_game_record {
597
598 enc_timestamp defined $_[0]{timestamp} ? $_[0]{timestamp} : (q||);
599 enc_U8 defined $_[0]{type} ? $_[0]{type} : (q||);
600 enc_U8 defined $_[0]{handicap} ? $_[0]{handicap} : (q||);
601 enc_U16 defined $_[0]{revision} ? $_[0]{revision} : (q||);
602 enc_user defined $_[0]{black} ? $_[0]{black} : (q||);
603 enc_user defined $_[0]{white} ? $_[0]{white} : (q||);
604 enc_user defined $_[0]{owner} ? $_[0]{owner} : (q||);
605 enc_U16 defined $_[0]{komi} ? $_[0]{komi} : (q||);
606 enc_score16_2 defined $_[0]{score} ? $_[0]{score} : (q||);
607 enc_U8 defined $_[0]{size} ? $_[0]{size} : (q||);
608 enc_U8 defined $_[0]{flags} ? $_[0]{flags} : (q||);
609 }
610
611
612 #############################################################################
613 # "less" primitive types
614
615 # this was the most horrible thing to decode. still not everything is decoded correctly(?)
616 sub dec_TREE {
617 my @r;
618 my $old_data = $data;#d#
619 while (length $data) {
620 my $type = dec_U8;
621 my $add = $type < 128;
622
623 my $ofs = (length $old_data) - (length $data);#d#
624
625 $type &= 127;
626
627 if ($type == 127) {
628 dec_U8; # unused?? *sigh*
629 push @r, [add_node => dec_I32];
630
631 } elsif ($type == 126) {
632 push @r, [set_node => dec_I32];
633
634 } elsif ($type == 125) {
635 push @r, [set_current => dec_I32];
636
637 } elsif ($type == 34) {
638 push @r, [score => dec_U8, dec_score32_1000];
639
640 } elsif ($type == 29) {
641 push @r, [type_29 => dec_ZSTRING];
642 warn "UNKNOWN TREE TYPE 29 $r[-1][1]\007 PLEASE REPORT";#d#
643 die;
644
645 } elsif ($type == 28) {
646 # move number, only in variations it seems. oh my.
647 push @r, [movenum => dec_ZSTRING];
648
649 } elsif ($type == 26) {
650 push @r, [type_26 => dec_U8]; # sets a flag (?)
651 warn "unknown tree node 26, please ignore\n";
652 # possibly marks moves done while editing, as opposed to game-moves(?)
653
654 } elsif ($type == 25) {
655 push @r, [result => dec_result];
656
657 } elsif ($type == 23) {
658 push @r, [mark => $add, MARK_GRAYED, dec_U8, dec_U8];
659
660 } elsif ($type == 22) {
661 push @r, [mark => $add, dec_U8() ? MARK_SMALL_W : MARK_SMALL_B, dec_U8, dec_U8];
662
663 } elsif ($type == 21) {
664 push @r, [mark => $add, MARK_SQUARE, dec_U8, dec_U8];
665
666 } elsif ($type == 20) {
667 push @r, [mark => $add, MARK_TRIANGLE, dec_U8, dec_U8];
668
669 } elsif ($type == 19) {
670 push @r, [mark => $add, MARK_LABEL, dec_U8, dec_U8, dec_ZSTRING];
671 #push @r, [unknown_18 => dec_U8, dec_U32, dec_U32, dec_U8, dec_U32, dec_U32, dec_U32];
672 #push @r, [set_timer => (dec_U8, dec_U32, dec_time)[0,2,1]];
673
674 } elsif ($type == 18) {
675 push @r, [set_timer => (dec_U8, dec_U32, dec_time)[0,2,1]];
676
677 } elsif ($type == 17) {
678 push @r, [set_stone => dec_U8, dec_U8, dec_U8];#d#?
679
680 # } elsif ($type == 16) {
681 # push @r, [set_stone => dec_U8, dec_U8, dec_U8];#o#
682
683 } elsif ($type == 15) {
684 push @r, [mark => $add, MARK_CIRCLE, dec_U8, dec_U8];#d#?
685
686 } elsif ($type == 14) {
687 push @r, [move => dec_U8, dec_U8, dec_U8];
688
689 } elsif (($type >= 4 && $type <= 9)
690 || ($type >= 11 && $type <= 13)
691 || $type == 24) {
692
693 push @r, [({
694 4 => "date",
695 5 => "unknown_comment5",
696 6 => "game_id", #?#
697 7 => "unknown_comment7",
698 8 => "unknown_comment8",
699 9 => "copyright", #?
700 11 => "unknown_comment11",
701 12 => "unknown_comment12",
702 13 => "unknown_comment13",
703 24 => "comment",
704 })->{$type} => dec_ZSTRING];
705
706 } elsif ($type == 3) {
707 push @r, [rank => dec_U8, dec_U32];
708
709 } elsif ($type == 2) {
710 push @r, [player => dec_U8, dec_ZSTRING];
711
712 } elsif ($type == 1) {
713 push @r, [sgf_name => dec_ZSTRING];
714
715 } elsif ($type == 0) {
716 # as usual, wms finds yet another way to duplicate code... oh well, what a mess.
717 # (no wonder he is so keen on keeping it a secret...)
718
719 push @r, [rules => dec_rules];
720
721 # OLD
722
723 } else {
724 require KGS::Listener::Debug; # hack
725 print STDERR KGS::Listener::Debug::dumpval(\@r);
726 printf "offset: 0x%04x\n", $ofs;
727 open XTYPE, "|xtype"; print XTYPE $old_data; close XTYPE;
728 warn "unknown tree type $type, PLEASE REPORT and include the game you wanted to watch. thx.";
729
730 }
731
732 #push @{$r[-1]}, offset => sprintf "0x%x", $ofs;#d#
733
734 }
735 # print STDERR KGS::Listener::Debug::dumpval(\@r);#d#
736 # return [];#d#
737 \@r;
738 }
739
740 sub enc_TREE {
741 for (@{$_[0]}) {
742 my ($type, @arg) = @$_;
743
744 if ($type eq "add_node") {
745 enc_U8 127;
746 enc_U8 0; # unused?
747 enc_I32 $arg[0];
748
749 } elsif ($type eq "set_node") {
750 enc_U8 126;
751 enc_I32 $arg[0];
752
753 } elsif ($type eq "set_current") {
754 enc_U8 125;
755 enc_I32 $arg[0];
756
757 } elsif ($type eq "movenum") {
758 enc_U8 28;
759 enc_ZSTRING $arg[0];
760
761 } elsif ($type eq "set_stone") {
762 enc_U8 16;
763 enc_U8 $arg[0];
764 enc_U8 $arg[1];
765 enc_U8 $arg[2];
766
767 } elsif ($type eq "move") {
768 enc_U8 14;
769 enc_U8 $arg[0];
770 enc_U8 $arg[1];
771 enc_U8 $arg[2];
772
773 } elsif ($type eq "comment") {
774 enc_U8 24;
775 enc_ZSTRING $arg[0];
776
777 } elsif ($type eq "mark") {
778 my $op = ({
779 &MARK_GRAYED => 23,
780 &MARK_SMALL_B => 22,
781 &MARK_SMALL_W => 22,
782 &MARK_SQUARE => 21,
783 &MARK_TRIANGLE => 20,
784 &MARK_LABEL => 19,
785 &MARK_CIRCLE => 15,
786 })->{$arg[1]};
787
788 enc_U8 $op + ($arg[0] ? 0 : 128);
789 enc_U8 $arg[1] == MARK_SMALL_W if $op == 22;
790 enc_U8 $arg[2];
791 enc_U8 $arg[3];
792
793 enc_ZSTRING $arg[4] if $op == 18;
794
795 # unknown types
796 } elsif ($type eq "type_29") {
797 enc_U8 29;
798 enc_ZSTRING $arg[0];
799 } elsif ($type eq "type_26") {
800 enc_U8 26;
801 enc_U8 $arg[0];
802
803 } else {
804 warn "unable to encode tree node type $type\n";
805 }
806 }
807 };
808
809
810
811 #############################################################################
812 # messages
813
814 # login
815 $dec_client{0x0000} = sub {
816 $data = $_[0];
817 my $r = { DATA => $data };
818 $r->{type} = "login";
819
820 $r->{ver_major} = dec_U32 q|2|;
821 $r->{ver_minor} = dec_U32 q|6|;
822 $r->{ver_micro} = dec_U32 q|12|;
823 $r->{name} = dec_username q||;
824 $r->{password} = dec_password q|0|;
825 $r->{guest} = dec_flag q|1|;
826 $r->{_unknown3} = dec_U16 q|0|;
827 $r->{locale} = dec_locale q|"en_US"|;
828 $r->{clientver} = dec_DATA q|"1.4.2_03:Swing app:Sun Microsystems Inc."|;
829 $r->{TRAILING_DATA} = $data if length $data;
830 $r;
831 };
832 $enc_client{login} = sub {
833 $data = "";
834 enc_U16 0x0000;
835
836 enc_U32 defined $_[0]{ver_major} ? $_[0]{ver_major} : (q|2|);
837 enc_U32 defined $_[0]{ver_minor} ? $_[0]{ver_minor} : (q|6|);
838 enc_U32 defined $_[0]{ver_micro} ? $_[0]{ver_micro} : (q|12|);
839 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
840 enc_password defined $_[0]{password} ? $_[0]{password} : (q|0|);
841 enc_flag defined $_[0]{guest} ? $_[0]{guest} : (q|1|);
842 enc_U16 defined $_[0]{_unknown3} ? $_[0]{_unknown3} : (q|0|);
843 enc_locale defined $_[0]{locale} ? $_[0]{locale} : (q|"en_US"|);
844 enc_DATA defined $_[0]{clientver} ? $_[0]{clientver} : (q|"1.4.2_03:Swing app:Sun Microsystems Inc."|);
845 $data;
846 };
847
848 # req_userinfo
849 $dec_client{0x0007} = sub {
850 $data = $_[0];
851 my $r = { DATA => $data };
852 $r->{type} = "req_userinfo";
853
854 $r->{name} = dec_username q||;
855 $r->{TRAILING_DATA} = $data if length $data;
856 $r;
857 };
858 $enc_client{req_userinfo} = sub {
859 $data = "";
860 enc_U16 0x0007;
861
862 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
863 $data;
864 };
865
866 # update_userinfo
867 $dec_client{0x0007} = sub {
868 $data = $_[0];
869 my $r = { DATA => $data };
870 $r->{type} = "update_userinfo";
871
872 $r->{setpass} = dec_flag q||;
873 $r->{password} = dec_password q|0|;
874 $r->{realname} = dec_realname q||;
875 $r->{email} = dec_email q||;
876 $r->{info} = dec_userinfo q||;
877 $r->{homepage} = dec_url q||;
878 $r->{_unused} = dec_U64 q|0|;
879 $r->{_unused} = dec_U64 q|0|;
880 $r->{TRAILING_DATA} = $data if length $data;
881 $r;
882 };
883 $enc_client{update_userinfo} = sub {
884 $data = "";
885 enc_U16 0x0007;
886
887 enc_flag defined $_[0]{setpass} ? $_[0]{setpass} : (q||);
888 enc_password defined $_[0]{password} ? $_[0]{password} : (q|0|);
889 enc_realname defined $_[0]{realname} ? $_[0]{realname} : (q||);
890 enc_email defined $_[0]{email} ? $_[0]{email} : (q||);
891 enc_userinfo defined $_[0]{info} ? $_[0]{info} : (q||);
892 enc_url defined $_[0]{homepage} ? $_[0]{homepage} : (q||);
893 enc_U64 defined $_[0]{_unused} ? $_[0]{_unused} : (q|0|);
894 enc_U64 defined $_[0]{_unused} ? $_[0]{_unused} : (q|0|);
895 $data;
896 };
897
898 # msg_chat
899 $dec_client{0x0013} = sub {
900 $data = $_[0];
901 my $r = { DATA => $data };
902 $r->{type} = "msg_chat";
903
904 $r->{name} = dec_username q||;
905 $r->{name2} = dec_username q||;
906 $r->{message} = dec_STRING q||;
907 $r->{TRAILING_DATA} = $data if length $data;
908 $r;
909 };
910 $enc_client{msg_chat} = sub {
911 $data = "";
912 enc_U16 0x0013;
913
914 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
915 enc_username defined $_[0]{name2} ? $_[0]{name2} : (q||);
916 enc_STRING defined $_[0]{message} ? $_[0]{message} : (q||);
917 $data;
918 };
919
920 # req_stats
921 $dec_client{0x0014} = sub {
922 $data = $_[0];
923 my $r = { DATA => $data };
924 $r->{type} = "req_stats";
925
926 $r->{TRAILING_DATA} = $data if length $data;
927 $r;
928 };
929 $enc_client{req_stats} = sub {
930 $data = "";
931 enc_U16 0x0014;
932
933 $data;
934 };
935
936 # idle_reset
937 $dec_client{0x0016} = sub {
938 $data = $_[0];
939 my $r = { DATA => $data };
940 $r->{type} = "idle_reset";
941
942 $r->{TRAILING_DATA} = $data if length $data;
943 $r;
944 };
945 $enc_client{idle_reset} = sub {
946 $data = "";
947 enc_U16 0x0016;
948
949 $data;
950 };
951
952 # ping
953 $dec_client{0x001d} = sub {
954 $data = $_[0];
955 my $r = { DATA => $data };
956 $r->{type} = "ping";
957
958 $r->{TRAILING_DATA} = $data if length $data;
959 $r;
960 };
961 $enc_client{ping} = sub {
962 $data = "";
963 enc_U16 0x001d;
964
965 $data;
966 };
967
968 # req_usergraph
969 $dec_client{0x001e} = sub {
970 $data = $_[0];
971 my $r = { DATA => $data };
972 $r->{type} = "req_usergraph";
973
974 $r->{name} = dec_username q||;
975 $r->{TRAILING_DATA} = $data if length $data;
976 $r;
977 };
978 $enc_client{req_usergraph} = sub {
979 $data = "";
980 enc_U16 0x001e;
981
982 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
983 $data;
984 };
985
986 # req_pic
987 $dec_client{0x0021} = sub {
988 $data = $_[0];
989 my $r = { DATA => $data };
990 $r->{type} = "req_pic";
991
992 $r->{name} = dec_username q||;
993 $r->{TRAILING_DATA} = $data if length $data;
994 $r;
995 };
996 $enc_client{req_pic} = sub {
997 $data = "";
998 enc_U16 0x0021;
999
1000 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
1001 $data;
1002 };
1003
1004 # upload_pic
1005 $dec_client{0x0021} = sub {
1006 $data = $_[0];
1007 my $r = { DATA => $data };
1008 $r->{type} = "upload_pic";
1009
1010 $r->{name} = dec_username q||;
1011 $r->{data} = dec_DATA q||;
1012 $r->{TRAILING_DATA} = $data if length $data;
1013 $r;
1014 };
1015 $enc_client{upload_pic} = sub {
1016 $data = "";
1017 enc_U16 0x0021;
1018
1019 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
1020 enc_DATA defined $_[0]{data} ? $_[0]{data} : (q||);
1021 $data;
1022 };
1023
1024 # send_memo
1025 $dec_client{0x0023} = sub {
1026 $data = $_[0];
1027 my $r = { DATA => $data };
1028 $r->{type} = "send_memo";
1029
1030 $r->{name} = dec_username q||;
1031 $r->{cid} = dec_CLIENTID16 q||;
1032 $r->{msg} = dec_STRING q||;
1033 $r->{TRAILING_DATA} = $data if length $data;
1034 $r;
1035 };
1036 $enc_client{send_memo} = sub {
1037 $data = "";
1038 enc_U16 0x0023;
1039
1040 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
1041 enc_CLIENTID16 defined $_[0]{cid} ? $_[0]{cid} : (q||);
1042 enc_STRING defined $_[0]{msg} ? $_[0]{msg} : (q||);
1043 $data;
1044 };
1045
1046 # delete_memos
1047 $dec_client{0x0024} = sub {
1048 $data = $_[0];
1049 my $r = { DATA => $data };
1050 $r->{type} = "delete_memos";
1051
1052 $r->{TRAILING_DATA} = $data if length $data;
1053 $r;
1054 };
1055 $enc_client{delete_memos} = sub {
1056 $data = "";
1057 enc_U16 0x0024;
1058
1059 $data;
1060 };
1061
1062 # gnotice
1063 $dec_client{0x0100} = sub {
1064 $data = $_[0];
1065 my $r = { DATA => $data };
1066 $r->{type} = "gnotice";
1067
1068 $r->{notice} = dec_STRING q||;
1069 $r->{TRAILING_DATA} = $data if length $data;
1070 $r;
1071 };
1072 $enc_client{gnotice} = sub {
1073 $data = "";
1074 enc_U16 0x0100;
1075
1076 enc_STRING defined $_[0]{notice} ? $_[0]{notice} : (q||);
1077 $data;
1078 };
1079
1080 # notify_add
1081 $dec_client{0x0200} = sub {
1082 $data = $_[0];
1083 my $r = { DATA => $data };
1084 $r->{type} = "notify_add";
1085
1086 $r->{name} = dec_username q||;
1087 $r->{TRAILING_DATA} = $data if length $data;
1088 $r;
1089 };
1090 $enc_client{notify_add} = sub {
1091 $data = "";
1092 enc_U16 0x0200;
1093
1094 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
1095 $data;
1096 };
1097
1098 # notify_del
1099 $dec_client{0x0201} = sub {
1100 $data = $_[0];
1101 my $r = { DATA => $data };
1102 $r->{type} = "notify_del";
1103
1104 $r->{name} = dec_username q||;
1105 $r->{TRAILING_DATA} = $data if length $data;
1106 $r;
1107 };
1108 $enc_client{notify_del} = sub {
1109 $data = "";
1110 enc_U16 0x0201;
1111
1112 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
1113 $data;
1114 };
1115
1116 # list_rooms
1117 $dec_client{0x0318} = sub {
1118 $data = $_[0];
1119 my $r = { DATA => $data };
1120 $r->{type} = "list_rooms";
1121
1122 $r->{group} = dec_U8 q||;
1123 $r->{TRAILING_DATA} = $data if length $data;
1124 $r;
1125 };
1126 $enc_client{list_rooms} = sub {
1127 $data = "";
1128 enc_U16 0x0318;
1129
1130 enc_U8 defined $_[0]{group} ? $_[0]{group} : (q||);
1131 $data;
1132 };
1133
1134 # new_room
1135 $dec_client{0x031a} = sub {
1136 $data = $_[0];
1137 my $r = { DATA => $data };
1138 $r->{type} = "new_room";
1139
1140 $r->{name} = dec_username q||;
1141 $r->{i1} = dec_U32 q|0|;
1142 $r->{b1} = dec_U8 q|0|;
1143 $r->{b2} = dec_U8 q|255|;
1144 $r->{b3} = dec_U8 q|255|;
1145 $r->{group} = dec_U8 q|1|;
1146 $r->{name} = dec_ZSTRING q||;
1147 $r->{description} = dec_ZSTRING q||;
1148 $r->{flags} = dec_U8 q||;
1149 $r->{TRAILING_DATA} = $data if length $data;
1150 $r;
1151 };
1152 $enc_client{new_room} = sub {
1153 $data = "";
1154 enc_U16 0x031a;
1155
1156 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
1157 enc_U32 defined $_[0]{i1} ? $_[0]{i1} : (q|0|);
1158 enc_U8 defined $_[0]{b1} ? $_[0]{b1} : (q|0|);
1159 enc_U8 defined $_[0]{b2} ? $_[0]{b2} : (q|255|);
1160 enc_U8 defined $_[0]{b3} ? $_[0]{b3} : (q|255|);
1161 enc_U8 defined $_[0]{group} ? $_[0]{group} : (q|1|);
1162 enc_ZSTRING defined $_[0]{name} ? $_[0]{name} : (q||);
1163 enc_ZSTRING defined $_[0]{description} ? $_[0]{description} : (q||);
1164 enc_U8 defined $_[0]{flags} ? $_[0]{flags} : (q||);
1165 $data;
1166 };
1167
1168 # req_upd_rooms
1169 $dec_client{0x031b} = sub {
1170 $data = $_[0];
1171 my $r = { DATA => $data };
1172 $r->{type} = "req_upd_rooms";
1173
1174 $r->{channel} = dec_U16 q||;
1175 $r->{TRAILING_DATA} = $data if length $data;
1176 $r;
1177 };
1178 $enc_client{req_upd_rooms} = sub {
1179 $data = "";
1180 enc_U16 0x031b;
1181
1182 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1183 $data;
1184 };
1185
1186 # req_game_record
1187 $dec_client{0x0413} = sub {
1188 $data = $_[0];
1189 my $r = { DATA => $data };
1190 $r->{type} = "req_game_record";
1191
1192 $r->{name} = dec_username q||;
1193 $r->{timestamp} = dec_timestamp q||;
1194 $r->{TRAILING_DATA} = $data if length $data;
1195 $r;
1196 };
1197 $enc_client{req_game_record} = sub {
1198 $data = "";
1199 enc_U16 0x0413;
1200
1201 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
1202 enc_timestamp defined $_[0]{timestamp} ? $_[0]{timestamp} : (q||);
1203 $data;
1204 };
1205
1206 # join_room
1207 $dec_client{0x4300} = sub {
1208 $data = $_[0];
1209 my $r = { DATA => $data };
1210 $r->{type} = "join_room";
1211
1212 $r->{channel} = dec_U16 q||;
1213 $r->{user} = dec_user q||;
1214 $r->{TRAILING_DATA} = $data if length $data;
1215 $r;
1216 };
1217 $enc_client{join_room} = sub {
1218 $data = "";
1219 enc_U16 0x4300;
1220
1221 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1222 enc_user defined $_[0]{user} ? $_[0]{user} : (q||);
1223 $data;
1224 };
1225
1226 # msg_room
1227 $dec_client{0x4301} = sub {
1228 $data = $_[0];
1229 my $r = { DATA => $data };
1230 $r->{type} = "msg_room";
1231
1232 $r->{channel} = dec_U16 q||;
1233 $r->{name} = dec_username q||;
1234 $r->{message} = dec_STRING q||;
1235 $r->{TRAILING_DATA} = $data if length $data;
1236 $r;
1237 };
1238 $enc_client{msg_room} = sub {
1239 $data = "";
1240 enc_U16 0x4301;
1241
1242 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1243 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
1244 enc_STRING defined $_[0]{message} ? $_[0]{message} : (q||);
1245 $data;
1246 };
1247
1248 # part_room
1249 $dec_client{0x4302} = sub {
1250 $data = $_[0];
1251 my $r = { DATA => $data };
1252 $r->{type} = "part_room";
1253
1254 $r->{channel} = dec_U16 q||;
1255 $r->{name} = dec_username q||;
1256 $r->{TRAILING_DATA} = $data if length $data;
1257 $r;
1258 };
1259 $enc_client{part_room} = sub {
1260 $data = "";
1261 enc_U16 0x4302;
1262
1263 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1264 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
1265 $data;
1266 };
1267
1268 # new_game
1269 $dec_client{0x4305} = sub {
1270 $data = $_[0];
1271 my $r = { DATA => $data };
1272 $r->{type} = "new_game";
1273
1274 $r->{channel} = dec_U16 q||;
1275 $r->{cid} = dec_CLIENTID16 q||;
1276 $r->{gametype} = dec_U8 q||;
1277 $r->{flags} = dec_U8 q||;
1278 $r->{rules} = dec_rules q||;
1279 $r->{notes} = dec_STRING q||;
1280 $r->{TRAILING_DATA} = $data if length $data;
1281 $r;
1282 };
1283 $enc_client{new_game} = sub {
1284 $data = "";
1285 enc_U16 0x4305;
1286
1287 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1288 enc_CLIENTID16 defined $_[0]{cid} ? $_[0]{cid} : (q||);
1289 enc_U8 defined $_[0]{gametype} ? $_[0]{gametype} : (q||);
1290 enc_U8 defined $_[0]{flags} ? $_[0]{flags} : (q||);
1291 enc_rules defined $_[0]{rules} ? $_[0]{rules} : (q||);
1292 enc_STRING defined $_[0]{notes} ? $_[0]{notes} : (q||);
1293 $data;
1294 };
1295
1296 # load_game
1297 $dec_client{0x430a} = sub {
1298 $data = $_[0];
1299 my $r = { DATA => $data };
1300 $r->{type} = "load_game";
1301
1302 $r->{channel} = dec_U16 q||;
1303 $r->{timestamp} = dec_timestamp q||;
1304 $r->{user} = dec_username q||;
1305 $r->{flags} = dec_U8 q||;
1306 $r->{TRAILING_DATA} = $data if length $data;
1307 $r;
1308 };
1309 $enc_client{load_game} = sub {
1310 $data = "";
1311 enc_U16 0x430a;
1312
1313 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1314 enc_timestamp defined $_[0]{timestamp} ? $_[0]{timestamp} : (q||);
1315 enc_username defined $_[0]{user} ? $_[0]{user} : (q||);
1316 enc_U8 defined $_[0]{flags} ? $_[0]{flags} : (q||);
1317 $data;
1318 };
1319
1320 # req_games
1321 $dec_client{0x430b} = sub {
1322 $data = $_[0];
1323 my $r = { DATA => $data };
1324 $r->{type} = "req_games";
1325
1326 $r->{channel} = dec_U16 q||;
1327 $r->{TRAILING_DATA} = $data if length $data;
1328 $r;
1329 };
1330 $enc_client{req_games} = sub {
1331 $data = "";
1332 enc_U16 0x430b;
1333
1334 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1335 $data;
1336 };
1337
1338 # req_desc
1339 $dec_client{0x4319} = sub {
1340 $data = $_[0];
1341 my $r = { DATA => $data };
1342 $r->{type} = "req_desc";
1343
1344 $r->{channel} = dec_U16 q||;
1345 $r->{TRAILING_DATA} = $data if length $data;
1346 $r;
1347 };
1348 $enc_client{req_desc} = sub {
1349 $data = "";
1350 enc_U16 0x4319;
1351
1352 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1353 $data;
1354 };
1355
1356 # challenge
1357 $dec_client{0x4400} = sub {
1358 $data = $_[0];
1359 my $r = { DATA => $data };
1360 $r->{type} = "challenge";
1361
1362 $r->{channel} = dec_U16 q||;
1363 $r->{black} = dec_user q||;
1364 $r->{white} = dec_user q||;
1365 $r->{gametype} = dec_U8 q||;
1366 $r->{cid} = dec_CLIENTID8 q||;
1367 $r->{rules} = dec_rules q||;
1368 $r->{TRAILING_DATA} = $data if length $data;
1369 $r;
1370 };
1371 $enc_client{challenge} = sub {
1372 $data = "";
1373 enc_U16 0x4400;
1374
1375 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1376 enc_user defined $_[0]{black} ? $_[0]{black} : (q||);
1377 enc_user defined $_[0]{white} ? $_[0]{white} : (q||);
1378 enc_U8 defined $_[0]{gametype} ? $_[0]{gametype} : (q||);
1379 enc_CLIENTID8 defined $_[0]{cid} ? $_[0]{cid} : (q||);
1380 enc_rules defined $_[0]{rules} ? $_[0]{rules} : (q||);
1381 $data;
1382 };
1383
1384 # join_game
1385 $dec_client{0x4403} = sub {
1386 $data = $_[0];
1387 my $r = { DATA => $data };
1388 $r->{type} = "join_game";
1389
1390 $r->{channel} = dec_U16 q||;
1391 $r->{user} = dec_user q||;
1392 $r->{TRAILING_DATA} = $data if length $data;
1393 $r;
1394 };
1395 $enc_client{join_game} = sub {
1396 $data = "";
1397 enc_U16 0x4403;
1398
1399 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1400 enc_user defined $_[0]{user} ? $_[0]{user} : (q||);
1401 $data;
1402 };
1403
1404 # part_game
1405 $dec_client{0x4404} = sub {
1406 $data = $_[0];
1407 my $r = { DATA => $data };
1408 $r->{type} = "part_game";
1409
1410 $r->{channel} = dec_U16 q||;
1411 $r->{name} = dec_username q||;
1412 $r->{TRAILING_DATA} = $data if length $data;
1413 $r;
1414 };
1415 $enc_client{part_game} = sub {
1416 $data = "";
1417 enc_U16 0x4404;
1418
1419 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1420 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
1421 $data;
1422 };
1423
1424 # set_tree
1425 $dec_client{0x4405} = sub {
1426 $data = $_[0];
1427 my $r = { DATA => $data };
1428 $r->{type} = "set_tree";
1429
1430 $r->{channel} = dec_U16 q||;
1431 $r->{tree} = dec_TREE q||;
1432 $r->{TRAILING_DATA} = $data if length $data;
1433 $r;
1434 };
1435 $enc_client{set_tree} = sub {
1436 $data = "";
1437 enc_U16 0x4405;
1438
1439 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1440 enc_TREE defined $_[0]{tree} ? $_[0]{tree} : (q||);
1441 $data;
1442 };
1443
1444 # upd_tree
1445 $dec_client{0x4406} = sub {
1446 $data = $_[0];
1447 my $r = { DATA => $data };
1448 $r->{type} = "upd_tree";
1449
1450 $r->{channel} = dec_U16 q||;
1451 $r->{tree} = dec_TREE q||;
1452 $r->{TRAILING_DATA} = $data if length $data;
1453 $r;
1454 };
1455 $enc_client{upd_tree} = sub {
1456 $data = "";
1457 enc_U16 0x4406;
1458
1459 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1460 enc_TREE defined $_[0]{tree} ? $_[0]{tree} : (q||);
1461 $data;
1462 };
1463
1464 # mark_dead
1465 $dec_client{0x4407} = sub {
1466 $data = $_[0];
1467 my $r = { DATA => $data };
1468 $r->{type} = "mark_dead";
1469
1470 $r->{channel} = dec_U16 q||;
1471 $r->{x} = dec_U8 q||;
1472 $r->{y} = dec_U8 q||;
1473 $r->{dead} = dec_flag q||;
1474 $r->{TRAILING_DATA} = $data if length $data;
1475 $r;
1476 };
1477 $enc_client{mark_dead} = sub {
1478 $data = "";
1479 enc_U16 0x4407;
1480
1481 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1482 enc_U8 defined $_[0]{x} ? $_[0]{x} : (q||);
1483 enc_U8 defined $_[0]{y} ? $_[0]{y} : (q||);
1484 enc_flag defined $_[0]{dead} ? $_[0]{dead} : (q||);
1485 $data;
1486 };
1487
1488 # get_tree
1489 $dec_client{0x4408} = sub {
1490 $data = $_[0];
1491 my $r = { DATA => $data };
1492 $r->{type} = "get_tree";
1493
1494 $r->{channel} = dec_U16 q||;
1495 $r->{node} = dec_U32 q||;
1496 $r->{TRAILING_DATA} = $data if length $data;
1497 $r;
1498 };
1499 $enc_client{get_tree} = sub {
1500 $data = "";
1501 enc_U16 0x4408;
1502
1503 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1504 enc_U32 defined $_[0]{node} ? $_[0]{node} : (q||);
1505 $data;
1506 };
1507
1508 # game_done
1509 $dec_client{0x440a} = sub {
1510 $data = $_[0];
1511 my $r = { DATA => $data };
1512 $r->{type} = "game_done";
1513
1514 $r->{channel} = dec_U16 q||;
1515 $r->{id} = dec_U32 q||;
1516 $r->{TRAILING_DATA} = $data if length $data;
1517 $r;
1518 };
1519 $enc_client{game_done} = sub {
1520 $data = "";
1521 enc_U16 0x440a;
1522
1523 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1524 enc_U32 defined $_[0]{id} ? $_[0]{id} : (q||);
1525 $data;
1526 };
1527
1528 # claim_win
1529 $dec_client{0x440c} = sub {
1530 $data = $_[0];
1531 my $r = { DATA => $data };
1532 $r->{type} = "claim_win";
1533
1534 $r->{channel} = dec_U16 q||;
1535 $r->{player} = dec_U8 q||;
1536 $r->{TRAILING_DATA} = $data if length $data;
1537 $r;
1538 };
1539 $enc_client{claim_win} = sub {
1540 $data = "";
1541 enc_U16 0x440c;
1542
1543 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1544 enc_U8 defined $_[0]{player} ? $_[0]{player} : (q||);
1545 $data;
1546 };
1547
1548 # add_time
1549 $dec_client{0x440d} = sub {
1550 $data = $_[0];
1551 my $r = { DATA => $data };
1552 $r->{type} = "add_time";
1553
1554 $r->{channel} = dec_U16 q||;
1555 $r->{time} = dec_U32 q||;
1556 $r->{player} = dec_U8 q||;
1557 $r->{TRAILING_DATA} = $data if length $data;
1558 $r;
1559 };
1560 $enc_client{add_time} = sub {
1561 $data = "";
1562 enc_U16 0x440d;
1563
1564 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1565 enc_U32 defined $_[0]{time} ? $_[0]{time} : (q||);
1566 enc_U8 defined $_[0]{player} ? $_[0]{player} : (q||);
1567 $data;
1568 };
1569
1570 # req_undo
1571 $dec_client{0x440e} = sub {
1572 $data = $_[0];
1573 my $r = { DATA => $data };
1574 $r->{type} = "req_undo";
1575
1576 $r->{channel} = dec_U16 q||;
1577 $r->{TRAILING_DATA} = $data if length $data;
1578 $r;
1579 };
1580 $enc_client{req_undo} = sub {
1581 $data = "";
1582 enc_U16 0x440e;
1583
1584 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1585 $data;
1586 };
1587
1588 # grant_undo
1589 $dec_client{0x440f} = sub {
1590 $data = $_[0];
1591 my $r = { DATA => $data };
1592 $r->{type} = "grant_undo";
1593
1594 $r->{channel} = dec_U16 q||;
1595 $r->{TRAILING_DATA} = $data if length $data;
1596 $r;
1597 };
1598 $enc_client{grant_undo} = sub {
1599 $data = "";
1600 enc_U16 0x440f;
1601
1602 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1603 $data;
1604 };
1605
1606 # resign_game
1607 $dec_client{0x4410} = sub {
1608 $data = $_[0];
1609 my $r = { DATA => $data };
1610 $r->{type} = "resign_game";
1611
1612 $r->{channel} = dec_U16 q||;
1613 $r->{player} = dec_U8 q||;
1614 $r->{TRAILING_DATA} = $data if length $data;
1615 $r;
1616 };
1617 $enc_client{resign_game} = sub {
1618 $data = "";
1619 enc_U16 0x4410;
1620
1621 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1622 enc_U8 defined $_[0]{player} ? $_[0]{player} : (q||);
1623 $data;
1624 };
1625
1626 # set_teacher
1627 $dec_client{0x441a} = sub {
1628 $data = $_[0];
1629 my $r = { DATA => $data };
1630 $r->{type} = "set_teacher";
1631
1632 $r->{channel} = dec_U16 q||;
1633 $r->{name} = dec_username q||;
1634 $r->{TRAILING_DATA} = $data if length $data;
1635 $r;
1636 };
1637 $enc_client{set_teacher} = sub {
1638 $data = "";
1639 enc_U16 0x441a;
1640
1641 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1642 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
1643 $data;
1644 };
1645
1646 # allow_user
1647 $dec_client{0x4422} = sub {
1648 $data = $_[0];
1649 my $r = { DATA => $data };
1650 $r->{type} = "allow_user";
1651
1652 $r->{channel} = dec_U16 q||;
1653 $r->{othername} = dec_username q||;
1654 $r->{name} = dec_username q||;
1655 $r->{TRAILING_DATA} = $data if length $data;
1656 $r;
1657 };
1658 $enc_client{allow_user} = sub {
1659 $data = "";
1660 enc_U16 0x4422;
1661
1662 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1663 enc_username defined $_[0]{othername} ? $_[0]{othername} : (q||);
1664 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
1665 $data;
1666 };
1667
1668 # set_privacy
1669 $dec_client{0x4423} = sub {
1670 $data = $_[0];
1671 my $r = { DATA => $data };
1672 $r->{type} = "set_privacy";
1673
1674 $r->{channel} = dec_U16 q||;
1675 $r->{private} = dec_flag q||;
1676 $r->{TRAILING_DATA} = $data if length $data;
1677 $r;
1678 };
1679 $enc_client{set_privacy} = sub {
1680 $data = "";
1681 enc_U16 0x4423;
1682
1683 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1684 enc_flag defined $_[0]{private} ? $_[0]{private} : (q||);
1685 $data;
1686 };
1687
1688 # game_move
1689 $dec_client{0x4427} = sub {
1690 $data = $_[0];
1691 my $r = { DATA => $data };
1692 $r->{type} = "game_move";
1693
1694 $r->{channel} = dec_U16 q||;
1695 $r->{x} = dec_U8 q||;
1696 $r->{y} = dec_U8 q||;
1697 $r->{TRAILING_DATA} = $data if length $data;
1698 $r;
1699 };
1700 $enc_client{game_move} = sub {
1701 $data = "";
1702 enc_U16 0x4427;
1703
1704 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1705 enc_U8 defined $_[0]{x} ? $_[0]{x} : (q||);
1706 enc_U8 defined $_[0]{y} ? $_[0]{y} : (q||);
1707 $data;
1708 };
1709
1710 # reject_challenge
1711 $dec_client{0x4429} = sub {
1712 $data = $_[0];
1713 my $r = { DATA => $data };
1714 $r->{type} = "reject_challenge";
1715
1716 $r->{channel} = dec_U16 q||;
1717 $r->{name} = dec_username q||;
1718 $r->{gametype} = dec_U8 q||;
1719 $r->{cid} = dec_CLIENTID8 q||;
1720 $r->{rules} = dec_rules q||;
1721 $r->{TRAILING_DATA} = $data if length $data;
1722 $r;
1723 };
1724 $enc_client{reject_challenge} = sub {
1725 $data = "";
1726 enc_U16 0x4429;
1727
1728 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1729 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
1730 enc_U8 defined $_[0]{gametype} ? $_[0]{gametype} : (q||);
1731 enc_CLIENTID8 defined $_[0]{cid} ? $_[0]{cid} : (q||);
1732 enc_rules defined $_[0]{rules} ? $_[0]{rules} : (q||);
1733 $data;
1734 };
1735
1736 # more_comments
1737 $dec_client{0x442d} = sub {
1738 $data = $_[0];
1739 my $r = { DATA => $data };
1740 $r->{type} = "more_comments";
1741
1742 $r->{channel} = dec_U16 q||;
1743 $r->{node} = dec_U32 q||;
1744 $r->{TRAILING_DATA} = $data if length $data;
1745 $r;
1746 };
1747 $enc_client{more_comments} = sub {
1748 $data = "";
1749 enc_U16 0x442d;
1750
1751 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1752 enc_U32 defined $_[0]{node} ? $_[0]{node} : (q||);
1753 $data;
1754 };
1755
1756 # save_game
1757 $dec_client{0x442e} = sub {
1758 $data = $_[0];
1759 my $r = { DATA => $data };
1760 $r->{type} = "save_game";
1761
1762 $r->{channel} = dec_U16 q||;
1763 $r->{TRAILING_DATA} = $data if length $data;
1764 $r;
1765 };
1766 $enc_client{save_game} = sub {
1767 $data = "";
1768 enc_U16 0x442e;
1769
1770 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1771 $data;
1772 };
1773
1774 # req_result
1775 $dec_client{0x4433} = sub {
1776 $data = $_[0];
1777 my $r = { DATA => $data };
1778 $r->{type} = "req_result";
1779
1780 $r->{channel} = dec_U16 q||;
1781 $r->{TRAILING_DATA} = $data if length $data;
1782 $r;
1783 };
1784 $enc_client{req_result} = sub {
1785 $data = "";
1786 enc_U16 0x4433;
1787
1788 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1789 $data;
1790 };
1791
1792 # set_quiet
1793 $dec_client{0x4434} = sub {
1794 $data = $_[0];
1795 my $r = { DATA => $data };
1796 $r->{type} = "set_quiet";
1797
1798 $r->{channel} = dec_U16 q||;
1799 $r->{quiet} = dec_flag q||;
1800 $r->{TRAILING_DATA} = $data if length $data;
1801 $r;
1802 };
1803 $enc_client{set_quiet} = sub {
1804 $data = "";
1805 enc_U16 0x4434;
1806
1807 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1808 enc_flag defined $_[0]{quiet} ? $_[0]{quiet} : (q||);
1809 $data;
1810 };
1811
1812 # msg_game
1813 $dec_client{0x4436} = sub {
1814 $data = $_[0];
1815 my $r = { DATA => $data };
1816 $r->{type} = "msg_game";
1817
1818 $r->{channel} = dec_U16 q||;
1819 $r->{message} = dec_STRING q||;
1820 $r->{TRAILING_DATA} = $data if length $data;
1821 $r;
1822 };
1823 $enc_client{msg_game} = sub {
1824 $data = "";
1825 enc_U16 0x4436;
1826
1827 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
1828 enc_STRING defined $_[0]{message} ? $_[0]{message} : (q||);
1829 $data;
1830 };
1831
1832 # quit
1833 $dec_client{0xffff} = sub {
1834 $data = $_[0];
1835 my $r = { DATA => $data };
1836 $r->{type} = "quit";
1837
1838 $r->{TRAILING_DATA} = $data if length $data;
1839 $r;
1840 };
1841 $enc_client{quit} = sub {
1842 $data = "";
1843 enc_U16 0xffff;
1844
1845 $data;
1846 };
1847
1848 # login
1849 $dec_server{0x0001} = sub {
1850 $data = $_[0];
1851 my $r = { DATA => $data };
1852 $r->{type} = "login";
1853
1854 $r->{message} = dec_CONSTANT q|login successful|;
1855 $r->{success} = dec_CONSTANT q|1|;
1856 $r->{user} = dec_user q||;
1857 $r->{unknown1} = dec_U16 q||;
1858 $r->{unknown2} = dec_U16 q||;
1859 $r->{TRAILING_DATA} = $data if length $data;
1860 $r;
1861 };
1862 $enc_server{login} = sub {
1863 $data = "";
1864 enc_U16 0x0001;
1865
1866 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|login successful|);
1867 enc_CONSTANT defined $_[0]{success} ? $_[0]{success} : (q|1|);
1868 enc_user defined $_[0]{user} ? $_[0]{user} : (q||);
1869 enc_U16 defined $_[0]{unknown1} ? $_[0]{unknown1} : (q||);
1870 enc_U16 defined $_[0]{unknown2} ? $_[0]{unknown2} : (q||);
1871 $data;
1872 };
1873
1874 # login
1875 $dec_server{0x0002} = sub {
1876 $data = $_[0];
1877 my $r = { DATA => $data };
1878 $r->{type} = "login";
1879
1880 $r->{message} = dec_CONSTANT q|login successful: client version is outdated.|;
1881 $r->{success} = dec_CONSTANT q|1|;
1882 $r->{user} = dec_user q||;
1883 $r->{unknown1} = dec_U16 q||;
1884 $r->{unknown2} = dec_U16 q||;
1885 $r->{TRAILING_DATA} = $data if length $data;
1886 $r;
1887 };
1888 $enc_server{login} = sub {
1889 $data = "";
1890 enc_U16 0x0002;
1891
1892 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|login successful: client version is outdated.|);
1893 enc_CONSTANT defined $_[0]{success} ? $_[0]{success} : (q|1|);
1894 enc_user defined $_[0]{user} ? $_[0]{user} : (q||);
1895 enc_U16 defined $_[0]{unknown1} ? $_[0]{unknown1} : (q||);
1896 enc_U16 defined $_[0]{unknown2} ? $_[0]{unknown2} : (q||);
1897 $data;
1898 };
1899
1900 # login
1901 $dec_server{0x0003} = sub {
1902 $data = $_[0];
1903 my $r = { DATA => $data };
1904 $r->{type} = "login";
1905
1906 $r->{message} = dec_CONSTANT q|login failed: client version out of date|;
1907 $r->{user} = dec_user q||;
1908 $r->{unknown1} = dec_U16 q||;
1909 $r->{unknown2} = dec_U16 q||;
1910 $r->{TRAILING_DATA} = $data if length $data;
1911 $r;
1912 };
1913 $enc_server{login} = sub {
1914 $data = "";
1915 enc_U16 0x0003;
1916
1917 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|login failed: client version out of date|);
1918 enc_user defined $_[0]{user} ? $_[0]{user} : (q||);
1919 enc_U16 defined $_[0]{unknown1} ? $_[0]{unknown1} : (q||);
1920 enc_U16 defined $_[0]{unknown2} ? $_[0]{unknown2} : (q||);
1921 $data;
1922 };
1923
1924 # login
1925 $dec_server{0x0004} = sub {
1926 $data = $_[0];
1927 my $r = { DATA => $data };
1928 $r->{type} = "login";
1929
1930 $r->{message} = dec_CONSTANT q|login failed: wrong password|;
1931 $r->{user} = dec_user q||;
1932 $r->{unknown1} = dec_U16 q||;
1933 $r->{unknown2} = dec_U16 q||;
1934 $r->{TRAILING_DATA} = $data if length $data;
1935 $r;
1936 };
1937 $enc_server{login} = sub {
1938 $data = "";
1939 enc_U16 0x0004;
1940
1941 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|login failed: wrong password|);
1942 enc_user defined $_[0]{user} ? $_[0]{user} : (q||);
1943 enc_U16 defined $_[0]{unknown1} ? $_[0]{unknown1} : (q||);
1944 enc_U16 defined $_[0]{unknown2} ? $_[0]{unknown2} : (q||);
1945 $data;
1946 };
1947
1948 # login
1949 $dec_server{0x0005} = sub {
1950 $data = $_[0];
1951 my $r = { DATA => $data };
1952 $r->{type} = "login";
1953
1954 $r->{message} = dec_CONSTANT q|login failed: specified user does not exist|;
1955 $r->{user} = dec_user q||;
1956 $r->{unknown1} = dec_U16 q||;
1957 $r->{unknown2} = dec_U16 q||;
1958 $r->{TRAILING_DATA} = $data if length $data;
1959 $r;
1960 };
1961 $enc_server{login} = sub {
1962 $data = "";
1963 enc_U16 0x0005;
1964
1965 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|login failed: specified user does not exist|);
1966 enc_user defined $_[0]{user} ? $_[0]{user} : (q||);
1967 enc_U16 defined $_[0]{unknown1} ? $_[0]{unknown1} : (q||);
1968 enc_U16 defined $_[0]{unknown2} ? $_[0]{unknown2} : (q||);
1969 $data;
1970 };
1971
1972 # login
1973 $dec_server{0x0006} = sub {
1974 $data = $_[0];
1975 my $r = { DATA => $data };
1976 $r->{type} = "login";
1977
1978 $r->{message} = dec_CONSTANT q|login failed: other user of same name already exists|;
1979 $r->{user} = dec_user q||;
1980 $r->{unknown1} = dec_U16 q||;
1981 $r->{unknown2} = dec_U16 q||;
1982 $r->{TRAILING_DATA} = $data if length $data;
1983 $r;
1984 };
1985 $enc_server{login} = sub {
1986 $data = "";
1987 enc_U16 0x0006;
1988
1989 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|login failed: other user of same name already exists|);
1990 enc_user defined $_[0]{user} ? $_[0]{user} : (q||);
1991 enc_U16 defined $_[0]{unknown1} ? $_[0]{unknown1} : (q||);
1992 enc_U16 defined $_[0]{unknown2} ? $_[0]{unknown2} : (q||);
1993 $data;
1994 };
1995
1996 # userinfo
1997 $dec_server{0x0008} = sub {
1998 $data = $_[0];
1999 my $r = { DATA => $data };
2000 $r->{type} = "userinfo";
2001
2002 $r->{_unused0} = dec_flag q||;
2003 $r->{user} = dec_user q||;
2004 $r->{_unused1} = dec_U64 q||;
2005 $r->{realname} = dec_realname q||;
2006 $r->{email} = dec_email q||;
2007 $r->{info} = dec_userinfo q||;
2008 $r->{homepage} = dec_url q||;
2009 $r->{regdate} = dec_timestamp q||;
2010 $r->{lastlogin} = dec_timestamp q||;
2011 $r->{TRAILING_DATA} = $data if length $data;
2012 $r;
2013 };
2014 $enc_server{userinfo} = sub {
2015 $data = "";
2016 enc_U16 0x0008;
2017
2018 enc_flag defined $_[0]{_unused0} ? $_[0]{_unused0} : (q||);
2019 enc_user defined $_[0]{user} ? $_[0]{user} : (q||);
2020 enc_U64 defined $_[0]{_unused1} ? $_[0]{_unused1} : (q||);
2021 enc_realname defined $_[0]{realname} ? $_[0]{realname} : (q||);
2022 enc_email defined $_[0]{email} ? $_[0]{email} : (q||);
2023 enc_userinfo defined $_[0]{info} ? $_[0]{info} : (q||);
2024 enc_url defined $_[0]{homepage} ? $_[0]{homepage} : (q||);
2025 enc_timestamp defined $_[0]{regdate} ? $_[0]{regdate} : (q||);
2026 enc_timestamp defined $_[0]{lastlogin} ? $_[0]{lastlogin} : (q||);
2027 $data;
2028 };
2029
2030 # upd_userinfo_result
2031 $dec_server{0x0009} = sub {
2032 $data = $_[0];
2033 my $r = { DATA => $data };
2034 $r->{type} = "upd_userinfo_result";
2035
2036 $r->{name} = dec_username q||;
2037 $r->{message} = dec_CONSTANT q|Thanks for registering.|;
2038 $r->{TRAILING_DATA} = $data if length $data;
2039 $r;
2040 };
2041 $enc_server{upd_userinfo_result} = sub {
2042 $data = "";
2043 enc_U16 0x0009;
2044
2045 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
2046 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Thanks for registering.|);
2047 $data;
2048 };
2049
2050 # upd_userinfo_result
2051 $dec_server{0x000a} = sub {
2052 $data = $_[0];
2053 my $r = { DATA => $data };
2054 $r->{type} = "upd_userinfo_result";
2055
2056 $r->{name} = dec_username q||;
2057 $r->{message} = dec_CONSTANT q|The user "%s" has been successfully updated.|;
2058 $r->{TRAILING_DATA} = $data if length $data;
2059 $r;
2060 };
2061 $enc_server{upd_userinfo_result} = sub {
2062 $data = "";
2063 enc_U16 0x000a;
2064
2065 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
2066 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|The user "%s" has been successfully updated.|);
2067 $data;
2068 };
2069
2070 # upd_userinfo_result
2071 $dec_server{0x000b} = sub {
2072 $data = $_[0];
2073 my $r = { DATA => $data };
2074 $r->{type} = "upd_userinfo_result";
2075
2076 $r->{name} = dec_username q||;
2077 $r->{message} = dec_CONSTANT q|There is no user "%s". Update failed.|;
2078 $r->{TRAILING_DATA} = $data if length $data;
2079 $r;
2080 };
2081 $enc_server{upd_userinfo_result} = sub {
2082 $data = "";
2083 enc_U16 0x000b;
2084
2085 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
2086 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|There is no user "%s". Update failed.|);
2087 $data;
2088 };
2089
2090 # userinfo_failed
2091 $dec_server{0x0012} = sub {
2092 $data = $_[0];
2093 my $r = { DATA => $data };
2094 $r->{type} = "userinfo_failed";
2095
2096 $r->{name} = dec_username q||;
2097 $r->{TRAILING_DATA} = $data if length $data;
2098 $r;
2099 };
2100 $enc_server{userinfo_failed} = sub {
2101 $data = "";
2102 enc_U16 0x0012;
2103
2104 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
2105 $data;
2106 };
2107
2108 # msg_chat
2109 $dec_server{0x0013} = sub {
2110 $data = $_[0];
2111 my $r = { DATA => $data };
2112 $r->{type} = "msg_chat";
2113
2114 $r->{name} = dec_username q||;
2115 $r->{name2} = dec_username q||;
2116 $r->{message} = dec_STRING q||;
2117 $r->{TRAILING_DATA} = $data if length $data;
2118 $r;
2119 };
2120 $enc_server{msg_chat} = sub {
2121 $data = "";
2122 enc_U16 0x0013;
2123
2124 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
2125 enc_username defined $_[0]{name2} ? $_[0]{name2} : (q||);
2126 enc_STRING defined $_[0]{message} ? $_[0]{message} : (q||);
2127 $data;
2128 };
2129
2130 # stats
2131 $dec_server{0x0015} = sub {
2132 $data = $_[0];
2133 my $r = { DATA => $data };
2134 $r->{type} = "stats";
2135
2136 $r->{ver_major} = dec_U16 q||;
2137 $r->{ver_minor} = dec_U16 q||;
2138 $r->{ver_micro} = dec_U16 q||;
2139 $r->{boot_time} = dec_timestamp q||;
2140 $r->{users_cur} = dec_U32 q||;
2141 $r->{users_max} = dec_U32 q||;
2142 $r->{users_lim} = dec_U32 q||;
2143 $r->{accts_cur} = dec_U32 q||;
2144 $r->{accts_max} = dec_U32 q||;
2145 $r->{unknown1} = dec_U32 q||;
2146 $r->{work_max} = dec_U32 q||;
2147 $r->{rooms_cur} = dec_U32 q||;
2148 $r->{rooms_max} = dec_U32 q||;
2149 $r->{rooms_lim} = dec_U32 q||;
2150 $r->{games_cur} = dec_U32 q||;
2151 $r->{games_max} = dec_U32 q||;
2152 $r->{games_lim} = dec_U32 q||;
2153 $r->{results_cur} = dec_U32 q||;
2154 $r->{results_max} = dec_U32 q||;
2155 $r->{unknown2} = dec_U32 q||;
2156 $r->{params_cur} = dec_U32 q||;
2157 $r->{params_max} = dec_U32 q||;
2158 $r->{bytes_in} = dec_U64 q||;
2159 $r->{packets_in} = dec_U64 q||;
2160 $r->{bytes_out} = dec_U64 q||;
2161 $r->{packets_out} = dec_U64 q||;
2162 $r->{TRAILING_DATA} = $data if length $data;
2163 $r;
2164 };
2165 $enc_server{stats} = sub {
2166 $data = "";
2167 enc_U16 0x0015;
2168
2169 enc_U16 defined $_[0]{ver_major} ? $_[0]{ver_major} : (q||);
2170 enc_U16 defined $_[0]{ver_minor} ? $_[0]{ver_minor} : (q||);
2171 enc_U16 defined $_[0]{ver_micro} ? $_[0]{ver_micro} : (q||);
2172 enc_timestamp defined $_[0]{boot_time} ? $_[0]{boot_time} : (q||);
2173 enc_U32 defined $_[0]{users_cur} ? $_[0]{users_cur} : (q||);
2174 enc_U32 defined $_[0]{users_max} ? $_[0]{users_max} : (q||);
2175 enc_U32 defined $_[0]{users_lim} ? $_[0]{users_lim} : (q||);
2176 enc_U32 defined $_[0]{accts_cur} ? $_[0]{accts_cur} : (q||);
2177 enc_U32 defined $_[0]{accts_max} ? $_[0]{accts_max} : (q||);
2178 enc_U32 defined $_[0]{unknown1} ? $_[0]{unknown1} : (q||);
2179 enc_U32 defined $_[0]{work_max} ? $_[0]{work_max} : (q||);
2180 enc_U32 defined $_[0]{rooms_cur} ? $_[0]{rooms_cur} : (q||);
2181 enc_U32 defined $_[0]{rooms_max} ? $_[0]{rooms_max} : (q||);
2182 enc_U32 defined $_[0]{rooms_lim} ? $_[0]{rooms_lim} : (q||);
2183 enc_U32 defined $_[0]{games_cur} ? $_[0]{games_cur} : (q||);
2184 enc_U32 defined $_[0]{games_max} ? $_[0]{games_max} : (q||);
2185 enc_U32 defined $_[0]{games_lim} ? $_[0]{games_lim} : (q||);
2186 enc_U32 defined $_[0]{results_cur} ? $_[0]{results_cur} : (q||);
2187 enc_U32 defined $_[0]{results_max} ? $_[0]{results_max} : (q||);
2188 enc_U32 defined $_[0]{unknown2} ? $_[0]{unknown2} : (q||);
2189 enc_U32 defined $_[0]{params_cur} ? $_[0]{params_cur} : (q||);
2190 enc_U32 defined $_[0]{params_max} ? $_[0]{params_max} : (q||);
2191 enc_U64 defined $_[0]{bytes_in} ? $_[0]{bytes_in} : (q||);
2192 enc_U64 defined $_[0]{packets_in} ? $_[0]{packets_in} : (q||);
2193 enc_U64 defined $_[0]{bytes_out} ? $_[0]{bytes_out} : (q||);
2194 enc_U64 defined $_[0]{packets_out} ? $_[0]{packets_out} : (q||);
2195 $data;
2196 };
2197
2198 # idle_warn
2199 $dec_server{0x0016} = sub {
2200 $data = $_[0];
2201 my $r = { DATA => $data };
2202 $r->{type} = "idle_warn";
2203
2204 $r->{TRAILING_DATA} = $data if length $data;
2205 $r;
2206 };
2207 $enc_server{idle_warn} = sub {
2208 $data = "";
2209 enc_U16 0x0016;
2210
2211 $data;
2212 };
2213
2214 # login
2215 $dec_server{0x0018} = sub {
2216 $data = $_[0];
2217 my $r = { DATA => $data };
2218 $r->{type} = "login";
2219
2220 $r->{message} = dec_CONSTANT q|logged out: another client logged in with your username|;
2221 $r->{TRAILING_DATA} = $data if length $data;
2222 $r;
2223 };
2224 $enc_server{login} = sub {
2225 $data = "";
2226 enc_U16 0x0018;
2227
2228 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|logged out: another client logged in with your username|);
2229 $data;
2230 };
2231
2232 # login
2233 $dec_server{0x001c} = sub {
2234 $data = $_[0];
2235 my $r = { DATA => $data };
2236 $r->{type} = "login";
2237
2238 $r->{message} = dec_CONSTANT q|logged out: idle for too long|;
2239 $r->{TRAILING_DATA} = $data if length $data;
2240 $r;
2241 };
2242 $enc_server{login} = sub {
2243 $data = "";
2244 enc_U16 0x001c;
2245
2246 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|logged out: idle for too long|);
2247 $data;
2248 };
2249
2250 # error
2251 $dec_server{0x0020} = sub {
2252 $data = $_[0];
2253 my $r = { DATA => $data };
2254 $r->{type} = "error";
2255
2256 $r->{message} = dec_CONSTANT q|Sorry, you have too many unfinished games. You cannot turn on your rank. Please finish some of your games, then try again.|;
2257 $r->{TRAILING_DATA} = $data if length $data;
2258 $r;
2259 };
2260 $enc_server{error} = sub {
2261 $data = "";
2262 enc_U16 0x0020;
2263
2264 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, you have too many unfinished games. You cannot turn on your rank. Please finish some of your games, then try again.|);
2265 $data;
2266 };
2267
2268 # login
2269 $dec_server{0x0022} = sub {
2270 $data = $_[0];
2271 my $r = { DATA => $data };
2272 $r->{type} = "login";
2273
2274 $r->{reason} = dec_STRING q||;
2275 $r->{result} = dec_CONSTANT q|user or ip blocked|;
2276 $r->{TRAILING_DATA} = $data if length $data;
2277 $r;
2278 };
2279 $enc_server{login} = sub {
2280 $data = "";
2281 enc_U16 0x0022;
2282
2283 enc_STRING defined $_[0]{reason} ? $_[0]{reason} : (q||);
2284 enc_CONSTANT defined $_[0]{result} ? $_[0]{result} : (q|user or ip blocked|);
2285 $data;
2286 };
2287
2288 # timewarning_default
2289 $dec_server{0x001b} = sub {
2290 $data = $_[0];
2291 my $r = { DATA => $data };
2292 $r->{type} = "timewarning_default";
2293
2294 $r->{channel} = dec_U16 q||;
2295 $r->{time} = dec_U16 q||;
2296 $r->{TRAILING_DATA} = $data if length $data;
2297 $r;
2298 };
2299 $enc_server{timewarning_default} = sub {
2300 $data = "";
2301 enc_U16 0x001b;
2302
2303 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
2304 enc_U16 defined $_[0]{time} ? $_[0]{time} : (q||);
2305 $data;
2306 };
2307
2308 # idle_err
2309 $dec_server{0x001c} = sub {
2310 $data = $_[0];
2311 my $r = { DATA => $data };
2312 $r->{type} = "idle_err";
2313
2314 $r->{TRAILING_DATA} = $data if length $data;
2315 $r;
2316 };
2317 $enc_server{idle_err} = sub {
2318 $data = "";
2319 enc_U16 0x001c;
2320
2321 $data;
2322 };
2323
2324 # ping
2325 $dec_server{0x001d} = sub {
2326 $data = $_[0];
2327 my $r = { DATA => $data };
2328 $r->{type} = "ping";
2329
2330 $r->{TRAILING_DATA} = $data if length $data;
2331 $r;
2332 };
2333 $enc_server{ping} = sub {
2334 $data = "";
2335 enc_U16 0x001d;
2336
2337 $data;
2338 };
2339
2340 # usergraph
2341 $dec_server{0x001e} = sub {
2342 $data = $_[0];
2343 my $r = { DATA => $data };
2344 $r->{type} = "usergraph";
2345
2346 $r->{name} = dec_username q||;
2347 $r->{data} = (my $array = []);
2348 while (length $data) {
2349 push @$array, dec_I16 ;
2350 }
2351
2352 $r->{TRAILING_DATA} = $data if length $data;
2353 $r;
2354 };
2355 $enc_server{usergraph} = sub {
2356 $data = "";
2357 enc_U16 0x001e;
2358
2359 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
2360 enc_I16 defined $_[0]{data} ? $_[0]{data} : (q||);
2361 $data;
2362 };
2363
2364 # userpic
2365 $dec_server{0x0021} = sub {
2366 $data = $_[0];
2367 my $r = { DATA => $data };
2368 $r->{type} = "userpic";
2369
2370 $r->{name} = dec_username q||;
2371 $r->{data} = dec_DATA q||;
2372 $r->{TRAILING_DATA} = $data if length $data;
2373 $r;
2374 };
2375 $enc_server{userpic} = sub {
2376 $data = "";
2377 enc_U16 0x0021;
2378
2379 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
2380 enc_DATA defined $_[0]{data} ? $_[0]{data} : (q||);
2381 $data;
2382 };
2383
2384 # memo_error
2385 $dec_server{0x0025} = sub {
2386 $data = $_[0];
2387 my $r = { DATA => $data };
2388 $r->{type} = "memo_error";
2389
2390 $r->{name} = dec_username q||;
2391 $r->{cid} = dec_CLIENTID16 q||;
2392 $r->{message} = dec_CONSTANT q|memo send failed: account already exists|;
2393 $r->{subtype} = dec_CONSTANT q|25|;
2394 $r->{TRAILING_DATA} = $data if length $data;
2395 $r;
2396 };
2397 $enc_server{memo_error} = sub {
2398 $data = "";
2399 enc_U16 0x0025;
2400
2401 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
2402 enc_CLIENTID16 defined $_[0]{cid} ? $_[0]{cid} : (q||);
2403 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|memo send failed: account already exists|);
2404 enc_CONSTANT defined $_[0]{subtype} ? $_[0]{subtype} : (q|25|);
2405 $data;
2406 };
2407
2408 # memo_error
2409 $dec_server{0x0026} = sub {
2410 $data = $_[0];
2411 my $r = { DATA => $data };
2412 $r->{type} = "memo_error";
2413
2414 $r->{name} = dec_username q||;
2415 $r->{cid} = dec_CLIENTID16 q||;
2416 $r->{message} = dec_CONSTANT q|memo send failed: error 26|;
2417 $r->{subtype} = dec_CONSTANT q|26|;
2418 $r->{TRAILING_DATA} = $data if length $data;
2419 $r;
2420 };
2421 $enc_server{memo_error} = sub {
2422 $data = "";
2423 enc_U16 0x0026;
2424
2425 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
2426 enc_CLIENTID16 defined $_[0]{cid} ? $_[0]{cid} : (q||);
2427 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|memo send failed: error 26|);
2428 enc_CONSTANT defined $_[0]{subtype} ? $_[0]{subtype} : (q|26|);
2429 $data;
2430 };
2431
2432 # memo_error
2433 $dec_server{0x0027} = sub {
2434 $data = $_[0];
2435 my $r = { DATA => $data };
2436 $r->{type} = "memo_error";
2437
2438 $r->{name} = dec_username q||;
2439 $r->{cid} = dec_CLIENTID16 q||;
2440 $r->{message} = dec_CONSTANT q|memo send failed: user is online, use chat|;
2441 $r->{subtype} = dec_CONSTANT q|27|;
2442 $r->{TRAILING_DATA} = $data if length $data;
2443 $r;
2444 };
2445 $enc_server{memo_error} = sub {
2446 $data = "";
2447 enc_U16 0x0027;
2448
2449 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
2450 enc_CLIENTID16 defined $_[0]{cid} ? $_[0]{cid} : (q||);
2451 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|memo send failed: user is online, use chat|);
2452 enc_CONSTANT defined $_[0]{subtype} ? $_[0]{subtype} : (q|27|);
2453 $data;
2454 };
2455
2456 # memo_error
2457 $dec_server{0x0028} = sub {
2458 $data = $_[0];
2459 my $r = { DATA => $data };
2460 $r->{type} = "memo_error";
2461
2462 $r->{name} = dec_username q||;
2463 $r->{cid} = dec_CLIENTID16 q||;
2464 $r->{message} = dec_CONSTANT q|memo send failed: error 28|;
2465 $r->{subtype} = dec_CONSTANT q|28|;
2466 $r->{TRAILING_DATA} = $data if length $data;
2467 $r;
2468 };
2469 $enc_server{memo_error} = sub {
2470 $data = "";
2471 enc_U16 0x0028;
2472
2473 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
2474 enc_CLIENTID16 defined $_[0]{cid} ? $_[0]{cid} : (q||);
2475 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|memo send failed: error 28|);
2476 enc_CONSTANT defined $_[0]{subtype} ? $_[0]{subtype} : (q|28|);
2477 $data;
2478 };
2479
2480 # memo
2481 $dec_server{0x0029} = sub {
2482 $data = $_[0];
2483 my $r = { DATA => $data };
2484 $r->{type} = "memo";
2485
2486 $r->{name} = dec_username q||;
2487 $r->{time} = dec_timestamp q||;
2488 $r->{message} = dec_ZSTRING q||;
2489 $r->{TRAILING_DATA} = $data if length $data;
2490 $r;
2491 };
2492 $enc_server{memo} = sub {
2493 $data = "";
2494 enc_U16 0x0029;
2495
2496 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
2497 enc_timestamp defined $_[0]{time} ? $_[0]{time} : (q||);
2498 enc_ZSTRING defined $_[0]{message} ? $_[0]{message} : (q||);
2499 $data;
2500 };
2501
2502 # memo_sent
2503 $dec_server{0x002a} = sub {
2504 $data = $_[0];
2505 my $r = { DATA => $data };
2506 $r->{type} = "memo_sent";
2507
2508 $r->{name} = dec_username q||;
2509 $r->{cid} = dec_CLIENTID16 q||;
2510 $r->{TRAILING_DATA} = $data if length $data;
2511 $r;
2512 };
2513 $enc_server{memo_sent} = sub {
2514 $data = "";
2515 enc_U16 0x002a;
2516
2517 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
2518 enc_CLIENTID16 defined $_[0]{cid} ? $_[0]{cid} : (q||);
2519 $data;
2520 };
2521
2522 # gnotice
2523 $dec_server{0x0100} = sub {
2524 $data = $_[0];
2525 my $r = { DATA => $data };
2526 $r->{type} = "gnotice";
2527
2528 $r->{notice} = dec_STRING q||;
2529 $r->{TRAILING_DATA} = $data if length $data;
2530 $r;
2531 };
2532 $enc_server{gnotice} = sub {
2533 $data = "";
2534 enc_U16 0x0100;
2535
2536 enc_STRING defined $_[0]{notice} ? $_[0]{notice} : (q||);
2537 $data;
2538 };
2539
2540 # notify_event
2541 $dec_server{0x0202} = sub {
2542 $data = $_[0];
2543 my $r = { DATA => $data };
2544 $r->{type} = "notify_event";
2545
2546 $r->{event} = dec_U32 q||;
2547 $r->{user} = dec_user q||;
2548 $r->{gamerecord} = dec_game_record q||
2549 if ($r->{event} == 2);
2550 $r->{TRAILING_DATA} = $data if length $data;
2551 $r;
2552 };
2553 $enc_server{notify_event} = sub {
2554 $data = "";
2555 enc_U16 0x0202;
2556
2557 enc_U32 defined $_[0]{event} ? $_[0]{event} : (q||);
2558 enc_user defined $_[0]{user} ? $_[0]{user} : (q||);
2559 enc_game_record defined $_[0]{gamerecord} ? $_[0]{gamerecord} : (q||);
2560 $data;
2561 };
2562
2563 # login_done
2564 $dec_server{0x030c} = sub {
2565 $data = $_[0];
2566 my $r = { DATA => $data };
2567 $r->{type} = "login_done";
2568
2569 $r->{TRAILING_DATA} = $data if length $data;
2570 $r;
2571 };
2572 $enc_server{login_done} = sub {
2573 $data = "";
2574 enc_U16 0x030c;
2575
2576 $data;
2577 };
2578
2579 # priv_room
2580 $dec_server{0x0310} = sub {
2581 $data = $_[0];
2582 my $r = { DATA => $data };
2583 $r->{type} = "priv_room";
2584
2585 $r->{name} = dec_STRING q||;
2586 $r->{TRAILING_DATA} = $data if length $data;
2587 $r;
2588 };
2589 $enc_server{priv_room} = sub {
2590 $data = "";
2591 enc_U16 0x0310;
2592
2593 enc_STRING defined $_[0]{name} ? $_[0]{name} : (q||);
2594 $data;
2595 };
2596
2597 # upd_rooms
2598 $dec_server{0x0318} = sub {
2599 $data = $_[0];
2600 my $r = { DATA => $data };
2601 $r->{type} = "upd_rooms";
2602
2603 $r->{rooms} = (my $array = []);
2604 while (length $data) {
2605 push @$array, dec_room ;
2606 }
2607
2608 $r->{TRAILING_DATA} = $data if length $data;
2609 $r;
2610 };
2611 $enc_server{upd_rooms} = sub {
2612 $data = "";
2613 enc_U16 0x0318;
2614
2615 enc_room defined $_[0]{rooms} ? $_[0]{rooms} : (q||);
2616 $data;
2617 };
2618
2619 # chal_defaults
2620 $dec_server{0x0411} = sub {
2621 $data = $_[0];
2622 my $r = { DATA => $data };
2623 $r->{type} = "chal_defaults";
2624
2625 $r->{channel} = dec_U16 q||;
2626 $r->{defaults} = dec_challenge_defaults q||;
2627 $r->{TRAILING_DATA} = $data if length $data;
2628 $r;
2629 };
2630 $enc_server{chal_defaults} = sub {
2631 $data = "";
2632 enc_U16 0x0411;
2633
2634 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
2635 enc_challenge_defaults defined $_[0]{defaults} ? $_[0]{defaults} : (q||);
2636 $data;
2637 };
2638
2639 # already_playing
2640 $dec_server{0x0412} = sub {
2641 $data = $_[0];
2642 my $r = { DATA => $data };
2643 $r->{type} = "already_playing";
2644
2645 $r->{message} = dec_CONSTANT q|Sorry, you are already playing in one game, so you can't start playing in another.|;
2646 $r->{cid} = dec_CLIENTID16 q||;
2647 $r->{TRAILING_DATA} = $data if length $data;
2648 $r;
2649 };
2650 $enc_server{already_playing} = sub {
2651 $data = "";
2652 enc_U16 0x0412;
2653
2654 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, you are already playing in one game, so you can't start playing in another.|);
2655 enc_CLIENTID16 defined $_[0]{cid} ? $_[0]{cid} : (q||);
2656 $data;
2657 };
2658
2659 # game_record
2660 $dec_server{0x0414} = sub {
2661 $data = $_[0];
2662 my $r = { DATA => $data };
2663 $r->{type} = "game_record";
2664
2665 $r->{name} = dec_username q||;
2666 $r->{more} = dec_flag q||;
2667 $r->{games} = (my $array = []);
2668 while (length $data) {
2669 push @$array, dec_game_record ;
2670 }
2671
2672 $r->{TRAILING_DATA} = $data if length $data;
2673 $r;
2674 };
2675 $enc_server{game_record} = sub {
2676 $data = "";
2677 enc_U16 0x0414;
2678
2679 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
2680 enc_flag defined $_[0]{more} ? $_[0]{more} : (q||);
2681 enc_game_record defined $_[0]{games} ? $_[0]{games} : (q||);
2682 $data;
2683 };
2684
2685 # error
2686 $dec_server{0x0417} = sub {
2687 $data = $_[0];
2688 my $r = { DATA => $data };
2689 $r->{type} = "error";
2690
2691 $r->{message} = dec_CONSTANT q|Sorry, your opponent is currently not logged in, so you can't resume this game.|;
2692 $r->{TRAILING_DATA} = $data if length $data;
2693 $r;
2694 };
2695 $enc_server{error} = sub {
2696 $data = "";
2697 enc_U16 0x0417;
2698
2699 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, your opponent is currently not logged in, so you can't resume this game.|);
2700 $data;
2701 };
2702
2703 # error
2704 $dec_server{0x0418} = sub {
2705 $data = $_[0];
2706 my $r = { DATA => $data };
2707 $r->{type} = "error";
2708
2709 $r->{message} = dec_CONSTANT q|Sorry, your opponent is already playing in a game, so you cannot continue this one.|;
2710 $r->{TRAILING_DATA} = $data if length $data;
2711 $r;
2712 };
2713 $enc_server{error} = sub {
2714 $data = "";
2715 enc_U16 0x0418;
2716
2717 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, your opponent is already playing in a game, so you cannot continue this one.|);
2718 $data;
2719 };
2720
2721 # error
2722 $dec_server{0x0419} = sub {
2723 $data = $_[0];
2724 my $r = { DATA => $data };
2725 $r->{type} = "error";
2726
2727 $r->{message} = dec_CONSTANT q|Sorry, the server is out of boards! Please wait a few minutes and try to start a game again.|;
2728 $r->{TRAILING_DATA} = $data if length $data;
2729 $r;
2730 };
2731 $enc_server{error} = sub {
2732 $data = "";
2733 enc_U16 0x0419;
2734
2735 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, the server is out of boards! Please wait a few minutes and try to start a game again.|);
2736 $data;
2737 };
2738
2739 # upd_game2
2740 $dec_server{0x041c} = sub {
2741 $data = $_[0];
2742 my $r = { DATA => $data };
2743 $r->{type} = "upd_game2";
2744
2745 $r->{channel_junk} = dec_U16 q||;
2746 $r->{game} = dec_game q||;
2747 $r->{TRAILING_DATA} = $data if length $data;
2748 $r;
2749 };
2750 $enc_server{upd_game2} = sub {
2751 $data = "";
2752 enc_U16 0x041c;
2753
2754 enc_U16 defined $_[0]{channel_junk} ? $_[0]{channel_junk} : (q||);
2755 enc_game defined $_[0]{game} ? $_[0]{game} : (q||);
2756 $data;
2757 };
2758
2759 # error
2760 $dec_server{0x041f} = sub {
2761 $data = $_[0];
2762 my $r = { DATA => $data };
2763 $r->{type} = "error";
2764
2765 $r->{message} = dec_CONSTANT q|Sorry, the game you tried to load was not correctly saved...probably caused by the server crashing. It cannot be recovered.|;
2766 $r->{TRAILING_DATA} = $data if length $data;
2767 $r;
2768 };
2769 $enc_server{error} = sub {
2770 $data = "";
2771 enc_U16 0x041f;
2772
2773 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, the game you tried to load was not correctly saved...probably caused by the server crashing. It cannot be recovered.|);
2774 $data;
2775 };
2776
2777 # error
2778 $dec_server{0x0420} = sub {
2779 $data = $_[0];
2780 my $r = { DATA => $data };
2781 $r->{type} = "error";
2782
2783 $r->{message} = dec_CONSTANT q|Sorry, user "%s" has left the game you are starting before you could challenge them. You will have to play against somebody else.|;
2784 $r->{TRAILING_DATA} = $data if length $data;
2785 $r;
2786 };
2787 $enc_server{error} = sub {
2788 $data = "";
2789 enc_U16 0x0420;
2790
2791 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, user "%s" has left the game you are starting before you could challenge them. You will have to play against somebody else.|);
2792 $data;
2793 };
2794
2795 # error
2796 $dec_server{0x0421} = sub {
2797 $data = $_[0];
2798 my $r = { DATA => $data };
2799 $r->{type} = "error";
2800
2801 $r->{message} = dec_CONSTANT q|Sorry, this game is a private lesson. You will not be allowed to observe it.|;
2802 $r->{TRAILING_DATA} = $data if length $data;
2803 $r;
2804 };
2805 $enc_server{error} = sub {
2806 $data = "";
2807 enc_U16 0x0421;
2808
2809 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, this game is a private lesson. You will not be allowed to observe it.|);
2810 $data;
2811 };
2812
2813 # add_global_challenges
2814 $dec_server{0x043a} = sub {
2815 $data = $_[0];
2816 my $r = { DATA => $data };
2817 $r->{type} = "add_global_challenges";
2818
2819 $r->{games} = (my $array = []);
2820 while (length $data) {
2821 push @$array, dec_room_game ;
2822 }
2823
2824 $r->{TRAILING_DATA} = $data if length $data;
2825 $r;
2826 };
2827 $enc_server{add_global_challenges} = sub {
2828 $data = "";
2829 enc_U16 0x043a;
2830
2831 enc_room_game defined $_[0]{games} ? $_[0]{games} : (q||);
2832 $data;
2833 };
2834
2835 # join_room
2836 $dec_server{0x4300} = sub {
2837 $data = $_[0];
2838 my $r = { DATA => $data };
2839 $r->{type} = "join_room";
2840
2841 $r->{channel} = dec_U16 q||;
2842 $r->{users} = (my $array = []);
2843 while (length $data) {
2844 push @$array, dec_user ;
2845 }
2846
2847 $r->{TRAILING_DATA} = $data if length $data;
2848 $r;
2849 };
2850 $enc_server{join_room} = sub {
2851 $data = "";
2852 enc_U16 0x4300;
2853
2854 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
2855 enc_user defined $_[0]{users} ? $_[0]{users} : (q||);
2856 $data;
2857 };
2858
2859 # msg_room
2860 $dec_server{0x4301} = sub {
2861 $data = $_[0];
2862 my $r = { DATA => $data };
2863 $r->{type} = "msg_room";
2864
2865 $r->{channel} = dec_U16 q||;
2866 $r->{name} = dec_username q||;
2867 $r->{message} = dec_STRING q||;
2868 $r->{TRAILING_DATA} = $data if length $data;
2869 $r;
2870 };
2871 $enc_server{msg_room} = sub {
2872 $data = "";
2873 enc_U16 0x4301;
2874
2875 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
2876 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
2877 enc_STRING defined $_[0]{message} ? $_[0]{message} : (q||);
2878 $data;
2879 };
2880
2881 # part_room
2882 $dec_server{0x4302} = sub {
2883 $data = $_[0];
2884 my $r = { DATA => $data };
2885 $r->{type} = "part_room";
2886
2887 $r->{channel} = dec_U16 q||;
2888 $r->{user} = dec_user q||;
2889 $r->{TRAILING_DATA} = $data if length $data;
2890 $r;
2891 };
2892 $enc_server{part_room} = sub {
2893 $data = "";
2894 enc_U16 0x4302;
2895
2896 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
2897 enc_user defined $_[0]{user} ? $_[0]{user} : (q||);
2898 $data;
2899 };
2900
2901 # del_room
2902 $dec_server{0x4303} = sub {
2903 $data = $_[0];
2904 my $r = { DATA => $data };
2905 $r->{type} = "del_room";
2906
2907 $r->{channel} = dec_U16 q||;
2908 $r->{TRAILING_DATA} = $data if length $data;
2909 $r;
2910 };
2911 $enc_server{del_room} = sub {
2912 $data = "";
2913 enc_U16 0x4303;
2914
2915 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
2916 $data;
2917 };
2918
2919 # upd_games
2920 $dec_server{0x4304} = sub {
2921 $data = $_[0];
2922 my $r = { DATA => $data };
2923 $r->{type} = "upd_games";
2924
2925 $r->{channel} = dec_U16 q||;
2926 $r->{games} = (my $array = []);
2927 while (length $data) {
2928 push @$array, dec_game ;
2929 }
2930
2931 $r->{TRAILING_DATA} = $data if length $data;
2932 $r;
2933 };
2934 $enc_server{upd_games} = sub {
2935 $data = "";
2936 enc_U16 0x4304;
2937
2938 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
2939 enc_game defined $_[0]{games} ? $_[0]{games} : (q||);
2940 $data;
2941 };
2942
2943 # desc_room
2944 $dec_server{0x4319} = sub {
2945 $data = $_[0];
2946 my $r = { DATA => $data };
2947 $r->{type} = "desc_room";
2948
2949 $r->{channel} = dec_U16 q||;
2950 $r->{owner} = dec_username q||;
2951 $r->{description} = dec_STRING q||;
2952 $r->{TRAILING_DATA} = $data if length $data;
2953 $r;
2954 };
2955 $enc_server{desc_room} = sub {
2956 $data = "";
2957 enc_U16 0x4319;
2958
2959 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
2960 enc_username defined $_[0]{owner} ? $_[0]{owner} : (q||);
2961 enc_STRING defined $_[0]{description} ? $_[0]{description} : (q||);
2962 $data;
2963 };
2964
2965 # challenge
2966 $dec_server{0x4400} = sub {
2967 $data = $_[0];
2968 my $r = { DATA => $data };
2969 $r->{type} = "challenge";
2970
2971 $r->{channel} = dec_U16 q||;
2972 $r->{black} = dec_user q||;
2973 $r->{white} = dec_user q||;
2974 $r->{gametype} = dec_U8 q||;
2975 $r->{cid} = dec_CLIENTID8 q||;
2976 $r->{rules} = dec_rules q||;
2977 $r->{notes} = dec_STRING q||;
2978 $r->{TRAILING_DATA} = $data if length $data;
2979 $r;
2980 };
2981 $enc_server{challenge} = sub {
2982 $data = "";
2983 enc_U16 0x4400;
2984
2985 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
2986 enc_user defined $_[0]{black} ? $_[0]{black} : (q||);
2987 enc_user defined $_[0]{white} ? $_[0]{white} : (q||);
2988 enc_U8 defined $_[0]{gametype} ? $_[0]{gametype} : (q||);
2989 enc_CLIENTID8 defined $_[0]{cid} ? $_[0]{cid} : (q||);
2990 enc_rules defined $_[0]{rules} ? $_[0]{rules} : (q||);
2991 enc_STRING defined $_[0]{notes} ? $_[0]{notes} : (q||);
2992 $data;
2993 };
2994
2995 # upd_game
2996 $dec_server{0x4401} = sub {
2997 $data = $_[0];
2998 my $r = { DATA => $data };
2999 $r->{type} = "upd_game";
3000
3001 $r->{channel} = dec_U16 q||;
3002 $r->{game} = dec_game q||;
3003 $r->{TRAILING_DATA} = $data if length $data;
3004 $r;
3005 };
3006 $enc_server{upd_game} = sub {
3007 $data = "";
3008 enc_U16 0x4401;
3009
3010 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3011 enc_game defined $_[0]{game} ? $_[0]{game} : (q||);
3012 $data;
3013 };
3014
3015 # del_game
3016 $dec_server{0x4402} = sub {
3017 $data = $_[0];
3018 my $r = { DATA => $data };
3019 $r->{type} = "del_game";
3020
3021 $r->{channel} = dec_U16 q||;
3022 $r->{TRAILING_DATA} = $data if length $data;
3023 $r;
3024 };
3025 $enc_server{del_game} = sub {
3026 $data = "";
3027 enc_U16 0x4402;
3028
3029 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3030 $data;
3031 };
3032
3033 # upd_observers
3034 $dec_server{0x4403} = sub {
3035 $data = $_[0];
3036 my $r = { DATA => $data };
3037 $r->{type} = "upd_observers";
3038
3039 $r->{channel} = dec_U16 q||;
3040 $r->{users} = (my $array = []);
3041 while (length $data) {
3042 push @$array, dec_user ;
3043 }
3044
3045 $r->{TRAILING_DATA} = $data if length $data;
3046 $r;
3047 };
3048 $enc_server{upd_observers} = sub {
3049 $data = "";
3050 enc_U16 0x4403;
3051
3052 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3053 enc_user defined $_[0]{users} ? $_[0]{users} : (q||);
3054 $data;
3055 };
3056
3057 # del_observer
3058 $dec_server{0x4404} = sub {
3059 $data = $_[0];
3060 my $r = { DATA => $data };
3061 $r->{type} = "del_observer";
3062
3063 $r->{channel} = dec_U16 q||;
3064 $r->{name} = dec_username q||;
3065 $r->{TRAILING_DATA} = $data if length $data;
3066 $r;
3067 };
3068 $enc_server{del_observer} = sub {
3069 $data = "";
3070 enc_U16 0x4404;
3071
3072 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3073 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
3074 $data;
3075 };
3076
3077 # set_tree
3078 $dec_server{0x4405} = sub {
3079 $data = $_[0];
3080 my $r = { DATA => $data };
3081 $r->{type} = "set_tree";
3082
3083 $r->{channel} = dec_U16 q||;
3084 $r->{tree} = dec_TREE q||;
3085 $r->{TRAILING_DATA} = $data if length $data;
3086 $r;
3087 };
3088 $enc_server{set_tree} = sub {
3089 $data = "";
3090 enc_U16 0x4405;
3091
3092 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3093 enc_TREE defined $_[0]{tree} ? $_[0]{tree} : (q||);
3094 $data;
3095 };
3096
3097 # upd_tree
3098 $dec_server{0x4406} = sub {
3099 $data = $_[0];
3100 my $r = { DATA => $data };
3101 $r->{type} = "upd_tree";
3102
3103 $r->{channel} = dec_U16 q||;
3104 $r->{tree} = dec_TREE q||;
3105 $r->{TRAILING_DATA} = $data if length $data;
3106 $r;
3107 };
3108 $enc_server{upd_tree} = sub {
3109 $data = "";
3110 enc_U16 0x4406;
3111
3112 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3113 enc_TREE defined $_[0]{tree} ? $_[0]{tree} : (q||);
3114 $data;
3115 };
3116
3117 # superko
3118 $dec_server{0x4409} = sub {
3119 $data = $_[0];
3120 my $r = { DATA => $data };
3121 $r->{type} = "superko";
3122
3123 $r->{channel} = dec_U16 q||;
3124 $r->{TRAILING_DATA} = $data if length $data;
3125 $r;
3126 };
3127 $enc_server{superko} = sub {
3128 $data = "";
3129 enc_U16 0x4409;
3130
3131 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3132 $data;
3133 };
3134
3135 # game_done
3136 $dec_server{0x440a} = sub {
3137 $data = $_[0];
3138 my $r = { DATA => $data };
3139 $r->{type} = "game_done";
3140
3141 $r->{channel} = dec_U16 q||;
3142 $r->{id} = dec_U32 q||;
3143 $r->{black} = dec_flag q||;
3144 $r->{white} = dec_flag q||;
3145 $r->{TRAILING_DATA} = $data if length $data;
3146 $r;
3147 };
3148 $enc_server{game_done} = sub {
3149 $data = "";
3150 enc_U16 0x440a;
3151
3152 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3153 enc_U32 defined $_[0]{id} ? $_[0]{id} : (q||);
3154 enc_flag defined $_[0]{black} ? $_[0]{black} : (q||);
3155 enc_flag defined $_[0]{white} ? $_[0]{white} : (q||);
3156 $data;
3157 };
3158
3159 # final_result
3160 $dec_server{0x440b} = sub {
3161 $data = $_[0];
3162 my $r = { DATA => $data };
3163 $r->{type} = "final_result";
3164
3165 $r->{channel} = dec_U16 q||;
3166 $r->{blackscore} = dec_scorevalues q||;
3167 $r->{whitescore} = dec_scorevalues q||;
3168 $r->{TRAILING_DATA} = $data if length $data;
3169 $r;
3170 };
3171 $enc_server{final_result} = sub {
3172 $data = "";
3173 enc_U16 0x440b;
3174
3175 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3176 enc_scorevalues defined $_[0]{blackscore} ? $_[0]{blackscore} : (q||);
3177 enc_scorevalues defined $_[0]{whitescore} ? $_[0]{whitescore} : (q||);
3178 $data;
3179 };
3180
3181 # out_of_time
3182 $dec_server{0x440c} = sub {
3183 $data = $_[0];
3184 my $r = { DATA => $data };
3185 $r->{type} = "out_of_time";
3186
3187 $r->{channel} = dec_U16 q||;
3188 $r->{player} = dec_U8 q||;
3189 $r->{TRAILING_DATA} = $data if length $data;
3190 $r;
3191 };
3192 $enc_server{out_of_time} = sub {
3193 $data = "";
3194 enc_U16 0x440c;
3195
3196 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3197 enc_U8 defined $_[0]{player} ? $_[0]{player} : (q||);
3198 $data;
3199 };
3200
3201 # req_undo
3202 $dec_server{0x440e} = sub {
3203 $data = $_[0];
3204 my $r = { DATA => $data };
3205 $r->{type} = "req_undo";
3206
3207 $r->{channel} = dec_U16 q||;
3208 $r->{TRAILING_DATA} = $data if length $data;
3209 $r;
3210 };
3211 $enc_server{req_undo} = sub {
3212 $data = "";
3213 enc_U16 0x440e;
3214
3215 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3216 $data;
3217 };
3218
3219 # resign_game
3220 $dec_server{0x4410} = sub {
3221 $data = $_[0];
3222 my $r = { DATA => $data };
3223 $r->{type} = "resign_game";
3224
3225 $r->{channel} = dec_U16 q||;
3226 $r->{player} = dec_U8 q||;
3227 $r->{TRAILING_DATA} = $data if length $data;
3228 $r;
3229 };
3230 $enc_server{resign_game} = sub {
3231 $data = "";
3232 enc_U16 0x4410;
3233
3234 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3235 enc_U8 defined $_[0]{player} ? $_[0]{player} : (q||);
3236 $data;
3237 };
3238
3239 # game_error
3240 $dec_server{0x4415} = sub {
3241 $data = $_[0];
3242 my $r = { DATA => $data };
3243 $r->{type} = "game_error";
3244
3245 $r->{channel} = dec_U16 q||;
3246 $r->{message} = dec_CONSTANT q|Sorry, this is a lecture game. Only authorized players are allowed to make comments.|;
3247 $r->{TRAILING_DATA} = $data if length $data;
3248 $r;
3249 };
3250 $enc_server{game_error} = sub {
3251 $data = "";
3252 enc_U16 0x4415;
3253
3254 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3255 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, this is a lecture game. Only authorized players are allowed to make comments.|);
3256 $data;
3257 };
3258
3259 # set_teacher
3260 $dec_server{0x441a} = sub {
3261 $data = $_[0];
3262 my $r = { DATA => $data };
3263 $r->{type} = "set_teacher";
3264
3265 $r->{channel} = dec_U16 q||;
3266 $r->{name} = dec_username q||;
3267 $r->{TRAILING_DATA} = $data if length $data;
3268 $r;
3269 };
3270 $enc_server{set_teacher} = sub {
3271 $data = "";
3272 enc_U16 0x441a;
3273
3274 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3275 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
3276 $data;
3277 };
3278
3279 # owner_left
3280 $dec_server{0x441d} = sub {
3281 $data = $_[0];
3282 my $r = { DATA => $data };
3283 $r->{type} = "owner_left";
3284
3285 $r->{channel} = dec_U16 q||;
3286 $r->{message} = dec_CONSTANT q|Sorry, the owner of this game has left. Nobody will be allowed to edit it until the owner returns.|;
3287 $r->{TRAILING_DATA} = $data if length $data;
3288 $r;
3289 };
3290 $enc_server{owner_left} = sub {
3291 $data = "";
3292 enc_U16 0x441d;
3293
3294 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3295 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, the owner of this game has left. Nobody will be allowed to edit it until the owner returns.|);
3296 $data;
3297 };
3298
3299 # teacher_left
3300 $dec_server{0x441e} = sub {
3301 $data = $_[0];
3302 my $r = { DATA => $data };
3303 $r->{type} = "teacher_left";
3304
3305 $r->{channel} = dec_U16 q||;
3306 $r->{TRAILING_DATA} = $data if length $data;
3307 $r;
3308 };
3309 $enc_server{teacher_left} = sub {
3310 $data = "";
3311 enc_U16 0x441e;
3312
3313 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3314 $data;
3315 };
3316
3317 # allow_user_result
3318 $dec_server{0x4422} = sub {
3319 $data = $_[0];
3320 my $r = { DATA => $data };
3321 $r->{type} = "allow_user_result";
3322
3323 $r->{message} = dec_CONSTANT q|User "%s" will now be allowed full access to your game.|;
3324 $r->{channel} = dec_U16 q||;
3325 $r->{TRAILING_DATA} = $data if length $data;
3326 $r;
3327 };
3328 $enc_server{allow_user_result} = sub {
3329 $data = "";
3330 enc_U16 0x4422;
3331
3332 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|User "%s" will now be allowed full access to your game.|);
3333 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3334 $data;
3335 };
3336
3337 # allow_user_result
3338 $dec_server{0x4424} = sub {
3339 $data = $_[0];
3340 my $r = { DATA => $data };
3341 $r->{type} = "allow_user_result";
3342
3343 $r->{message} = dec_CONSTANT q|Sorry, user "%s" is a guest and cannot be allowed full access to your game.|;
3344 $r->{channel} = dec_U16 q||;
3345 $r->{TRAILING_DATA} = $data if length $data;
3346 $r;
3347 };
3348 $enc_server{allow_user_result} = sub {
3349 $data = "";
3350 enc_U16 0x4424;
3351
3352 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, user "%s" is a guest and cannot be allowed full access to your game.|);
3353 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3354 $data;
3355 };
3356
3357 # allow_user_result
3358 $dec_server{0x4425} = sub {
3359 $data = $_[0];
3360 my $r = { DATA => $data };
3361 $r->{type} = "allow_user_result";
3362
3363 $r->{message} = dec_CONSTANT q|Sorry, user "%s" does not seem to exist and cannot be allowed into your game.|;
3364 $r->{channel} = dec_U16 q||;
3365 $r->{TRAILING_DATA} = $data if length $data;
3366 $r;
3367 };
3368 $enc_server{allow_user_result} = sub {
3369 $data = "";
3370 enc_U16 0x4425;
3371
3372 enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, user "%s" does not seem to exist and cannot be allowed into your game.|);
3373 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3374 $data;
3375 };
3376
3377 # add_tree
3378 $dec_server{0x4428} = sub {
3379 $data = $_[0];
3380 my $r = { DATA => $data };
3381 $r->{type} = "add_tree";
3382
3383 $r->{channel} = dec_U16 q||;
3384 $r->{tree} = dec_TREE q||;
3385 $r->{TRAILING_DATA} = $data if length $data;
3386 $r;
3387 };
3388 $enc_server{add_tree} = sub {
3389 $data = "";
3390 enc_U16 0x4428;
3391
3392 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3393 enc_TREE defined $_[0]{tree} ? $_[0]{tree} : (q||);
3394 $data;
3395 };
3396
3397 # reject_challenge
3398 $dec_server{0x4429} = sub {
3399 $data = $_[0];
3400 my $r = { DATA => $data };
3401 $r->{type} = "reject_challenge";
3402
3403 $r->{channel} = dec_U16 q||;
3404 $r->{name} = dec_username q||;
3405 $r->{gametype} = dec_U8 q||;
3406 $r->{cid} = dec_CLIENTID8 q||;
3407 $r->{rules} = dec_rules q||;
3408 $r->{TRAILING_DATA} = $data if length $data;
3409 $r;
3410 };
3411 $enc_server{reject_challenge} = sub {
3412 $data = "";
3413 enc_U16 0x4429;
3414
3415 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3416 enc_username defined $_[0]{name} ? $_[0]{name} : (q||);
3417 enc_U8 defined $_[0]{gametype} ? $_[0]{gametype} : (q||);
3418 enc_CLIENTID8 defined $_[0]{cid} ? $_[0]{cid} : (q||);
3419 enc_rules defined $_[0]{rules} ? $_[0]{rules} : (q||);
3420 $data;
3421 };
3422
3423 # set_comments
3424 $dec_server{0x442b} = sub {
3425 $data = $_[0];
3426 my $r = { DATA => $data };
3427 $r->{type} = "set_comments";
3428
3429 $r->{channel} = dec_U16 q||;
3430 $r->{node} = dec_U32 q||;
3431 $r->{comments} = dec_STRING q||;
3432 $r->{TRAILING_DATA} = $data if length $data;
3433 $r;
3434 };
3435 $enc_server{set_comments} = sub {
3436 $data = "";
3437 enc_U16 0x442b;
3438
3439 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3440 enc_U32 defined $_[0]{node} ? $_[0]{node} : (q||);
3441 enc_STRING defined $_[0]{comments} ? $_[0]{comments} : (q||);
3442 $data;
3443 };
3444
3445 # add_comments
3446 $dec_server{0x442c} = sub {
3447 $data = $_[0];
3448 my $r = { DATA => $data };
3449 $r->{type} = "add_comments";
3450
3451 $r->{channel} = dec_U16 q||;
3452 $r->{node} = dec_U32 q||;
3453 $r->{comments} = dec_STRING q||;
3454 $r->{TRAILING_DATA} = $data if length $data;
3455 $r;
3456 };
3457 $enc_server{add_comments} = sub {
3458 $data = "";
3459 enc_U16 0x442c;
3460
3461 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3462 enc_U32 defined $_[0]{node} ? $_[0]{node} : (q||);
3463 enc_STRING defined $_[0]{comments} ? $_[0]{comments} : (q||);
3464 $data;
3465 };
3466
3467 # more_comments
3468 $dec_server{0x442d} = sub {
3469 $data = $_[0];
3470 my $r = { DATA => $data };
3471 $r->{type} = "more_comments";
3472
3473 $r->{channel} = dec_U16 q||;
3474 $r->{node} = dec_U32 q||;
3475 $r->{TRAILING_DATA} = $data if length $data;
3476 $r;
3477 };
3478 $enc_server{more_comments} = sub {
3479 $data = "";
3480 enc_U16 0x442d;
3481
3482 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3483 enc_U32 defined $_[0]{node} ? $_[0]{node} : (q||);
3484 $data;
3485 };
3486
3487 # new_game
3488 $dec_server{0x442f} = sub {
3489 $data = $_[0];
3490 my $r = { DATA => $data };
3491 $r->{type} = "new_game";
3492
3493 $r->{channel} = dec_U16 q||;
3494 $r->{cid} = dec_CLIENTID16 q||;
3495 $r->{TRAILING_DATA} = $data if length $data;
3496 $r;
3497 };
3498 $enc_server{new_game} = sub {
3499 $data = "";
3500 enc_U16 0x442f;
3501
3502 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3503 enc_CLIENTID16 defined $_[0]{cid} ? $_[0]{cid} : (q||);
3504 $data;
3505 };
3506
3507 # req_result
3508 $dec_server{0x4433} = sub {
3509 $data = $_[0];
3510 my $r = { DATA => $data };
3511 $r->{type} = "req_result";
3512
3513 $r->{channel} = dec_U16 q||;
3514 $r->{TRAILING_DATA} = $data if length $data;
3515 $r;
3516 };
3517 $enc_server{req_result} = sub {
3518 $data = "";
3519 enc_U16 0x4433;
3520
3521 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3522 $data;
3523 };
3524
3525 # set_quiet
3526 $dec_server{0x4434} = sub {
3527 $data = $_[0];
3528 my $r = { DATA => $data };
3529 $r->{type} = "set_quiet";
3530
3531 $r->{channel} = dec_U16 q||;
3532 $r->{quiet} = dec_flag q||;
3533 $r->{TRAILING_DATA} = $data if length $data;
3534 $r;
3535 };
3536 $enc_server{set_quiet} = sub {
3537 $data = "";
3538 enc_U16 0x4434;
3539
3540 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3541 enc_flag defined $_[0]{quiet} ? $_[0]{quiet} : (q||);
3542 $data;
3543 };
3544
3545 # set_gametime
3546 $dec_server{0x4437} = sub {
3547 $data = $_[0];
3548 my $r = { DATA => $data };
3549 $r->{type} = "set_gametime";
3550
3551 $r->{channel} = dec_U16 q||;
3552 $r->{black_time} = dec_time q||;
3553 $r->{black_moves} = dec_U16 q||;
3554 $r->{white_time} = dec_time q||;
3555 $r->{white_moves} = dec_U16 q||;
3556 $r->{TRAILING_DATA} = $data if length $data;
3557 $r;
3558 };
3559 $enc_server{set_gametime} = sub {
3560 $data = "";
3561 enc_U16 0x4437;
3562
3563 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3564 enc_time defined $_[0]{black_time} ? $_[0]{black_time} : (q||);
3565 enc_U16 defined $_[0]{black_moves} ? $_[0]{black_moves} : (q||);
3566 enc_time defined $_[0]{white_time} ? $_[0]{white_time} : (q||);
3567 enc_U16 defined $_[0]{white_moves} ? $_[0]{white_moves} : (q||);
3568 $data;
3569 };
3570
3571 # del_global_challenge
3572 $dec_server{0x443b} = sub {
3573 $data = $_[0];
3574 my $r = { DATA => $data };
3575 $r->{type} = "del_global_challenge";
3576
3577 $r->{channel} = dec_U16 q||;
3578 $r->{game} = dec_U16 q||;
3579 $r->{TRAILING_DATA} = $data if length $data;
3580 $r;
3581 };
3582 $enc_server{del_global_challenge} = sub {
3583 $data = "";
3584 enc_U16 0x443b;
3585
3586 enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||);
3587 enc_U16 defined $_[0]{game} ? $_[0]{game} : (q||);
3588 $data;
3589 };
3590
3591 }
3592
3593 1;