# This is an automatically generated file. # This is an automatically generated file. # This is an automatically generated file. # This is an automatically generated file. # This is an automatically generated file. # See doc/protocol.xml and doc/doc2messages_pm.xsl (and doc/Makefile) package KGS::Messages; use strict; our %type; our %dec_client; # decode messages send to server our %enc_client; # encode messages send to server our %dec_server; # decode messages received from server our %enc_server; # encode messages received from server { use Gtk2::GoBoard::Constants; # for MARK_xyz use Math::BigInt (); my $data; # stores currently processed decoding/encoding packet sub _set_data($) { $data = shift } # for debugging or special apps only sub _get_data() { $data } # for debugging or special apps only # primitive enc/decoders ############################################################################# sub dec_U8 { (my ($r), $data) = unpack "C a*", $data; $r; } sub dec_U16 { (my ($r), $data) = unpack "v a*", $data; $r; } sub dec_U32 { (my ($r), $data) = unpack "V a*", $data; $r; } sub dec_U64 { # do NOT use Math::BigInt here. my ($lo, $hi) = (dec_U32, dec_U32); $hi * 2**32 + $lo; } sub dec_I8 { (my ($r), $data) = unpack "c a*", $data; $r; } sub dec_I16 { (my ($r), $data) = unpack "v a*", $data; unpack "s", pack "S", $r; } sub dec_I32 { (my ($r), $data) = unpack "V a*", $data; unpack "i", pack "I", $r; } sub dec_DATA { (my ($r), $data) = ($data, ""); $r; } sub dec_ZSTRING { $data =~ s/^((?:..)*?)(?:\x00\x00|\Z)//s; # use Encode... join "", map chr, unpack "v*", $1; } BEGIN { *dec_STRING = \&dec_ZSTRING }; sub dec_CONSTANT { $_[0]; } sub dec_password { dec_U64; } sub dec_HEX { # for debugging "HEX: " . unpack "H*", $data;#d# } ############################################################################# sub enc_U8 { $data .= pack "C", $_[0]; } sub enc_U16 { $data .= pack "v", $_[0]; } sub enc_U32 { $data .= pack "V", $_[0]; } sub enc_U64 { my $i = new Math::BigInt $_[0]; enc_U32 $i & 0xffffffff; enc_U32 $i >> 32; } sub enc_I8 { $data .= pack "c", $_[0]; } sub enc_I16 { enc_U16 unpack "S", pack "s", $_[0]; } sub enc_I32 { enc_U32 unpack "I", pack "i", $_[0]; } sub enc_DATA { # a dream! $data .= $_[0]; } sub enc_ZSTRING { # should use encode for speed and clarity ;) $data .= pack "v*", (map ord, split //, $_[0]), 0; } sub enc_STRING { # should use encode for speed and clarity ;) $data .= pack "v*", map ord, split //, $_[0]; } sub enc_CONSTANT { # nop } sub enc_password { # $hash must be 64 bit my $hash = new Math::BigInt; $hash = $hash * 1055 + ord for split //, $_[0]; enc_U64 $hash & new Math::BigInt "0xffffffffffffffff"; } sub enc_HEX { die "enc_HEX not defined for good"; } ############################################################################# # types sub dec_username { (my ($r), $data) = unpack "Z10 a*", $data; $r; } sub enc_username { $data .= pack "a10", $_[0]; } sub dec_roomname { my $res = ""; my @r = unpack "v25 a*", $data; $data = pop @r; for (@r) { last unless $_; $res .= chr $_; } # dump extra data to file for later analysis #my $x = pack "v*", @r; $x =~ s/^(..)*?\x00\x00//s; open DUMP, ">>/root/kgs-dump"; print DUMP $x; close DUMP;#d# $res; } sub enc_roomname { $data .= pack "v25", map ord, split //, $_[0]; } sub dec_realname { my $res = ""; my @r = unpack "v50 a*", $data; $data = pop @r; for (@r) { last unless $_; $res .= chr $_; } # dump extra data to file for later analysis #my $x = pack "v*", @r; $x =~ s/^(..)*?\x00\x00//s; open DUMP, ">>/root/kgs-dump"; print DUMP $x; close DUMP;#d# $res; } sub enc_realname { $data .= pack "v50", map ord, split //, $_[0]; } sub dec_email { my $res = ""; my @r = unpack "v70 a*", $data; $data = pop @r; for (@r) { last unless $_; $res .= chr $_; } # dump extra data to file for later analysis #my $x = pack "v*", @r; $x =~ s/^(..)*?\x00\x00//s; open DUMP, ">>/root/kgs-dump"; print DUMP $x; close DUMP;#d# $res; } sub enc_email { $data .= pack "v70", map ord, split //, $_[0]; } sub dec_userinfo { my $res = ""; my @r = unpack "v1000 a*", $data; $data = pop @r; for (@r) { last unless $_; $res .= chr $_; } # dump extra data to file for later analysis #my $x = pack "v*", @r; $x =~ s/^(..)*?\x00\x00//s; open DUMP, ">>/root/kgs-dump"; print DUMP $x; close DUMP;#d# $res; } sub enc_userinfo { $data .= pack "v1000", map ord, split //, $_[0]; } sub dec_url { (my ($r), $data) = unpack "Z100 a*", $data; $r; } sub enc_url { $data .= pack "a100", $_[0]; } sub dec_locale { (my ($r), $data) = unpack "Z5 a*", $data; $r; } sub enc_locale { $data .= pack "a5", $_[0]; } sub dec_flag { (1 / 1) * dec_U8; } sub enc_flag { enc_U8 $_[0] * 1; } sub dec_komi16_2 { (1 / 2) * dec_I16; } sub enc_komi16_2 { enc_I16 $_[0] * 2; } sub dec_komi16_4 { (1 / 4) * dec_I16; } sub enc_komi16_4 { enc_I16 $_[0] * 4; } sub dec_komi32_2 { (1 / 2) * dec_I32; } sub enc_komi32_2 { enc_I32 $_[0] * 2; } sub dec_komi32_4 { (1 / 4) * dec_I32; } sub enc_komi32_4 { enc_I32 $_[0] * 4; } sub dec_result { (1 / 2) * dec_I32; } sub enc_result { enc_I32 $_[0] * 2; } sub dec_score16_2 { (1 / 2) * dec_I16; } sub enc_score16_2 { enc_I16 $_[0] * 2; } sub dec_score16_4 { (1 / 4) * dec_I16; } sub enc_score16_4 { enc_I16 $_[0] * 4; } sub dec_score32_4 { (1 / 4) * dec_I32; } sub enc_score32_4 { enc_I32 $_[0] * 4; } sub dec_score32_1000 { (1 / 1000) * dec_I32; } sub enc_score32_1000 { enc_I32 $_[0] * 1000; } sub dec_time { (1 / 1000) * dec_U32; } sub enc_time { enc_U32 $_[0] * 1000; } sub dec_timestamp { (1 / 1000) * dec_U64; } sub enc_timestamp { enc_U64 $_[0] * 1000; } sub dec_CLIENTID16 { (1 / 1) * dec_U16; } sub enc_CLIENTID16 { enc_U16 $_[0] * 1; } sub dec_CLIENTID8 { (1 / 1) * dec_U8; } sub enc_CLIENTID8 { enc_U8 $_[0] * 1; } ############################################################################# # structures sub dec_message_header { my $r = {}; $r->{length} = dec_U16 q||; $r->{type} = dec_U16 q||; $r; } sub enc_message_header { enc_U16 defined $_[0]{length} ? $_[0]{length} : (q||); enc_U16 defined $_[0]{type} ? $_[0]{type} : (q||); } sub dec_user { my $r = {}; $r->{name} = dec_username q||; $r->{flags} = dec_U32 q|1|; bless $r, KGS::User::; $r; } sub enc_user { enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_U32 defined $_[0]{flags} ? $_[0]{flags} : (q|1|); } sub dec_rules { my $r = {}; $r->{ruleset} = dec_U8 q||; $r->{size} = dec_U8 q||; $r->{handicap} = dec_U8 q||; $r->{komi} = dec_komi16_2 q||; $r->{timesys} = dec_U8 q||; $r->{time} = dec_U32 q||; $r->{interval} = dec_U32 q||; $r->{count} = dec_U16 q||; bless $r, KGS::Rules::; $r; } sub enc_rules { enc_U8 defined $_[0]{ruleset} ? $_[0]{ruleset} : (q||); enc_U8 defined $_[0]{size} ? $_[0]{size} : (q||); enc_U8 defined $_[0]{handicap} ? $_[0]{handicap} : (q||); enc_komi16_2 defined $_[0]{komi} ? $_[0]{komi} : (q||); enc_U8 defined $_[0]{timesys} ? $_[0]{timesys} : (q||); enc_U32 defined $_[0]{time} ? $_[0]{time} : (q||); enc_U32 defined $_[0]{interval} ? $_[0]{interval} : (q||); enc_U16 defined $_[0]{count} ? $_[0]{count} : (q||); } sub dec_challenge_defaults { my $r = {}; $r->{gametype} = dec_U8 q||; $r->{ruleset} = dec_U8 q||; $r->{size} = dec_U32 q||; $r->{timesys} = dec_U32 q||; $r->{time} = dec_U32 q||; $r->{byo_time} = dec_U32 q||; $r->{byo_periods} = dec_U32 q||; $r->{can_time} = dec_U32 q||; $r->{can_stones} = dec_U32 q||; $r->{notes} = dec_STRING q||; $r; } sub enc_challenge_defaults { enc_U8 defined $_[0]{gametype} ? $_[0]{gametype} : (q||); enc_U8 defined $_[0]{ruleset} ? $_[0]{ruleset} : (q||); enc_U32 defined $_[0]{size} ? $_[0]{size} : (q||); enc_U32 defined $_[0]{timesys} ? $_[0]{timesys} : (q||); enc_U32 defined $_[0]{time} ? $_[0]{time} : (q||); enc_U32 defined $_[0]{byo_time} ? $_[0]{byo_time} : (q||); enc_U32 defined $_[0]{byo_periods} ? $_[0]{byo_periods} : (q||); enc_U32 defined $_[0]{can_time} ? $_[0]{can_time} : (q||); enc_U32 defined $_[0]{can_stones} ? $_[0]{can_stones} : (q||); enc_STRING defined $_[0]{notes} ? $_[0]{notes} : (q||); } sub dec_game { my $r = {}; $r->{channel} = dec_U16 q||; $r->{type} = dec_U8 q||; $r->{black} = dec_user q||; $r->{white} = dec_user q||; $r->{owner} = dec_user q||; $r->{size} = dec_U8 q||; $r->{handicap} = dec_I8 q||; $r->{komi} = dec_komi16_2 q||; $r->{moves} = dec_I16 q||; $r->{flags} = dec_U16 q||; $r->{observers} = dec_U32 q||; $r->{saved} = dec_flag q||; $r->{notes} = dec_ZSTRING q|| if ($r->{handicap} < 0); bless $r, KGS::Game::; $r; } sub enc_game { enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U8 defined $_[0]{type} ? $_[0]{type} : (q||); enc_user defined $_[0]{black} ? $_[0]{black} : (q||); enc_user defined $_[0]{white} ? $_[0]{white} : (q||); enc_user defined $_[0]{owner} ? $_[0]{owner} : (q||); enc_U8 defined $_[0]{size} ? $_[0]{size} : (q||); enc_I8 defined $_[0]{handicap} ? $_[0]{handicap} : (q||); enc_komi16_2 defined $_[0]{komi} ? $_[0]{komi} : (q||); enc_I16 defined $_[0]{moves} ? $_[0]{moves} : (q||); enc_U16 defined $_[0]{flags} ? $_[0]{flags} : (q||); enc_U32 defined $_[0]{observers} ? $_[0]{observers} : (q||); enc_flag defined $_[0]{saved} ? $_[0]{saved} : (q||); enc_ZSTRING defined $_[0]{notes} ? $_[0]{notes} : (q||); } sub dec_room_game { my $r = {}; $r->{channel} = dec_U16 q||; $r->{game} = dec_game q||; $r; } sub enc_room_game { enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_game defined $_[0]{game} ? $_[0]{game} : (q||); } sub dec_room_obs { my $r = {}; $r->{name} = dec_roomname q||; $r->{channel} = dec_U16 q||; $r->{flags} = dec_U32 q||; $r->{users} = dec_U32 q||; $r; } sub enc_room_obs { enc_roomname defined $_[0]{name} ? $_[0]{name} : (q||); enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U32 defined $_[0]{flags} ? $_[0]{flags} : (q||); enc_U32 defined $_[0]{users} ? $_[0]{users} : (q||); } sub dec_room { my $r = {}; $r->{channel} = dec_U16 q||; $r->{flags} = dec_U8 q||; $r->{group} = dec_U8 q||; $r->{users} = dec_U16 q||; $r->{games} = dec_U16 q||; $r->{name} = dec_STRING q||; bless $r, KGS::Room::; $r; } sub enc_room { enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U8 defined $_[0]{flags} ? $_[0]{flags} : (q||); enc_U8 defined $_[0]{group} ? $_[0]{group} : (q||); enc_U16 defined $_[0]{users} ? $_[0]{users} : (q||); enc_U16 defined $_[0]{games} ? $_[0]{games} : (q||); enc_STRING defined $_[0]{name} ? $_[0]{name} : (q||); } sub dec_scorevalues { my $r = {}; $r->{score} = dec_score32_4 q||; $r->{territory} = dec_U32 q||; $r->{captures} = dec_U32 q||; $r->{i3} = dec_U32 q||; $r->{f2} = dec_U32 q||; $r->{komi} = dec_komi32_4 q||; $r->{i4} = dec_U32 q||; bless $r, KGS::Score::; $r; } sub enc_scorevalues { enc_score32_4 defined $_[0]{score} ? $_[0]{score} : (q||); enc_U32 defined $_[0]{territory} ? $_[0]{territory} : (q||); enc_U32 defined $_[0]{captures} ? $_[0]{captures} : (q||); enc_U32 defined $_[0]{i3} ? $_[0]{i3} : (q||); enc_U32 defined $_[0]{f2} ? $_[0]{f2} : (q||); enc_komi32_4 defined $_[0]{komi} ? $_[0]{komi} : (q||); enc_U32 defined $_[0]{i4} ? $_[0]{i4} : (q||); } sub dec_game_record { my $r = {}; $r->{timestamp} = dec_timestamp q||; $r->{type} = dec_U8 q||; $r->{handicap} = dec_U8 q||; $r->{revision} = dec_U16 q||; $r->{black} = dec_user q||; $r->{white} = dec_user q||; $r->{owner} = dec_user q||; $r->{komi} = dec_U16 q||; $r->{score} = dec_score16_2 q||; $r->{size} = dec_U8 q||; $r->{flags} = dec_U8 q||; bless $r, KGS::GameRecord::; $r; } sub enc_game_record { enc_timestamp defined $_[0]{timestamp} ? $_[0]{timestamp} : (q||); enc_U8 defined $_[0]{type} ? $_[0]{type} : (q||); enc_U8 defined $_[0]{handicap} ? $_[0]{handicap} : (q||); enc_U16 defined $_[0]{revision} ? $_[0]{revision} : (q||); enc_user defined $_[0]{black} ? $_[0]{black} : (q||); enc_user defined $_[0]{white} ? $_[0]{white} : (q||); enc_user defined $_[0]{owner} ? $_[0]{owner} : (q||); enc_U16 defined $_[0]{komi} ? $_[0]{komi} : (q||); enc_score16_2 defined $_[0]{score} ? $_[0]{score} : (q||); enc_U8 defined $_[0]{size} ? $_[0]{size} : (q||); enc_U8 defined $_[0]{flags} ? $_[0]{flags} : (q||); } ############################################################################# # "less" primitive types # this was the most horrible thing to decode. still not everything is decoded correctly(?) sub dec_TREE { my @r; my $old_data = $data;#d# while (length $data) { my $type = dec_U8; my $add = $type < 128; my $ofs = (length $old_data) - (length $data);#d# $type &= 127; if ($type == 127) { dec_U8; # unused?? *sigh* push @r, [add_node => dec_I32]; } elsif ($type == 126) { push @r, [set_node => dec_I32]; } elsif ($type == 125) { push @r, [set_current => dec_I32]; } elsif ($type == 34) { push @r, [score => dec_U8, dec_score32_1000]; } elsif ($type == 29) { push @r, [type_29 => dec_ZSTRING]; warn "UNKNOWN TREE TYPE 29 $r[-1][1]\007 PLEASE REPORT";#d# die; } elsif ($type == 28) { # move number, only in variations it seems. oh my. push @r, [movenum => dec_ZSTRING]; } elsif ($type == 26) { push @r, [type_26 => dec_U8]; # sets a flag (?) warn "unknown tree node 26, please ignore\n"; # possibly marks moves done while editing, as opposed to game-moves(?) } elsif ($type == 25) { push @r, [result => dec_result]; } elsif ($type == 23) { push @r, [mark => $add, MARK_GRAYED, dec_U8, dec_U8]; } elsif ($type == 22) { push @r, [mark => $add, dec_U8() ? MARK_SMALL_W : MARK_SMALL_B, dec_U8, dec_U8]; } elsif ($type == 21) { push @r, [mark => $add, MARK_SQUARE, dec_U8, dec_U8]; } elsif ($type == 20) { push @r, [mark => $add, MARK_TRIANGLE, dec_U8, dec_U8]; } elsif ($type == 19) { push @r, [mark => $add, MARK_LABEL, dec_U8, dec_U8, dec_ZSTRING]; #push @r, [unknown_18 => dec_U8, dec_U32, dec_U32, dec_U8, dec_U32, dec_U32, dec_U32]; #push @r, [set_timer => (dec_U8, dec_U32, dec_time)[0,2,1]]; } elsif ($type == 18) { push @r, [set_timer => (dec_U8, dec_U32, dec_time)[0,2,1]]; } elsif ($type == 17) { push @r, [set_stone => dec_U8, dec_U8, dec_U8];#d#? # } elsif ($type == 16) { # push @r, [set_stone => dec_U8, dec_U8, dec_U8];#o# } elsif ($type == 15) { push @r, [mark => $add, MARK_CIRCLE, dec_U8, dec_U8];#d#? } elsif ($type == 14) { push @r, [move => dec_U8, dec_U8, dec_U8]; } elsif (($type >= 4 && $type <= 9) || ($type >= 11 && $type <= 13) || $type == 24) { push @r, [({ 4 => "date", 5 => "unknown_comment5", 6 => "game_id", #?# 7 => "unknown_comment7", 8 => "unknown_comment8", 9 => "copyright", #? 11 => "unknown_comment11", 12 => "unknown_comment12", 13 => "unknown_comment13", 24 => "comment", })->{$type} => dec_ZSTRING]; } elsif ($type == 3) { push @r, [rank => dec_U8, dec_U32]; } elsif ($type == 2) { push @r, [player => dec_U8, dec_ZSTRING]; } elsif ($type == 1) { push @r, [sgf_name => dec_ZSTRING]; } elsif ($type == 0) { # as usual, wms finds yet another way to duplicate code... oh well, what a mess. # (no wonder he is so keen on keeping it a secret...) push @r, [rules => dec_rules]; # OLD } else { require KGS::Listener::Debug; # hack print STDERR KGS::Listener::Debug::dumpval(\@r); printf "offset: 0x%04x\n", $ofs; open XTYPE, "|xtype"; print XTYPE $old_data; close XTYPE; warn "unknown tree type $type, PLEASE REPORT and include the game you wanted to watch. thx."; } #push @{$r[-1]}, offset => sprintf "0x%x", $ofs;#d# } # print STDERR KGS::Listener::Debug::dumpval(\@r);#d# # return [];#d# \@r; } sub enc_TREE { for (@{$_[0]}) { my ($type, @arg) = @$_; if ($type eq "add_node") { enc_U8 127; enc_U8 0; # unused? enc_I32 $arg[0]; } elsif ($type eq "set_node") { enc_U8 126; enc_I32 $arg[0]; } elsif ($type eq "set_current") { enc_U8 125; enc_I32 $arg[0]; } elsif ($type eq "movenum") { enc_U8 28; enc_ZSTRING $arg[0]; } elsif ($type eq "set_stone") { enc_U8 16; enc_U8 $arg[0]; enc_U8 $arg[1]; enc_U8 $arg[2]; } elsif ($type eq "move") { enc_U8 14; enc_U8 $arg[0]; enc_U8 $arg[1]; enc_U8 $arg[2]; } elsif ($type eq "comment") { enc_U8 24; enc_ZSTRING $arg[0]; } elsif ($type eq "mark") { my $op = ({ &MARK_GRAYED => 23, &MARK_SMALL_B => 22, &MARK_SMALL_W => 22, &MARK_SQUARE => 21, &MARK_TRIANGLE => 20, &MARK_LABEL => 19, &MARK_CIRCLE => 15, })->{$arg[1]}; enc_U8 $op + ($arg[0] ? 0 : 128); enc_U8 $arg[1] == MARK_SMALL_W if $op == 22; enc_U8 $arg[2]; enc_U8 $arg[3]; enc_ZSTRING $arg[4] if $op == 18; # unknown types } elsif ($type eq "type_29") { enc_U8 29; enc_ZSTRING $arg[0]; } elsif ($type eq "type_26") { enc_U8 26; enc_U8 $arg[0]; } else { warn "unable to encode tree node type $type\n"; } } }; ############################################################################# # messages # login $dec_client{0x0000} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "login"; $r->{ver_major} = dec_U32 q|2|; $r->{ver_minor} = dec_U32 q|6|; $r->{ver_micro} = dec_U32 q|1|; $r->{name} = dec_username q||; $r->{password} = dec_password q|0|; $r->{guest} = dec_flag q|1|; $r->{_unknown3} = dec_U16 q|0|; $r->{locale} = dec_locale q|"en_US"|; $r->{clientver} = dec_DATA q|"1.4.2_03:Swing app:Sun Microsystems Inc."|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{login} = sub { $data = ""; enc_U16 0x0000; enc_U32 defined $_[0]{ver_major} ? $_[0]{ver_major} : (q|2|); enc_U32 defined $_[0]{ver_minor} ? $_[0]{ver_minor} : (q|6|); enc_U32 defined $_[0]{ver_micro} ? $_[0]{ver_micro} : (q|1|); enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_password defined $_[0]{password} ? $_[0]{password} : (q|0|); enc_flag defined $_[0]{guest} ? $_[0]{guest} : (q|1|); enc_U16 defined $_[0]{_unknown3} ? $_[0]{_unknown3} : (q|0|); enc_locale defined $_[0]{locale} ? $_[0]{locale} : (q|"en_US"|); enc_DATA defined $_[0]{clientver} ? $_[0]{clientver} : (q|"1.4.2_03:Swing app:Sun Microsystems Inc."|); $data; }; # req_userinfo $dec_client{0x0007} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "req_userinfo"; $r->{name} = dec_username q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{req_userinfo} = sub { $data = ""; enc_U16 0x0007; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); $data; }; # update_userinfo $dec_client{0x0007} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "update_userinfo"; $r->{setpass} = dec_flag q||; $r->{password} = dec_password q|0|; $r->{realname} = dec_realname q||; $r->{email} = dec_email q||; $r->{info} = dec_userinfo q||; $r->{homepage} = dec_url q||; $r->{_unused} = dec_U64 q|0|; $r->{_unused} = dec_U64 q|0|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{update_userinfo} = sub { $data = ""; enc_U16 0x0007; enc_flag defined $_[0]{setpass} ? $_[0]{setpass} : (q||); enc_password defined $_[0]{password} ? $_[0]{password} : (q|0|); enc_realname defined $_[0]{realname} ? $_[0]{realname} : (q||); enc_email defined $_[0]{email} ? $_[0]{email} : (q||); enc_userinfo defined $_[0]{info} ? $_[0]{info} : (q||); enc_url defined $_[0]{homepage} ? $_[0]{homepage} : (q||); enc_U64 defined $_[0]{_unused} ? $_[0]{_unused} : (q|0|); enc_U64 defined $_[0]{_unused} ? $_[0]{_unused} : (q|0|); $data; }; # msg_chat $dec_client{0x0013} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "msg_chat"; $r->{name} = dec_username q||; $r->{name2} = dec_username q||; $r->{message} = dec_STRING q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{msg_chat} = sub { $data = ""; enc_U16 0x0013; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_username defined $_[0]{name2} ? $_[0]{name2} : (q||); enc_STRING defined $_[0]{message} ? $_[0]{message} : (q||); $data; }; # req_stats $dec_client{0x0014} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "req_stats"; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{req_stats} = sub { $data = ""; enc_U16 0x0014; $data; }; # idle_reset $dec_client{0x0016} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "idle_reset"; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{idle_reset} = sub { $data = ""; enc_U16 0x0016; $data; }; # ping $dec_client{0x001d} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "ping"; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{ping} = sub { $data = ""; enc_U16 0x001d; $data; }; # req_usergraph $dec_client{0x001e} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "req_usergraph"; $r->{name} = dec_username q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{req_usergraph} = sub { $data = ""; enc_U16 0x001e; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); $data; }; # req_pic $dec_client{0x0021} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "req_pic"; $r->{name} = dec_username q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{req_pic} = sub { $data = ""; enc_U16 0x0021; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); $data; }; # upload_pic $dec_client{0x0021} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "upload_pic"; $r->{name} = dec_username q||; $r->{data} = dec_DATA q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{upload_pic} = sub { $data = ""; enc_U16 0x0021; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_DATA defined $_[0]{data} ? $_[0]{data} : (q||); $data; }; # send_memo $dec_client{0x0023} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "send_memo"; $r->{name} = dec_username q||; $r->{cid} = dec_CLIENTID16 q||; $r->{msg} = dec_STRING q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{send_memo} = sub { $data = ""; enc_U16 0x0023; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_CLIENTID16 defined $_[0]{cid} ? $_[0]{cid} : (q||); enc_STRING defined $_[0]{msg} ? $_[0]{msg} : (q||); $data; }; # delete_memos $dec_client{0x0024} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "delete_memos"; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{delete_memos} = sub { $data = ""; enc_U16 0x0024; $data; }; # gnotice $dec_client{0x0100} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "gnotice"; $r->{notice} = dec_STRING q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{gnotice} = sub { $data = ""; enc_U16 0x0100; enc_STRING defined $_[0]{notice} ? $_[0]{notice} : (q||); $data; }; # notify_add $dec_client{0x0200} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "notify_add"; $r->{name} = dec_username q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{notify_add} = sub { $data = ""; enc_U16 0x0200; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); $data; }; # notify_del $dec_client{0x0201} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "notify_del"; $r->{name} = dec_username q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{notify_del} = sub { $data = ""; enc_U16 0x0201; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); $data; }; # list_rooms $dec_client{0x0318} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "list_rooms"; $r->{group} = dec_U8 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{list_rooms} = sub { $data = ""; enc_U16 0x0318; enc_U8 defined $_[0]{group} ? $_[0]{group} : (q||); $data; }; # new_room $dec_client{0x031a} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "new_room"; $r->{name} = dec_username q||; $r->{i1} = dec_U32 q|0|; $r->{b1} = dec_U8 q|0|; $r->{b2} = dec_U8 q|255|; $r->{b3} = dec_U8 q|255|; $r->{group} = dec_U8 q|1|; $r->{name} = dec_ZSTRING q||; $r->{description} = dec_ZSTRING q||; $r->{flags} = dec_U8 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{new_room} = sub { $data = ""; enc_U16 0x031a; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_U32 defined $_[0]{i1} ? $_[0]{i1} : (q|0|); enc_U8 defined $_[0]{b1} ? $_[0]{b1} : (q|0|); enc_U8 defined $_[0]{b2} ? $_[0]{b2} : (q|255|); enc_U8 defined $_[0]{b3} ? $_[0]{b3} : (q|255|); enc_U8 defined $_[0]{group} ? $_[0]{group} : (q|1|); enc_ZSTRING defined $_[0]{name} ? $_[0]{name} : (q||); enc_ZSTRING defined $_[0]{description} ? $_[0]{description} : (q||); enc_U8 defined $_[0]{flags} ? $_[0]{flags} : (q||); $data; }; # req_upd_rooms $dec_client{0x031b} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "req_upd_rooms"; $r->{channel} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{req_upd_rooms} = sub { $data = ""; enc_U16 0x031b; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); $data; }; # req_game_record $dec_client{0x0413} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "req_game_record"; $r->{name} = dec_username q||; $r->{timestamp} = dec_timestamp q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{req_game_record} = sub { $data = ""; enc_U16 0x0413; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_timestamp defined $_[0]{timestamp} ? $_[0]{timestamp} : (q||); $data; }; # join_room $dec_client{0x4300} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "join_room"; $r->{channel} = dec_U16 q||; $r->{user} = dec_user q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{join_room} = sub { $data = ""; enc_U16 0x4300; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_user defined $_[0]{user} ? $_[0]{user} : (q||); $data; }; # msg_room $dec_client{0x4301} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "msg_room"; $r->{channel} = dec_U16 q||; $r->{name} = dec_username q||; $r->{message} = dec_STRING q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{msg_room} = sub { $data = ""; enc_U16 0x4301; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_STRING defined $_[0]{message} ? $_[0]{message} : (q||); $data; }; # part_room $dec_client{0x4302} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "part_room"; $r->{channel} = dec_U16 q||; $r->{name} = dec_username q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{part_room} = sub { $data = ""; enc_U16 0x4302; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_username defined $_[0]{name} ? $_[0]{name} : (q||); $data; }; # new_game $dec_client{0x4305} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "new_game"; $r->{channel} = dec_U16 q||; $r->{cid} = dec_CLIENTID16 q||; $r->{gametype} = dec_U8 q||; $r->{flags} = dec_U8 q||; $r->{rules} = dec_rules q||; $r->{notes} = dec_STRING q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{new_game} = sub { $data = ""; enc_U16 0x4305; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_CLIENTID16 defined $_[0]{cid} ? $_[0]{cid} : (q||); enc_U8 defined $_[0]{gametype} ? $_[0]{gametype} : (q||); enc_U8 defined $_[0]{flags} ? $_[0]{flags} : (q||); enc_rules defined $_[0]{rules} ? $_[0]{rules} : (q||); enc_STRING defined $_[0]{notes} ? $_[0]{notes} : (q||); $data; }; # load_game $dec_client{0x430a} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "load_game"; $r->{channel} = dec_U16 q||; $r->{timestamp} = dec_timestamp q||; $r->{user} = dec_username q||; $r->{flags} = dec_U8 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{load_game} = sub { $data = ""; enc_U16 0x430a; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_timestamp defined $_[0]{timestamp} ? $_[0]{timestamp} : (q||); enc_username defined $_[0]{user} ? $_[0]{user} : (q||); enc_U8 defined $_[0]{flags} ? $_[0]{flags} : (q||); $data; }; # req_games $dec_client{0x430b} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "req_games"; $r->{channel} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{req_games} = sub { $data = ""; enc_U16 0x430b; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); $data; }; # req_desc $dec_client{0x4319} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "req_desc"; $r->{channel} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{req_desc} = sub { $data = ""; enc_U16 0x4319; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); $data; }; # challenge $dec_client{0x4400} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "challenge"; $r->{channel} = dec_U16 q||; $r->{black} = dec_user q||; $r->{white} = dec_user q||; $r->{gametype} = dec_U8 q||; $r->{cid} = dec_CLIENTID8 q||; $r->{rules} = dec_rules q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{challenge} = sub { $data = ""; enc_U16 0x4400; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_user defined $_[0]{black} ? $_[0]{black} : (q||); enc_user defined $_[0]{white} ? $_[0]{white} : (q||); enc_U8 defined $_[0]{gametype} ? $_[0]{gametype} : (q||); enc_CLIENTID8 defined $_[0]{cid} ? $_[0]{cid} : (q||); enc_rules defined $_[0]{rules} ? $_[0]{rules} : (q||); $data; }; # join_game $dec_client{0x4403} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "join_game"; $r->{channel} = dec_U16 q||; $r->{user} = dec_user q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{join_game} = sub { $data = ""; enc_U16 0x4403; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_user defined $_[0]{user} ? $_[0]{user} : (q||); $data; }; # part_game $dec_client{0x4404} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "part_game"; $r->{channel} = dec_U16 q||; $r->{name} = dec_username q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{part_game} = sub { $data = ""; enc_U16 0x4404; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_username defined $_[0]{name} ? $_[0]{name} : (q||); $data; }; # set_tree $dec_client{0x4405} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "set_tree"; $r->{channel} = dec_U16 q||; $r->{tree} = dec_TREE q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{set_tree} = sub { $data = ""; enc_U16 0x4405; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_TREE defined $_[0]{tree} ? $_[0]{tree} : (q||); $data; }; # upd_tree $dec_client{0x4406} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "upd_tree"; $r->{channel} = dec_U16 q||; $r->{tree} = dec_TREE q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{upd_tree} = sub { $data = ""; enc_U16 0x4406; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_TREE defined $_[0]{tree} ? $_[0]{tree} : (q||); $data; }; # mark_dead $dec_client{0x4407} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "mark_dead"; $r->{channel} = dec_U16 q||; $r->{x} = dec_U8 q||; $r->{y} = dec_U8 q||; $r->{dead} = dec_flag q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{mark_dead} = sub { $data = ""; enc_U16 0x4407; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U8 defined $_[0]{x} ? $_[0]{x} : (q||); enc_U8 defined $_[0]{y} ? $_[0]{y} : (q||); enc_flag defined $_[0]{dead} ? $_[0]{dead} : (q||); $data; }; # get_tree $dec_client{0x4408} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "get_tree"; $r->{channel} = dec_U16 q||; $r->{node} = dec_U32 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{get_tree} = sub { $data = ""; enc_U16 0x4408; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U32 defined $_[0]{node} ? $_[0]{node} : (q||); $data; }; # game_done $dec_client{0x440a} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "game_done"; $r->{channel} = dec_U16 q||; $r->{id} = dec_U32 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{game_done} = sub { $data = ""; enc_U16 0x440a; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U32 defined $_[0]{id} ? $_[0]{id} : (q||); $data; }; # claim_win $dec_client{0x440c} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "claim_win"; $r->{channel} = dec_U16 q||; $r->{player} = dec_U8 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{claim_win} = sub { $data = ""; enc_U16 0x440c; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U8 defined $_[0]{player} ? $_[0]{player} : (q||); $data; }; # add_time $dec_client{0x440d} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "add_time"; $r->{channel} = dec_U16 q||; $r->{time} = dec_U32 q||; $r->{player} = dec_U8 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{add_time} = sub { $data = ""; enc_U16 0x440d; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U32 defined $_[0]{time} ? $_[0]{time} : (q||); enc_U8 defined $_[0]{player} ? $_[0]{player} : (q||); $data; }; # req_undo $dec_client{0x440e} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "req_undo"; $r->{channel} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{req_undo} = sub { $data = ""; enc_U16 0x440e; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); $data; }; # grant_undo $dec_client{0x440f} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "grant_undo"; $r->{channel} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{grant_undo} = sub { $data = ""; enc_U16 0x440f; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); $data; }; # resign_game $dec_client{0x4410} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "resign_game"; $r->{channel} = dec_U16 q||; $r->{player} = dec_U8 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{resign_game} = sub { $data = ""; enc_U16 0x4410; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U8 defined $_[0]{player} ? $_[0]{player} : (q||); $data; }; # set_teacher $dec_client{0x441a} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "set_teacher"; $r->{channel} = dec_U16 q||; $r->{name} = dec_username q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{set_teacher} = sub { $data = ""; enc_U16 0x441a; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_username defined $_[0]{name} ? $_[0]{name} : (q||); $data; }; # allow_user $dec_client{0x4422} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "allow_user"; $r->{channel} = dec_U16 q||; $r->{othername} = dec_username q||; $r->{name} = dec_username q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{allow_user} = sub { $data = ""; enc_U16 0x4422; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_username defined $_[0]{othername} ? $_[0]{othername} : (q||); enc_username defined $_[0]{name} ? $_[0]{name} : (q||); $data; }; # set_privacy $dec_client{0x4423} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "set_privacy"; $r->{channel} = dec_U16 q||; $r->{private} = dec_flag q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{set_privacy} = sub { $data = ""; enc_U16 0x4423; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_flag defined $_[0]{private} ? $_[0]{private} : (q||); $data; }; # game_move $dec_client{0x4427} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "game_move"; $r->{channel} = dec_U16 q||; $r->{x} = dec_U8 q||; $r->{y} = dec_U8 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{game_move} = sub { $data = ""; enc_U16 0x4427; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U8 defined $_[0]{x} ? $_[0]{x} : (q||); enc_U8 defined $_[0]{y} ? $_[0]{y} : (q||); $data; }; # reject_challenge $dec_client{0x4429} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "reject_challenge"; $r->{channel} = dec_U16 q||; $r->{name} = dec_username q||; $r->{gametype} = dec_U8 q||; $r->{cid} = dec_CLIENTID8 q||; $r->{rules} = dec_rules q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{reject_challenge} = sub { $data = ""; enc_U16 0x4429; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_U8 defined $_[0]{gametype} ? $_[0]{gametype} : (q||); enc_CLIENTID8 defined $_[0]{cid} ? $_[0]{cid} : (q||); enc_rules defined $_[0]{rules} ? $_[0]{rules} : (q||); $data; }; # more_comments $dec_client{0x442d} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "more_comments"; $r->{channel} = dec_U16 q||; $r->{node} = dec_U32 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{more_comments} = sub { $data = ""; enc_U16 0x442d; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U32 defined $_[0]{node} ? $_[0]{node} : (q||); $data; }; # save_game $dec_client{0x442e} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "save_game"; $r->{channel} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{save_game} = sub { $data = ""; enc_U16 0x442e; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); $data; }; # req_result $dec_client{0x4433} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "req_result"; $r->{channel} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{req_result} = sub { $data = ""; enc_U16 0x4433; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); $data; }; # set_quiet $dec_client{0x4434} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "set_quiet"; $r->{channel} = dec_U16 q||; $r->{quiet} = dec_flag q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{set_quiet} = sub { $data = ""; enc_U16 0x4434; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_flag defined $_[0]{quiet} ? $_[0]{quiet} : (q||); $data; }; # msg_game $dec_client{0x4436} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "msg_game"; $r->{channel} = dec_U16 q||; $r->{message} = dec_STRING q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{msg_game} = sub { $data = ""; enc_U16 0x4436; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_STRING defined $_[0]{message} ? $_[0]{message} : (q||); $data; }; # quit $dec_client{0xffff} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "quit"; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_client{quit} = sub { $data = ""; enc_U16 0xffff; $data; }; # login $dec_server{0x0001} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "login"; $r->{message} = dec_CONSTANT q|login successful|; $r->{success} = dec_CONSTANT q|1|; $r->{user} = dec_user q||; $r->{unknown1} = dec_U16 q||; $r->{unknown2} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{login} = sub { $data = ""; enc_U16 0x0001; enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|login successful|); enc_CONSTANT defined $_[0]{success} ? $_[0]{success} : (q|1|); enc_user defined $_[0]{user} ? $_[0]{user} : (q||); enc_U16 defined $_[0]{unknown1} ? $_[0]{unknown1} : (q||); enc_U16 defined $_[0]{unknown2} ? $_[0]{unknown2} : (q||); $data; }; # login $dec_server{0x0002} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "login"; $r->{message} = dec_CONSTANT q|login successful: client version is outdated.|; $r->{success} = dec_CONSTANT q|1|; $r->{user} = dec_user q||; $r->{unknown1} = dec_U16 q||; $r->{unknown2} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{login} = sub { $data = ""; enc_U16 0x0002; enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|login successful: client version is outdated.|); enc_CONSTANT defined $_[0]{success} ? $_[0]{success} : (q|1|); enc_user defined $_[0]{user} ? $_[0]{user} : (q||); enc_U16 defined $_[0]{unknown1} ? $_[0]{unknown1} : (q||); enc_U16 defined $_[0]{unknown2} ? $_[0]{unknown2} : (q||); $data; }; # login $dec_server{0x0003} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "login"; $r->{message} = dec_CONSTANT q|login failed: client version out of date|; $r->{user} = dec_user q||; $r->{unknown1} = dec_U16 q||; $r->{unknown2} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{login} = sub { $data = ""; enc_U16 0x0003; enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|login failed: client version out of date|); enc_user defined $_[0]{user} ? $_[0]{user} : (q||); enc_U16 defined $_[0]{unknown1} ? $_[0]{unknown1} : (q||); enc_U16 defined $_[0]{unknown2} ? $_[0]{unknown2} : (q||); $data; }; # login $dec_server{0x0004} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "login"; $r->{message} = dec_CONSTANT q|login failed: wrong password|; $r->{user} = dec_user q||; $r->{unknown1} = dec_U16 q||; $r->{unknown2} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{login} = sub { $data = ""; enc_U16 0x0004; enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|login failed: wrong password|); enc_user defined $_[0]{user} ? $_[0]{user} : (q||); enc_U16 defined $_[0]{unknown1} ? $_[0]{unknown1} : (q||); enc_U16 defined $_[0]{unknown2} ? $_[0]{unknown2} : (q||); $data; }; # login $dec_server{0x0005} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "login"; $r->{message} = dec_CONSTANT q|login failed: specified user does not exist|; $r->{user} = dec_user q||; $r->{unknown1} = dec_U16 q||; $r->{unknown2} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{login} = sub { $data = ""; enc_U16 0x0005; enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|login failed: specified user does not exist|); enc_user defined $_[0]{user} ? $_[0]{user} : (q||); enc_U16 defined $_[0]{unknown1} ? $_[0]{unknown1} : (q||); enc_U16 defined $_[0]{unknown2} ? $_[0]{unknown2} : (q||); $data; }; # login $dec_server{0x0006} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "login"; $r->{message} = dec_CONSTANT q|login failed: other user of same name already exists|; $r->{user} = dec_user q||; $r->{unknown1} = dec_U16 q||; $r->{unknown2} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{login} = sub { $data = ""; enc_U16 0x0006; enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|login failed: other user of same name already exists|); enc_user defined $_[0]{user} ? $_[0]{user} : (q||); enc_U16 defined $_[0]{unknown1} ? $_[0]{unknown1} : (q||); enc_U16 defined $_[0]{unknown2} ? $_[0]{unknown2} : (q||); $data; }; # userinfo $dec_server{0x0008} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "userinfo"; $r->{_unused0} = dec_flag q||; $r->{user} = dec_user q||; $r->{_unused1} = dec_U64 q||; $r->{realname} = dec_realname q||; $r->{email} = dec_email q||; $r->{info} = dec_userinfo q||; $r->{homepage} = dec_url q||; $r->{regdate} = dec_timestamp q||; $r->{lastlogin} = dec_timestamp q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{userinfo} = sub { $data = ""; enc_U16 0x0008; enc_flag defined $_[0]{_unused0} ? $_[0]{_unused0} : (q||); enc_user defined $_[0]{user} ? $_[0]{user} : (q||); enc_U64 defined $_[0]{_unused1} ? $_[0]{_unused1} : (q||); enc_realname defined $_[0]{realname} ? $_[0]{realname} : (q||); enc_email defined $_[0]{email} ? $_[0]{email} : (q||); enc_userinfo defined $_[0]{info} ? $_[0]{info} : (q||); enc_url defined $_[0]{homepage} ? $_[0]{homepage} : (q||); enc_timestamp defined $_[0]{regdate} ? $_[0]{regdate} : (q||); enc_timestamp defined $_[0]{lastlogin} ? $_[0]{lastlogin} : (q||); $data; }; # upd_userinfo_result $dec_server{0x0009} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "upd_userinfo_result"; $r->{name} = dec_username q||; $r->{message} = dec_CONSTANT q|Thanks for registering.|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{upd_userinfo_result} = sub { $data = ""; enc_U16 0x0009; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Thanks for registering.|); $data; }; # upd_userinfo_result $dec_server{0x000a} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "upd_userinfo_result"; $r->{name} = dec_username q||; $r->{message} = dec_CONSTANT q|The user "%s" has been successfully updated.|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{upd_userinfo_result} = sub { $data = ""; enc_U16 0x000a; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|The user "%s" has been successfully updated.|); $data; }; # upd_userinfo_result $dec_server{0x000b} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "upd_userinfo_result"; $r->{name} = dec_username q||; $r->{message} = dec_CONSTANT q|There is no user "%s". Update failed.|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{upd_userinfo_result} = sub { $data = ""; enc_U16 0x000b; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|There is no user "%s". Update failed.|); $data; }; # userinfo_failed $dec_server{0x0012} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "userinfo_failed"; $r->{name} = dec_username q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{userinfo_failed} = sub { $data = ""; enc_U16 0x0012; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); $data; }; # msg_chat $dec_server{0x0013} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "msg_chat"; $r->{name} = dec_username q||; $r->{name2} = dec_username q||; $r->{message} = dec_STRING q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{msg_chat} = sub { $data = ""; enc_U16 0x0013; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_username defined $_[0]{name2} ? $_[0]{name2} : (q||); enc_STRING defined $_[0]{message} ? $_[0]{message} : (q||); $data; }; # stats $dec_server{0x0015} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "stats"; $r->{ver_major} = dec_U16 q||; $r->{ver_minor} = dec_U16 q||; $r->{ver_micro} = dec_U16 q||; $r->{boot_time} = dec_timestamp q||; $r->{users_cur} = dec_U32 q||; $r->{users_max} = dec_U32 q||; $r->{users_lim} = dec_U32 q||; $r->{accts_cur} = dec_U32 q||; $r->{accts_max} = dec_U32 q||; $r->{unknown1} = dec_U32 q||; $r->{work_max} = dec_U32 q||; $r->{rooms_cur} = dec_U32 q||; $r->{rooms_max} = dec_U32 q||; $r->{rooms_lim} = dec_U32 q||; $r->{games_cur} = dec_U32 q||; $r->{games_max} = dec_U32 q||; $r->{games_lim} = dec_U32 q||; $r->{results_cur} = dec_U32 q||; $r->{results_max} = dec_U32 q||; $r->{unknown2} = dec_U32 q||; $r->{params_cur} = dec_U32 q||; $r->{params_max} = dec_U32 q||; $r->{bytes_in} = dec_U64 q||; $r->{packets_in} = dec_U64 q||; $r->{bytes_out} = dec_U64 q||; $r->{packets_out} = dec_U64 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{stats} = sub { $data = ""; enc_U16 0x0015; enc_U16 defined $_[0]{ver_major} ? $_[0]{ver_major} : (q||); enc_U16 defined $_[0]{ver_minor} ? $_[0]{ver_minor} : (q||); enc_U16 defined $_[0]{ver_micro} ? $_[0]{ver_micro} : (q||); enc_timestamp defined $_[0]{boot_time} ? $_[0]{boot_time} : (q||); enc_U32 defined $_[0]{users_cur} ? $_[0]{users_cur} : (q||); enc_U32 defined $_[0]{users_max} ? $_[0]{users_max} : (q||); enc_U32 defined $_[0]{users_lim} ? $_[0]{users_lim} : (q||); enc_U32 defined $_[0]{accts_cur} ? $_[0]{accts_cur} : (q||); enc_U32 defined $_[0]{accts_max} ? $_[0]{accts_max} : (q||); enc_U32 defined $_[0]{unknown1} ? $_[0]{unknown1} : (q||); enc_U32 defined $_[0]{work_max} ? $_[0]{work_max} : (q||); enc_U32 defined $_[0]{rooms_cur} ? $_[0]{rooms_cur} : (q||); enc_U32 defined $_[0]{rooms_max} ? $_[0]{rooms_max} : (q||); enc_U32 defined $_[0]{rooms_lim} ? $_[0]{rooms_lim} : (q||); enc_U32 defined $_[0]{games_cur} ? $_[0]{games_cur} : (q||); enc_U32 defined $_[0]{games_max} ? $_[0]{games_max} : (q||); enc_U32 defined $_[0]{games_lim} ? $_[0]{games_lim} : (q||); enc_U32 defined $_[0]{results_cur} ? $_[0]{results_cur} : (q||); enc_U32 defined $_[0]{results_max} ? $_[0]{results_max} : (q||); enc_U32 defined $_[0]{unknown2} ? $_[0]{unknown2} : (q||); enc_U32 defined $_[0]{params_cur} ? $_[0]{params_cur} : (q||); enc_U32 defined $_[0]{params_max} ? $_[0]{params_max} : (q||); enc_U64 defined $_[0]{bytes_in} ? $_[0]{bytes_in} : (q||); enc_U64 defined $_[0]{packets_in} ? $_[0]{packets_in} : (q||); enc_U64 defined $_[0]{bytes_out} ? $_[0]{bytes_out} : (q||); enc_U64 defined $_[0]{packets_out} ? $_[0]{packets_out} : (q||); $data; }; # idle_warn $dec_server{0x0016} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "idle_warn"; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{idle_warn} = sub { $data = ""; enc_U16 0x0016; $data; }; # login $dec_server{0x0018} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "login"; $r->{message} = dec_CONSTANT q|logged out: another client logged in with your username|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{login} = sub { $data = ""; enc_U16 0x0018; enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|logged out: another client logged in with your username|); $data; }; # login $dec_server{0x001c} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "login"; $r->{message} = dec_CONSTANT q|logged out: idle for too long|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{login} = sub { $data = ""; enc_U16 0x001c; enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|logged out: idle for too long|); $data; }; # error $dec_server{0x0020} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "error"; $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.|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{error} = sub { $data = ""; enc_U16 0x0020; 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.|); $data; }; # login $dec_server{0x0022} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "login"; $r->{reason} = dec_STRING q||; $r->{result} = dec_CONSTANT q|user or ip blocked|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{login} = sub { $data = ""; enc_U16 0x0022; enc_STRING defined $_[0]{reason} ? $_[0]{reason} : (q||); enc_CONSTANT defined $_[0]{result} ? $_[0]{result} : (q|user or ip blocked|); $data; }; # timewarning_default $dec_server{0x001b} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "timewarning_default"; $r->{channel} = dec_U16 q||; $r->{time} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{timewarning_default} = sub { $data = ""; enc_U16 0x001b; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U16 defined $_[0]{time} ? $_[0]{time} : (q||); $data; }; # idle_err $dec_server{0x001c} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "idle_err"; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{idle_err} = sub { $data = ""; enc_U16 0x001c; $data; }; # ping $dec_server{0x001d} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "ping"; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{ping} = sub { $data = ""; enc_U16 0x001d; $data; }; # usergraph $dec_server{0x001e} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "usergraph"; $r->{name} = dec_username q||; $r->{data} = (my $array = []); while (length $data) { push @$array, dec_I16 ; } $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{usergraph} = sub { $data = ""; enc_U16 0x001e; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_I16 defined $_[0]{data} ? $_[0]{data} : (q||); $data; }; # userpic $dec_server{0x0021} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "userpic"; $r->{name} = dec_username q||; $r->{data} = dec_DATA q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{userpic} = sub { $data = ""; enc_U16 0x0021; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_DATA defined $_[0]{data} ? $_[0]{data} : (q||); $data; }; # memo_error $dec_server{0x0025} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "memo_error"; $r->{name} = dec_username q||; $r->{cid} = dec_CLIENTID16 q||; $r->{message} = dec_CONSTANT q|memo send failed: account already exists|; $r->{subtype} = dec_CONSTANT q|25|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{memo_error} = sub { $data = ""; enc_U16 0x0025; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_CLIENTID16 defined $_[0]{cid} ? $_[0]{cid} : (q||); enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|memo send failed: account already exists|); enc_CONSTANT defined $_[0]{subtype} ? $_[0]{subtype} : (q|25|); $data; }; # memo_error $dec_server{0x0026} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "memo_error"; $r->{name} = dec_username q||; $r->{cid} = dec_CLIENTID16 q||; $r->{message} = dec_CONSTANT q|memo send failed: error 26|; $r->{subtype} = dec_CONSTANT q|26|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{memo_error} = sub { $data = ""; enc_U16 0x0026; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_CLIENTID16 defined $_[0]{cid} ? $_[0]{cid} : (q||); enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|memo send failed: error 26|); enc_CONSTANT defined $_[0]{subtype} ? $_[0]{subtype} : (q|26|); $data; }; # memo_error $dec_server{0x0027} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "memo_error"; $r->{name} = dec_username q||; $r->{cid} = dec_CLIENTID16 q||; $r->{message} = dec_CONSTANT q|memo send failed: user is online, use chat|; $r->{subtype} = dec_CONSTANT q|27|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{memo_error} = sub { $data = ""; enc_U16 0x0027; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_CLIENTID16 defined $_[0]{cid} ? $_[0]{cid} : (q||); enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|memo send failed: user is online, use chat|); enc_CONSTANT defined $_[0]{subtype} ? $_[0]{subtype} : (q|27|); $data; }; # memo_error $dec_server{0x0028} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "memo_error"; $r->{name} = dec_username q||; $r->{cid} = dec_CLIENTID16 q||; $r->{message} = dec_CONSTANT q|memo send failed: error 28|; $r->{subtype} = dec_CONSTANT q|28|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{memo_error} = sub { $data = ""; enc_U16 0x0028; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_CLIENTID16 defined $_[0]{cid} ? $_[0]{cid} : (q||); enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|memo send failed: error 28|); enc_CONSTANT defined $_[0]{subtype} ? $_[0]{subtype} : (q|28|); $data; }; # memo $dec_server{0x0029} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "memo"; $r->{name} = dec_username q||; $r->{time} = dec_timestamp q||; $r->{message} = dec_ZSTRING q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{memo} = sub { $data = ""; enc_U16 0x0029; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_timestamp defined $_[0]{time} ? $_[0]{time} : (q||); enc_ZSTRING defined $_[0]{message} ? $_[0]{message} : (q||); $data; }; # memo_sent $dec_server{0x002a} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "memo_sent"; $r->{name} = dec_username q||; $r->{cid} = dec_CLIENTID16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{memo_sent} = sub { $data = ""; enc_U16 0x002a; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_CLIENTID16 defined $_[0]{cid} ? $_[0]{cid} : (q||); $data; }; # gnotice $dec_server{0x0100} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "gnotice"; $r->{notice} = dec_STRING q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{gnotice} = sub { $data = ""; enc_U16 0x0100; enc_STRING defined $_[0]{notice} ? $_[0]{notice} : (q||); $data; }; # notify_event $dec_server{0x0202} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "notify_event"; $r->{event} = dec_U32 q||; $r->{user} = dec_user q||; $r->{gamerecord} = dec_game_record q|| if ($r->{event} == 2); $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{notify_event} = sub { $data = ""; enc_U16 0x0202; enc_U32 defined $_[0]{event} ? $_[0]{event} : (q||); enc_user defined $_[0]{user} ? $_[0]{user} : (q||); enc_game_record defined $_[0]{gamerecord} ? $_[0]{gamerecord} : (q||); $data; }; # login_done $dec_server{0x030c} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "login_done"; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{login_done} = sub { $data = ""; enc_U16 0x030c; $data; }; # priv_room $dec_server{0x0310} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "priv_room"; $r->{name} = dec_STRING q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{priv_room} = sub { $data = ""; enc_U16 0x0310; enc_STRING defined $_[0]{name} ? $_[0]{name} : (q||); $data; }; # upd_rooms $dec_server{0x0318} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "upd_rooms"; $r->{rooms} = (my $array = []); while (length $data) { push @$array, dec_room ; } $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{upd_rooms} = sub { $data = ""; enc_U16 0x0318; enc_room defined $_[0]{rooms} ? $_[0]{rooms} : (q||); $data; }; # chal_defaults $dec_server{0x0411} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "chal_defaults"; $r->{channel} = dec_U16 q||; $r->{defaults} = dec_challenge_defaults q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{chal_defaults} = sub { $data = ""; enc_U16 0x0411; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_challenge_defaults defined $_[0]{defaults} ? $_[0]{defaults} : (q||); $data; }; # already_playing $dec_server{0x0412} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "already_playing"; $r->{message} = dec_CONSTANT q|Sorry, you are already playing in one game, so you can't start playing in another.|; $r->{cid} = dec_CLIENTID16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{already_playing} = sub { $data = ""; enc_U16 0x0412; enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, you are already playing in one game, so you can't start playing in another.|); enc_CLIENTID16 defined $_[0]{cid} ? $_[0]{cid} : (q||); $data; }; # game_record $dec_server{0x0414} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "game_record"; $r->{name} = dec_username q||; $r->{more} = dec_flag q||; $r->{games} = (my $array = []); while (length $data) { push @$array, dec_game_record ; } $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{game_record} = sub { $data = ""; enc_U16 0x0414; enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_flag defined $_[0]{more} ? $_[0]{more} : (q||); enc_game_record defined $_[0]{games} ? $_[0]{games} : (q||); $data; }; # error $dec_server{0x0417} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "error"; $r->{message} = dec_CONSTANT q|Sorry, your opponent is currently not logged in, so you can't resume this game.|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{error} = sub { $data = ""; enc_U16 0x0417; enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, your opponent is currently not logged in, so you can't resume this game.|); $data; }; # error $dec_server{0x0418} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "error"; $r->{message} = dec_CONSTANT q|Sorry, your opponent is already playing in a game, so you cannot continue this one.|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{error} = sub { $data = ""; enc_U16 0x0418; enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, your opponent is already playing in a game, so you cannot continue this one.|); $data; }; # error $dec_server{0x0419} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "error"; $r->{message} = dec_CONSTANT q|Sorry, the server is out of boards! Please wait a few minutes and try to start a game again.|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{error} = sub { $data = ""; enc_U16 0x0419; 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.|); $data; }; # upd_game2 $dec_server{0x041c} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "upd_game2"; $r->{channel_junk} = dec_U16 q||; $r->{game} = dec_game q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{upd_game2} = sub { $data = ""; enc_U16 0x041c; enc_U16 defined $_[0]{channel_junk} ? $_[0]{channel_junk} : (q||); enc_game defined $_[0]{game} ? $_[0]{game} : (q||); $data; }; # error $dec_server{0x041f} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "error"; $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.|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{error} = sub { $data = ""; enc_U16 0x041f; 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.|); $data; }; # error $dec_server{0x0420} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "error"; $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.|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{error} = sub { $data = ""; enc_U16 0x0420; 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.|); $data; }; # error $dec_server{0x0421} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "error"; $r->{message} = dec_CONSTANT q|Sorry, this game is a private lesson. You will not be allowed to observe it.|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{error} = sub { $data = ""; enc_U16 0x0421; enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, this game is a private lesson. You will not be allowed to observe it.|); $data; }; # add_global_challenges $dec_server{0x043a} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "add_global_challenges"; $r->{games} = (my $array = []); while (length $data) { push @$array, dec_room_game ; } $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{add_global_challenges} = sub { $data = ""; enc_U16 0x043a; enc_room_game defined $_[0]{games} ? $_[0]{games} : (q||); $data; }; # join_room $dec_server{0x4300} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "join_room"; $r->{channel} = dec_U16 q||; $r->{users} = (my $array = []); while (length $data) { push @$array, dec_user ; } $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{join_room} = sub { $data = ""; enc_U16 0x4300; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_user defined $_[0]{users} ? $_[0]{users} : (q||); $data; }; # msg_room $dec_server{0x4301} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "msg_room"; $r->{channel} = dec_U16 q||; $r->{name} = dec_username q||; $r->{message} = dec_STRING q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{msg_room} = sub { $data = ""; enc_U16 0x4301; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_STRING defined $_[0]{message} ? $_[0]{message} : (q||); $data; }; # part_room $dec_server{0x4302} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "part_room"; $r->{channel} = dec_U16 q||; $r->{user} = dec_user q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{part_room} = sub { $data = ""; enc_U16 0x4302; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_user defined $_[0]{user} ? $_[0]{user} : (q||); $data; }; # del_room $dec_server{0x4303} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "del_room"; $r->{channel} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{del_room} = sub { $data = ""; enc_U16 0x4303; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); $data; }; # upd_games $dec_server{0x4304} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "upd_games"; $r->{channel} = dec_U16 q||; $r->{games} = (my $array = []); while (length $data) { push @$array, dec_game ; } $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{upd_games} = sub { $data = ""; enc_U16 0x4304; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_game defined $_[0]{games} ? $_[0]{games} : (q||); $data; }; # desc_room $dec_server{0x4319} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "desc_room"; $r->{channel} = dec_U16 q||; $r->{owner} = dec_username q||; $r->{description} = dec_STRING q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{desc_room} = sub { $data = ""; enc_U16 0x4319; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_username defined $_[0]{owner} ? $_[0]{owner} : (q||); enc_STRING defined $_[0]{description} ? $_[0]{description} : (q||); $data; }; # challenge $dec_server{0x4400} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "challenge"; $r->{channel} = dec_U16 q||; $r->{black} = dec_user q||; $r->{white} = dec_user q||; $r->{gametype} = dec_U8 q||; $r->{cid} = dec_CLIENTID8 q||; $r->{rules} = dec_rules q||; $r->{notes} = dec_STRING q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{challenge} = sub { $data = ""; enc_U16 0x4400; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_user defined $_[0]{black} ? $_[0]{black} : (q||); enc_user defined $_[0]{white} ? $_[0]{white} : (q||); enc_U8 defined $_[0]{gametype} ? $_[0]{gametype} : (q||); enc_CLIENTID8 defined $_[0]{cid} ? $_[0]{cid} : (q||); enc_rules defined $_[0]{rules} ? $_[0]{rules} : (q||); enc_STRING defined $_[0]{notes} ? $_[0]{notes} : (q||); $data; }; # upd_game $dec_server{0x4401} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "upd_game"; $r->{channel} = dec_U16 q||; $r->{game} = dec_game q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{upd_game} = sub { $data = ""; enc_U16 0x4401; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_game defined $_[0]{game} ? $_[0]{game} : (q||); $data; }; # del_game $dec_server{0x4402} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "del_game"; $r->{channel} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{del_game} = sub { $data = ""; enc_U16 0x4402; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); $data; }; # upd_observers $dec_server{0x4403} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "upd_observers"; $r->{channel} = dec_U16 q||; $r->{users} = (my $array = []); while (length $data) { push @$array, dec_user ; } $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{upd_observers} = sub { $data = ""; enc_U16 0x4403; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_user defined $_[0]{users} ? $_[0]{users} : (q||); $data; }; # del_observer $dec_server{0x4404} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "del_observer"; $r->{channel} = dec_U16 q||; $r->{name} = dec_username q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{del_observer} = sub { $data = ""; enc_U16 0x4404; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_username defined $_[0]{name} ? $_[0]{name} : (q||); $data; }; # set_tree $dec_server{0x4405} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "set_tree"; $r->{channel} = dec_U16 q||; $r->{tree} = dec_TREE q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{set_tree} = sub { $data = ""; enc_U16 0x4405; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_TREE defined $_[0]{tree} ? $_[0]{tree} : (q||); $data; }; # upd_tree $dec_server{0x4406} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "upd_tree"; $r->{channel} = dec_U16 q||; $r->{tree} = dec_TREE q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{upd_tree} = sub { $data = ""; enc_U16 0x4406; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_TREE defined $_[0]{tree} ? $_[0]{tree} : (q||); $data; }; # superko $dec_server{0x4409} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "superko"; $r->{channel} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{superko} = sub { $data = ""; enc_U16 0x4409; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); $data; }; # game_done $dec_server{0x440a} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "game_done"; $r->{channel} = dec_U16 q||; $r->{id} = dec_U32 q||; $r->{black} = dec_flag q||; $r->{white} = dec_flag q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{game_done} = sub { $data = ""; enc_U16 0x440a; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U32 defined $_[0]{id} ? $_[0]{id} : (q||); enc_flag defined $_[0]{black} ? $_[0]{black} : (q||); enc_flag defined $_[0]{white} ? $_[0]{white} : (q||); $data; }; # final_result $dec_server{0x440b} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "final_result"; $r->{channel} = dec_U16 q||; $r->{blackscore} = dec_scorevalues q||; $r->{whitescore} = dec_scorevalues q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{final_result} = sub { $data = ""; enc_U16 0x440b; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_scorevalues defined $_[0]{blackscore} ? $_[0]{blackscore} : (q||); enc_scorevalues defined $_[0]{whitescore} ? $_[0]{whitescore} : (q||); $data; }; # out_of_time $dec_server{0x440c} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "out_of_time"; $r->{channel} = dec_U16 q||; $r->{player} = dec_U8 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{out_of_time} = sub { $data = ""; enc_U16 0x440c; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U8 defined $_[0]{player} ? $_[0]{player} : (q||); $data; }; # req_undo $dec_server{0x440e} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "req_undo"; $r->{channel} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{req_undo} = sub { $data = ""; enc_U16 0x440e; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); $data; }; # resign_game $dec_server{0x4410} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "resign_game"; $r->{channel} = dec_U16 q||; $r->{player} = dec_U8 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{resign_game} = sub { $data = ""; enc_U16 0x4410; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U8 defined $_[0]{player} ? $_[0]{player} : (q||); $data; }; # game_error $dec_server{0x4415} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "game_error"; $r->{channel} = dec_U16 q||; $r->{message} = dec_CONSTANT q|Sorry, this is a lecture game. Only authorized players are allowed to make comments.|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{game_error} = sub { $data = ""; enc_U16 0x4415; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, this is a lecture game. Only authorized players are allowed to make comments.|); $data; }; # set_teacher $dec_server{0x441a} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "set_teacher"; $r->{channel} = dec_U16 q||; $r->{name} = dec_username q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{set_teacher} = sub { $data = ""; enc_U16 0x441a; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_username defined $_[0]{name} ? $_[0]{name} : (q||); $data; }; # owner_left $dec_server{0x441d} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "owner_left"; $r->{channel} = dec_U16 q||; $r->{message} = dec_CONSTANT q|Sorry, the owner of this game has left. Nobody will be allowed to edit it until the owner returns.|; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{owner_left} = sub { $data = ""; enc_U16 0x441d; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); 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.|); $data; }; # teacher_left $dec_server{0x441e} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "teacher_left"; $r->{channel} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{teacher_left} = sub { $data = ""; enc_U16 0x441e; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); $data; }; # allow_user_result $dec_server{0x4422} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "allow_user_result"; $r->{message} = dec_CONSTANT q|User "%s" will now be allowed full access to your game.|; $r->{channel} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{allow_user_result} = sub { $data = ""; enc_U16 0x4422; enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|User "%s" will now be allowed full access to your game.|); enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); $data; }; # allow_user_result $dec_server{0x4424} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "allow_user_result"; $r->{message} = dec_CONSTANT q|Sorry, user "%s" is a guest and cannot be allowed full access to your game.|; $r->{channel} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{allow_user_result} = sub { $data = ""; enc_U16 0x4424; enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, user "%s" is a guest and cannot be allowed full access to your game.|); enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); $data; }; # allow_user_result $dec_server{0x4425} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "allow_user_result"; $r->{message} = dec_CONSTANT q|Sorry, user "%s" does not seem to exist and cannot be allowed into your game.|; $r->{channel} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{allow_user_result} = sub { $data = ""; enc_U16 0x4425; enc_CONSTANT defined $_[0]{message} ? $_[0]{message} : (q|Sorry, user "%s" does not seem to exist and cannot be allowed into your game.|); enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); $data; }; # add_tree $dec_server{0x4428} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "add_tree"; $r->{channel} = dec_U16 q||; $r->{tree} = dec_TREE q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{add_tree} = sub { $data = ""; enc_U16 0x4428; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_TREE defined $_[0]{tree} ? $_[0]{tree} : (q||); $data; }; # reject_challenge $dec_server{0x4429} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "reject_challenge"; $r->{channel} = dec_U16 q||; $r->{name} = dec_username q||; $r->{gametype} = dec_U8 q||; $r->{cid} = dec_CLIENTID8 q||; $r->{rules} = dec_rules q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{reject_challenge} = sub { $data = ""; enc_U16 0x4429; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_username defined $_[0]{name} ? $_[0]{name} : (q||); enc_U8 defined $_[0]{gametype} ? $_[0]{gametype} : (q||); enc_CLIENTID8 defined $_[0]{cid} ? $_[0]{cid} : (q||); enc_rules defined $_[0]{rules} ? $_[0]{rules} : (q||); $data; }; # set_comments $dec_server{0x442b} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "set_comments"; $r->{channel} = dec_U16 q||; $r->{node} = dec_U32 q||; $r->{comments} = dec_STRING q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{set_comments} = sub { $data = ""; enc_U16 0x442b; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U32 defined $_[0]{node} ? $_[0]{node} : (q||); enc_STRING defined $_[0]{comments} ? $_[0]{comments} : (q||); $data; }; # add_comments $dec_server{0x442c} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "add_comments"; $r->{channel} = dec_U16 q||; $r->{node} = dec_U32 q||; $r->{comments} = dec_STRING q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{add_comments} = sub { $data = ""; enc_U16 0x442c; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U32 defined $_[0]{node} ? $_[0]{node} : (q||); enc_STRING defined $_[0]{comments} ? $_[0]{comments} : (q||); $data; }; # more_comments $dec_server{0x442d} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "more_comments"; $r->{channel} = dec_U16 q||; $r->{node} = dec_U32 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{more_comments} = sub { $data = ""; enc_U16 0x442d; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U32 defined $_[0]{node} ? $_[0]{node} : (q||); $data; }; # new_game $dec_server{0x442f} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "new_game"; $r->{channel} = dec_U16 q||; $r->{cid} = dec_CLIENTID16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{new_game} = sub { $data = ""; enc_U16 0x442f; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_CLIENTID16 defined $_[0]{cid} ? $_[0]{cid} : (q||); $data; }; # req_result $dec_server{0x4433} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "req_result"; $r->{channel} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{req_result} = sub { $data = ""; enc_U16 0x4433; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); $data; }; # set_quiet $dec_server{0x4434} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "set_quiet"; $r->{channel} = dec_U16 q||; $r->{quiet} = dec_flag q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{set_quiet} = sub { $data = ""; enc_U16 0x4434; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_flag defined $_[0]{quiet} ? $_[0]{quiet} : (q||); $data; }; # set_gametime $dec_server{0x4437} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "set_gametime"; $r->{channel} = dec_U16 q||; $r->{black_time} = dec_time q||; $r->{black_moves} = dec_U16 q||; $r->{white_time} = dec_time q||; $r->{white_moves} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{set_gametime} = sub { $data = ""; enc_U16 0x4437; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_time defined $_[0]{black_time} ? $_[0]{black_time} : (q||); enc_U16 defined $_[0]{black_moves} ? $_[0]{black_moves} : (q||); enc_time defined $_[0]{white_time} ? $_[0]{white_time} : (q||); enc_U16 defined $_[0]{white_moves} ? $_[0]{white_moves} : (q||); $data; }; # del_global_challenge $dec_server{0x443b} = sub { $data = $_[0]; my $r = { DATA => $data }; $r->{type} = "del_global_challenge"; $r->{channel} = dec_U16 q||; $r->{game} = dec_U16 q||; $r->{TRAILING_DATA} = $data if length $data; $r; }; $enc_server{del_global_challenge} = sub { $data = ""; enc_U16 0x443b; enc_U16 defined $_[0]{channel} ? $_[0]{channel} : (q||); enc_U16 defined $_[0]{game} ? $_[0]{game} : (q||); $data; }; } 1;