#! /usr/bin/perl use strict; use warnings; use File::Find; use Data::Dumper; use DBI; use DBD::mysql; use Parallel::ForkManager; use File::Basename; use Log::Log4perl qw(:easy); use Cwd; use feature qw(say); # GLOBAL VARS #-------------------------------------------------------------- my (%HH, %FolderModified, %LatestModtime, %USER, %DBaction_type); #my $HH_DIR = '/var/www/zino/pkrstarsbot/upload'; my $RootDir = getcwd() . '/upload'; my $Logfile = getcwd() . '/log/log.conf'; my $LogfileOutput = getcwd() . "/log/output"; my $HH_FILETYPE = 'txt$'; my $DUMP_FILE = getcwd() . "/log/dump"; my $SkippedDir = getcwd() . "/log/skip"; my $ErrorDir = getcwd() . "/log/error"; my $NoActionMatch = getcwd() . "/log/noactionmatch"; my %SupportedGameTypes = ( "HOLD'EM" => { 'NO LIMIT' => { 'REALMONEY' => { 'SIXPLUSHOLDEM' => 0, 'TEMPEST' => 0, 'CASH' => 0, # Cash Full Ring Play Money, Cash Short Ring Play Money 'ZOOM' => 0, 'TOURNAMENT_1' => 0, # Sit&KO, SITNKO 36 'TOURNAMENT_2' => 0, # Grand Tour 'TOURNAMENT_3' => 0, # Sit&Go Heads Up 'TOURNAMENT_4' => 0, # SITNGO 6 max, sitngo heads up, spingo holdem, spinngo max holdem }, 'PLAYMONEY' => { 'SIXPLUSHOLDEM' => 0, 'TEMPEST' => 0, 'CASH' => 0, 'ZOOM' => 0, 'TOURNAMENT_1' => 0, 'TOURNAMENT_2' => 0, 'TOURNAMENT_3' => 0, 'TOURNAMENT_4' => 0, }, }, 'LIMIT' => { 'REALMONEY' => { 'SIXPLUSHOLDEM' => 0, 'TEMPEST' => 0, 'CASH' => 0, 'ZOOM' => 0, 'TOURNAMENT_1' => 0, 'TOURNAMENT_2' => 0, 'TOURNAMENT_3' => 0, 'TOURNAMENT_4' => 0, }, 'PLAYMONEY' => { 'SIXPLUSHOLDEM' => 0, 'TEMPEST' => 0, 'CASH' => 0, 'ZOOM' => 0, 'TOURNAMENT_1' => 0, 'TOURNAMENT_2' => 0, 'TOURNAMENT_3' => 0, 'TOURNAMENT_4' => 0, }, }, } ); my %Patterns = ( 'GAMEINFO' => { # 'SNG' => 'PokerStars Hand #(\d+?): Tournament #(\d+?), (.*?) (.*?) (.*?) (.*?) - Level (.*?) \((\d+?)\/(\d+?)\) - (\d+?)\/(\d+?)\/(\d+?) (\d+?)\:(\d+?)\:(\d+?) (.*)', # 'CASHGAME' => 'PokerStars Hand #(\d+?): (.*?) (.*?) \(\$?(\d+\.?\d*)\/\$?(\d+\.?\d*)(.*?)\) - (\d+?)\/(\d+?)\/(\d+?) (\d+?)\:(\d+?)\:(\d+?) (.*)', # 'ZOOMPLAYMONEY' => 'PokerStars Zoom Hand #(\d+?): (.*?) (.*?) \((\d+?)\/(\d+?)\) - (\d+?)\/(\d+?)\/(\d+?) (\d+?)\:(\d+?)\:(\d+?) (.*)', # 'ZOOMREALMONEY' => 'PokerStars Zoom Hand #(\d+?): (.*?) (.*?) \(\$(\d+\.?\d*)\/\$(\d+\.?\d*)\) - (\d+?)\/(\d+?)\/(\d+?) (\d+?)\:(\d+?)\:(\d+?) (.*)', # 'SHOOTOUTTOURNAMENT' => 'PokerStars Hand #(\d+?): Tournament #(\d+?), Freeroll (.*?) (.*?) - Match Round (.*?), Level (.*?) \((\d+?)\/(\d+?)\) - (\d+?)\/(\d+?)\/(\d+?) (\d+?)\:(\d+?)\:(\d+?) (.*)', # 'ZOOMTOURNAMENT' => 'PokerStars Hand #(\d+?): Zoom Tournament #(\d+?), (.*?) (.*?) (.*?) (.*?) - Level (.*?) \((\d+?)\/(\d+?)\) - (\d+?)\/(\d+?)\/(\d+?) (\d+?)\:(\d+?)\:(\d+?) (.*)', 'REALMONEY' => { 'SIXPLUSHOLDEM' => 'PokerStars Hand #(\d+): 6\+ (.+?) (.+)\(Button Blind (\$|\€|\£)(.+?) - Ante [\$\€\£](.+?) (USD|EUR|GBP)\) - (\d+)\/(\d+)\/(\d+) (\d+):(\d+):(\d+) (\w+)', 'TEMPEST' => 'PokerStars Hand #(\d+): Tempest (.+?) (.+)\((\$|\€|\£)(.+?)\/[\$\€\£](.+?)\/[\$\€\£](.+?) - [\$\€\£](.+?) Cap - (USD|EUR|GBP)\) - (\d+)\/(\d+)\/(\d+) (\d+):(\d+):(\d+) (\w+)', 'CASH' => 'PokerStars Hand #(\d+): ((?!Tempest|\+).*?) (.*) \((\$|\€|\£)(.+?)\/[\$\€\£](.+?) (USD|EUR|GBP)\) - (\d+?)\/(\d+?)\/(\d+?) (\d+?)\:(\d+?)\:(\d+?) (\w*)', # Cash Full Ring Play Money, Cash Short Ring Play Money 'ZOOM' => 'PokerStars Zoom Hand #(\d+?): (.*?) (.*?) \((\$|\€|\£)(.+?)\/[\$\€\£](.+?)\) - (\d+?)\/(\d+?)\/(\d+?) (\d+?)\:(\d+?)\:(\d+?) (.*)', 'TOURNAMENT_1' => 'PokerStars Hand #(\d+): Tournament #(\d+), (\$|\€|\£)([^\+]+?)\+[\$\€\£](.+?)\+[\$\€\£](.+?) (USD|EUR|GBP) (.+?) (.+) - Level (\w+) \((\d+)\/(\d+)\) - (\d+?)\/(\d+?)\/(\d+?) (\d+?)\:(\d+?)\:(\d+?) (\w*)', # Sit&KO, SITNKO 36 'TOURNAMENT_2' => 'PokerStars Hand #(\d+): Tournament #(\d+), ([^\d\+]+?) (.+) - Level (\w+) \((\d+)\/(\d+)\) - (\d+?)\/(\d+?)\/(\d+?) (\d+?)\:(\d+?)\:(\d+?) (\w*)', # Grand Tour, same regex but differs when looking at bounty amounts 'TOURNAMENT_3' => 'PokerStars Hand #(\d+): Tournament #(\d+), ([^\d\+]+?) (.+) - Level (\w+) \((\d+)\/(\d+)\) - (\d+?)\/(\d+?)\/(\d+?) (\d+?)\:(\d+?)\:(\d+?) (\w*)', # Sit&Go Heads Up 'TOURNAMENT_4' => 'PokerStars Hand #(\d+): Tournament #(\d+), (\$|\€|\£)([^\+]+?)\+[\$\€\£]([^\+]+?) (USD|EUR|GBP) (.+?) (.+) - Level (\w+) \((\d+)\/(\d+)\) - (\d+?)\/(\d+?)\/(\d+?) (\d+?)\:(\d+?)\:(\d+?) (\w*)', # SITNGO 6 max, sitngo heads up, spingo holdem, spinngo max holdem }, 'PLAYMONEY' => { 'SIXPLUSHOLDEM' => 'PokerStars Hand #(\d+): 6\+ (.+?) (.+)\(Button Blind (\d+) - Ante (\d+) \) - (\d+)\/(\d+)\/(\d+) (\d+):(\d+):(\d+) (\w+)', 'TEMPEST' => 'PokerStars Hand #(\d+): Tempest (.+?) (.+)\((\d+)\/(\d+)\/(\d+) - (\d+) Cap - \) - (\d+)\/(\d+)\/(\d+) (\d+):(\d+):(\d+) (\w+)', 'CASH' => 'PokerStars Hand #(\d+): (.*?) (.*) \((\d+)\/(\d+)\) - (\d+?)\/(\d+?)\/(\d+?) (\d+?)\:(\d+?)\:(\d+?) (\w*)', # Cash Full Ring Play Money, Cash Heads Up, Cash Short Ring Play Money 'ZOOM' => 'PokerStars Zoom Hand #(\d+?): (.*?) (.*?) \((\d+?)\/(\d+?)\) - (\d+?)\/(\d+?)\/(\d+?) (\d+?)\:(\d+?)\:(\d+?) (.*)', 'TOURNAMENT_1' => 'PokerStars Hand #(\d+): Tournament #(\d+), (\d+)\+(\d+)\+(\d+) (.+?) (.+) - Level (\w+) \((\d+)\/(\d+)\) - (\d+?)\/(\d+?)\/(\d+?) (\d+?)\:(\d+?)\:(\d+?) (\w*)', # Sit&KO, SITNKO 36 'TOURNAMENT_2' => 'PokerStars Hand #(\d+): Tournament #(\d+), ([^\d\+]+?) (.+) - Level (\w+) \((\d+)\/(\d+)\) - (\d+?)\/(\d+?)\/(\d+?) (\d+?)\:(\d+?)\:(\d+?) (\w*)', # Grand Tour 'TOURNAMENT_3' => 'PokerStars Hand #(\d+): Tournament #(\d+), (\d+)\+(\d+) (.+?) (.+) - Match Round (\w+), Level (\w+) \((\d+)\/(\d+)\) - (\d+?)\/(\d+?)\/(\d+?) (\d+?)\:(\d+?)\:(\d+?) (\w*)', # Sit&Go Heads Up 'TOURNAMENT_4' => 'PokerStars Hand #(\d+): Tournament #(\d+), (\d+)\+(\d+) (.+?) (.+) - Level (\w+) \((\d+)\/(\d+)\) - (\d+?)\/(\d+?)\/(\d+?) (\d+?)\:(\d+?)\:(\d+?) (\w*)', # SITNGO 6 max, sitngo heads up, spingo holdem, spinngo max holdem }, }, 'MONEY' => '\$|\€\£', 'TABLEINFO' => { 'REALMONEY' => { 'WITH_TABLE_NUMBER' => 'Table \'(.+) (\d+)\' ([^\(\)]+?) Seat #(\d+?)', 'WITHOUT_TABLE_NUMBER' => 'Table \'(.+)[^\d+$]\' ([^\(\)]+?) Seat #(\d+?)', }, 'PLAYMONEY' => { 'WITHOUT_TABLE_NUMBER' =>'Table \'(.+)\' (.+?) \(Play Money\) Seat #(\d+?)', 'WITH_TABLE_NUMBER' => 'Table \'(.+) (\d+)\' ([^\(\)]+?) Seat #(\d+?)', }, }, 'PREHOLECARDS' => { 'SEAT' => { 'REGULAR'=> 'Seat (\d+?)\: (.*?) \([\$\€\£]?(\d+\.?\d*) in chips\) (.*)', 'TOURNAMENT_2' => 'Seat (\d+): (.+?) \((\d+) in chips, (?:[\$|\€|\£])?(.+) bounty\) (.*)', }, 'POST' => '(.+?)\: posts (.*?) [\$\€\£]?(\d+\.?\d*)(.*)', 'ALLOWED' => '(.*?) will be allowed to play after the button', }, 'HOLECARDS' => { 'OWNCARDS' => 'Dealt to (.*?) \[(.+?) (.*?)\]', }, 'ACTIONS' => { 'FOLD' => '(.*?): folds', 'CALL' => '(.*?): calls [\$\€\£]?(\d+\.?\d*)(.*)', 'CHECK' => '(.*?): checks', 'RAISE' => '(.*?): raises [\$\€\£]?(\d+\.?\d*) to [\$\€\£]?(\d+\.?\d*)(.*)', 'COLLECTED' => '(.*?) collected [\$\€\£]?(\d+\.?\d*) from (.*)', 'RETURNED' => 'Uncalled bet \([\$\€\£]?(\d+\.?\d*)\) returned to (.*)', 'BET' => '(.*?): bets [\$\€\£]?(\d+\.?\d*)(.*)', 'NOSHOW' => '(.*?): doesn\'t show hand', 'SHOW' => '(.*?): shows \[(.*?) (.*?)\] \((.*?)\)', 'MUCK' => '(.*?): mucks hand', 'FINISHED_TOURNAMENT' => '(.*?) finished the tournament in (.*?) place(.*)', 'WIN_TOURNAMENT' => '(.*) wins the tournament - congratulations!', 'WIN_TOURNAMENT_RECEIVE' => '(.*) wins the tournament and receives (?:[\$|\€|\£])?(.+) - congratulations!', 'SUMMARY_SHOWED_WON' => 'Seat (\d+): (.+?) (?:\((.+?)\) ?)? ?(?:\((.+?)\) ?)?showed \[(.*?) (.*?)\] and won \([\$\€\£]?(\d+\.?\d*)\) with (.*)', 'SUMMARY_SHOWED_LOST' => 'Seat (\d+): (.+?) (?:\((.+?)\) ?)? ?(?:\((.+?)\) ?)?showed \[(.*?) (.*?)\] and lost with (.*)', 'SUMMARY_FOLDED' => 'Seat (\d+): (.+?) (?:\((.+?)\) ?)? ?(?:\((.+?)\) ?)?folded (.*)', 'SUMMARY_COLLECTED' => 'Seat (\d+): (.+?) (?:\((.+?)\) ?)? ?(?:\((.+?)\) ?)?collected \([\$\€\£]?(\d+\.?\d*)\)', 'SUMMARY_MUCKED' => 'Seat (\d+): (.+?) (?:\((.+?)\) ?)? ?(?:\((.+?)\) ?)?mucked \[(.*?) (.*?)\]', 'WIN_BOUNTY' => '(.*?) wins the [\$\€\£]?(\d+\.?\d*) bounty for eliminating (.*)', 'LEAVE' => '(.*?) leaves the table', 'TIMED_OUT' => '(.*?) has timed out(.*)', 'SAID' => '(.*?) said, "(.*)"', 'SPLIT_BOUNTY' => '(.*?) split the [\$\€\£]?(\d+\.?\d*) bounty for eliminating (.*)', 'WIN_WHATEVER' => '(.*?) wins (.*)', 'DISCONNECTED' => '(.*?) is disconnected', 'CONNECTED' => '(.*?) is connected', 'SITTINGOUT' => '(.*?) is sitting out', 'FINISHED_NOWIN' => '(.*?) finished the tournament', 'WIN_BOUNTY_ELIMINATING' => '(.+) wins (?:\$|\€|\£)?(.+) for eliminating (.+) and their own bounty increases by (?:[\$|\€|\£])?(.+) to (?:[\$|\€|\£])?(.+)', }, 'CARDS' => { 'FLOP' => '\*\*\* FLOP \*\*\* \[(.*?) (.*?) (.*?)\]', 'TURN' => '\*\*\* TURN \*\*\* \[.*? .*? .*?\] \[(.*?)\]', 'RIVER' => '\*\*\* RIVER \*\*\* \[.*? .*? .*? .*?\] \[(.*?)\]', }, 'SUMMARY' => { 'TOTAL_POT' => 'Total pot [\$\€\£]?(\d+\.?\d*)', 'MAIN_POT' => 'Main pot [\$\€\£]?(\d+\.?\d*)', 'SIDE_POT' => 'Side pot [\$\€\£]?(\d+\.?\d*)', 'RAKE' => 'Rake [\$\€\£]?(\d+\.?\d*)', 'SEAT' => 'Seat \d+\:', 'BOARD' => 'Board \[(.*?)]', } ); #-------------------------------------------------------------- # DB VARS #-------------------------------------------------------------- my (%DBTournamentAndHandIDs, %PlayerNames, %DBTableNames); # my %DBaction_type = ( # 'POST' => 2, 'FOLD' => 3, 'RETURNED' => 4, 'FINISHED' => 5, 'DOESNT_SHOW' => 6, 'CALL' => 7, 'RAISE' => 8, 'COLLECTED' => 9, 'WIN' => 10, 'CHECK' => 11, 'BET' => 12, 'SHOWED_LOST' => 13, 'SHOWED_WON' => 14, 'FOLDED' => 15, 'MUCKED' => 16, 'SHOW' => 17, 'MUCK' => 18, 'WIN_BOUNTY' => 19, 'LEAVE' => 20, 'TIMED_OUT' => 21, 'TIMED_OUT_DISCONNECT' => 22, 'SAID' => 23, 'SPLIT_BOUNTY' => 24, 'WIN_WHATEVER' => 25, 'CONNECTED' => 26, 'DISCONNECTED' => 27, 'SITTINGOUT' => 28, 'FINISHED_NOWIN' => 29, 'WIN_BOUNTY_ELIMINATING' => 30, 'WIN_BOUNTY_ELIMINATING' => 31, # ); my %DBblinds = ( 'small blind' => 1, 'big blind' => 2, 'the ante' => 3, 'button' => 4, 'small & big blinds' => 5, 'button blind' => 6, ); my %DBwhen = ( 'before Flop (didn\'t bet)' => 1, 'before Flop' => 2, 'on the Flop' => 3, 'on the Turn' => 4, 'on the River' => 5, ); my %DBpot = ( 'pot' => 1, 'main pot' => 2, 'side pot' => 3, ); my %DBgame_mode = ( 'TOURNAMENT_1' => 1, 'TOURNAMENT_2' => 2, 'TOURNAMENT_3' => 3, 'TOURNAMENT_4' => 4, 'SIXPLUSHOLDEM' => 5, 'TEMPEST' => 6, 'CASH' => 7, 'ZOOM' => 8, ); my %DBcurrency= ( 'USD' => 1, 'EUR' => 2, 'GBP' => 3, ); my %DBTournamentType= ( 'NORMAL' => 1, 'FREEROLL' => 2, ); my %DBcards = ( '2s' => 1, '3s' => 2, '4s' => 3, '5s' => 4, '6s' => 5, '7s' => 6, '8s' => 7, '9s' => 8, 'Ts' => 9, 'Js' => 10, 'Qs' => 11, 'Ks' => 12, 'As' => 13, '2h' => 14, '3h' => 15, '4h' => 16, '5h' => 17, '6h' => 18, '7h' => 19, '8h' => 20, '9h' => 21, 'Th' => 22, 'Jh' => 23, 'Qh' => 24, 'Kh' => 25, 'Ah' => 26, '2c' => 27, '3c' => 28, '4c' => 29, '5c' => 30, '6c' => 31, '7c' => 32, '8c' => 33, '9c' => 34, 'Tc' => 35, 'Jc' => 36, 'Qc' => 37, 'Kc' => 38, 'Ac' => 39, '2d' => 40, '3d' => 41, '4d' => 42, '5d' => 43, '6d' => 44, '7d' => 45, '8d' => 46, '9d' => 47, 'Td' => 48, 'Jd' => 49, 'Qd' => 50, 'Kd' => 51, 'Ad' => 52 ); #-------------------------------------------------------------- # CONF #-------------------------------------------------------------- my $DBSync = 1; my $debug = 1; my $ForkProcesses = 2; my $FileNotOlderThanMin = 11; my $LoopIntervalSec = 10; my $UtimeFiles = 0; my $UtimeFilesOnlyOnStart = 0; my $WipeAnyFile = 0; my $ForkManagerTempDir = getcwd() . "/tmp"; ############################################################### # MYSQL #-------------------------------------------------------------- my %pdb = ( 'database' => 'pkrstarsbot', 'host' => 'localhost', 'username' => 'pkrstarsbot', 'password' => 'ichpkrstarsbot#1337', 'port' => 3306, 'attributes' => { PrintError => 0, RaiseError => 1, AutoCommit => 1, } ); #my %MySQLAttr = (PrintError => 0, RaiseError => 1, HandleError => \&dbi_error_handler, AutoCommit => 0); my %MySQLAttr = (PrintError => 0, RaiseError => 1, AutoCommit => 1); my ($connection, $statement, $MySQLErrorMessage); ############################################################### # FORKMANAGER #-------------------------------------------------------------- my $pm = Parallel::ForkManager->new($ForkProcesses, $ForkManagerTempDir); $pm->run_on_start( sub { my ($pid, $Dir) = @_; print "CHILD '$pid' STARTED...\n"; # LOCK FOLDER #$FolderModified{$Dir}{'Syncing'} = 1; #print Dumper(\%FolderModified); } ); $pm->run_on_finish( sub { my ($pid, $exit_code, $ident, $exit_signal, $core_dump, $data) = @_; say "CHILD '$pid' FINISHED WITH EXIT CODE '$exit_code'"; print Dumper $data; if ($data->[1]) { if ($data->[1] eq 'error' || $data->[1] eq 'skip') { delete $HH{$data->[0]}; return; } } # UNLOCK FOLDER # $FolderModified{$Dir}{'Syncing'} = 0; $HH{$data->[0]}{'SYNCING'} = 0; #print Dumper(\%FolderModified); } ); ############################################################### # LOG4PERL #-------------------------------------------------------------- Log::Log4perl->init($Logfile); $SIG{__WARN__} = sub { local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1; WARN @_; }; $SIG{__DIE__} = sub { if($^S) { # We're in an eval {} and don't want log this message but catch it later return; } $Log::Log4perl::caller_depth++; LOGDIE @_; }; my $logger = Log::Log4perl->get_logger('rootLogger'); ############################################################### # MAIN LOOP #-------------------------------------------------------------- if ($LoopIntervalSec) { for (;;) { say ''; say "=" x 80; print "MAIN LOOP \[" . scalar(localtime(time())) . "\]\n"; &db_action_type(); my $statement = 'SELECT ID, ACTION_TYPE FROM pkrstarsbot.action_type'; my $ary_ref2 = $connection->selectcol_arrayref($statement, { Columns=>[2,1] }); my %hash = @$ary_ref2; # build hash from key-value pairs so $hash{$id} => name find(\&wanted, $RootDir); print Dumper \%HH; &StartFork() if %HH; sleep $LoopIntervalSec; } } else { &RunPKRStarsBot($RootDir); print Dumper(\%HH); } ############################################################### sub db_action_type { $connection = &pdb_connect($pdb{username}, $pdb{password}, $pdb{database}, $pdb{host}, $pdb{attributes}); my $statement = 'SELECT ID, ACTION_TYPE FROM pkrstarsbot.action_type'; my $ary_ref = $connection->selectcol_arrayref($statement, { Columns=>[2,1] }); %DBaction_type = @$ary_ref; # build hash from key-value pairs so $hash{$id} => name $connection->disconnect(); } sub pdb_query() { my ($switch, $table, $hash, $where) = @_; my $response; delete @$hash{ grep { not defined $$hash{$_} } keys %$hash }; # delete keys by their undefined values delete @$where{ grep { not defined $$where{$_} } keys %$where }; # delete keys by their undefined values my %delimeter = ( 'insert_notexists' => { 'keys' => ', ', 'values' => ', ', 'keysvalues' => ' AND ', }, 'insert' => { 'keys' => ', ', 'values' => ', ', }, 'update' => { 'keys' => ', ', 'values' => ', ', 'keysvalues' => ' AND ', }, 'get_var' => { 'keys' => ', ', 'values' => ', ', 'keysvalues' => ' AND ', }, ); my $keys_data = join($delimeter{$switch}{'keys'}, map { $_ } keys %$hash); my $values_data = join($delimeter{$switch}{'values'}, map { $connection->quote($$hash{$_}) } keys %$hash); my $keysvalues_data = join($delimeter{$switch}{'keysvalues'}, map { "$_ = " . $connection->quote($$hash{$_}) } keys %$hash); my $keys_where = join($delimeter{$switch}{'keys'}, map { $_ } keys %$where); my $values_where = join($delimeter{$switch}{'values'}, map { $connection->quote($$where{$_}) } keys %$where); my $keysvalues_where = join($delimeter{$switch}{'keysvalues'}, map { "$_ = " . $connection->quote($$where{$_}) } keys %$where); # say "$keys_data\n$values_data\n$keysvalues_data\n$keys_where\n$values_where\n$keysvalues_where"; my %template = ( 'insert_notexists' => { 'sprintf_statement' => 'INSERT INTO %s (%s) SELECT %s FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM %s WHERE %s) LIMIT 1', 'sprintf_values' => [$table, $keys_data, $values_data, $table, $keysvalues_data], 'method' => 'do', }, 'insert' => { 'sprintf_statement' => 'INSERT INTO %s (%s) VALUES (%s)', 'sprintf_values' => [$table, $keys_data, $values_data], 'method' => 'do', }, 'update' => { 'sprintf_statement' => 'UPDATE %s SET %s WHERE %s', 'sprintf_values' => [$table, $keysvalues_data, $keysvalues_where], 'method' => 'do', }, 'get_var' => { 'sprintf_statement' => 'SELECT %s FROM %s WHERE %s LIMIT 1', 'sprintf_values' => [$keys_data, $table, $keysvalues_where], 'method' => 'selectrow_array', }, ); my $query = sprintf($template{$switch}{'sprintf_statement'}, @{$template{$switch}{'sprintf_values'}}); $response = $connection->do($query) or die $connection->errstr if $template{$switch}{'method'} eq 'do'; $response = $connection->selectrow_array($query) if $template{$switch}{'method'} eq 'selectrow_array'; return $response; } sub StartFork() { foreach my $FileName (keys %HH) { if ($HH{$FileName}{'CHANGED'}) { if ($HH{$FileName}{'SYNCING'}) { say "Syncing already in process for $FileName"; next; } $HH{$FileName}{'SYNCING'} = 1; $pm->start($HH{$FileName}{'DIR_PATH'}) and next; # CHILD $connection = &pdb_connect($pdb{username}, $pdb{password}, $pdb{database}, $pdb{host}, $pdb{attributes}); &GetUserIDbyBasenameID($HH{$FileName}); &openHH($HH{$FileName}); &DBSync() if $DBSync; &WipeFileSingle($HH{$FileName}{'FULL_FILEPATH'}) if $WipeAnyFile; $connection->disconnect(); $pm->finish(0, [$FileName]); } } $pm->wait_all_children(); say "Continuing parent..."; } sub NoActionMatch() { my ($DatasetRef, $content) = @_; my $dir = "$NoActionMatch/$USER{'ID'}"; mkdir($dir, 0777) if ( !-d $dir ); my $file = "$dir/$$DatasetRef{'FILENAME'}"; open(my $in,"+>>", $file); say $in $content; close($in); } sub SkipFile() { my ($DatasetRef, $switch) = @_; my $dir; # print Dumper $DatasetRef; $dir = "$SkippedDir/$USER{'ID'}" if $switch eq 'skip'; $dir = "$ErrorDir/$USER{'ID'}" if $switch eq 'error'; mkdir($dir, 0777) if ( !-d $dir ); rename($$DatasetRef{'FULL_FILEPATH'}, "$dir/$$DatasetRef{'FILENAME'}") or warn $!; $connection->disconnect() if $connection; $pm->finish(1337, [$$DatasetRef{'FILENAME'}, $switch]); } sub Delimiter { my $SubName = shift; print "\n" . "-" x 80 . "\nSUB " . $SubName . "\n" . '-' x 80 . "\n"; } sub WipeFiles { for my $FileName (keys %HH) { if ($HH{$FileName}{'WIPE_FILE'}) { print "\[WARNING\] WIPING $HH{$FileName}{'FULL_FILEPATH'} NOW (FILE NOT SUPPORTED)\n"; unlink $HH{$FileName}{'FULL_FILEPATH'} or warn "CANT UNLINK: $!"; } elsif ($WipeAnyFile) { print "\[WARNING\] WIPING $HH{$FileName}{'FULL_FILEPATH'} NOW (WIPEANYFILE)\n"; unlink $HH{$FileName}{'FULL_FILEPATH'} or warn "CANT UNLINK: $!"; } } } sub WipeFolderContents { my $dir = shift; my $regex = "$dir/* $dir/.*"; my $errors; while ($_ = glob($regex)) { next if -d $_; say "\[WARNING\] WIPING $_ NOW (WIPEFOLDERCONTENTS)"; unlink($_) or ++$errors, warn("Can't remove $_: $!"); } #exit(1) if $errors; } sub WipeFileSingle { my $FullFilepath = shift; print "\[WARNING\] WIPING $FullFilepath NOW (WIPEANYFILE)\n"; unlink $FullFilepath or warn "CANT UNLINK: $!"; } sub GetUserIDbyBasename { my $FileName = shift; my $UserDir = uc(basename($FileName)); my $query = "SELECT `ID` FROM `reg_users` WHERE `UserName` = ?"; $statement = $connection->prepare($query); $statement->execute($UserDir); my $UserID= $statement->fetchrow(); $statement->finish; $USER{'ID'} = $UserID; } sub GetUserIDbyBasenameID { my ($DatasetRef) = shift; # GET USER ID AND CHECK IF USER EXISTS IN DB, OTHERWISE EXIT $USER{'ID'} = basename($$DatasetRef{'DIR_PATH'}); my $exists = $connection->selectrow_array('SELECT 1 `ID` FROM reg_users WHERE `ID` = ?', undef, $USER{'ID'}); if (!$exists) { say "Aborting: User with ID '$USER{'ID'}' not found in DB."; &SkipFile($$DatasetRef ,'error'); } } ############################################################### # DB SUBROUTINES #-------------------------------------------------------------- sub DBSync { return if !%HH; &dumpToFile($DUMP_FILE, \%HH); # ACTIONS #&DBUpdateConfig('FileNotOlderThanMin', $FileNotOlderThanMin); &DBGetTournamentIDsAndHandIDs(); &DBGetTableNamesAndHandIDs(); # IF DATA AVAILABLE IT WILL FILL %DBTableNames AND PREVENT DOUBLE HAND SYNCING IN &DBInsert(); #print Dumper(\%DBTableNames); &DBInsert(); open my $FH, '>', $LogfileOutput; #print $FH Dumper($HH{$filename}{'HH'}); print $FH Dumper(%HH); close $FH; } sub DBUpdateConfig { my ($key, $value) = @_; my $query = "UPDATE `pkrstarsbot`.`config` SET `Value` = '$value' WHERE `config`.`Key` = '$key'"; $statement = $connection->prepare($query); $statement->execute(); $statement->finish; } sub DBUpdateTournamentAdded { my $TournamentID = shift; my $query = "UPDATE `pkrstarsbot`.`tournaments` SET `TimeStampAdded` = CURRENT_TIMESTAMP WHERE `TournamentID` = $TournamentID"; $statement = $connection->prepare($query); $statement->execute(); $statement->finish; } sub DBInsertPlayerName { my ($PlayerName) = @_; my $query = "INSERT INTO `pkrstarsbot`.`player` (`Name`) VALUES ('$PlayerName');"; $statement = $connection->prepare($query); $statement->execute(); $statement->finish; } sub DBGetPlayerID { my ($PlayerName) = @_; my $query = "SELECT `ID` FROM `player` WHERE `Name` = '$PlayerName'"; $statement = $connection->prepare($query); $statement->execute(); my $PlayerID = $statement->fetchrow(); $statement->finish; return $PlayerID; } sub DBUpdateSynced { my ($Dataset_ref, $HandNr) = @_; my $HandID = $$Dataset_ref{$HandNr}{'HANDID'}; my $query = "UPDATE `pkrstarsbot`.`hands` SET `SYNCED` = 1 WHERE `hands`.`HandID` = $HandID AND `hands`.`UserID` = $USER{'ID'}"; $statement = $connection->prepare($query); $statement->execute(); $statement->finish; } sub DBInsert { for my $filename (keys %HH) { # IF NO HANDS IN HISTORY next if !$HH{$filename}{'HH'}; next if $HH{$filename}{'DBSYNC_SKIP'}; for my $HandNr (sort {$a<=>$b} keys %{$HH{$filename}{'HH'}}) { my $TournamentID = $HH{$filename}{'HH'}{$HandNr}{'TOURNAMENTID'}; my $HandID = $HH{$filename}{'HH'}{$HandNr}{'HANDID'}; say ''; say "=" x 80; say "Syncing Hand #$HandID @" . scalar(localtime(time())) . " (File: $HH{$filename}{'FILENAME'})"; say "\t-> tournament #$TournamentID"; # ACTIONS my $GameMode = $HH{$filename}{'HH'}{$HandNr}{'GAME_MODE'}; # if ($GameMode eq 'TOURNAMENT' || $GameMode eq 'ZOOM_TOURNAMENT') { if ($GameMode =~ m/TOURNAMENT/) { &DBCheckSyncTournaments($HH{$filename}{'HH'}, $HandNr); } # elsif ($GameMode eq 'CASH_GAME' || $GameMode eq 'ZOOM') { elsif ($GameMode eq 'SIXPLUSHOLDEM' || $GameMode eq 'ZOOM' || $GameMode eq 'TEMPEST' || $GameMode eq 'CASH') { &DBCheckSyncTables($HH{$filename}{'HH'}, $HandNr); } last if $HH{$filename}{'HH'}{$HandNr}{'DBSYNC_SKIP'}; &DBGetInsertPlayers($HH{$filename}{'HH'}, $HandNr); #print Dumper \%PlayerNames; # die; &DBCheckSyncHandsGeneral($HH{$filename}{'HH'}, $HandNr, $filename); # MARK HAND AS FULLY SYNCED &DBUpdateSynced($HH{$filename}{'HH'}, $HandNr); # LAST HANDACTION OF A HAND #if ($HandNr == scalar(keys($HH{$filename}{'HH'}))) { # print "LAST ENTRY FOR $filename: $HandNr\n"; #} } } } sub DBCheckSyncTables { my ($DatasetRef, $HandNr) = @_; if (!$DBTableNames{$$DatasetRef{$HandNr}{'TABLE_NUMBER'}}) { # CHECK IF TABLE ALREADY IN DB my $row_ref = &DBTableExistsByName($$DatasetRef{$HandNr}{'TABLE_NUMBER'}); # TABLE NOT YET IN DB. INSERT AND CREATE MAPPING if (!@$row_ref) { print "Table $$DatasetRef{$HandNr}{'TABLE_NUMBER'} not yet in DB\n"; # CURRENCY my $currency; if ($$DatasetRef{$HandNr}{'CURRENCY'}) { $currency = $DBcurrency{$$DatasetRef{$HandNr}{'CURRENCY'}}; } # TABLE my $query = "INSERT INTO `pkrstarsbot`.`table_names` (`TABLE_NUMBER` ,`LIMIT_TYPE` ,`GAME_TYPE` ,`TABLE_MAX_TYPE` ,`SMALL_BLIND` ,`BIG_BLIND`, `CURRENCY`) VALUES (?, ?, ?, ?, ?, ?, ?);"; $statement = $connection->prepare($query); $statement->execute($$DatasetRef{$HandNr}{'TABLE_NUMBER'}, $$DatasetRef{$HandNr}{'LIMIT_TYPE'}, $$DatasetRef{$HandNr}{'GAME_TYPE'}, $$DatasetRef{$HandNr}{'TABLE_MAX_TYPE'}, $$DatasetRef{$HandNr}{'SMALL_BLIND'}, $$DatasetRef{$HandNr}{'BIG_BLIND'}, $currency); $statement->finish; } # GET ID AND PUT INTO %DBTableNames my $row_ref2 = &DBTableExistsByName($$DatasetRef{$HandNr}{'TABLE_NUMBER'}); $DBTableNames{$$DatasetRef{$HandNr}{'TABLE_NUMBER'}}{'ID'} = $$row_ref2[0]; # TABLE MAPPING #my $query2 = "INSERT INTO `pkrstarsbot`.`table_names_mapping` (`UserID` ,`TABLE_NAME_ID`) VALUES (?, ?);"; my $query2 = "INSERT INTO `pkrstarsbot`.`table_names_mapping` (`UserID` ,`TABLE_NAME_ID`) SELECT $USER{'ID'}, $DBTableNames{$$DatasetRef{$HandNr}{'TABLE_NUMBER'}}{'ID'} FROM dual WHERE NOT EXISTS (SELECT 1 FROM `pkrstarsbot`.`table_names_mapping` WHERE UserID = $USER{'ID'} AND TABLE_NAME_ID = $DBTableNames{$$DatasetRef{$HandNr}{'TABLE_NUMBER'}}{'ID'});"; $statement = $connection->prepare($query2); $statement->execute(); $statement->finish; } else { #print "Table $$DatasetRef{$HandNr}{'TABLE_NUMBER'} ALREADY in DB\n"; } } sub DBTableExistsByName { my $TableName = shift; my $query = "Select table_names.ID From table_names Where table_names.TABLE_NUMBER = '$TableName'"; $statement = $connection->prepare($query); $statement->execute(); my @row = $statement->fetchrow_array; $statement->finish; return \@row; } sub DBSyncBetrounds { my ($DatasetRef, $HandNr) = @_; # print Dumper $$DatasetRef{$HandNr}{'BETROUNDS'}; &DBSyncPreHoleCardSeats($DatasetRef, $HandNr); &DBSyncPreHoleCards($DatasetRef, $HandNr); &DBSyncHoleCards($DatasetRef, $HandNr); &DBSyncFlop($DatasetRef, $HandNr); &DBSyncTurn($DatasetRef, $HandNr); &DBSyncRiver($DatasetRef, $HandNr); &DBSyncShowDown($DatasetRef, $HandNr); &DBSyncSummary($DatasetRef, $HandNr); } sub DBSyncShowDown { my ($DatasetRef, $HandNr) = @_; if ($$DatasetRef{$HandNr}{'BETROUNDS'}{'SHOWDOWN'}) { &DBSyncBetround($DatasetRef, $HandNr, 'SHOWDOWN'); } } sub DBSyncSummary { my ($DatasetRef, $HandNr) = @_; if ($$DatasetRef{$HandNr}{'BETROUNDS'}{'SUMMARY'}) { &DBSyncBetround($DatasetRef, $HandNr, 'SUMMARY'); } } sub DBSyncRiver { my ($DatasetRef, $HandNr) = @_; if ($$DatasetRef{$HandNr}{'BETROUNDS'}{'RIVER'}) { &DBSyncBetround($DatasetRef, $HandNr, 'RIVER'); } } sub DBSyncTurn { my ($DatasetRef, $HandNr) = @_; if ($$DatasetRef{$HandNr}{'BETROUNDS'}{'TURN'}) { &DBSyncBetround($DatasetRef, $HandNr, 'TURN'); } } sub DBSyncFlop { my ($DatasetRef, $HandNr) = @_; if ($$DatasetRef{$HandNr}{'BETROUNDS'}{'FLOP'}) { &DBSyncBetround($DatasetRef, $HandNr, 'FLOP'); } } sub DBSyncHoleCards { my ($DatasetRef, $HandNr) = @_; &DBSyncBetround($DatasetRef, $HandNr, 'HOLECARDS'); } sub DBSyncBetround { my ($DatasetRef, $HandNr, $Betround) = @_; my $BetroundLC = lc($Betround); say "\t-> $Betround"; # IDs my $TournamentID = $$DatasetRef{$HandNr}{'TOURNAMENTID'} ? $$DatasetRef{$HandNr}{'TOURNAMENTID'} : '-'; my $HandID = $$DatasetRef{$HandNr}{'HANDID'}; # print Dumper($$DatasetRef{$HandNr}); # print "TournamentID: $TournamentID\tHandID: $HandID\tBetround: $Betround\n"; for my $ActionNr (keys %{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}}) { #if (!$DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}) { # print "$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}\n"; #} # print Dumper($$DatasetRef{$HandNr}); # open my $FH, '>', 'outfile.txt'; # print $FH Dumper(\%HH); # close $FH; if ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'FOLD' || $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'NOSHOW' || $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'CHECK' || $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'MUCK' || $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'TIMED_OUT' || $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'TIMED_OUT_DISCONNECT') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `UserID`) VALUES (?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $USER{'ID'}); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'POST') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `AMOUNT`, `UserID`) VALUES (?, ?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; my $Amount = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'AMOUNT'}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $Amount, $USER{'ID'}); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'RETURNED') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `AMOUNT`, `UserID`) VALUES (?, ?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; my $Amount = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'AMOUNT'}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $Amount, $USER{'ID'}); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'FINISHED_TOURNAMENT') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `PLACE`, `AMOUNT_RECEIVED`, `UserID`) VALUES (?, ?, ?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; my $Place = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'PLACE'}; my $AmountReceived = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'AMOUNT_RECEIVED'}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $Place, $AmountReceived, $USER{'ID'}); $statement->finish; my $OwnPlayer = $$DatasetRef{$HandNr}{'OWN_PLAYER'}; my $PlayerName = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}; if ($PlayerName eq $OwnPlayer) { # UPDATE PLAYER FINISHED &DBUpdateTournamentPlayerFinished($DatasetRef, $HandNr); } } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'CALL' || $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'BET') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `AMOUNT`, `ALL-IN`, `UserID`) VALUES (?, ?, ?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; my $Amount = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'AMOUNT'}; my $AllIn = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ALL-IN'}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $Amount, $AllIn, $USER{'ID'}); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'RAISE') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `ALL-IN`, `RAISE_FROM`, `RAISE_TO`, `UserID`) VALUES (?, ?, ?, ?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; my $AllIn = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ALL-IN'}; my $RaiseFrom = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'RAISE_FROM'}; my $RaiseTo = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'RAISE_TO'}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $AllIn, $RaiseFrom, $RaiseTo, $USER{'ID'}); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'COLLECTED') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `FROM`, `AMOUNT`, `UserID`) VALUES (?, ?, ?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; my $FromID = $DBpot{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'FROM'}} if $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'FROM'}; my $Amount = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'AMOUNT'}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $FromID, $Amount, $USER{'ID'}); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'WIN_TOURNAMENT') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `AMOUNT_RECEIVED`, `UserID`) VALUES (?, ?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; my $AmountReceived = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'AMOUNT_RECEIVED'}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $AmountReceived, $USER{'ID'}); $statement->finish; my $OwnPlayer = $$DatasetRef{$HandNr}{'OWN_PLAYER'}; my $PlayerName = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}; if ($PlayerName eq $OwnPlayer) { # UPDATE PLAYER FINISHED &DBUpdateTournamentPlayerFinished($DatasetRef, $HandNr); } } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'SUMMARY_SHOWED_LOST' || $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'SUMMARY_SHOWED_WON' || $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'SUMMARY_MUCKED') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `SUMMARYSEATNR`, `POS1`, `POS2`, `HAND_DESCRIPTION`, `CARD1`, `CARD2`, `AMOUNT`, `UserID`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; my $SummarySeatNr = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'SUMMARYSEATNR'}; my $Pos1 = $DBblinds{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'POSITION'}{1}} if $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'POSITION'}{1}; my $Pos2 = $DBblinds{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'POSITION'}{2}} if $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'POSITION'}{2}; my $HandDescription = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'HAND_DESCRIPTION'} if $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'HAND_DESCRIPTION'}; my $Card1 = $DBcards{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'CARDS'}{1}}; my $Card2 = $DBcards{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'CARDS'}{2}}; my $Amount = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'AMOUNT'} if $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'AMOUNT'}; # print Dumper $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}; # die; print Dumper $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr} if !$NameID; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $SummarySeatNr, $Pos1, $Pos2, $HandDescription, $Card1, $Card2, $Amount, $USER{'ID'}); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'SUMMARY_FOLDED') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `SUMMARYSEATNR`, `POS1`, `POS2`, `WHEN`, `UserID`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; my $SummarySeatNr = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'SUMMARYSEATNR'}; my $Pos1 = $DBblinds{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'POSITION'}{1}} if $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'POSITION'}{1}; my $Pos2 = $DBblinds{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'POSITION'}{2}} if $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'POSITION'}{2}; my $When = $DBwhen{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'WHEN'}}; # print Dumper \%PlayerNames; # print Dumper $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}; print Dumper $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr} if !$NameID; print Dumper \%PlayerNames if !$NameID; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $SummarySeatNr, $Pos1, $Pos2, $When, $USER{'ID'}); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'SUMMARY_COLLECTED') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `SUMMARYSEATNR`, `POS1`, `POS2`, `UserID`) VALUES (?, ?, ?, ?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; my $SummarySeatNr = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'SUMMARYSEATNR'}; my $Pos1 = $DBblinds{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'POSITION'}{1}} if $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'POSITION'}{1}; my $Pos2 = $DBblinds{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'POSITION'}{2}} if $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'POSITION'}{2}; print Dumper $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr} if !$NameID; print Dumper \%PlayerNames if !$NameID; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $SummarySeatNr, $Pos1, $Pos2, $USER{'ID'}); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'SHOW') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `HAND_DESCRIPTION`, `CARD1`, `CARD2`, `UserID`) VALUES (?, ?, ?, ?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; my $HandDescription = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'HAND_DESCRIPTION'}; my $Card1 = $DBcards{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'CARDS'}{1}}; my $Card2 = $DBcards{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'CARDS'}{2}}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $HandDescription, $Card1, $Card2, $USER{'ID'}); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'WIN_BOUNTY') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `NAME_ELIMINATED`, `AMOUNT`, `UserID`) VALUES (?, ?, ?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; my $NameEliminated = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME_ELIMINATED'}}{'ID'}; my $Amount = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'AMOUNT'}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $NameEliminated, $Amount, $USER{'ID'}); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'SPLIT_BOUNTY') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `NAME_ELIMINATED`, `AMOUNT`, `UserID`, `SPLIT_BOUNTY_PLAYERS`, `SPLIT_BOUNTY_AMOUNT`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; my $NameEliminated = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME_ELIMINATED'}}{'ID'}; my $Amount = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'AMOUNT'}; my $SplitBountyPlayers = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'SPLIT_BOUNTY_PLAYERS'}; my $SplitBountyAmount = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'SPLIT_BOUNTY_AMOUNT'}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $NameEliminated, $Amount, $USER{'ID'}, $SplitBountyPlayers, $SplitBountyAmount); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'LEAVE') { # REGISTER NEW PLAYER IN DB AND PLAYERNAMES IF NEEDED if (!$PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}) { my $PlayerID = &DBGetPlayerID($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}); if ($PlayerID) { $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'} = $PlayerID; } else { &DBInsertPlayerName($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}); $PlayerID = &DBGetPlayerID($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}); $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'} = $PlayerID; } } my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `UserID`) VALUES (?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $USER{'ID'}); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'SAID') { # REGISTER NEW PLAYER IN DB AND PLAYERNAMES IF NEEDED (NOT SURE IF OBSERVER SAID_DATA GET INTO LOGS) if (!$PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}) { my $PlayerID = &DBGetPlayerID($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}); if ($PlayerID) { $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'} = $PlayerID; } else { &DBInsertPlayerName($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}); $PlayerID = &DBGetPlayerID($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}); $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'} = $PlayerID; } } my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `UserID`, `SAID_DATA`) VALUES (?, ?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; my $SaidData = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'SAID_DATA'}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $USER{'ID'}, $SaidData); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'WIN_WHATEVER') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `UserID`, `WIN_DATA`) VALUES (?, ?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; my $WinData = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'WIN_DATA'}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $USER{'ID'}, $WinData); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'DISCONNECTED') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `UserID`) VALUES (?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $USER{'ID'}); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'CONNECTED') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `UserID`) VALUES (?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $USER{'ID'}); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'SITTINGOUT') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `UserID`) VALUES (?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $USER{'ID'}); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'FINISHED_NOWIN') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `UserID`) VALUES (?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $USER{'ID'}); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'WIN_BOUNTY_ELIMINATING') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `UserID`, `NAME_ELIMINATED`, `AMOUNT`, `BOUNTY_FROM`, `BOUNTY_TO`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; my $Amount = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'AMOUNT'}; my $NameEliminated = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME_ELIMINATED'}; my $BountyFrom = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'BOUNTY_FROM'}; my $BountyTo = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'BOUNTY_TO'}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $USER{'ID'}, $NameEliminated, $Amount, $BountyFrom, $BountyTo); $statement->finish; } elsif ($$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'} eq 'WIN_TOURNAMENT_RECEIVE') { my $query = "INSERT INTO `pkrstarsbot`.`$BetroundLC` (`HandID`, `NAME`, `ACTION`, `ActionNr`, `UserID`, `AMOUNT_RECEIVED`) VALUES (?, ?, ?, ?, ?, ?);"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'NAME'}}{'ID'}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'ACTION'}}; my $AmountReceived = $$DatasetRef{$HandNr}{'BETROUNDS'}{$Betround}{$ActionNr}{'AMOUNT_RECEIVED'}; $statement = $connection->prepare($query); $statement->execute($HandID, $NameID, $ActionID, $ActionNr, $USER{'ID'}, $AmountReceived); $statement->finish; } } } sub DBSyncPreHoleCards { my ($DatasetRef, $HandNr) = @_; #print Dumper($$DatasetRef{$HandNr}); say "\t-> preholecards"; # IDs my $TournamentID = $$DatasetRef{$HandNr}{'TOURNAMENTID'}; my $HandID = $$DatasetRef{$HandNr}{'HANDID'}; my $query = "INSERT INTO `pkrstarsbot`.`preholecards` (`HandID`, `NAME`, `AMOUNT`, `TYPE`, `ACTION`, `ALL-IN`, `ActionNr`, `UserID`) VALUES (?, ?, ?, ?, ?, ?, ?, ?);"; $statement = $connection->prepare($query); for my $ActionNr (keys %{$$DatasetRef{$HandNr}{'BETROUNDS'}{'PREHOLECARDS'}}) { #print "Inserting...\n"; #print "NAME: $$DatasetRef{$HandNr}{'BETROUNDS'}{'PREHOLECARDS'}{$ActionNr}{'NAME'}\n"; my $NameID = $PlayerNames{$$DatasetRef{$HandNr}{'BETROUNDS'}{'PREHOLECARDS'}{$ActionNr}{'NAME'}}{'ID'}; my $TypeID = $DBblinds{$$DatasetRef{$HandNr}{'BETROUNDS'}{'PREHOLECARDS'}{$ActionNr}{'TYPE'}}; my $ActionID = $DBaction_type{$$DatasetRef{$HandNr}{'BETROUNDS'}{'PREHOLECARDS'}{$ActionNr}{'ACTION'}}; my $Amount = $$DatasetRef{$HandNr}{'BETROUNDS'}{'PREHOLECARDS'}{$ActionNr}{'AMOUNT'}; my $AllIn = $$DatasetRef{$HandNr}{'BETROUNDS'}{'PREHOLECARDS'}{$ActionNr}{'ALL-IN'}; $statement->execute($HandID, $NameID, $Amount, $TypeID, $ActionID, $AllIn, $ActionNr, $USER{'ID'}); } } sub DBSyncPreHoleCardSeats { my ($DatasetRef, $HandNr) = @_; say "\t-> preholecardseats"; # IDs my $HandID = $$DatasetRef{$HandNr}{'HANDID'}; for my $PlayerName (keys %{$$DatasetRef{$HandNr}{'PLAYERS'}}) { my $NameID = $PlayerNames{$PlayerName}{'ID'}; my $Amount = $$DatasetRef{$HandNr}{'PLAYERS'}{$PlayerName}{'CHIPS_AMOUNT'}; my $PreHoleCardSeatNr = $$DatasetRef{$HandNr}{'PLAYERS'}{$PlayerName}{'PREHOLECARDSSEATNR'}; my $SitOut = $$DatasetRef{$HandNr}{'PLAYERS'}{$PlayerName}{'SIT_OUT'}; my $BountyAmount = $$DatasetRef{$HandNr}{'PLAYERS'}{$PlayerName}{'BOUNTY_AMOUNT'} if $$DatasetRef{$HandNr}{'PLAYERS'}{$PlayerName}{'BOUNTY_AMOUNT'}; my $response = &pdb_query('insert_notexists', 'pkrstarsbot.preholecardseats', {'HandID' => $HandID, 'NAME' => $NameID, 'PREHOLECARDSSEATNR' => $PreHoleCardSeatNr, 'CHIPS_AMOUNT' => $Amount, 'SIT_OUT' => $SitOut, 'BOUNTY_AMOUNT' => $BountyAmount}); # $statement = $connection->prepare($query); # $statement->execute(); # $statement->finish; # eval { # $statement = $connection->prepare($query); # # $statement->execute($HandID, $NameID, $PreHoleCardSeatNr, $Amount, $SitOut, $HandID, $NameID, $PreHoleCardSeatNr, $Amount, $SitOut); # $statement->execute(); # }; # # ... then check if there was an error. (Deadlock error is 1213.) # if ($@) { # if ($DBI::err == 1213) { # print "Deadlock! Retrying ...\n"; # redo; # } # else { # print "DBI Error: $DBI::errstr\n"; # print "Query: $query\n"; # #print "PlayerName: $PlayerName\n"; # #last; # } # } } } sub DBStartSyncHandsGeneral { &Delimiter((caller(0))[3]); my ($DatasetRef, $HandNr, $TableName, $HandID) = @_; &DBInsertNewHandCashGame($DatasetRef, $HandNr); push(@{$DBTableNames{$TableName}{'HANDS'}}, $HandID); return if $$DatasetRef{$HandNr}{'DBSYNC_SKIP'}; &DBSyncBetrounds($DatasetRef, $HandNr); } sub DBStartSyncTournaments { my ($DatasetRef, $HandNr, $HandID, $TournamentID) = @_; &DBInsertNewHand($DatasetRef, $HandNr); push(@{$DBTournamentAndHandIDs{$TournamentID}{'HandIDs'}}, $HandID); &DBSyncBetrounds($DatasetRef, $HandNr); } sub DBDoubleCheckSyncHandsGeneral { my ($DatasetRef, $HandNr, $filename, $TableName) = @_; print "DOUBLE CHECKING NOW\n"; for my $HandNr (sort {$a<=>$b} keys %{$DatasetRef}) { #print "HANDID: $$DatasetRef{$HandNr}{'HANDID'}\n"; push(@{$HH{$filename}{'HH_HANDID'}}, $$DatasetRef{$HandNr}{'HANDID'}); } my $HandIDs = join(',', @{$HH{$filename}{'HH_HANDID'}}); my $query = "select DISTINCT HandID from hands where HandID in ($HandIDs)"; #print Dumper $query; $statement = $connection->prepare($query); $statement->execute(); while (my $SQLHandID = $statement->fetchrow_array) { #print "Returned HandID: $SQLHandID\n"; push(@{$DBTableNames{$TableName}{'HANDS'}}, $SQLHandID); } $statement->finish; } sub DBCheckSyncHandsGeneral { my ($DatasetRef, $HandNr, $filename) = @_; # IDs my $TournamentID = $$DatasetRef{$HandNr}{'TOURNAMENTID'}; my $HandID = $$DatasetRef{$HandNr}{'HANDID'}; my $GameMode = $$DatasetRef{$HandNr}{'GAME_MODE'}; # if ($GameMode eq 'TOURNAMENT' || $GameMode eq 'ZOOM_TOURNAMENT') { if ($GameMode =~ m/TOURNAMENT/) { if (!$DBTournamentAndHandIDs{$TournamentID}{'HandIDs'}) { &DBStartSyncTournaments($DatasetRef, $HandNr, $HandID, $TournamentID); } elsif ($DBTournamentAndHandIDs{$TournamentID}{'HandIDs'}) { #print Dumper($DBTournamentAndHandIDs{$TournamentID}{'HandIDs'}); if (my ($matched) = grep $_ eq $HandID, @{$DBTournamentAndHandIDs{$TournamentID}{'HandIDs'}}) { say "\t-> hand already inserted"; } else { &DBStartSyncTournaments($DatasetRef, $HandNr, $HandID, $TournamentID); } } } elsif ($GameMode !~ m/TOURNAMENT/) { my $TableName = $$DatasetRef{$HandNr}{'TABLE_NUMBER'}; if (!$DBTableNames{$TableName}{'HANDS'}) { # ARRAY $DBTableNames{$TableName}{'HANDS'} DOES NOT EXIST YET #print "ARRAY DOES NOT EXIST YET\n"; # DOUBLE CHECK IF HAND EXIST BECAUSE OF FileNotOlderThanMin # PLAYER COULD SIT OUT ON CASH GAME FOR LONGER THAN FileNotOlderThanMin SO THIS WOULD ADD SAME HANDS TWICE OR MORE # FILLS @{$DBTableNames{$TableName}{'HANDS'}} TO PREVENT DUPLICATE SYNCING if (!$$DatasetRef{'ARRAY_HANDID'}) { &DBDoubleCheckSyncHandsGeneral($DatasetRef, $HandNr, $filename, $TableName); } if (my ($matched) = grep $_ eq $HandID, @{$DBTableNames{$TableName}{'HANDS'}}) { print "DOUBLE CHECK: Hand $HandID was already synced with DB.\n"; } else { &DBStartSyncHandsGeneral($DatasetRef, $HandNr, $TableName, $HandID); } } elsif ($DBTableNames{$TableName}{'HANDS'}) { # ARRAY $DBTableNames{$TableName}{'HANDS'} ALREADY EXISTS #print "ARRAY DOES EXIST\n"; if (my ($matched) = grep $_ eq $HandID, @{$DBTableNames{$TableName}{'HANDS'}}) { print "Hand $HandID was already synced with DB.\n"; } else { &DBStartSyncHandsGeneral($DatasetRef, $HandNr, $TableName, $HandID); } } } } sub DBCheckSyncTournaments { my ($DatasetRef, $HandNr) = @_; # IDs my $TournamentID = $$DatasetRef{$HandNr}{'TOURNAMENTID'}; # CHECK/SYNC TOURNAMENTS if (!$DBTournamentAndHandIDs{$TournamentID}) { say "\t-> inserting tournament"; &DBInsertNewTournament($$DatasetRef{$HandNr}); } else { say "\t-> tournament already inserted"; } } sub DBGetInsertPlayers { my ($DatasetRef, $HandNr) = @_; # Tournament / Hand ID my $TournamentID = $$DatasetRef{$HandNr}{'TOURNAMENTID'}; my $HandID = $$DatasetRef{$HandNr}{'HANDID'}; # GET PLAYER LISTING my %UniqueNames; for my $PlayerName (keys %{$$DatasetRef{$HandNr}{'PLAYERS'}}) { $UniqueNames{$PlayerName} = undef; } #print Dumper(\%UniqueNames); # DELETE KNOWN PLAYER my %Skip = %UniqueNames; for my $PlayerName (keys %Skip) { if ($PlayerNames{$PlayerName}) { delete $Skip{$PlayerName}; } } if (!%Skip) { say "\t-> all players already inserted"; return; } # UniqueNames has at least 1 item here my $SQLNames; my $i = 1; for my $PlayerName (keys %UniqueNames) { # SQL FIX: USERNAMES CAN CONTAIN ' CHARACTER, THEY HAVE TO BE ESCAPED TO GET RIGHT SQL PLAYERLISTING $PlayerName = $connection->quote($PlayerName); $SQLNames = $SQLNames . "$PlayerName, " if $i < scalar(keys(%UniqueNames)); $SQLNames = $SQLNames . "$PlayerName" if $i == scalar(keys(%UniqueNames)); $i++; } #print Dumper($SQLNames); # CHECK EXISTING PLAYER IN DB my $hash_ref = &DBCheckPlayerNamesExist($SQLNames); if ($hash_ref) { %PlayerNames = (%PlayerNames, %$hash_ref); # DELETE KNOWN PLAYER for my $PlayerName (keys %UniqueNames) { if ($PlayerNames{$PlayerName}) { delete $UniqueNames{$PlayerName}; } } } # INSERT UNKNOWN PLAYER if (%UniqueNames) { my $query = "INSERT INTO `pkrstarsbot`.`player` (Name) SELECT ? FROM dual WHERE NOT EXISTS (SELECT 1 FROM `pkrstarsbot`.`player` WHERE `Name` = ?)"; $statement = $connection->prepare($query); for my $PlayerName (keys %UniqueNames) { say "\t-> inserting new player $PlayerName"; $statement->execute($PlayerName, $PlayerName); } $statement->finish; # SYNC AGAIN TO GET INSERTED ID's my $hash_ref = &DBCheckPlayerNamesExist($SQLNames); #print Dumper($hash_ref); %PlayerNames = (%PlayerNames, %$hash_ref); #print Dumper(\%PlayerNames); } else { say "\t-> all player already inserted (REMOVE THIS?)"; } } sub DBCheckPlayerNamesExist { my $SQLNames = shift; # CHECK WHICH PLAYERS ARE ALREADY IN DB AND GET ID AT THE SAME TIME # my $query = "SELECT * FROM player WHERE `Name` in (?);"; my $query = "SELECT * FROM player WHERE `Name` in ($SQLNames);"; #print "QUERY: $query\n"; $statement = $connection->prepare($query); $statement->execute(); return my $hash_ref = $statement->fetchall_hashref('Name'); } sub DBUpdateTournamentTimeStamp { my ($DatasetRef, $HandNr) = @_; #my $query = "UPDATE `pkrstarsbot`.`tournaments` SET `TimeStamp` = TIMESTAMP( '' ) WHERE `TournamentID` = $$DatasetRef{$HandNr}{'TOURNAMENTID'}"; my $query = "UPDATE `pkrstarsbot`.`tournaments` SET `TimeStamp` = now() WHERE `TournamentID` = $$DatasetRef{$HandNr}{'TOURNAMENTID'}"; $statement = $connection->prepare($query); $statement->execute(); $statement->finish; } sub DBUpdateTournamentPlayerFinished { my ($DatasetRef, $HandNr) = @_; my $query = "UPDATE `pkrstarsbot`.`tournaments` SET `PLAYER_FINISHED` = 1 WHERE `TournamentID` = $$DatasetRef{$HandNr}{'TOURNAMENTID'} AND `UserID` = $USER{'ID'}"; $statement = $connection->prepare($query); $statement->execute(); $statement->finish; } sub DBUpdateCashGameTimeStamp { my ($DatasetRef, $HandNr) = @_; my $TableNameID = $DBTableNames{$$DatasetRef{$HandNr}{'TABLE_NUMBER'}}{'ID'}; #my $query = "UPDATE `pkrstarsbot`.`table_names_mapping` SET `TimeStampUpdate` = TIMESTAMP( '' ) WHERE `UserID` = $USER{'ID'} And `TABLE_NAME_ID` = $TableNameID"; my $query = "UPDATE `pkrstarsbot`.`table_names_mapping` SET `TimeStampUpdate` = now() WHERE `UserID` = $USER{'ID'} And `TABLE_NAME_ID` = $TableNameID"; $statement = $connection->prepare($query); $statement->execute(); $statement->finish; } sub DBInsertNewHand { my ($DatasetRef, $HandNr) = @_; #print Dumper($$DatasetRef{$HandNr}); say "\t-> inserting new hand"; # UPDATE TOURNAMENT TIMESTAMP &DBUpdateTournamentTimeStamp($DatasetRef, $HandNr); # BOARD AND POTS my ($Board1, $Board2, $Board3, $Board4, $Board5); if ($$DatasetRef{$HandNr}{'BOARD'}) { $Board1 = $DBcards{$$DatasetRef{$HandNr}{'BOARD'}{1}}; $Board2 = $DBcards{$$DatasetRef{$HandNr}{'BOARD'}{2}}; $Board3 = $DBcards{$$DatasetRef{$HandNr}{'BOARD'}{3}}; $Board4 = $DBcards{$$DatasetRef{$HandNr}{'BOARD'}{4}} if $$DatasetRef{$HandNr}{'BOARD'}{4}; $Board5 = $DBcards{$$DatasetRef{$HandNr}{'BOARD'}{5}} if $$DatasetRef{$HandNr}{'BOARD'}{5}; } my $MainPot = $$DatasetRef{$HandNr}{'MAIN_POT'} if $$DatasetRef{$HandNr}{'MAIN_POT'}; my $SidePot = $$DatasetRef{$HandNr}{'SIDE_POT'} if $$DatasetRef{$HandNr}{'SIDE_POT'}; # MATCH ROUND my $MatchRound; if ($$DatasetRef{$HandNr}{'MATCH_ROUND'}) { $MatchRound = $$DatasetRef{$HandNr}{'MATCH_ROUND'}; } my $query = "INSERT INTO `pkrstarsbot`.`hands` (`TournamentID`, `HandNr`, `SMALL_BLIND`, `START_MINUTES`, `TABLE_NUMBER`, `BLIND_LEVEL`, `BUTTON_SEAT`, `START_HOUR`, `START_DAY`, `START_YEAR`, `BIG_BLIND`, `START_SECONDS`, `START_MONTH`, `TIMEZONE`, `HandID`, `Rake`, `OWN_PLAYER`, `OWN_CARD1`, `OWN_CARD2`, `TOTAL_POT`, `BOARD1`, `BOARD2`, `BOARD3`, `BOARD4`, `BOARD5`, `MAIN_POT`, `SIDE_POT`, `GAME_MODE`, `UserID`, `MATCH_ROUND`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"; my @values = ($$DatasetRef{$HandNr}{'TOURNAMENTID'}, $HandNr, $$DatasetRef{$HandNr}{'SMALL_BLIND'}, $$DatasetRef{$HandNr}{'START_MINUTES'}, $$DatasetRef{$HandNr}{'TABLE_NUMBER'}, $$DatasetRef{$HandNr}{'BLIND_LEVEL'}, $$DatasetRef{$HandNr}{'BUTTON_SEAT'}, $$DatasetRef{$HandNr}{'START_HOUR'}, $$DatasetRef{$HandNr}{'START_DAY'}, $$DatasetRef{$HandNr}{'START_YEAR'}, $$DatasetRef{$HandNr}{'BIG_BLIND'}, $$DatasetRef{$HandNr}{'START_SECONDS'}, $$DatasetRef{$HandNr}{'START_MONTH'}, $$DatasetRef{$HandNr}{'TIMEZONE'}, $$DatasetRef{$HandNr}{'HANDID'}, $$DatasetRef{$HandNr}{'RAKE'}, $PlayerNames{$$DatasetRef{$HandNr}{'OWN_PLAYER'}}{'ID'}, $DBcards{$$DatasetRef{$HandNr}{'OWN_CARDS'}{1}}, $DBcards{$$DatasetRef{$HandNr}{'OWN_CARDS'}{2}}, $$DatasetRef{$HandNr}{'TOTAL_POT'}, $Board1, $Board2, $Board3, $Board4, $Board5, $MainPot, $SidePot, $DBgame_mode{$$DatasetRef{$HandNr}{'GAME_MODE'}}, $USER{'ID'}, $MatchRound); # print Dumper \@values; $statement = $connection->prepare($query); $statement->execute(@values); $statement->finish; } sub DBInsertNewHandCashGame { my ($DatasetRef, $HandNr) = @_; # UPDATE TOURNAMENT TIMESTAMP &DBUpdateCashGameTimeStamp($DatasetRef, $HandNr); print "\n$$DatasetRef{$HandNr}{'GAME_MODE'} HAND $$DatasetRef{$HandNr}{'HANDID'} ON $$DatasetRef{$HandNr}{'TABLE_NUMBER'}: Syncing... \[" . scalar(localtime(time())) . "\]\n"; my ($Board1, $Board2, $Board3, $Board4, $Board5); if ($$DatasetRef{$HandNr}{'BOARD'}) { $Board1 = $DBcards{$$DatasetRef{$HandNr}{'BOARD'}{1}}; $Board2 = $DBcards{$$DatasetRef{$HandNr}{'BOARD'}{2}}; $Board3 = $DBcards{$$DatasetRef{$HandNr}{'BOARD'}{3}}; $Board4 = $DBcards{$$DatasetRef{$HandNr}{'BOARD'}{4}} if $$DatasetRef{$HandNr}{'BOARD'}{4}; $Board5 = $DBcards{$$DatasetRef{$HandNr}{'BOARD'}{5}} if $$DatasetRef{$HandNr}{'BOARD'}{5}; } #my $MainPot; #if ($$DatasetRef{$HandNr}{'MAIN_POT'}) { $MainPot = $$DatasetRef{$HandNr}{'MAIN_POT'} } else { $MainPot = undef } my $MainPot = $$DatasetRef{$HandNr}{'MAIN_POT'} ? $$DatasetRef{$HandNr}{'MAIN_POT'} : undef; my $SidePot = $$DatasetRef{$HandNr}{'SIDE_POT'} ? $$DatasetRef{$HandNr}{'SIDE_POT'} : undef; # my $MainPot = $$DatasetRef{$HandNr}{'MAIN_POT'} if $$DatasetRef{$HandNr}{'MAIN_POT'}; # my $SidePot = $$DatasetRef{$HandNr}{'SIDE_POT'} if $$DatasetRef{$HandNr}{'SIDE_POT'}; my $TableNameID = $DBTableNames{$$DatasetRef{$HandNr}{'TABLE_NUMBER'}}{'ID'}; my $query = "INSERT INTO `pkrstarsbot`.`hands` (`TableNameID` ,`HandNr` ,`SMALL_BLIND` ,`START_MINUTES` ,`BUTTON_SEAT` ,`START_HOUR` ,`START_DAY` ,`START_YEAR` ,`BIG_BLIND` ,`START_SECONDS` ,`START_MONTH` ,`TIMEZONE` ,`HandID` ,`Rake` ,`OWN_PLAYER` ,`OWN_CARD1` ,`OWN_CARD2` ,`TOTAL_POT` ,`BOARD1` ,`BOARD2` ,`BOARD3` ,`BOARD4` ,`BOARD5` ,`MAIN_POT` ,`SIDE_POT`, `GAME_MODE`, `UserID`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"; $statement = $connection->prepare($query); my $ok = $statement->execute($TableNameID, $HandNr, $$DatasetRef{$HandNr}{'SMALL_BLIND'}, $$DatasetRef{$HandNr}{'START_MINUTES'}, $$DatasetRef{$HandNr}{'BUTTON_SEAT'}, $$DatasetRef{$HandNr}{'START_HOUR'}, $$DatasetRef{$HandNr}{'START_DAY'}, $$DatasetRef{$HandNr}{'START_YEAR'}, $$DatasetRef{$HandNr}{'BIG_BLIND'}, $$DatasetRef{$HandNr}{'START_SECONDS'}, $$DatasetRef{$HandNr}{'START_MONTH'}, $$DatasetRef{$HandNr}{'TIMEZONE'}, $$DatasetRef{$HandNr}{'HANDID'}, $$DatasetRef{$HandNr}{'RAKE'}, $PlayerNames{$$DatasetRef{$HandNr}{'OWN_PLAYER'}}{'ID'}, $DBcards{$$DatasetRef{$HandNr}{'OWN_CARDS'}{1}}, $DBcards{$$DatasetRef{$HandNr}{'OWN_CARDS'}{2}}, $$DatasetRef{$HandNr}{'TOTAL_POT'}, $Board1, $Board2, $Board3, $Board4, $Board5, $MainPot, $SidePot, $DBgame_mode{$$DatasetRef{$HandNr}{'GAME_MODE'}}, $USER{'ID'}); $statement->finish; # SKIP DBSYNC FOR THIS DATASET IF DUPLICATE KEY ENTRY -> TOURNAMENT ALREADY SYNCED BUT CANT BE FETCHED BECAUSE INTERVAL IN &DBGetTournamentIDsAndHandIDs() if (!$ok) { if ($MySQLErrorMessage =~ /Duplicate entry/) { $$DatasetRef{'DBSYNC_SKIP'} = 1; print "\[WARNING\]: SKIPPING DBSYNC FOR CASH GAME HAND $$DatasetRef{$HandNr}{'HANDID'} BECAUSE OF DUPLICATE ENTRY\n"; } else { die; } } } sub DBInsertNewTournament { my $DatasetRef = shift; # CURRENCY my $currency; if ($$DatasetRef{'CURRENCY'}) { $currency = $DBcurrency{$$DatasetRef{'CURRENCY'}}; } # TOURNAMENT TYPE my $TournamentType = $DBTournamentType{$$DatasetRef{'TOURNAMENT_TYPE'}}; my @values = ($USER{'ID'}, $$DatasetRef{'TOURNAMENTID'}, $$DatasetRef{'LIMIT_TYPE'}, $$DatasetRef{'GAME_TYPE'}, $$DatasetRef{'TABLE_MAX_TYPE'}, $currency, $TournamentType); if ($$DatasetRef{'BUY_IN_1'}) { push(@values, $$DatasetRef{'BUY_IN_1'}); } else { push(@values, undef); } if ($$DatasetRef{'BUY_IN_2'}) { push(@values, $$DatasetRef{'BUY_IN_2'}); } else { push(@values, undef); } if ($$DatasetRef{'BUY_IN_3'}) { push(@values, $$DatasetRef{'BUY_IN_3'}); } else { push(@values, undef); } if ($$DatasetRef{'BUTTON_BLIND'}) { push(@values, $$DatasetRef{'BUTTON_BLIND'}); } else { push(@values, undef); } if ($$DatasetRef{'ANTE'}) { push(@values, $$DatasetRef{'ANTE'}); } else { push(@values, undef); } # print Dumper \@values; my $query = "INSERT INTO `pkrstarsbot`.`tournaments` (`UserID`, `TournamentID`,`LIMIT_TYPE`,`GAME_TYPE`,`TABLE_MAX_TYPE`, `CURRENCY`, `TOURNAMENT_TYPE`, `BUY_IN_1`, `BUY_IN_2`, `BUY_IN_3`, `BUTTON_BLIND`, `ANTE`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"; $statement = $connection->prepare($query); my $ok = $statement->execute(@values); $statement->finish; &DBUpdateTournamentAdded($$DatasetRef{'TOURNAMENTID'}); # SKIP DBSYNC FOR THIS DATASET IF DUPLICATE KEY ENTRY -> TOURNAMENT ALREADY SYNCED BUT CANT BE FETCHED BECAUSE INTERVAL IN &DBGetTournamentIDsAndHandIDs() if (!$ok) { if ($MySQLErrorMessage =~ /Duplicate entry/) { $$DatasetRef{'DBSYNC_SKIP'} = 1; print "\[WARNING\]: SKIPPING DBSYNC FOR TOURNAMENTID $$DatasetRef{'TOURNAMENTID'} BECAUSE OF DUPLICATE ENTRY\n"; } else { die; } } } sub DBGetTournamentIDsAndHandIDs { # my $query = "Select hands.TournamentID, hands.HandID From reg_users Inner Join tournaments On tournaments.UserID = reg_users.ID Inner Join hands On hands.TournamentID = tournaments.TournamentID Where reg_users.ID = $USER{'ID'} And tournaments.TimeStamp >= Now() - Interval $FileNotOlderThanMin Minute"; #my $query = "SELECT tournaments.TournamentID, hands.HandID FROM `tournaments` LEFT JOIN hands ON tournaments.TournamentID = hands.TournamentID WHERE UserID = $USER{'ID'}"; my $query = "SELECT hands.TournamentID, hands.HandID FROM tournaments INNER JOIN hands ON hands.TournamentID = tournaments.TournamentID WHERE tournaments.UserID = $USER{'ID'}"; $statement = $connection->prepare($query); $statement->execute(); while (my $hash_ref = $statement->fetchrow_hashref) { push(@{$DBTournamentAndHandIDs{$$hash_ref{'TournamentID'}}{'HandIDs'}}, $$hash_ref{'HandID'}); } } sub DBGetTableNamesAndHandIDs { #my $query = "Select hands.TableNameID, hands.HandID From reg_users Inner Join table_names_mapping On table_names_mapping.UserID = reg_users.ID Inner Join table_names On table_names_mapping.TABLE_NAME_ID = table_names.ID Inner Join hands On hands.TableNameID = table_names.ID Where reg_users.ID = $USER{'ID'} And hands.TimeStamp >= Now() - Interval $FileNotOlderThanMin Minute"; # my $query = "Select hands.HandID, table_names.TABLE_NUMBER, table_names_mapping.TimeStampUpdate, table_names_mapping.TABLE_NAME_ID From reg_users Inner Join table_names_mapping On table_names_mapping.UserID = reg_users.ID Inner Join table_names On table_names_mapping.TABLE_NAME_ID = table_names.ID Inner Join hands On hands.TableNameID = table_names.ID Where reg_users.ID = $USER{'ID'} And table_names_mapping.TimeStampUpdate >= Now() - Interval $FileNotOlderThanMin Minute"; #print "$query\n"; # DOUBLE CHECK HERE my $query = "SELECT hands.HandID, table_names.TABLE_NUMBER, table_names_mapping.TABLE_NAME_ID FROM table_names_mapping INNER JOIN table_names ON table_names_mapping.TABLE_NAME_ID = table_names.ID INNER JOIN hands ON hands.TableNameID = table_names.ID WHERE table_names_mapping.UserID = $USER{'ID'}"; $statement = $connection->prepare($query); $statement->execute(); while (my $hash_ref = $statement->fetchrow_hashref) { $DBTableNames{$$hash_ref{'TABLE_NUMBER'}}{'ID'} = $$hash_ref{'TABLE_NAME_ID'}; push(@{$DBTableNames{$$hash_ref{'TABLE_NUMBER'}}{'HANDS'}}, $$hash_ref{'HandID'}); } } sub dbi_error_handler { my( $message, $handle, $first_value ) = @_; # print to your log file, call your own logger etc ... # here it will die() to be similar to "or die()" method, but the line number is incorect warn($message); print "Message: $message\tHandle: $handle\tFirst Value: $first_value\n"; $MySQLErrorMessage = $message; # if you return false it will check/execute RaiseError and PrintError return 0; } sub DBGetTournamentIDs { my @TournamentIDs; my $query = "SELECT TournamentID FROM `tournaments` WHERE UserID = $USER{'ID'}"; $statement = $connection->prepare($query); $statement->execute(); while (my @row = $statement->fetchrow_array) { push(@TournamentIDs, @row); } $statement->finish; return \@TournamentIDs; } sub DBCheckSingleExists { my ($table, $key, $value) = @_; my $query = "SELECT count( 1 ) FROM $table WHERE $key = $value"; $statement = $connection->prepare($query); return my $result = $statement->execute(); } sub pdb_connect { my ($username, $password, $database, $host, $attributes) = @_; # assign the values to your connection variable my $connectionInfo="dbi:mysql:$database;$host"; # make connection to database my $l_connection = DBI->connect($connectionInfo, $username, $password, $attributes) || warn "MySQL conncet failed: $DBI::errstr"; # the value of this connection is returned by the sub-routine return $l_connection; } # sub ConnectToMySql { # my ($db) = @_; # # assign the values to your connection variable # my $connectionInfo="dbi:mysql:$db;$MySQL{'hostname'}"; # # make connection to database # my $l_connection = DBI->connect($connectionInfo,$MySQL{'user'},$MySQL{'pw'},\%MySQLAttr) || warn "MySQL conncet failed: $DBI::errstr"; # # the value of this connection is returned by the sub-routine # return $l_connection; # } ############################################################### sub wanted { my $CurrentFilename = $_; if ($CurrentFilename =~ /$HH_FILETYPE/ ) { my $FileNotOlderThanSec = $FileNotOlderThanMin * 60; my $modtime = &get_modtime($File::Find::name); my $ageFileSec = time() - $modtime; my $ageFileMin = int($ageFileSec / 60); if ($ageFileSec <= $FileNotOlderThanSec) { $HH{$CurrentFilename}{'AGE_MIN'} = $ageFileMin; $HH{$CurrentFilename}{'RECENT'} = 1; $HH{$CurrentFilename}{'DIR_PATH'} = $File::Find::dir; $HH{$CurrentFilename}{'FILENAME'} = $CurrentFilename; $HH{$CurrentFilename}{'FULL_FILEPATH'} = $File::Find::name; $HH{$CurrentFilename}{'MODTIME'} = $modtime; $HH{$CurrentFilename}{'CHANGED'} = 0; $HH{$CurrentFilename}{'CHANGED'} = 1 if (($HH{$CurrentFilename}{'OLD_MODTIME'} && $modtime != $HH{$CurrentFilename}{'OLD_MODTIME'}) || !$HH{$CurrentFilename}{'OLD_MODTIME'}); $HH{$CurrentFilename}{'OLD_MODTIME'} = $modtime; } else { delete $HH{$CurrentFilename}; } } } sub get_modtime { my $FullFilepath = shift; return my $last_mod_time = (stat ($FullFilepath))[9]; } # sub ParseHH { # for my $FileName (keys(%HH)) { # #print Dumper($HH{$FileName}); # # DISREGARDING MODTIME IF ALREADY SYNCING # my $DIR_PATH = $HH{$FileName}{'DIR_PATH'}; # if ($FolderModified{$DIR_PATH}{'Syncing'}) { # #print "Already syncing, disregarding ModTimeLimit\n"; # &openHH($HH{$FileName}); # &DBSync() if $DBSync; # &WipeFileSingle($HH{$FileName}{'FULL_FILEPATH'}) if $WipeAnyFile; # undef $HH{$FileName}; # } # else { # if ($FileNotOlderThanMin) { # # PARSE ONLY IF MODTIME IS NOT OLDER THAN DESIRED # my $FileNotOlderThanSec = $FileNotOlderThanMin * 60; # my $ageFileSec = time() - $HH{$FileName}{'MODTIME'}; # if ($ageFileSec <= $FileNotOlderThanSec) { # &openHH($HH{$FileName}); # &DBSync() if $DBSync; # &WipeFileSingle($HH{$FileName}{'FULL_FILEPATH'}) if $WipeAnyFile; # undef $HH{$FileName}; # } # else { # print "$FileName exceeds ModTimeLimit\n"; # &WipeFileSingle($HH{$FileName}{'FULL_FILEPATH'}) if $WipeAnyFile; # } # } # else { # &openHH($HH{$FileName}); # &DBSync() if $DBSync; # &WipeFileSingle($HH{$FileName}{'FULL_FILEPATH'}) if $WipeAnyFile; # undef $HH{$FileName}; # } # } # } # } sub openHH { my $DatasetRef = shift; my $FullFilePath = $$DatasetRef{'FULL_FILEPATH'}; my $content; open(my $fh, '<', $FullFilePath) or die "Cannot open file $FullFilePath: $!\n"; { local $/; $content = <$fh>; } close($fh); # Determine single hands &SingleHand($DatasetRef, \$content); } sub SingleHand { my ($DatasetRef, $content_ref) = @_; my $SingleHandCount = 1; foreach my $SingleHand (split /\R\R\R*/, $$content_ref) { #print Dumper($SingleHand); my @SingleHand = split /\R/, $SingleHand; # ARRAY CONTAINIGN SINGLE BETROUND ACTIONS PER ROW # print Dumper(\@SingleHand); # GET INDEXES FOR ALL THE ACTIONS THAT HAPPENED DURING THE HAND my $ArrayActionPos_ref = &GetArrayActionPos(\@SingleHand, $DatasetRef); # CHECKS IF BETROUNDS EXIST AND REPORTS IF FILE SHOULD BE SKIPPED BECAUSE BETROUND INDICES DONT MAKE SENSE if (!$ArrayActionPos_ref) { say "ArrayActionPos empty -> Skipping"; $$DatasetRef{'HHPARSE_SKIP'} = 1; $$DatasetRef{'DBSYNC_SKIP'} = 1; $$DatasetRef{'WIPE_FILE'} = 1; &SkipFile($DatasetRef, 'error'); # return; # ABORTING PARSING HERE, %HH WILL BE EMPTY WHICH WILL SKIP DBSYNC AS WELL } # EXPLANATION ACTIONS # $DatasetRef = $HH{$FileName} # @SingleHand = ARRAY CONTAINIGN SINGLE BETROUND ACTIONS PER ROW # $ArrayActionPos_ref = ARRAY CONTAINING INDICES @SingleHand WHICH SHOW START AND END POINTS FOR EACH BETROUND # $SingleHandCount = INT COUNTING THE TOTAL HAND COUNT OF $DatasetRef &ParsePREHOLECARDS($ArrayActionPos_ref, \@SingleHand, $DatasetRef, \$SingleHandCount); &ParseHOLECARDS(\@SingleHand, $DatasetRef, \$SingleHandCount); &ParseFlopActions(\@SingleHand, $DatasetRef, \$SingleHandCount); &ParseTurnActions(\@SingleHand, $DatasetRef, \$SingleHandCount); &ParseRiverActions(\@SingleHand, $DatasetRef, \$SingleHandCount); &ParseShowDownActions(\@SingleHand, $DatasetRef, \$SingleHandCount); &ParseSummaryActions(\@SingleHand, $DatasetRef, \$SingleHandCount); $SingleHandCount++; } } sub ParseSummaryActions { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref) = @_; # ACTIONS &ParseSummaryPotRake($SingleHand_ref, $DatasetRef, $SingleHandCount_ref); &ParseSummaryBoard($SingleHand_ref, $DatasetRef, $SingleHandCount_ref); &ParseSummarySeats($SingleHand_ref, $DatasetRef, $SingleHandCount_ref); } sub ParseSummaryPotRake { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref) = @_; # PARSE STRING my $SummaryString = $$SingleHand_ref[$$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'SUMMARY'}{'START'}+1]; # PARSE POTS AND RAKE if ($SummaryString =~ m/$Patterns{'SUMMARY'}{'TOTAL_POT'}/) { $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOTAL_POT'} = $1; } if ($SummaryString =~ m/$Patterns{'SUMMARY'}{'MAIN_POT'}/) { $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'MAIN_POT'} = $1; } if ($SummaryString =~ m/$Patterns{'SUMMARY'}{'SIDE_POT'}/) { $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'SIDE_POT'} = $1; } if ($SummaryString =~ m/$Patterns{'SUMMARY'}{'RAKE'}/) { $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'RAKE'} = $1; } } sub ParseSummaryBoard { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref) = @_; # REGEX my $SummaryBoardRegex = 'Board \[(.*?)]'; # BOARD MAYBE if ($$SingleHand_ref[$$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'SUMMARY'}{'START'}+2] =~ m/$SummaryBoardRegex/) { my @Board = split / /, $1; for my $i (0..$#Board) { $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BOARD'}{$i+1} = $Board[$i]; } } } sub ParseSummarySeats { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref) = @_; my ($min, $max); # GET INDEX WHERE SEAT LISTING ENDS my @SeatIndex = grep { $$SingleHand_ref[$_] =~ /$Patterns{'SUMMARY'}{'SEAT'}/ } $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'SUMMARY'}{'START'}..$$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'SUMMARY'}{'END'}; for (@SeatIndex) { $min = $_ if !$min || $_ < $min; $max = $_ if !$max || $_ > $max; }; &ParseBetroundActions($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $min, $max, 'SUMMARY'); # PUT SEAT LISTING INDEX INTO DATASET $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'SUMMARYSEATLISTING'}{'START'} = $min; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'SUMMARYSEATLISTING'}{'END'} = $max; } sub ParseShowDownActions { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref) = @_; if (!$$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'SHOWDOWN'}) { return; } else { my $BetroundStart = $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'SHOWDOWN'}{'START'}; my $BetroundEnd = $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'SHOWDOWN'}{'END'}; if ($BetroundStart != $BetroundEnd) { &ParseBetroundActions($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $BetroundStart+1, $BetroundEnd, 'SHOWDOWN'); } } } sub ParseRiverActions { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref) = @_; if (!$$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'RIVER'}) { return; } else { my $BetroundStart = $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'RIVER'}{'START'}; my $BetroundEnd = $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'RIVER'}{'END'}; # PARSE RIVER CARDS $$SingleHand_ref[$BetroundStart] =~ m/$Patterns{'CARDS'}{'RIVER'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'CARDS_RIVER'}{1} = $1; if ($BetroundStart != $BetroundEnd) { &ParseBetroundActions($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $BetroundStart+1, $BetroundEnd, 'RIVER'); } } } sub ParseTurnActions { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref) = @_; if (!$$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'TURN'}) { return; } else { my $BetroundStart = $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'TURN'}{'START'}; my $BetroundEnd = $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'TURN'}{'END'}; # PARSE TURN CARDS $$SingleHand_ref[$BetroundStart] =~ m/$Patterns{'CARDS'}{'TURN'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'CARDS_TURN'}{1} = $1; if ($BetroundStart != $BetroundEnd) { &ParseBetroundActions($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $BetroundStart+1, $BetroundEnd, 'TURN'); } } } sub ParseHOLECARDS { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref) = @_; # ACTIONS &ParseOwnHand($SingleHand_ref, $DatasetRef, $SingleHandCount_ref); &ParseHoleCardsActions($SingleHand_ref, $DatasetRef, $SingleHandCount_ref); } sub ParseFlopActions { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref) = @_; if (!$$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'FLOP'}) { return; } else { my $BetroundStart = $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'FLOP'}{'START'}; my $BetroundEnd = $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'FLOP'}{'END'}; # PARSE FLOP CARDS $$SingleHand_ref[$BetroundStart] =~ m/$Patterns{'CARDS'}{'FLOP'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'CARDS_FLOP'}{'CARDS'}{1} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'CARDS_FLOP'}{'CARDS'}{2} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'CARDS_FLOP'}{'CARDS'}{3} = $3; if ($BetroundStart != $BetroundEnd) { &ParseBetroundActions($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $BetroundStart+1, $BetroundEnd, 'FLOP'); } } } sub ParseHoleCardsActions { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref) = @_; my $BetroundStart = $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'HOLECARDS'}{'START'} + 2; my $BetroundEnd = $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'HOLECARDS'}{'END'}; &ParseBetroundActions($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $BetroundStart, $BetroundEnd, 'HOLECARDS'); } sub ParseBetroundActions { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $BetroundStart, $BetroundEnd, $Betround) = @_; my $Count = 1; my $Action = $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BETROUNDS'}; for my $i ($BetroundStart .. $BetroundEnd) { if ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'FOLD'}/) { $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'ACTION'} = 'FOLD'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'CALL'}/) { #print "$1\t$2\t$3\n"; $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'AMOUNT'} = $2; if ($3 =~ m/all-in/) { $$Action{$Betround}{$Count}{'ALL-IN'} = 1; } else { $$Action{$Betround}{$Count}{'ALL-IN'} = 0; }; $$Action{$Betround}{$Count}{'ACTION'} = 'CALL'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'CHECK'}/) { #print "$1\n"; $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'ACTION'} = 'CHECK'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'RAISE'}/) { #print "$1\t$2\t$3\t$4\n"; $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'RAISE_FROM'} = $2; $$Action{$Betround}{$Count}{'RAISE_TO'} = $3; if ($4 =~ m/all-in/) { $$Action{$Betround}{$Count}{'ALL-IN'} = 1; } else { $$Action{$Betround}{$Count}{'ALL-IN'} = 0; }; $$Action{$Betround}{$Count}{'ACTION'} = 'RAISE'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'COLLECTED'}/) { #print "$1\t$2\n"; $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'AMOUNT'} = $2; $$Action{$Betround}{$Count}{'FROM'} = $3; $$Action{$Betround}{$Count}{'ACTION'} = 'COLLECTED'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'RETURNED'}/) { #print "$1\t$2\n"; $$Action{$Betround}{$Count}{'AMOUNT'} = $1; $$Action{$Betround}{$Count}{'NAME'} = $2; $$Action{$Betround}{$Count}{'ACTION'} = 'RETURNED'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'BET'}/) { #print "$1\t$2\n"; $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'AMOUNT'} = $2; if ($3 =~ m/all-in/) { $$Action{$Betround}{$Count}{'ALL-IN'} = 1; } else { $$Action{$Betround}{$Count}{'ALL-IN'} = 0; }; $$Action{$Betround}{$Count}{'ACTION'} = 'BET'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'NOSHOW'}/) { #print "$1\n"; $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'ACTION'} = 'NOSHOW'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'SHOW'}/) { #print "$1\n"; $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'CARDS'}{1} = $2; $$Action{$Betround}{$Count}{'CARDS'}{2} = $3; $$Action{$Betround}{$Count}{'HAND_DESCRIPTION'} = $4; $$Action{$Betround}{$Count}{'ACTION'} = 'SHOW'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'MUCK'}/) { #print "$1\n"; $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'ACTION'} = 'MUCK'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'FINISHED_TOURNAMENT'}/) { #print "$1\n"; $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'PLACE'} = $2; if ($3) { $3 =~ m/received \$?(\d+\.?\d*)\./; $$Action{$Betround}{$Count}{'AMOUNT_RECEIVED'} = $1; } $$Action{$Betround}{$Count}{'ACTION'} = 'FINISHED_TOURNAMENT'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'WIN_TOURNAMENT'}/) { $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'ACTION'} = 'WIN_TOURNAMENT'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'WIN_TOURNAMENT_RECEIVE'}/) { $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'AMOUNT_RECEIVED'} = $2; $$Action{$Betround}{$Count}{'ACTION'} = 'WIN_TOURNAMENT_RECEIVE'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'SUMMARY_SHOWED_WON'}/) { $$Action{$Betround}{$Count}{'SUMMARYSEATNR'} = $1; $$Action{$Betround}{$Count}{'NAME'} = $2; $$Action{$Betround}{$Count}{'POSITION'}{1} = $3 if $3; $$Action{$Betround}{$Count}{'POSITION'}{2} = $4 if $4; $$Action{$Betround}{$Count}{'CARDS'}{1} = $5; $$Action{$Betround}{$Count}{'CARDS'}{2} = $6; $$Action{$Betround}{$Count}{'AMOUNT'} = $7; $$Action{$Betround}{$Count}{'HAND_DESCRIPTION'} = $8; # if ($3) { # my $NameAndPos = $3; # my $PosCount = 1; # if ($NameAndPos =~ m/\((.*?)\)/) { # while ($NameAndPos =~ m/\((.*?)\)/g) { # #print "POS: $1\n"; # $$Action{$Betround}{$Count}{'POSITION'}{$PosCount} = $1; # $PosCount++; # } # } # } $$Action{$Betround}{$Count}{'ACTION'} = 'SUMMARY_SHOWED_WON'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'SUMMARY_SHOWED_LOST'}/) { $$Action{$Betround}{$Count}{'SUMMARYSEATNR'} = $1; $$Action{$Betround}{$Count}{'NAME'} = $2; $$Action{$Betround}{$Count}{'POSITION'}{1} = $3 if $3; $$Action{$Betround}{$Count}{'POSITION'}{2} = $4 if $4; $$Action{$Betround}{$Count}{'CARDS'}{1} = $5; $$Action{$Betround}{$Count}{'CARDS'}{2} = $6; $$Action{$Betround}{$Count}{'HAND_DESCRIPTION'} = $7; # if ($3) { # my $NameAndPos = $3; # my $PosCount = 1; # if ($NameAndPos =~ m/\((.*?)\)/) { # while ($NameAndPos =~ m/\((.*?)\)/g) { # #print "POS: $1\n"; # $$Action{$Betround}{$Count}{'POSITION'}{$PosCount} = $1; # $PosCount++; # } # } # } $$Action{$Betround}{$Count}{'ACTION'} = 'SUMMARY_SHOWED_LOST'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'SUMMARY_FOLDED'}/) { # print "1: $1\t2: $2\t4: $4\n"; $$Action{$Betround}{$Count}{'SUMMARYSEATNR'} = $1; $$Action{$Betround}{$Count}{'NAME'} = $2; $$Action{$Betround}{$Count}{'POSITION'}{1} = $3 if $3; $$Action{$Betround}{$Count}{'POSITION'}{2} = $4 if $4; $$Action{$Betround}{$Count}{'WHEN'} = $5; # if ($3) { # # say "3: $3"; # my $NameAndPos = $3; # my $PosCount = 1; # if ($NameAndPos =~ m/\((.*?)\)/) { # while ($NameAndPos =~ m/\((.*?)\)/g) { # #print "POS: $1\n"; # $$Action{$Betround}{$Count}{'POSITION'}{$PosCount} = $1; # $PosCount++; # } # } # } $$Action{$Betround}{$Count}{'ACTION'} = 'SUMMARY_FOLDED'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'SUMMARY_COLLECTED'}/) { $$Action{$Betround}{$Count}{'SUMMARYSEATNR'} = $1; $$Action{$Betround}{$Count}{'NAME'} = $2; $$Action{$Betround}{$Count}{'POSITION'}{1} = $3 if $3; $$Action{$Betround}{$Count}{'POSITION'}{2} = $4 if $4; $$Action{$Betround}{$Count}{'AMOUNT'} = $5; # if ($3) { # my $NameAndPos = $3; # my $PosCount = 1; # if ($NameAndPos =~ m/\((.*?)\)/) { # while ($NameAndPos =~ m/\((.*?)\)/g) { # #print "POS: $1\n"; # $$Action{$Betround}{$Count}{'POSITION'}{$PosCount} = $1; # $PosCount++; # } # } # } $$Action{$Betround}{$Count}{'ACTION'} = 'SUMMARY_COLLECTED'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'SUMMARY_MUCKED'}/) { $$Action{$Betround}{$Count}{'SUMMARYSEATNR'} = $1; $$Action{$Betround}{$Count}{'NAME'} = $2; $$Action{$Betround}{$Count}{'POSITION'}{1} = $3 if $3; $$Action{$Betround}{$Count}{'POSITION'}{2} = $4 if $4; $$Action{$Betround}{$Count}{'CARDS'}{1} = $5; $$Action{$Betround}{$Count}{'CARDS'}{2} = $6; # if ($3) { # my $NameAndPos = $3; # my $PosCount = 1; # if ($NameAndPos =~ m/\((.*?)\)/) { # while ($NameAndPos =~ m/\((.*?)\)/g) { # #print "POS: $1\n"; # $$Action{$Betround}{$Count}{'POSITION'}{$PosCount} = $1; # $PosCount++; # } # } # } $$Action{$Betround}{$Count}{'ACTION'} = 'SUMMARY_MUCKED'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'WIN_BOUNTY'}/) { #print "$1\n"; $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'AMOUNT'} = $2; $$Action{$Betround}{$Count}{'NAME_ELIMINATED'} = $3; $$Action{$Betround}{$Count}{'ACTION'} = 'WIN_BOUNTY'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'LEAVE'}/) { #print "$1\n"; $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'ACTION'} = 'LEAVE'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'TIMED_OUT'}/) { #print "$1\n"; $$Action{$Betround}{$Count}{'NAME'} = $1; if ($2) { $$Action{$Betround}{$Count}{'ACTION'} = 'TIMED_OUT_DISCONNECT'; } else { $$Action{$Betround}{$Count}{'ACTION'} = 'TIMED_OUT'; } } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'SAID'}/) { #print "$1\n"; $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'SAID_DATA'} = $2; $$Action{$Betround}{$Count}{'ACTION'} = 'SAID'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'SPLIT_BOUNTY'}/) { #print "$1\t$2\t$3\n"; my ($Names, $Amount, $NameEliminated) = ($1, $2, $3); # Split Names and loop my @Names = split /, /, $Names; for my $PlayerName (@Names) { $$Action{$Betround}{$Count}{'NAME'} = $PlayerName; $$Action{$Betround}{$Count}{'AMOUNT'} = $Amount; $$Action{$Betround}{$Count}{'NAME_ELIMINATED'} = $NameEliminated; $$Action{$Betround}{$Count}{'ACTION'} = 'SPLIT_BOUNTY'; $$Action{$Betround}{$Count}{'SPLIT_BOUNTY_PLAYERS'} = $#Names+1; # CALCULATE THE SPLIT BOUNTY AMOUNT my $SplitBountyAmount = $Amount/($#Names+1); $SplitBountyAmount = eval sprintf('%.2f', $SplitBountyAmount); $$Action{$Betround}{$Count}{'SPLIT_BOUNTY_AMOUNT'} = $SplitBountyAmount; $Count++; } } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'WIN_WHATEVER'}/) { #print "$1\n"; $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'WIN_DATA'} = $2; $$Action{$Betround}{$Count}{'ACTION'} = 'WIN_WHATEVER'; # FIX FOR PHANTOMBOT: CHANGE POS OF '$' TO THE END # my $AmountRegex = '\$?(\d+\.?\d*)'; # $$Action{$Betround}{$Count}{'WIN_DATA'} =~ s/$AmountRegex/$1\$/g; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'DISCONNECTED'}/) { $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'ACTION'} = 'DISCONNECTED'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'CONNECTED'}/) { $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'ACTION'} = 'CONNECTED'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'SITTINGOUT'}/) { $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'ACTION'} = 'SITTINGOUT'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'FINISHED_NOWIN'}/) { $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'ACTION'} = 'FINISHED_NOWIN'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'ACTIONS'}{'WIN_BOUNTY_ELIMINATING'}/) { $$Action{$Betround}{$Count}{'NAME'} = $1; $$Action{$Betround}{$Count}{'AMOUNT'} = $2; $$Action{$Betround}{$Count}{'NAME_ELIMINATED'} = $3; $$Action{$Betround}{$Count}{'BOUNTY_FROM'} = $4; $$Action{$Betround}{$Count}{'BOUNTY_TO'} = $5; $$Action{$Betround}{$Count}{'ACTION'} = 'WIN_BOUNTY_ELIMINATING'; } else { say "No action matched"; &NoActionMatch($DatasetRef, $$SingleHand_ref[$i]); } $Count++; } } sub ParseOwnHand { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref) = @_; $$SingleHand_ref[$$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'HOLECARDS'}{'START'} + 1] =~ m/$Patterns{'HOLECARDS'}{'OWNCARDS'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'OWN_PLAYER'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'OWN_CARDS'}{1} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'OWN_CARDS'}{2} = $3; } sub ParsePREHOLECARDS { my ($ArrayActionPos_ref, $SingleHand_ref, $DatasetRef, $SingleHandCount_ref) = @_; # PUT DETERMINDED ACTIONARRAYPOSITIONS IN DATASET $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'} = $ArrayActionPos_ref; # ACTIONS &ParseHandInfoSNG($SingleHand_ref, $DatasetRef, $SingleHandCount_ref); # IDENTIFIES GAME TYPE AND PARSES SPECIFIC GAME TYPE INFO &CheckSupportedGameType($SingleHand_ref, $DatasetRef, $SingleHandCount_ref); # CHECKS IS WE CONTINUE/SUPPORT THE GAME TYPE &ParseTableInfo($SingleHand_ref, $DatasetRef, $SingleHandCount_ref); # RETRIEVES INFO ABOUT THE TABLE AND WHERE THE BUTTON IS &ParsePreHoleCardSeats($SingleHand_ref, $DatasetRef, $SingleHandCount_ref); # RETRIEVES INFO ABOUT ACTIONS PREHOLECARDS AND EXTENDS ArrayActionPos WITH INDICES ABOUT START AND END &ParsePreHoleCardPosts($SingleHand_ref, $DatasetRef, $SingleHandCount_ref); # RETRIEVES ADDITIONAL PREHOLECARDS INFO SUCH AS PLAYER NAMES AND THEIR AMOUNTS } sub CheckSupportedGameType { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref) = @_; if ( !$$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_TYPE'} ) { say "WE COULDNT IDENTIFY GAME TYPE BEFORE"; print Dumper $$DatasetRef{'HH'}{$$SingleHandCount_ref}; } my $GameType = uc($$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_TYPE'}); my $LimitType = uc($$DatasetRef{'HH'}{$$SingleHandCount_ref}{'LIMIT_TYPE'}); my $GameMoney = $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MONEY'}; my $GameMode = $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MODE'}; if ($SupportedGameTypes{$GameType}{$LimitType}{$GameMoney}{$GameMode}) { say "$GameType $LimitType $GameMoney $GameMode IS SUPPORTED"; } else { say "$GameType $LimitType $GameMoney $GameMode IS NOT SUPPORTED -> SKIPPING"; $$DatasetRef{'HHPARSE_SKIP'} = 1; $$DatasetRef{'DBSYNC_SKIP'} = 1; &SkipFile($DatasetRef, 'skip'); } } sub ParseSixPlusHoldemGameInfo { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $switch) = @_; if ($switch eq 'REALMONEY') { $$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{'REALMONEY'}{'SIXPLUSHOLDEM'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'HANDID'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_TYPE'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'LIMIT_TYPE'} = $3; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'CURRENCY_SYMBOL'} = $4; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUTTON_BLIND'} = $5; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ANTE'} = $6; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'CURRENCY'} = $7; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_YEAR'} = $8; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MONTH'} = $9; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_DAY'} = $10; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_HOUR'} = $11; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MINUTES'} = $12; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_SECONDS'} = $13; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TIMEZONE'} = $14; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MODE'} = 'SIXPLUSHOLDEM'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MONEY'} = 'REALMONEY'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENT_TYPE'} = 'NORMAL'; # NORMAL, FREEROLL } elsif ($switch eq 'PLAYMONEY') { $$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{'PLAYMONEY'}{'SIXPLUSHOLDEM'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'HANDID'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_TYPE'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'LIMIT_TYPE'} = $3; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUTTON_BLIND'} = $4; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ANTE'} = $5; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_YEAR'} = $6; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MONTH'} = $7; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_DAY'} = $8; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_HOUR'} = $9; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MINUTES'} = $10; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_SECONDS'} = $11; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TIMEZONE'} = $12; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MODE'} = 'SIXPLUSHOLDEM'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MONEY'} = 'PLAYMONEY'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENT_TYPE'} = 'NORMAL'; # NORMAL, FREEROLL } } sub ParseTempestGameInfo { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $switch) = @_; if ($switch eq 'REALMONEY') { $$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{'REALMONEY'}{'TEMPEST'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'HANDID'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_TYPE'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'LIMIT_TYPE'} = $3; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'CURRENCY_SYMBOL'} = $4; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUY_IN_1'} = $5; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUY_IN_2'} = $6; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUY_IN_3'} = $7; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'CAP'} = $8; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'CURRENCY'} = $9; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_YEAR'} = $10; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MONTH'} = $11; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_DAY'} = $12; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_HOUR'} = $13; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MINUTES'} = $14; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_SECONDS'} = $15; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TIMEZONE'} = $16; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MODE'} = 'TEMPEST'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MONEY'} = 'REALMONEY'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENT_TYPE'} = 'NORMAL'; # NORMAL, FREEROLL } elsif ($switch eq 'PLAYMONEY') { $$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{'PLAYMONEY'}{'TEMPEST'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'HANDID'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_TYPE'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'LIMIT_TYPE'} = $3; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUY_IN_1'} = $4; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUY_IN_2'} = $5; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUY_IN_3'} = $6; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'CAP'} = $7; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_YEAR'} = $8; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MONTH'} = $9; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_DAY'} = $10; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_HOUR'} = $11; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MINUTES'} = $12; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_SECONDS'} = $13; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TIMEZONE'} = $14; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MODE'} = 'TEMPEST'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MONEY'} = 'PLAYMONEY'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENT_TYPE'} = 'NORMAL'; # NORMAL, FREEROLL } } sub ParseTournament1GameInfo { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $switch) = @_; if ($switch eq 'REALMONEY') { $$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{'REALMONEY'}{'TOURNAMENT_1'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'HANDID'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENTID'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'CURRENCY_SYMBOL'} = $3; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUY_IN_1'} = $4; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUY_IN_2'} = $5; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUY_IN_3'} = $6; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'CURRENCY'} = $7; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_TYPE'} = $8; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'LIMIT_TYPE'} = $9; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BLIND_LEVEL'} = $10; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'SMALL_BLIND'} = $11; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BIG_BLIND'} = $12; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_YEAR'} = $13; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MONTH'} = $14; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_DAY'} = $15; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_HOUR'} = $16; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MINUTES'} = $17; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_SECONDS'} = $18; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TIMEZONE'} = $19; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MODE'} = 'TOURNAMENT_1'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MONEY'} = 'REALMONEY'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENT_TYPE'} = 'NORMAL'; } elsif ($switch eq 'PLAYMONEY') { $$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{'PLAYMONEY'}{'TOURNAMENT_1'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'HANDID'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENTID'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUY_IN_1'} = $3; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUY_IN_2'} = $4; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUY_IN_3'} = $5; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_TYPE'} = $6; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'LIMIT_TYPE'} = $7; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BLIND_LEVEL'} = $8; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'SMALL_BLIND'} = $9; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BIG_BLIND'} = $10; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_YEAR'} = $11; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MONTH'} = $12; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_DAY'} = $13; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_HOUR'} = $14; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MINUTES'} = $15; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_SECONDS'} = $16; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TIMEZONE'} = $17; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MODE'} = 'TOURNAMENT_1'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MONEY'} = 'PLAYMONEY'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENT_TYPE'} = 'NORMAL'; } } sub ParseTournament2GameInfo { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $switch) = @_; # Regex same for real money and play money $$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{$switch}{'TOURNAMENT_2'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'HANDID'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENTID'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_TYPE'} = $3; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'LIMIT_TYPE'} = $4; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BLIND_LEVEL'} = $5; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'SMALL_BLIND'} = $6; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BIG_BLIND'} = $7; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_YEAR'} = $8; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MONTH'} = $9; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_DAY'} = $10; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_HOUR'} = $11; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MINUTES'} = $12; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_SECONDS'} = $13; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TIMEZONE'} = $14; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MODE'} = 'TOURNAMENT_2'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENT_TYPE'} = 'NORMAL'; # fix money type: grand tour play/real money determined by bounty amount of players if ($$SingleHand_ref[2] =~ m/$Patterns{'MONEY'}/) { $switch = 'REALMONEY'; } elsif ($$SingleHand_ref[2] !~ m/$Patterns{'MONEY'}/) { $switch = 'PLAYMONEY'; } else { say "COULDNT DETECT PLAY OR REALMONEY -> SKIPPING"; &SkipFile($DatasetRef, 'error'); } $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MONEY'} = $switch; } sub ParseTournament3GameInfo { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $switch) = @_; if ($switch eq 'REALMONEY') { $$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{'REALMONEY'}{'TOURNAMENT_3'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'HANDID'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENTID'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_TYPE'} = $3; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'LIMIT_TYPE'} = $4; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BLIND_LEVEL'} = $5; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'SMALL_BLIND'} = $6; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BIG_BLIND'} = $7; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_YEAR'} = $8; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MONTH'} = $9; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_DAY'} = $10; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_HOUR'} = $11; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MINUTES'} = $12; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_SECONDS'} = $13; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TIMEZONE'} = $14; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MODE'} = 'TOURNAMENT_3'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MONEY'} = 'REALMONEY'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENT_TYPE'} = 'NORMAL'; } elsif ($switch eq 'PLAYMONEY') { $$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{'PLAYMONEY'}{'TOURNAMENT_3'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'HANDID'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENTID'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUY_IN_1'} = $3; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUY_IN_2'} = $4; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_TYPE'} = $5; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'LIMIT_TYPE'} = $6; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'MATCH_ROUND'} = $7; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BLIND_LEVEL'} = $8; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'SMALL_BLIND'} = $9; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BIG_BLIND'} = $10; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_YEAR'} = $11; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MONTH'} = $12; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_DAY'} = $13; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_HOUR'} = $14; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MINUTES'} = $15; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_SECONDS'} = $16; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TIMEZONE'} = $17; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MODE'} = 'TOURNAMENT_3'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MONEY'} = 'PLAYMONEY'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENT_TYPE'} = 'NORMAL'; } } sub ParseTournament4GameInfo { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $switch) = @_; if ($switch eq 'REALMONEY') { $$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{'REALMONEY'}{'TOURNAMENT_4'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'HANDID'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENTID'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'CURRENCY_SYMBOL'} = $3; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUY_IN_1'} = $4; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUY_IN_2'} = $5; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'CURRENCY'} = $6; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_TYPE'} = $7; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'LIMIT_TYPE'} = $8; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BLIND_LEVEL'} = $9; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'SMALL_BLIND'} = $10; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BIG_BLIND'} = $11; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_YEAR'} = $12; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MONTH'} = $13; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_DAY'} = $14; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_HOUR'} = $15; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MINUTES'} = $16; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_SECONDS'} = $17; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TIMEZONE'} = $18; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MODE'} = 'TOURNAMENT_4'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MONEY'} = 'REALMONEY'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENT_TYPE'} = 'NORMAL'; } elsif ($switch eq 'PLAYMONEY') { $$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{'REALMONEY'}{'TOURNAMENT_4'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'HANDID'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENTID'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUY_IN_1'} = $3; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUY_IN_2'} = $4; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_TYPE'} = $5; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'LIMIT_TYPE'} = $6; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BLIND_LEVEL'} = $7; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'SMALL_BLIND'} = $8; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BIG_BLIND'} = $9; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_YEAR'} = $10; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MONTH'} = $11; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_DAY'} = $12; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_HOUR'} = $13; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MINUTES'} = $14; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_SECONDS'} = $15; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TIMEZONE'} = $16; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MODE'} = 'TOURNAMENT_4'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MONEY'} = 'PLAYMONEY'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENT_TYPE'} = 'NORMAL'; } } sub ParseZoomGameInfo { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $switch) = @_; if ($switch eq 'REALMONEY') { $$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{'REALMONEY'}{'ZOOM'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'HANDID'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_TYPE'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'LIMIT_TYPE'} = $3; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'CURRENCY_SYMBOL'} = $4; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'SMALL_BLIND'} = $5; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BIG_BLIND'} = $6; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_YEAR'} = $7; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MONTH'} = $8; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_DAY'} = $9; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_HOUR'} = $10; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MINUTES'} = $11; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_SECONDS'} = $12; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TIMEZONE'} = $13; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MODE'} = 'ZOOM'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MONEY'} = 'REALMONEY'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENT_TYPE'} = 'NORMAL'; } elsif ($switch eq 'PLAYMONEY') { $$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{'REALMONEY'}{'ZOOM'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'HANDID'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_TYPE'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'LIMIT_TYPE'} = $3; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'SMALL_BLIND'} = $4; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BIG_BLIND'} = $5; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_YEAR'} = $6; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MONTH'} = $7; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_DAY'} = $8; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_HOUR'} = $9; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MINUTES'} = $10; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_SECONDS'} = $11; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TIMEZONE'} = $12; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MODE'} = 'ZOOM'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MONEY'} = 'PLAYMONEY'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENT_TYPE'} = 'NORMAL'; } } sub ParseCashGameInfo { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $switch) = @_; if ($switch eq 'REALMONEY') { $$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{'REALMONEY'}{'CASH'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'HANDID'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_TYPE'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'LIMIT_TYPE'} = $3; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'CURRENCY_SYMBOL'} = $4; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'SMALL_BLIND'} = $5; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BIG_BLIND'} = $6; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'CURRENCY'} = $7; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_YEAR'} = $8; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MONTH'} = $9; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_DAY'} = $10; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_HOUR'} = $11; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MINUTES'} = $12; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_SECONDS'} = $13; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TIMEZONE'} = $14; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MODE'} = 'CASH'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MONEY'} = 'REALMONEY'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENT_TYPE'} = 'NORMAL'; } elsif ($switch eq 'PLAYMONEY') { $$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{'REALMONEY'}{'CASH'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'HANDID'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_TYPE'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'LIMIT_TYPE'} = $3; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'SMALL_BLIND'} = $5; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BIG_BLIND'} = $6; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_YEAR'} = $8; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MONTH'} = $9; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_DAY'} = $10; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_HOUR'} = $11; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_MINUTES'} = $12; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'START_SECONDS'} = $13; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TIMEZONE'} = $14; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MODE'} = 'CASH'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MONEY'} = 'PLAYMONEY'; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TOURNAMENT_TYPE'} = 'NORMAL'; } } sub ParseGameInfo { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $switch) = @_; if ($$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{$switch}{'SIXPLUSHOLDEM'}/) { ParseSixPlusHoldemGameInfo($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $switch); } elsif ($$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{$switch}{'TEMPEST'}/) { ParseTempestGameInfo($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $switch); } elsif ($$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{$switch}{'ZOOM'}/) { ParseZoomGameInfo($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $switch); } elsif ($$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{$switch}{'CASH'}/) { ParseCashGameInfo($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $switch); } elsif ($$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{$switch}{'TOURNAMENT_1'}/) { ParseTournament1GameInfo($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $switch); } elsif ($$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{$switch}{'TOURNAMENT_2'}/) { ParseTournament2GameInfo($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $switch); } elsif ($$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{$switch}{'TOURNAMENT_3'}/) { ParseTournament3GameInfo($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $switch); } elsif ($$SingleHand_ref[0] =~ m/$Patterns{'GAMEINFO'}{$switch}{'TOURNAMENT_4'}/) { ParseTournament4GameInfo($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $switch); } else { say "COULDNT DETECT HAND TYPE -> SKIPPING"; &SkipFile($DatasetRef, 'error'); } } sub ParseHandInfoSNG { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref) = @_; my $switch; # note: not valid for grand tour. can identify with bounty amounts on second log lin if ($$SingleHand_ref[0] =~ m/$Patterns{'MONEY'}/) { $switch = 'REALMONEY'; } elsif ($$SingleHand_ref[0] !~ m/$Patterns{'MONEY'}/) { $switch = 'PLAYMONEY'; } else { say "COULDNT DETECT PLAY OR REALMONEY -> SKIPPING"; &SkipFile($DatasetRef, 'error'); } ParseGameInfo($SingleHand_ref, $DatasetRef, $SingleHandCount_ref, $switch); } sub ParsePreHoleCardPosts { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref) = @_; my $Count = 1; # START INDEX my $PreHoleCardsPostsStartIndex = $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'PREHOLECARDSSEATLISTING'}{'END'} + 1; for my $i ($PreHoleCardsPostsStartIndex .. $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'PREHOLECARDS'}{'END'}) { if ($$SingleHand_ref[$i] =~ m/$Patterns{'PREHOLECARDS'}{'POST'}/) { #print "$1\t$2\t$3\t$4\n"; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BETROUNDS'}{'PREHOLECARDS'}{$Count}{'NAME'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BETROUNDS'}{'PREHOLECARDS'}{$Count}{'TYPE'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BETROUNDS'}{'PREHOLECARDS'}{$Count}{'AMOUNT'} = $3; if ($4 && $4 =~ m/all-in/) { $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BETROUNDS'}{'PREHOLECARDS'}{$Count}{'ALL-IN'} = 1; } else { $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BETROUNDS'}{'PREHOLECARDS'}{$Count}{'ALL-IN'} = 0; }; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BETROUNDS'}{'PREHOLECARDS'}{$Count}{'ACTION'} = 'POST'; } elsif ($$SingleHand_ref[$i] =~ m/$Patterns{'PREHOLECARDS'}{'ALLOWED'}/) { } $Count++; } } sub ParsePreHoleCardSeats { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref) = @_; my ($min, $max, $pattern); my $GameMode = $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MODE'}; if ($GameMode eq 'TOURNAMENT_2') { $pattern = $Patterns{'PREHOLECARDS'}{'SEAT'}{'TOURNAMENT_2'}; } else { $pattern = $Patterns{'PREHOLECARDS'}{'SEAT'}{'REGULAR'}; } # say $$SingleHand_ref[2]; # say $pattern; # GET INDEX WHERE SEAT LISTING ENDS my @SeatIndex = grep { $$SingleHand_ref[$_] =~ /$pattern/ } 2..$$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'PREHOLECARDS'}{'END'}; for (@SeatIndex) { $min = $_ if !$min || $_ < $min; $max = $_ if !$max || $_ > $max; }; # PARSE SEAT LISTING WITH INDEX for my $i (2 .. $max) { $$SingleHand_ref[$i] =~ m/$pattern/; if ($GameMode eq 'TOURNAMENT_2') { # say "$1\t$2\t$3\t$4\n$5"; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'PLAYERS'}{$2}{'PREHOLECARDSSEATNR'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'PLAYERS'}{$2}{'NAME'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'PLAYERS'}{$2}{'CHIPS_AMOUNT'} = $3; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'PLAYERS'}{$2}{'BOUNTY_AMOUNT'} = $4; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'PLAYERS'}{$2}{'SIT_OUT'} = 1 if $5; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'PLAYERS'}{$2}{'SIT_OUT'} = 0 if !$5; } else { #print "$1\t$2\t$3\t$4\n"; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'PLAYERS'}{$2}{'PREHOLECARDSSEATNR'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'PLAYERS'}{$2}{'NAME'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'PLAYERS'}{$2}{'CHIPS_AMOUNT'} = $3; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'PLAYERS'}{$2}{'SIT_OUT'} = 1 if $4; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'PLAYERS'}{$2}{'SIT_OUT'} = 0 if !$4; } } # print Dumper $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'PLAYERS'}; # die; # PUT SEAT LISTING INDEX INTO DATASET $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'PREHOLECARDSSEATLISTING'}{'START'} = 2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'ArrayActionPos'}{'PREHOLECARDSSEATLISTING'}{'END'} = $max; } sub ParseTableInfo { my ($SingleHand_ref, $DatasetRef, $SingleHandCount_ref) = @_; my $GameMode = $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MODE'}; my $GameMoney = $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'GAME_MONEY'}; if ($GameMode =~ m/TOURNAMENT/) { $$SingleHand_ref[1] =~ m/$Patterns{'TABLEINFO'}{$GameMoney}{'WITH_TABLE_NUMBER'}/; my $TournamentID = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TABLE_NUMBER'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TABLE_MAX_TYPE'} = $3; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUTTON_SEAT'} = $4; # print "$1\n$2\n$3\n"; } elsif ($GameMode !~ m/TOURNAMENT/) { $$SingleHand_ref[1] =~ m/$Patterns{'TABLEINFO'}{$GameMoney}{'WITHOUT_TABLE_NUMBER'}/; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TABLE_NUMBER'} = $1; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'TABLE_MAX_TYPE'} = $2; $$DatasetRef{'HH'}{$$SingleHandCount_ref}{'BUTTON_SEAT'} = $3; } else { say "Could not parse TableInfo -> SKIPPING"; $$DatasetRef{'HHPARSE_SKIP'} = 1; $$DatasetRef{'DBSYNC_SKIP'} = 1; &SkipFile($DatasetRef, 'error'); } } sub GetArrayActionPos { my ($SingleHand_ref, $DatasetRef) = @_; my %ArrayActionPos; # GET ARRAY INDICES WHERE BETROUNDS START AND END my $HoleCardsPattern = '\*\*\* HOLE CARDS \*\*\*'; my $FlopPattern = '\*\*\* FLOP \*\*\*'; my $TurnPattern = '\*\*\* TURN \*\*\*'; my $RiverPattern = '\*\*\* RIVER \*\*\*'; my $ShowDownPattern = '\*\*\* SHOW DOWN \*\*\*'; my $SummaryPattern = '\*\*\* SUMMARY \*\*\*'; # PreHoleCards ALWAYS my ($HoleCardsIndex) = grep { $$SingleHand_ref[$_] =~ /$HoleCardsPattern/ } 0..$#{$SingleHand_ref}; if (!$HoleCardsIndex) { say "ERROR IN &GetArrayActionPos PARSING: NO HOLECARDSINDEX, SKIPPING FILE."; &SkipFile($DatasetRef, 'error'); } $ArrayActionPos{'PREHOLECARDS'}{'START'} = 0; $ArrayActionPos{'PREHOLECARDS'}{'END'} = $HoleCardsIndex - 1; # Hole Cards ALWAYS $ArrayActionPos{'HOLECARDS'}{'START'} = $HoleCardsIndex; # SUMMARY ALWAYS my ($SummaryIndex) = grep { $$SingleHand_ref[$_] =~ /$SummaryPattern/ } 0..$#{$SingleHand_ref}; $ArrayActionPos{'SUMMARY'}{'START'} = $SummaryIndex; $ArrayActionPos{'SUMMARY'}{'END'} = $#{$SingleHand_ref}; # FlopIndex MAYBE my ($FlopIndex) = grep { $$SingleHand_ref[$_] =~ /$FlopPattern/ } 0..$#{$SingleHand_ref}; if ($FlopIndex) { $ArrayActionPos{'FLOP'}{'START'} = $FlopIndex; $ArrayActionPos{'HOLECARDS'}{'END'} = $FlopIndex - 1; # TurnIndex MAYBE my ($TurnIndex) = grep { $$SingleHand_ref[$_] =~ /$TurnPattern/ } 0..$#{$SingleHand_ref}; if ($TurnIndex) { $ArrayActionPos{'TURN'}{'START'} = $TurnIndex; $ArrayActionPos{'FLOP'}{'END'} = $TurnIndex - 1; # RiverIndex MAYBE my ($RiverIndex) = grep { $$SingleHand_ref[$_] =~ /$RiverPattern/ } 0..$#{$SingleHand_ref}; if ($RiverIndex) { $ArrayActionPos{'RIVER'}{'START'} = $RiverIndex; $ArrayActionPos{'TURN'}{'END'} = $RiverIndex - 1; # ShowDownIndex MAYBE my ($ShowDownIndex) = grep { $$SingleHand_ref[$_] =~ /$ShowDownPattern/ } 0..$#{$SingleHand_ref}; if ($ShowDownIndex) { $ArrayActionPos{'SHOWDOWN'}{'START'} = $ShowDownIndex; $ArrayActionPos{'SHOWDOWN'}{'END'} = $SummaryIndex - 1; $ArrayActionPos{'RIVER'}{'END'} = $ShowDownIndex - 1; } elsif (!$ShowDownIndex) { $ArrayActionPos{'RIVER'}{'END'} = $SummaryIndex - 1; } } elsif (!$RiverIndex) { $ArrayActionPos{'TURN'}{'END'} = $SummaryIndex - 1; } } elsif (!$TurnIndex) { $ArrayActionPos{'FLOP'}{'END'} = $SummaryIndex - 1; } } elsif (!$FlopIndex) { $ArrayActionPos{'HOLECARDS'}{'END'} = $SummaryIndex - 1; } if (&CheckValidArrayActionPos(\%ArrayActionPos)) { # VERIFIES THAT INDICES OF BETROUNDS ARE GREATER/EQUAL THAN 0 return \%ArrayActionPos; &PrintArrayActionStrings(\%ArrayActionPos, $SingleHand_ref); } else { say "ERROR IN &GetArrayActionPos PARSING: VERIFY FAILED -> SKIPPING FILE."; &SkipFile($DatasetRef, 'error'); } } sub CheckValidArrayActionPos { my $hash_ref = shift; my $defined; for my $BetRound (keys %$hash_ref) { for my $key (keys %{$$hash_ref{$BetRound}}) { if (defined $$hash_ref{$BetRound}{$key} && $$hash_ref{$BetRound}{$key} >= 0) { $defined = 1; } else { $defined = 0; } return 0 if !$defined; } } return 1; } sub PrintArrayActionStrings { my ($ArrayActionPos_ref, $SingleHand_ref) = @_; # PRINT PREHOLECARDS print "====== PREHOLECARDS ======\n"; for my $i ($$ArrayActionPos_ref{'PREHOLECARDS'}{'START'} .. $$ArrayActionPos_ref{'PREHOLECARDS'}{'END'}) { print "Line $i: $$SingleHand_ref[$i]\n"; } print "\n"; # PRINT HOLECARDS print "====== HOLECARDS ======\n"; for my $i ($$ArrayActionPos_ref{'HOLECARDS'}{'START'} .. $$ArrayActionPos_ref{'HOLECARDS'}{'END'}) { print "Line $i: $$SingleHand_ref[$i]\n"; } print "\n"; # PRINT FLOP if ($$ArrayActionPos_ref{'FLOP'}) { print "====== FLOP ======\n"; for my $i ($$ArrayActionPos_ref{'FLOP'}{'START'} .. $$ArrayActionPos_ref{'FLOP'}{'END'}) { print "Line $i: $$SingleHand_ref[$i]\n"; } print "\n"; } # PRINT TURN if ($$ArrayActionPos_ref{'TURN'}) { print "====== TURN ======\n"; for my $i ($$ArrayActionPos_ref{'TURN'}{'START'} .. $$ArrayActionPos_ref{'TURN'}{'END'}) { print "Line $i: $$SingleHand_ref[$i]\n"; } print "\n"; } # PRINT RIVER if ($$ArrayActionPos_ref{'RIVER'}) { print "====== RIVER ======\n"; for my $i ($$ArrayActionPos_ref{'RIVER'}{'START'} .. $$ArrayActionPos_ref{'RIVER'}{'END'}) { print "Line $i: $$SingleHand_ref[$i]\n"; } print "\n"; } # PRINT SHOWDOWN if ($$ArrayActionPos_ref{'SHOWDOWN'}) { print "====== SHOWDOWN ======\n"; for my $i ($$ArrayActionPos_ref{'SHOWDOWN'}{'START'} .. $$ArrayActionPos_ref{'SHOWDOWN'}{'END'}) { print "Line $i: $$SingleHand_ref[$i]\n"; } print "\n"; } # PRINT SUMMARY print "====== SUMMARY ======\n"; for my $i ($$ArrayActionPos_ref{'SUMMARY'}{'START'} .. $$ArrayActionPos_ref{'SUMMARY'}{'END'}) { print "Line $i: $$SingleHand_ref[$i]\n"; } print "\n"; } sub dumpToFile { my ($filepath, $ref) = @_; # DATA DUMPER UTF8 HACK local *Data::Dumper::qquote = sub { qq["${\(shift)}"] }; local $Data::Dumper::Useperl = 1; open my $FILE, '>:encoding(UTF-8)', $filepath; print $FILE Dumper $ref; close $FILE; }