11 my ($reportfile) = @_;
13 while (defined ($_ = readline $reportfile)) {
14 # empty line = end of head
16 # strip first key=val pair
18 ^\s* ([a-zA-Z]+) = ("(?: [^"\\] | \\. )*" | \S*)
19 }{}x or chomp, warn("Unknown pvpgn report header line: $_\n"), next;
20 my ($key, $val) = ($1, $2);
21 $val =~ s/^"(.*)"$/$1/ and $val =~ s/\\(.)/$1/g; # unquote
23 redo if /\S/; # other pairs on this line
29 my ($reportfile) = @_;
32 while (defined ($_ = readline $reportfile)) {
33 # ignore leading empty lines; stop if trailing
34 /\S/ or @player ? last : next;
35 my ($name, $result, $ladder) = /^ (\S+) \s+ ([A-Z]+) \s* (.*)/x
36 or chomp, warn("Unknown pvpgn report player line: $_\n");
37 push @player, {name => $name, result => $result};
39 my @ladderdata = $ladder =~ m{
40 ^ \s* rating=(\d+) \s+ \[\#\d+\]
41 \s+ prob=([\d.]+)% \s+ K=(\d+) \s+ adj=([+-]\d+) \s* $
42 }x ? $player[-1]{ladder} = {
47 } : warn("Unknown ladder details for player $name: $ladder\n");
52 while (defined ($_ = readline $reportfile)) {
53 m{<race>([^<]+)</race>} or next;
56 or die("More <race> entries than $i found players\n");
57 last unless $player[$i]->{result} eq "DISCONNECT";
59 $player[$i]->{race}= $1;
65 my $name = $ARGV[0] or die "Usage: $0 FILE\n";
66 open my $reportfile, '<', "$name.txt" or die "No report file: $!\n";
67 my $report = reporthead($reportfile);
68 print Dumper $report if $DBG;
70 my $players = reportplayers($reportfile);
71 my %resultdelta = qw(WIN 1 DISCONNECT 0 DRAW 0 LOSS -1);
73 defined $resultdelta{ $_->{result} }
74 or die "Invalid player result '$_->{result}' for $_->{name}\n";
75 $_->{delta} = $resultdelta{ $_->{result} };
77 print Dumper $players if $DBG;
84 my ($placeid) = $name =~ /.*([a-z]{2})/;
85 my $place = $placetxt{$placeid} or die "Unknown place id: $placeid\n";
86 print "Resolved place '$placeid' to $place\n" if $DBG;
89 my @dbinfo = do "dbinfo.inc.pl";
90 my $Db = DBIx::Simple->connect(@dbinfo, {pg_enable_utf8 => 1})
91 or die "No database: $DBI::errstr\n";
98 my ($start, $end) = map str2time($report->{$_}), qw(started ended);
100 $Db->insert("game", {
103 map => $report->{mapfile},
104 type => $report->{type},
105 start => time2str('%Y-%m-%d %X', $start),
106 duration => sprintf('%d seconds', $end - $start),
107 })->rows or die "Game insert failed: ".$Db->error."\n";
108 my $gameid = $Db->last_insert_id((undef) x 4, {sequence => "game_id_seq"});
110 $Db->insert("play", {
113 name => $players->[$_]->{name},
114 account => $players->[$_]->{name},
115 result => $players->[$_]->{delta},
116 race => substr($players->[$_]->{race}, 0, 1),
117 })->rows or die "Player insert failed: ".$Db->error."\n"