generate-plot-data 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #!/usr/bin/perl
  2. use FindBin '$RealBin';
  3. use lib "$RealBin/lib";
  4. use local::lib "$RealBin/perllib";
  5. use LogBot::BP;
  6. use DateTime;
  7. use File::Path qw(make_path);
  8. use File::Slurp;
  9. use JSON;
  10. my $QUIET = grep { $_ eq '-q' } @ARGV;
  11. LogBot->init("$RealBin/logbot.conf");
  12. my $DATA_PATH = LogBot->config->{data_path} . '/plot';
  13. generate_hours('', { name => '_empty' });
  14. generate_nicks('', { name => '_empty' });
  15. foreach my $network (LogBot->networks) {
  16. foreach my $channel ($network->channels) {
  17. next unless $channel->{public} || $channel->{hidden};
  18. generate_hours($network->{network}, $channel);
  19. generate_nicks($network->{network}, $channel);
  20. }
  21. }
  22. sub generate_hours {
  23. my ($network_name, $channel) = @_;
  24. my $data_path = $DATA_PATH . '/hours';
  25. make_path($data_path) unless -d $data_path;
  26. my $sql = sprintf("
  27. SELECT CAST(time %% (24 * 3600) AS INT), COUNT(*)
  28. FROM logs
  29. WHERE event in (%s, %s)
  30. GROUP BY CAST(time %% (24 * 3600) AS INT)
  31. ",
  32. EVENT_PUBLIC, EVENT_ACTION
  33. );
  34. my $filename = json_filename($data_path, $network_name, $channel);
  35. my %values;
  36. if ($channel->{name} ne '_empty') {
  37. my $dbh = $channel->database->{dbh};
  38. foreach my $row (@{ $dbh->selectall_arrayref($sql) }) {
  39. my ($ss, $value) = @$row;
  40. my $hh = sprintf("%.1f", $ss / (60 * 60));
  41. $hh = "0.0" if $hh == 24;
  42. $values{$hh} += $value;
  43. }
  44. }
  45. my @data;
  46. for (my $hh = 0; $hh < 24; $hh += 0.1) {
  47. $hh = sprintf("%.1f", $hh);
  48. push @data, [ $hh, $values{$hh} || 0 ];
  49. }
  50. my $json = {
  51. data => \@data,
  52. lines => {
  53. show => JSON::true,
  54. fill => JSON::true,
  55. },
  56. };
  57. write_file($filename, encode_json($json));
  58. }
  59. sub generate_nicks {
  60. my ($network_name, $channel) = @_;
  61. my $data_path = $DATA_PATH . '/nicks';
  62. make_path($data_path) unless -d $data_path;
  63. my $sql = "
  64. SELECT nick, COUNT(*) AS count
  65. FROM logs
  66. GROUP BY nick
  67. ORDER BY COUNT(*) DESC, nick ASC
  68. LIMIT 20
  69. ";
  70. my $filename = json_filename($data_path, $network_name, $channel);
  71. my $data = [];
  72. if ($channel->{name} ne '_empty') {
  73. my $dbh = $channel->database->{dbh};
  74. $data = $dbh->selectall_arrayref($sql, { Slice => {} });
  75. }
  76. my $json = {
  77. data => $data,
  78. bars => {
  79. show => JSON::true,
  80. },
  81. };
  82. write_file($filename, encode_json($json));
  83. }
  84. sub json_filename {
  85. my ($data_path, $network_name, $channel) = @_;
  86. my $channel_name = $channel->{name};
  87. $channel_name =~ s/^#//;
  88. $network_name .= '-' if $network_name;
  89. my $filename = "$data_path/$network_name$channel_name.json";
  90. $QUIET || say $filename;
  91. return $filename;
  92. }