forked from globau/logbot
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgenerate-plot-data
More file actions
executable file
·107 lines (91 loc) · 2.75 KB
/
generate-plot-data
File metadata and controls
executable file
·107 lines (91 loc) · 2.75 KB
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
#!/usr/bin/perl
use FindBin '$RealBin';
use lib $RealBin;
use LogBot::BP;
use DateTime;
use File::Path qw(make_path);
use File::Slurp;
use JSON;
my $QUIET = grep { $_ eq '-q' } @ARGV;
LogBot->init("$RealBin/logbot.conf");
my $DATA_PATH = LogBot->config->{data_path} . '/plot';
generate_hours('', { name => '_empty' });
generate_nicks('', { name => '_empty' });
foreach my $network (LogBot->networks) {
foreach my $channel ($network->channels) {
next unless $channel->{public} || $channel->{hidden};
generate_hours($network->{network}, $channel);
generate_nicks($network->{network}, $channel);
}
}
sub generate_hours {
my ($network_name, $channel) = @_;
my $data_path = $DATA_PATH . '/hours';
make_path($data_path) unless -d $data_path;
my $sql = sprintf("
SELECT CAST(time %% (24 * 3600) AS INT), COUNT(*)
FROM logs
WHERE event in (%s, %s)
GROUP BY CAST(time %% (24 * 3600) AS INT)
",
EVENT_PUBLIC, EVENT_ACTION
);
my $filename = json_filename($data_path, $network_name, $channel);
my %values;
if ($channel->{name} ne '_empty') {
my $dbh = $channel->database->{dbh};
foreach my $row (@{ $dbh->selectall_arrayref($sql) }) {
my ($ss, $value) = @$row;
my $hh = sprintf("%.1f", $ss / (60 * 60));
$hh = "0.0" if $hh == 24;
$values{$hh} += $value;
}
}
my @data;
for (my $hh = 0; $hh < 24; $hh += 0.1) {
$hh = sprintf("%.1f", $hh);
push @data, [ $hh, $values{$hh} || 0 ];
}
my $json = {
data => \@data,
lines => {
show => JSON::true,
fill => JSON::true,
},
};
write_file($filename, encode_json($json));
}
sub generate_nicks {
my ($network_name, $channel) = @_;
my $data_path = $DATA_PATH . '/nicks';
make_path($data_path) unless -d $data_path;
my $sql = "
SELECT nick, COUNT(*) AS count
FROM logs
GROUP BY nick
ORDER BY COUNT(*) DESC, nick ASC
LIMIT 20
";
my $filename = json_filename($data_path, $network_name, $channel);
my $data = [];
if ($channel->{name} ne '_empty') {
my $dbh = $channel->database->{dbh};
$data = $dbh->selectall_arrayref($sql, { Slice => {} });
}
my $json = {
data => $data,
bars => {
show => JSON::true,
},
};
write_file($filename, encode_json($json));
}
sub json_filename {
my ($data_path, $network_name, $channel) = @_;
my $channel_name = $channel->{name};
$channel_name =~ s/^#//;
$network_name .= '-' if $network_name;
my $filename = "$data_path/$network_name$channel_name.json";
$QUIET || say $filename;
return $filename;
}