# vim:set sw=4 ts=4 sts=4 ft=perl expandtab: package Lutim::Command::cron::stats; use Mojo::Base 'Mojolicious::Command'; use Mojo::DOM; use Mojo::Util qw(encode); use Mojo::File; use Mojo::JSON qw(encode_json); use Lutim::DB::Image; use Lutim::DefaultConfig qw($default_config); use DateTime; use FindBin qw($Bin); use File::Spec qw(catfile); use POSIX; has description => 'Generate statistics about Lutim.'; has usage => sub { shift->extract_usage }; sub run { my $c = shift; my $cfile = Mojo::File->new($Bin, '..' , 'lutim.conf'); if (defined $ENV{MOJO_CONFIG}) { $cfile = Mojo::File->new($ENV{MOJO_CONFIG}); unless (-e $cfile->to_abs) { $cfile = Mojo::File->new($Bin, '..', $ENV{MOJO_CONFIG}); } } my $config = $c->app->plugin('Config', { file => $cfile, default => $default_config }); my $template = 'themes/'.$config->{theme}.'/templates/data.html.ep.template'; unless (-e $template) { $template = 'themes/default/templates/data.html.ep.template'; } my $stats = {}; my $text = Mojo::File->new($template)->slurp; my $dom = Mojo::DOM->new($text); my $thead_tr = $dom->at('table thead tr'); my $tbody_tr = $dom->at('table tbody tr'); my $tbody_t2 = $tbody_tr->next; my $separation = time() - $config->{stats_day_num} * 86400; my %data; my $img = Lutim::DB::Image->new(app => $c->app); my $sca = $img->select_created_after($separation); $stats->{total} = $img->count_not_empty; $stats->{average} = floor($sca->size / $config->{stats_day_num}) if $config->{stats_day_num}; $stats->{for_days} = $config->{stats_day_num}; $sca->each( sub { my ($e, $num) = @_; my $time = DateTime->from_epoch(epoch => $e->created_at); my ($year, $month, $day) = ($time->year(), $time->month(), $time->day()); if (defined($data{$year}->{$month}->{$day})) { $data{$year}->{$month}->{$day} += 1; } else { $data{$year}->{$month}->{$day} = 1; } } ); my $total = $img->count_created_before($separation); if (scalar(keys %data)) { for my $year (sort {$a <=> $b} keys %data) { for my $month (sort {$a <=> $b} keys %{$data{$year}}) { for my $day (sort {$a <=> $b} keys %{$data{$year}->{$month}}) { $thead_tr->append_content(sprintf("%#.2d/%#.2d/%d\n", $day, $month, $year)); $tbody_tr->append_content(sprintf("%d\n", $data{$year}->{$month}->{$day})); $total += $data{$year}->{$month}->{$day}; $tbody_t2->append_content(sprintf("%d\n", $total)); } } } } else { my $dt = DateTime->from_epoch(epoch => $separation); $thead_tr->append_content(sprintf("%#.2d/%#.2d/%d\n", $dt->day(), $dt->month(), $dt->year())); $tbody_tr->append_content("0\n"); $tbody_t2->append_content(sprintf("%d\n", $total)); $dt = DateTime->now(); $thead_tr->append_content(sprintf("%#.2d/%#.2d/%d\n", $dt->day(), $dt->month(), $dt->year())); $tbody_tr->append_content("0\n"); $tbody_t2->append_content(sprintf("%d\n", $total)); } my $moy = $total / $config->{stats_day_num}; # Raw datas my $template2 = 'themes/'.$config->{theme}.'/templates/raw.html.ep.template'; unless (-e $template2) { $template2 = 'themes/default/templates/raw.html.ep.template'; } my $text2 = Mojo::File->new($template2)->slurp; my $dom2 = Mojo::DOM->new($text2); my $raw = $dom2->at('table tbody'); my $raw_foot = $dom2->at('table tfoot'); my $unlimited_enabled = $img->count_delete_at_day_endis(0, 1); my $unlimited_disabled = $img->count_delete_at_day_endis(0, 0); my $day_enabled = $img->count_delete_at_day_endis(1, 1); my $day_disabled = $img->count_delete_at_day_endis(1, 0); my $week_enabled = $img->count_delete_at_day_endis(7, 1); my $week_disabled = $img->count_delete_at_day_endis(7, 0); my $month_enabled = $img->count_delete_at_day_endis(30, 1); my $month_disabled = $img->count_delete_at_day_endis(30, 0); my $year_enabled = $img->count_delete_at_day_endis(365, 1); my $year_disabled = $img->count_delete_at_day_endis(365, 0); my $year_disabled_in_month = $img->count_delete_at_day_endis(365, 1, time - 335 * 86400); $stats->{unlimited} = { enabled => $unlimited_enabled, disabled => $unlimited_disabled }; $stats->{day} = { enabled => $day_enabled, disabled => $day_disabled }; $stats->{week} = { enabled => $week_enabled, disabled => $week_disabled }; $stats->{month} = { enabled => $month_enabled, disabled => $month_disabled }; $stats->{year} = { enabled => $year_enabled, disabled => $year_disabled }; my $year_disabled_in_month_pct = ($year_enabled != 0) ? " (".sprintf('%.2f', 100*$year_disabled_in_month/$year_enabled)."%)" : ''; $raw->append_content("\n<%= \$raw[4] %>".$unlimited_enabled."".$unlimited_disabled."ΓΈ\n"); $raw->append_content("<%= \$raw[5] %>".$day_enabled."".$day_disabled."".$day_enabled." (100%)\n"); $raw->append_content("<%= \$raw[6] %>".$week_enabled."".$week_disabled."".$week_enabled." (100%)\n"); $raw->append_content("<%= \$raw[7] %>".$month_enabled."".$month_disabled."".$month_enabled." (100%)\n"); $raw->append_content("<%= \$raw[8] %>".$year_enabled."".$year_disabled."".$year_disabled_in_month.$year_disabled_in_month_pct."\n"); $raw_foot->append_content("\n<%= \$raw[9] %>".($unlimited_enabled + $day_enabled + $week_enabled + $month_enabled + $year_enabled)."".($unlimited_disabled + $day_disabled + $week_disabled + $month_disabled + $year_disabled)."".($day_enabled + $week_enabled + $month_enabled + $year_disabled_in_month)."\n"); $dom2 = <", value: $unlimited_enabled}, {label: "<%= l('24 hours') %>", value: $day_enabled}, {label: "<%= l('%1 days', 7) %>", value: $week_enabled}, {label: "<%= l('%1 days', 30) %>", value: $month_enabled}, {label: "<%= l('1 year') %>", value: $year_enabled}, ], colors: [ '#40b489', '#40b9b1', '#40a1be', '#427dc1', '#455ac3', ] }; var disabled_donut = { element: 'raw-disabled-holder', data: [ {label: "<%= l('no time limit') %>", value: $unlimited_disabled}, {label: "<%= l('24 hours') %>", value: $day_disabled}, {label: "<%= l('%1 days', 7) %>", value: $week_disabled}, {label: "<%= l('%1 days', 30) %>", value: $month_disabled}, {label: "<%= l('1 year') %>", value: $year_disabled}, ], colors: [ '#40b489', '#40b9b1', '#40a1be', '#427dc1', '#455ac3', ] }; EOF Mojo::File->new('themes/'.$config->{theme}.'/templates/stats.json.ep')->spew(encode_json($stats)); Mojo::File->new('themes/'.$config->{theme}.'/templates/data.html.ep')->spew($dom); Mojo::File->new('themes/'.$config->{theme}.'/templates/raw.html.ep')->spew(encode('UTF-8', $dom2)); mkdir 'themes/'.$config->{theme}.'/templates/partial/' unless -d 'themes/'.$config->{theme}.'/templates/partial/'; Mojo::File->new('themes/'.$config->{theme}.'/templates/partial/raw.js.ep')->spew(encode('UTF-8', $js)); } =encoding utf8 =head1 NAME Lutim::Command::cron::stats - Stats generator =head1 SYNOPSIS Usage: script/lutim cron stats =cut 1;