seperate class Data::StarCraft::PvPGN::Report
[perl/schtarr.git] / pvpgnreport
1 #!/usr/bin/env perl
2
3 use strict;
4 use warnings;
5 use Data::StarCraft::PvPGN::Report;
6 use Data::Dumper;
7
8 our $DBG = 0;
9 our $TEST = 0;
10
11 my $path = $ARGV[0] or die "Usage: $0 FILE\n";
12 my ($name) = $path =~ m{([^/]+)$};
13 my $report = Data::StarCraft::PvPGN::Report->open("$path.txt")
14         or die "No report file: $!\n";
15 my $data = $report->head;
16 print Dumper $data if $DBG;
17
18 my $players = $report->players;
19 my %resultdelta = qw(WIN 1  DISCONNECT 0  DRAW 0  LOSS -1);
20 for (@$players) {
21         defined $resultdelta{ $_->{result} }
22                 or die "Invalid player result '$_->{result}' for $_->{name}\n";
23         $_->{delta} = $resultdelta{ $_->{result} };
24 }
25 print Dumper $players if $DBG;
26
27 my %placetxt = (
28         bn => "bnet",
29         gr => "groningen",
30         md => "mdhq",
31 );
32 my ($placeid) = $name =~ /.*([a-z]{2})/;
33 my $place = $placetxt{$placeid} or die "Unknown place id: $placeid\n";
34 print "Resolved place '$placeid' to $place\n" if $DBG;
35
36 use DBIx::Simple;
37 my @dbinfo = do "dbinfo.inc.pl";
38 my $Db = DBIx::Simple->connect(@dbinfo, {pg_enable_utf8 => 1})
39         or die "No database: $DBI::errstr\n";
40
41 $TEST and exit;
42
43 $Db->begin;
44
45 use Date::Parse;
46 my ($start, $end) = map str2time($data->{$_}), qw(started ended);
47 use Date::Format;
48 $Db->insert("game", {
49         name => $name,
50         place => $place,
51         map => $data->{mapfile},
52         type => $data->{type},
53         start => time2str('%Y-%m-%d %X', $start),
54         duration => sprintf('%d seconds', $end - $start),
55 })->rows or die "Game insert failed: ".$Db->error."\n";
56 my $gameid = $Db->last_insert_id((undef) x 4, {sequence => "game_id_seq"})
57         or die "Couldn't find our game insertion: ".$Db->error."\n";
58 print "Game inserted as # $gameid\n";
59
60 $Db->insert("play", {
61         game => $gameid,
62         slot => $_,
63         name => $players->[$_]->{name},
64         account => $players->[$_]->{name},
65         result => $players->[$_]->{delta},
66         race => substr($players->[$_]->{race}, 0, 1),
67 })->rows or die "Player insert failed: ".$Db->error."\n"
68         for 0 .. $#$players;
69
70 $Db->commit;
71