forked from beebop-Wiz/nethack-server
-
Notifications
You must be signed in to change notification settings - Fork 0
/
psql_leaderboard_write.pl
88 lines (76 loc) · 2.03 KB
/
psql_leaderboard_write.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
use DBI;
use DBD::Pg;
use File::Temp qw(tempfile);
use strict;
my $dbh = DBI->connect("dbi:Pg:dbname=nethack", "", "", { RaiseError => 1, AutoCommit => 0 } );
my ($tfh1, $tfname1) = tempfile("/tmp/psqllbXXXXXX", UNLINK=>1);
my ($tfh2, $tfname2) = tempfile("/tmp/psqldfXXXXXX", UNLINK=>1);
`diff xlogfile /opt/nethack/nh361/xlogfile > $tfname1`;
`cat $tfname1 > discord_fifo`;
`cp /opt/nethack/nh361/xlogfile xlogfile`;
my $lcnt = 0;
while(<$tfh1>) {
if($lcnt) {
if(/> (.*)/) {
print $tfh2 "$1\n";
}
$lcnt--;
} else {
if(/[0-9]+a[0-9]+,([0-9]+)/) {
$lcnt = $1;
} elsif(/[0-9]+a[0-9]+/) {
$lcnt = 1;
}
}
}
seek $tfh2, 0, 0;
my @log;
my $insert_sth = $dbh->prepare(<<EOQ);
INSERT INTO games VALUES ( DEFAULT, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?::bit, ?, ?, ?, ?, ?, ?, ?, to_timestamp(?), to_timestamp(?), ?::bit, ? );
EOQ
my %role_lookup = (
'Arc' => 0,
'Bar' => 1,
'Cav' => 2,
'Hea' => 3,
'Kni' => 4,
'Mon' => 5,
'Pri' => 6,
'Ran' => 7,
'Rog' => 8,
'Sam' => 9,
'Tou' => 10,
'Val' => 11,
'Wiz' => 12
);
my %race_lookup = (
'Hum' => 0,
'Elf' => 1,
'Dwa' => 2,
'Gno' => 3,
'Orc' => 4
);
my %align_lookup = (
'Law' => 0,
'Neu' => 1,
'Cha' => 2
);
my %gender_lookup = (
'Mal' => 0,
'Fem' => 1
);
while(<$tfh2>) {
print;
my @fields_arr = split /\t/;
my %F;
foreach my $f (@fields_arr) {
my @fa = split /=/, $f;
$F{$fa[0]} = $fa[1];
}
$F{'conduct'} = hex $F{'conduct'};
$F{'achieve'} = hex $F{'achieve'};
$F{'death'} .= ", while " . $F{'while'} if exists $F{'while'};
$insert_sth->execute(@F{'version', 'deathdnum', 'deathlev', 'maxlvl', 'hp', 'maxhp', 'points', 'deaths', 'deathdate', 'birthdate'}, $role_lookup{$F{'role'}}, $race_lookup{$F{'race'}}, $gender_lookup{$F{'gender'}}, $align_lookup{$F{'align'}}, @F{'name', 'death', 'conduct', 'turns', 'achieve', 'realtime', 'starttime', 'endtime'}, $gender_lookup{$F{'gender0'}}, $align_lookup{$F{'align0'}});
}
$dbh->commit;
$dbh->disconnect;