use strict;
use warnings;
-our $VERSION = '0.001';
+our $VERSION = '0.001002';
use POE;
use POE::Component::IRC::State;
use POE::Component::IRC::Plugin::CTCP;
use IRC::Utils qw/parse_user/;
+use Carp;
use DBI;
use DBD::SQLite;
use Text::ParseWords qw/shellwords/;
my %state;
+sub _yield { $irc->yield(@_) }
+sub _nick_name { $irc->nick_name }
+
+sub _uptime {
+ my ($starttime, $nick) = @_;
+ my $sth=$dbh->prepare('SELECT start,end FROM presence WHERE end > ? AND nick == ?');
+ $sth->execute($starttime, $nick);
+
+ my $uptime=0;
+ while (my ($start, $end)=$sth->fetchrow_array) {
+ $uptime+=$end-max($start,$starttime)
+ }
+ return $uptime
+}
+
sub run {
$irc=POE::Component::IRC::State->spawn;
POE::Session->create(
options => { trace => $DEBUG },
);
- $dbh=DBI->connect("dbi:SQLite:dbname=$DB") or die "Cannot connect to database: $!";
+ $dbh=DBI->connect("dbi:SQLite:dbname=$DB") or croak "Cannot connect to database: $!";
$dbh->do('CREATE TABLE presence (start INTEGER, end INTEGER, nick TEXT)');
- $insert=$dbh->prepare('INSERT INTO presence (start, end, nick) VALUES (?,?,?)') or die "Cannot prepare query: $!";
- $update=$dbh->prepare('UPDATE presence SET end = ? WHERE start == ? AND nick == ?') or die "Cannot prepare query: $!";
+ $insert=$dbh->prepare('INSERT INTO presence (start, end, nick) VALUES (?,?,?)') or croak "Cannot prepare query: $!";
+ $update=$dbh->prepare('UPDATE presence SET end = ? WHERE start == ? AND nick == ?') or croak "Cannot prepare query: $!";
$poe_kernel->run();
};
$_[KERNEL]->delay(tick => $TICK);
}
-sub bot_start{
+sub bot_start{ ## no critic (RequireArgUnpacking)
$_[KERNEL]->delay(tick => $TICK);
$irc->plugin_add(CTCP => POE::Component::IRC::Plugin::CTCP->new(
+ version => "Statsbot/$VERSION",
+ source => 'https://metacpan.org/pod/App::Statsbot',
userinfo => 'A bot which keeps logs and computes channel statistics',
clientinfo => 'PING VERSION CLIENTINFO USERINFO SOURCE',
));
servers => [ $SERVER ],
));
- $irc->yield(register => 'all');
- $irc->yield(
+ _yield(register => 'all');
+ _yield(
connect => {
Nick => $NICKNAME,
Username => 'statsbot',
);
}
-sub on_fatal{ die "Fatal error: $_[ARG0]" }
+sub on_fatal{ croak "Fatal error: $_[ARG0]" }
sub on_public{
my ($targets,$message)=@_[ARG1,ARG2];
- my $botnick = $irc->nick_name;
- return unless $message =~ /(?:$botnick[:,])?\s*!?presence\s*(.*)/;
+ my $botnick = _nick_name;
+
+ if ($message =~ /(?:$botnick[:,])?\s*!?help\s*(.*)/sx) {
+ _yield(privmsg => $targets, 'Try !presence username interval [truncate]');
+ _yield(privmsg => $targets, q/For example, !presence mgv '2 days'/);
+ _yield(privmsg => $targets, q/or !presence mgv '1 year' 4/);
+ return;
+ }
+
+ return unless $message =~ /(?:$botnick[:,])?\s*!?presence\s*(.*)/sx;
my ($nick, $time, $truncate) = shellwords $1;
$truncate//=-1;
eval {
$time = parse_duration $time;
} or do {
- $irc->yield("cannot parse timespec: $time");
+ _yield(privmsg => $targets, "cannot parse timespec: $time");
return;
};
- my $starttime=time-$time;
-
- my $sth=$dbh->prepare('SELECT start,end FROM presence WHERE end > ? AND nick == ?');
- $sth->execute($starttime, $nick);
-
- my $uptime=0;
- while (my ($start, $end)=$sth->fetchrow_array) {
- $uptime+=$end-max($start,$starttime)
- }
+ my $uptime=_uptime time-$time, $nick;
my $ret;
if ($truncate == -1) {
$time=duration_exact $time;
- $irc->yield(privmsg => $targets, "$nick was here $ret during the last $time");
+ _yield(privmsg => $targets, "$nick was here $ret during the last $time");
}