2831 lines
142 KiB
Perl
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;
|
|
} |