diff --git a/bin/add_missions.pl b/bin/add_missions.pl index 99243a73..cceacd7e 100644 --- a/bin/add_missions.pl +++ b/bin/add_missions.pl @@ -24,9 +24,10 @@ our $db = Lacuna->db; our $missions = $db->resultset('Lacuna::DB::Result::Mission'); out('Deleting missions nobody has completed...'); -$missions->search({ - date_posted => { '<' => DateTime->now->subtract( hours => 72 )} -})->delete; +my $old = $missions->search({date_posted => { '<' => DateTime->now->subtract( hours => 72 )}}); +while (my $mission = $old->next) { + $mission->incomplete; +} out('Adding missions...'); my @zones = $db->resultset('Lacuna::DB::Result::Map::Body')->search( diff --git a/lib/Lacuna/DB/Result/Log/Mission.pm b/lib/Lacuna/DB/Result/Log/Mission.pm new file mode 100644 index 00000000..78a9f9c0 --- /dev/null +++ b/lib/Lacuna/DB/Result/Log/Mission.pm @@ -0,0 +1,22 @@ +package Lacuna::DB::Result::Log::Mission; + +use Moose; +use utf8; +no warnings qw(uninitialized); +extends 'Lacuna::DB::Result'; +use Lacuna::Util; + +__PACKAGE__->table('mission_log'); +__PACKAGE__->add_columns( + filename => { data_type => 'varchar', size => 255 }, + offers => { data_type => 'int', default_value => 0 }, + skips => { data_type => 'int', default_value => 0 }, + skip_uni_level => { data_type => 'bigint', default_value => 0 }, + completes => { data_type => 'int', default_value => 0 }, + complete_uni_level => { data_type => 'bigint', default_value => 0 }, + seconds_to_complete => { data_type => 'bigint', default_value => 0 }, + incompletes => { data_type => 'int', default_value => 0 }, +); + +no Moose; +__PACKAGE__->meta->make_immutable(inline_constructor => 0); diff --git a/lib/Lacuna/DB/Result/Mission.pm b/lib/Lacuna/DB/Result/Mission.pm index 18bded4e..fc5574fa 100644 --- a/lib/Lacuna/DB/Result/Mission.pm +++ b/lib/Lacuna/DB/Result/Mission.pm @@ -27,6 +27,23 @@ has params => ( }, ); +sub log { + my $self = shift; + my $logs = Lacuna->db->resultset('Lacuna::DB::Result::Log::Mission'); + my $log = $logs->search({filename => $self->mission_file_name},{rows => 1})->single; + unless (defined $log) { + $log = $logs->new({filename => $self->mission_file_name})->insert; + } + return $log; +} + +sub incomplete { + my $self = shift; + my $log = $self->log; + $log->update({ incompletes => $log->incompletes + 1}); + $self->delete; +} + sub complete { my ($self, $body) = @_; $self->spend_objectives($body); @@ -37,12 +54,23 @@ sub complete { headline => sprintf($self->params->get('network_19_completion'), $body->empire->name), })->insert; $self->add_next_part; + my $log = $self->log; + $log->update({ + completes => $log->completes + 1, + complete_uni_level => $log->complete_uni_level + $body->empire->university_level, + seconds_to_complete => $log->seconds_to_complete + time() - $self->date_posted->epoch, + }); $self->delete; } sub skip { my ($self, $body) = @_; Lacuna->cache->set($self->mission_file_name, $body->empire_id, 1, 60 * 60 * 24 * 30); + my $log = $self->log; + $log->update({ + skips => $log->skips + 1, + skip_uni_level => $log->skip_uni_level + $body->empire->university_level, + }); } sub add_next_part { @@ -412,7 +440,7 @@ sub find_body_target { $body->search({ empire_id => undef }); } - return $body->search(undef,{rows => 1, order_by => 'rand()'})->get_column('id'); + return $body->search(undef,{rows => 1, order_by => 'rand()'})->get_column('id')->single; } sub find_star_target { @@ -432,7 +460,7 @@ sub find_star_target { $star->search({ color => $movement->{color} }); } - return $star->search(undef,{rows => 1, order_by => 'rand()'})->get_column('id'); + return $star->search(undef,{rows => 1, order_by => 'rand()'})->get_column('id')->single; } no Moose; diff --git a/lib/Lacuna/Web/MissionCurator.pm b/lib/Lacuna/Web/MissionCurator.pm index 848b7924..4c521615 100644 --- a/lib/Lacuna/Web/MissionCurator.pm +++ b/lib/Lacuna/Web/MissionCurator.pm @@ -10,6 +10,7 @@ use Module::Find; use UUID::Tiny ':std'; use Lacuna::Util qw(format_date); use List::Util qw(sum); +use Text::CSV_XS; sub www_add_essentia { my ($self, $request) = @_; @@ -36,6 +37,27 @@ sub www_add_essentia { return $self->www_default($request, 'Essentia Added'); } +sub www_stats { + my ($self, $request) = @_; + my $csv = Text::CSV_XS->new({binary => 1}); + my $logs = Lacuna->db->resultset('Lacuna::DB::Result::Log::Mission'); + my $out = $csv->combine('filename','number of times offered','number of incompletes','number of completes','completes university level','seconds to complete','number of skips','skips university level'); + while (my $log = $logs->next) { + $csv->combine( + $log->filename, + $log->offers, + $log->incompletes, + $log->completes, + $log->complete_uni_level, + $log->seconds_to_complete, + $log->skips, + $logs->skip_uni_level, + ); + $out .= $csv->string; + } + return $self->wrapper($out, { content_type => 'text/csv' }); +} + sub www_default { my ($self, $request, $message) = @_; my $page_number = $request->param('page_number') || 1; @@ -71,6 +93,7 @@ sub wrap { my ($self, $content) = @_; return $self->wrapper($content .'
Mission Utilities