Files
pkrstarsbot/server/server.pl
2021-02-16 23:07:41 +01:00

2831 lines
142 KiB
Perl

#! /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;
}