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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
package MasterServer::Database::SQLite::dbStats;
use strict;
use warnings;
use Exporter 'import';
our @EXPORT = qw| get_gamelist_stats
write_direct_beacons
write_stat
write_kfstats |;
################################################################################
# calculate stats for all individual games
################################################################################
sub get_gamelist_stats {
my $self = shift;
return $self->{dbh}->selectall_arrayref(
"SELECT DISTINCT gamename AS gamename,
COUNT(NULLIF(b333ms AND updated > datetime(?, 'unixepoch'), 0)) AS numdirect,
COUNT(NULLIF(updated > datetime(?, 'unixepoch'), 0)) AS numtotal
FROM serverlist
GROUP BY gamename", undef, time-7200, time-7200);
}
################################################################################
# Determine from the last beacon whether the server is still uplinking
# directly to us, or whether it stopped uplinking and is now artificially
# kept in the database.
################################################################################
sub write_direct_beacons {
my $self = shift;
my $u = $self->{dbh}->do(
"UPDATE serverlist
SET b333ms = 0
WHERE beacon < datetime(?, 'unixepoch') AND b333ms",
undef, time-3600);
# notify
$self->log("unset", "Lost $u direct beacons.") if ($u > 0);
}
################################################################################
# Write the stats to the games table
# A stat can not exist without existing gamename. Was inserted by cipher loader.
################################################################################
sub write_stat {
my ($self, %opt) = @_;
# if it is already in the pending list, update it with a new challenge
my $u = $self->{dbh}->do(
"UPDATE games
SET num_uplink = ?,
num_total = ?
WHERE gamename = ?",
undef, $opt{num_uplink}, $opt{num_total}, lc $opt{gamename});
# notify
$self->log("update", "Updated stats for $opt{gamename}.") if ($u > 0);
}
################################################################################
## Write the KFStats to the database
################################################################################
sub write_kfstats {
my ($self, $h) = @_;
# check if entry already excists.
my $u = $self->{dbh}->selectall_arrayref(
"SELECT * FROM kfstats WHERE UTkey = ? ", undef, $h->{UTkey});
if ( !defined $u->[0] ) {
$u = $self->{dbh}->do(
"INSERT INTO kfstats (UTkey, Username) VALUES (?,?)",
undef, $h->{UTkey}, $h->{Username});
# notify
$self->log("kfnew", "New KF Player $h->{Username} added");
}
# update existing information
$u = $self->{dbh}->do("UPDATE kfstats SET
Username = ?,
CurrentVeterancy = ?,
TotalKills = ?,
DecaptedKills = ?,
TotalMeleeDamage = ?,
MeleeKills = ?,
PowerWpnKills = ?,
BullpupDamage = ?,
StalkerKills = ?,
TotalWelded = ?,
TotalHealed = ?,
TotalPlaytime =?,
GamesWon = ?,
GamesLost = ?
WHERE UTkey = ?", undef,
$h->{Username},
$h->{CurrentVeterancy},
$h->{TotalKills},
$h->{DecaptedKills},
$h->{TotalMeleeDamage},
$h->{MeleeKills},
$h->{PowerWpnKills},
$h->{BullpupDamage},
$h->{StalkerKills},
$h->{TotalWelded},
$h->{TotalHealed},
$h->{TotalPlaytime},
$h->{GamesWon},
$h->{GamesLost},
$h->{UTkey}
);
}
1;
|