XXX: scmap: restore metadata marking (era-dependant styling)
[perl/schtarr.git] / pvpgnreport
index 1a91ddf83a63210f875786146e295b96a18be388..1f1abea19554cfa8e9f631be12d5b94b707fcfd7 100755 (executable)
@@ -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{<race>([^<]+)</race>} or next;
-               while (1) {
-                       defined $player[++$i]
-                               or die("More <race> 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,