X-Git-Url: http://git.shiar.net/perl/schtarr.git/blobdiff_plain/66615c316074968c4c39fd3962ba2e7eacedd44c..HEAD:/pvpgnreport diff --git a/pvpgnreport b/pvpgnreport index 1a91ddf..1f1abea 100755 --- a/pvpgnreport +++ b/pvpgnreport @@ -2,61 +2,28 @@ use strict; use warnings; +use Data::StarCraft::PvPGN::Report; use Data::Dumper; +our $VERSION = '1.00'; + our $DBG = 0; our $TEST = 0; -sub reporthead { - my ($reportfile) = @_; - my %report; - while (defined ($_ = readline $reportfile)) { - # empty line = end of head - /\S/ or last; - # strip first key=val pair - s{ - ^\s* ([a-zA-Z]+) = ("(?: [^"\\] | \\. )*" | \S*) - }{}x or chomp, warn("Unknown pvpgn report header line: $_\n"), next; - my ($key, $val) = ($1, $2); - $val =~ s/^"(.*)"$/$1/ and $val =~ s/\\(.)/$1/g; # unquote - $report{$key} = $val; - redo if /\S/; # other pairs on this line - } - return \%report; -} - -sub reportplayers { - my ($reportfile) = @_; - my @player; - - while (defined ($_ = readline $reportfile)) { - # ignore leading empty lines; stop if trailing - /\S/ or @player ? last : next; - my ($name, $result) = /^ (.*?) \s+ ([A-Z]+) \s*$/x - or chomp, warn("Unknown pvpgn report player line: $_\n"); - push @player, {name => $name, result => $result}; - } - - my $i = -1; - while (defined ($_ = readline $reportfile)) { - m{([^<]+)} or next; - while (1) { - defined $player[++$i] - or die("More entries than $i found players\n"); - last unless $player[$i]->{result} eq "DISCONNECT"; - } - $player[$i]->{race}= $1; - } - - return \@player; -} +use Getopt::Long qw(:config bundling auto_version auto_help); +GetOptions( + "verbose|v!" => \$DBG, + "test|t!" => \$TEST, +); -my $name = $ARGV[0] or die "Usage: $0 FILE\n"; -open my $reportfile, '<', "$name.txt" or die "No report file: $!\n"; -my $report = reporthead($reportfile); -print Dumper $report if $DBG; +my $path = $ARGV[0] or die "Usage: $0 FILE\n"; +my ($name) = $path =~ m{([^/]+)$}; +my $report = Data::StarCraft::PvPGN::Report->open("$path.txt") + or die "No report file: $!\n"; +my $data = $report->head; +print Dumper $data if $DBG; -my $players = reportplayers($reportfile); +my $players = $report->players; my %resultdelta = qw(WIN 1 DISCONNECT 0 DRAW 0 LOSS -1); for (@$players) { defined $resultdelta{ $_->{result} } @@ -74,9 +41,8 @@ my ($placeid) = $name =~ /.*([a-z]{2})/; my $place = $placetxt{$placeid} or die "Unknown place id: $placeid\n"; print "Resolved place '$placeid' to $place\n" if $DBG; -use DBIx::Simple; -my @dbinfo = do "dbinfo.inc.pl"; -my $Db = DBIx::Simple->connect(@dbinfo, {pg_enable_utf8 => 1}) +use Games::StarCraft::DB; +my $Db = Games::StarCraft::DB->connect or die "No database: $DBI::errstr\n"; $TEST and exit; @@ -84,17 +50,19 @@ $TEST and exit; $Db->begin; use Date::Parse; -my ($start, $end) = map str2time($report->{$_}), qw(started ended); +my ($start, $end) = map str2time($data->{$_}), qw(started ended); use Date::Format; $Db->insert("game", { name => $name, place => $place, - map => $report->{mapfile}, - type => $report->{type}, + map => $data->{mapfile}, + type => $data->{type}, start => time2str('%Y-%m-%d %X', $start), duration => sprintf('%d seconds', $end - $start), })->rows or die "Game insert failed: ".$Db->error."\n"; -my $gameid = $Db->last_insert_id((undef) x 4, {sequence => "game_id_seq"}); +my $gameid = $Db->last_insert_id((undef) x 4, {sequence => "game_id_seq"}) + or die "Couldn't find our game insertion: ".$Db->error."\n"; +print "Game inserted as # $gameid\n"; $Db->insert("play", { game => $gameid,