1
0
Fork 0
mirror of https://github.com/perlbot/perlbuut synced 2025-06-07 10:35:41 -04:00

Update plugins. Karma parsing for module names, and add a few more top/bottom options. Also update some eval stuff and make perldoc handle nested commands better

This commit is contained in:
Ryan Voots 2018-09-13 14:27:34 -04:00
parent 4b7f595637
commit 1e5af45c57
6 changed files with 261 additions and 52 deletions

View file

@ -54,7 +54,7 @@ sub handle {
my( $self, $said, $pm ) = @_;
my $body = $said->{body};
if( $body =~ /\(([^\)]+)\)(\+\+|--)/ or $body =~ /([\w\[\]\\`_^{|}-]+)(\+\+|--)/ ) {
if( $body =~ /\(([^\)]+)\)(\+\+|--)/ or $body =~ /([\w\[\]\\`_^{|}\-:]+)(\+\+|--)/ ) {
my( $subject, $op ) = ($1,$2);
if( $op eq '--' ) { $op = -1 } elsif( $op eq '++' ) { $op = 1 }
my $lirc = l_irc($subject) || lc $subject;

View file

@ -9,10 +9,6 @@ sub {
my $body = $said->{body};
s/^\s+//, s/\s+$// for $body;
warn "KARMATOPPLUGIN";
use Data::Dumper;
warn Dumper $said;
my $dbh = DBI->connect(
"dbi:SQLite:dbname=var/karma.db",
"",
@ -20,8 +16,59 @@ sub {
{ RaiseError => 1, PrintError => 0 }
);
if ($said->{body} =~ /\s*(-?\d+)(\s*karma)?/)
{
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)
@ -42,9 +89,7 @@ sub {
print "$subject: $karma ";
}
}
else
{
} else {
print "usage is: top/bottom \\d+ karma";
}
};

View file

@ -1,21 +1,67 @@
package Bot::BB3::Plugin::Perldoc;
use strict;
use warnings;
use URI::Encode qw(uri_encode);
no warnings 'void';
sub {
my( $said, $pm ) = @_;
sub new {
my( $class ) = @_;
my $self = bless {}, $class;
$self->{name} = 'perldoc';
$self->{opts} = {
command => 1,
handler => 1,
};
$self->{aliases} = ['perldoc'];
return $self;
}
sub get_conf_for_channel {
my ($self, $pm, $server, $channel) = @_;
my $gc = sub {$pm->plugin_conf($_[0], $server, $channel)};
# Load factoids if it exists, otherwise grab the old nfacts setup
my $conf = $gc->("perldoc");
return $conf;
}
sub handle {
my( $self, $said, $pm ) = @_;
my $conf = $self->get_conf_for_channel($pm, $said->{server}, $said->{channel});
my $url = "";
if ($said->{body} =~ /-q\s+(.*)/i) #faq questions
if (!$said->{addressed} && !$conf->{addressed} && $said->{body} =~ /^perldoc\s+(.*?)$/i) {
local $said->{body} = $1;
my ($handled, $result) = $self->command($said, $pm);
if ($handled eq "handled") {
return $result;
}
}
}
sub command {
my( $self, $said, $pm ) = @_;
my $url = "";
if ($said->{body} =~ /-q\s+(.*?)\s*(?:#.*)?/i) #faq questions
{#http://perldoc.perl.org/search.html?q=foo+bar
my $trimmed = $1;
$trimmed =~ s/^\s*(\S+)\s*$/$1/;
my $query = uri_encode($trimmed);
$query =~ s/%20/+/g;
$url = "http://perldoc.perl.org/search.html?q=".$query;
$url = "https://perldoc.pl/search?q=".$query;
# $url = makeashorterlink($url);
}
elsif ($said->{body} =~ /-f\s+(.*)/i) #functions, only use the first part of a multiword expression
elsif ($said->{body} =~ /-f\s+(\S+)\s*/i) #functions, only use the first part of a multiword expression
{
#http://perldoc.perl.org/functions/abs.html
my $func = $1;
@ -27,34 +73,51 @@ sub {
$url = "https://perldoc.pl/functions/".$func
}
elsif ($said->{body} =~ /-m\s+(.*)\s*$/i) # got a module!
elsif ($said->{body} =~ /-v\s+(\S+)\s*/i) #functions, only use the first part of a multiword expression
{
my $var = uri_encode($1, {"encode_reserved" => 1});
$url = "https://perldoc.pl/variables/".$var
}
elsif ($said->{body} =~ /-m\s+(\S+)\s*/i) # got a module!
{#http://search.cpan.org/search?query=foo%3ABar&mode=all
my $query = uri_encode($1);
# $query =~ s/%20/+/g;
$url = "https://p3rl.org/".$query;
$url = "https://perldoc.pl/".$query;
# $url = makeashorterlink($url);
}
elsif ($said->{body} =~ /::/) #module, go to cpan also
{
my $trimmed = $said->{body};
$trimmed =~ s/^\s*(\S+)\s*$/$1/;
$trimmed =~ s/^\s*(\S+)\s*(?:#.*)?$/$1/;
my $query = uri_encode($trimmed);
$query =~ s/%20/+/g;
$url = "https://p3rl.org/".$query;
$url = "https://perldoc.pl/$query";
# $url = makeashorterlink($url);
}
else # we've got just a plain word, use it as a doc title
{ #http://perldoc.perl.org/perlrun.html
if ($said->{body} =~ /\s*(\S+)\s*/)
if ($said->{body} =~ /^\s*(\S+)\s*(?:#.*)?$/)
{
$url = "https://perldoc.pl/$1";
}
else
{
print "Please request a valid section of perl documentation; you may also use, -q, -f, and -m just like on the command line";
if ($said->{addressed}) {
return("handled", "Please request a valid section of perl documentation; you may also use, -q, -f, and -m just like on the command line");
}
return;
}
}
print "Your documentation is available at: ", $url;
if (!$said->{nested}) {
return ("handled", "Your documentation is available at: $url");
} else {
return ("handled", $url);
}
}
"Bot::BB3::Plugin::Perldoc";
__DATA__
Provide links to perldoc pages and module documentation on metacpan. Takes most options like the perldoc command line program.

View file

@ -36,7 +36,7 @@ sub make_pastebin {
}
}
my @versions = ('', qw(1 2 3 4 5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.6t 5.8 5.10 5.12 5.14 5.16 5.18 5.20 5.22 5.24 5.26 5.26t all));
my @versions = ('', qw(1 2 3 4 5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.6t 5.8 5.10 5.12 5.14 5.16 5.18 5.20 5.22 5.24 5.26 5.26t 5.28 all));
sub new {
my( $class ) = @_;
@ -47,9 +47,9 @@ sub new {
command => 1,
};
my @perl_aliases = map {("eval$_", "weval$_", "seval$_", "wseval$_", "sweval$_")} @versions;
my @perl_aliases = map {("eval$_", "weval$_", "seval$_", "wseval$_", "sweval$_", "meval$_")} @versions;
$self->{aliases} = [ qw/jseval rkeval jeval phpeval pleval perleval deparse swdeparse wsdeparse wdeparse sdeparse k20eval rbeval pyeval luaeval cpeval wscpeval swcpeval wcpeval scpeval bleval coboleval cbeval/, @perl_aliases ];
$self->{aliases} = [ qw/jseval rkeval jeval phpeval pleval perleval deparse swdeparse wsdeparse wdeparse sdeparse k20eval rbeval pyeval luaeval cpeval wscpeval swcpeval wcpeval scpeval bleval coboleval cbeval basheval/, @perl_aliases ];
$self->{dbh} = DBI->connect("dbi:SQLite:dbname=var/evallogs.db");
return $self;
@ -87,6 +87,7 @@ sub command {
's' => 'perl',
'ws' => 'perl',
'sw' => 'perl',
'm' => 'perl',
'cp' => 'cperl',
'swcp' => 'cperl',
'wscp' => 'cperl',
@ -96,7 +97,8 @@ sub command {
'bl' => 'perl',
'cb' => 'cobol',
'cobol' => 'cobol',
map {($_=>"perl$_", "w$_"=>"perl$_", "s$_" => "perl$_", "ws$_"=>"perl$_", "sw$_"=>"perl$_")} @versions
'bash' => 'bash',
map {($_=>"perl$_", "w$_"=>"perl$_", "s$_" => "perl$_", "ws$_"=>"perl$_", "sw$_"=>"perl$_", "m$_"=>"perl$_")} @versions
);
my $orig_type = $type;
@ -118,13 +120,14 @@ sub command {
$code = eval {Encode::decode("utf8", $code)} // $code;
if ($command =~ /^([ws]+)?(?:eval|deparse)(?:5\.(\d+))?(all)?/i) {
if ($command =~ /^([wsm]+)?(?:eval|deparse)(?:5\.(\d+))?(all)?/i) {
my $c=$1;
my $v=$2;
my $all = $3;
$code = "use warnings; ".$code if ($c =~ /w/ && ($v>=6 || !defined $v || $all));
$code = '$^W=1;'.$code if ($c =~ /w/ && (defined $v && $v < 6 && !$all));
$code = "use strict; ".$code if ($c =~ /s/);
$code = "use ojo; ".$code if ($c =~ /m/);
}
$code = "use utf8; ". $code if ($type =~ /^perl(5.(8|10|12|14|16|18|20|22|24|26))?$/);

85
plugins/tell.pm Normal file
View file

@ -0,0 +1,85 @@
package Bot::BB3::Plugin::Tell;
use strict;
no warnings 'void';
sub new {
my( $class ) = @_;
my $self = bless {}, $class;
$self->{name} = 'tell';
$self->{opts} = {
command => 1,
};
return $self;
}
sub command {
my( $self, $said, $pm ) = @_;
my ($who, $what);
if ($said->{body} =~ /^\s*(.*?)\s+about\s+(.*)$/ ||
$said->{body} =~ /^\s*(\S*)\s+(.*)$/) {
($who, $what) = ($1, $2)
} else {
return ("handled", "Tell who about what?");
}
my ($success, $result) = runplugin($what, $said, $who, $pm);
unless ($success) {
my $result2;
($success, $result2) = runplugin("default $what", $said, $who, $pm);
if ($success) {
$result = $result2;
}
}
if ($success) {
return ("handled", "\x00$who: $result");
} else {
return ("handled", "Couldn't find anything for $what");
}
}
sub runplugin {
my( $cmd_string, $said, $who, $pm) = @_;
my( $cmd, $body ) = split " ", $cmd_string, 2;
defined($cmd) or
return( 0, "Error, cannot parse call to find command name, probably empty call in compose" );
defined($body) or $body = "";
my $plugin = $pm->get_plugin( $cmd, $said )
or return( 0, "Compose failed to find a plugin named: $cmd" );
my $newsaid = {%$said,
body => $body,
recommended_args => [ split /\s+/, $body ],
command_match => $cmd,
name => $who,
body_raw => $said->{addressed_as}. ": $body",
sender_raw => "$who!~$who\@NONLOCAL",
by_root => 0,
by_chan_op => 0,
ircnname => "~$who",
host => "NONLOCAL",
nested => 1,
};
local $@;
my( $status, $results ) = eval { $plugin->command( $newsaid, $pm ) };
if( $@ ) { return( 0, "Failed to execute plugin: $cmd because $@" ); }
else { return( 1, $results ) }
return( 0, "Error, should never reach here" );
}
"Bot::BB3::Plugin::Tell";
__DATA__
Tell other users about things. tell <who> [about] <what>"

View file

@ -11,10 +11,12 @@ close($fh);
chomp $consumer_key;
chomp $consumer_secret;
use HTML::Entities;
#die Dumper($consumer_key, $consumer_secret);
my $client = Twitter::API->new_with_traits(
traits => [qw/ApiMethods AppAuth/],
traits => [qw/ApiMethods AppAuth DecodeHtmlEntities/],
consumer_key => $consumer_key,
consumer_secret => $consumer_secret,
);
@ -27,11 +29,18 @@ sub display_tweet {
my $tweet = shift;
if ($tweet) {
my ($time, $text, $id) = @{$tweet}{qw/created_at text id/};
my ($time, $text, $id) = @{$tweet}{qw/created_at full_text id/};
$text //= $tweet->{text};
my $source = $tweet->{user}{name};
my $url = "https://twitter.com/link/status/$id";
unless ($text =~ m|https://t.co/|) {
print "<$source> $text $url";
} else {
print "<$source> $text";
}
} else {
print "No tweets found";
}
@ -45,7 +54,7 @@ sub {
if ($said->{body} =~ /^\s*(#\S+)/ ||
$said->{body} =~ /^\s*search\s+(.*)/) {
# hash tags. omg.
my $search = $client->search($1);
my $search = $client->search($1, {tweet_mode => "extended"});
open (my $fh, ">", "/tmp/twitter");
print $fh Dumper($search);
@ -54,10 +63,14 @@ sub {
my $tweet = $tweets->@[rand() * $tweets->@*];
display_tweet $tweet;
} elsif ($said->{body} =~ m|twitter.com/([^/]+)/status/(\d+)|) {
my ($userid, $tweetid) = ($1, $2);
my $tweet = $client->show_status($tweetid, {tweet_mode => "extended"});
display_tweet($tweet);
} else {
my ($userid, $count) = $said->{body} =~ /^\s*(\S+)(?:\s+(\d+))?/g;
my $timeline=$client->user_timeline($userid);
my $timeline=$client->user_timeline($userid, {tweet_mode => "extended"});
my $tweet = $timeline->[$count//0];
display_tweet $tweet;