1
0
Fork 0
mirror of https://github.com/perlbot/perlbuut synced 2025-06-07 16:55:42 -04:00
perlbuut/plugins/karmatop.pm

98 lines
3.3 KiB
Perl

use POE::Component::IRC::Common qw/l_irc/;
use DBI;
use DBD::SQLite;
no warnings 'void';
sub {
my( $said, $pm ) = @_;
my $body = $said->{body};
s/^\s+//, s/\s+$// for $body;
my $dbh = DBI->connect(
"dbi:SQLite:dbname=var/karma.db",
"",
"",
{ RaiseError => 1, PrintError => 0 }
);
if ($body =~ /me\s*(-?\d+)/) {
my $count = $1;
my $who = l_irc $said->{name};
my $sth;
if ($count > 0) {
$sth = $dbh->prepare("SELECT author, kars FROM (SELECT author, sum(operation) as kars FROM karma WHERE author <> 'perlbot' AND subject = ? GROUP BY author) AS karmsub ORDER BY kars DESC LIMIT ?");
} else {
$sth = $dbh->prepare("SELECT author, kars FROM (SELECT author, sum(operation) as kars FROM karma WHERE author <> 'perlbot' AND subject = ? GROUP BY author) AS karmsub ORDER BY kars ASC LIMIT ?");
}
$sth->execute($who, abs $count);
while (my $row = $sth->fetchrow_arrayref()) {
my $subject=$row->[0];
my $karma = $row->[1];
print "$subject: $karma ";
}
} elsif ($body =~ /abs\s*(-?\d+)/) {
my $count = $1;
my $sth;
if ($count > 0) {
$sth = $dbh->prepare("SELECT author, kars FROM (SELECT author, sum(abs(operation)) as kars FROM karma WHERE author <> 'perlbot' GROUP BY author) AS karmsub ORDER BY kars DESC LIMIT ?");
} else {
$sth = $dbh->prepare("SELECT author, kars FROM (SELECT author, sum(abs(operation)) as kars FROM karma WHERE author <> 'perlbot' GROUP BY author) AS karmsub ORDER BY kars ASC LIMIT ?");
}
$sth->execute(abs $count);
while (my $row = $sth->fetchrow_arrayref()) {
my $subject=$row->[0];
my $karma = $row->[1];
print "$subject: $karma ";
}
} elsif ($body =~ /most\s*(-?\d+)(\s*karma)?/){
my $count = $1;
my $sth;
if ($count > 0) {
$sth = $dbh->prepare("SELECT author, kars FROM (SELECT author, sum(operation) as kars FROM karma WHERE operation > 0 AND author <> 'perlbot' GROUP BY author) AS karmsub ORDER BY kars DESC LIMIT ?");
} else {
$sth = $dbh->prepare("SELECT author, kars FROM (SELECT author, sum(operation) as kars FROM karma WHERE operation < 0 AND author <> 'perlbot' GROUP BY author) AS karmsub ORDER BY kars ASC LIMIT ?");
}
$sth->execute(abs $count);
while (my $row = $sth->fetchrow_arrayref()) {
my $subject=$row->[0];
my $karma = $row->[1];
print "$subject: $karma ";
}
} elsif ($said->{body} =~ /\s*(-?\d+)(\s*karma)?/) {
my $count = $1;
my $sth;
if ($count > 0)
{
$sth = $dbh->prepare("SELECT subject, kars FROM (SELECT subject, sum(operation) as kars FROM karma GROUP BY subject) AS karmsub ORDER BY kars DESC LIMIT ?");
}
else
{
$sth = $dbh->prepare("SELECT subject, kars FROM (SELECT subject, sum(operation) as kars FROM karma GROUP BY subject) AS karmsub ORDER BY kars ASC LIMIT ?");
}
$sth->execute(abs $count);
while (my $row = $sth->fetchrow_arrayref())
{
my $subject=$row->[0];
my $karma = $row->[1];
print "$subject: $karma ";
}
} else {
print "usage is: top/bottom \\d+ karma";
}
};
__DATA__
karmatop <number>; returns the top or bottom karma for a number of things. to get bottom karma use negative numbers.