123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- #!/usr/bin/perl
- use FindBin '$RealBin';
- use lib "$RealBin/lib";
- use local::lib "$RealBin/perllib";
- 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;
- }
|