From e5097eee69ded52a99231a61b426d10deb1e6fb7 Mon Sep 17 00:00:00 2001 From: Pragmatic Software Date: Tue, 8 Sep 2015 01:37:34 -0700 Subject: [PATCH] Move URL titles to UrlTitles.pm plugin Add $event->{interpreted} field to events to notify other handlers whether an event was successfully interpreted by the interpreter. An $event->{interpreted} that is equal to or greater than 100 means the entire message was consumed and handlers shouldn't do any further processing of it that would generate any output to channels or users. Otherwise, $event->{interpreted} is incremented by 1 for each referenced command that was processed. --- PBot/IRCHandlers.pm | 2 +- PBot/Interpreter.pm | 51 +++++++++++++++---------------- PBot/Plugins/UrlTitles.pm | 63 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 28 deletions(-) create mode 100644 PBot/Plugins/UrlTitles.pm diff --git a/PBot/IRCHandlers.pm b/PBot/IRCHandlers.pm index 559bcc30..1796acff 100644 --- a/PBot/IRCHandlers.pm +++ b/PBot/IRCHandlers.pm @@ -101,7 +101,7 @@ sub on_public { my $host = $event->{event}->host; my $text = $event->{event}->{args}[0]; - $self->{pbot}->{interpreter}->process_line($from, $nick, $user, $host, $text); + $event->{interpreted} = $self->{pbot}->{interpreter}->process_line($from, $nick, $user, $host, $text); return 0; } diff --git a/PBot/Interpreter.pm b/PBot/Interpreter.pm index 9dfe696d..ddbf82cf 100644 --- a/PBot/Interpreter.pm +++ b/PBot/Interpreter.pm @@ -33,9 +33,6 @@ sub initialize { $self->{pbot} = delete $conf{pbot} // Carp::croak("Missing pbot reference to " . __FILE__); - $self->{pbot}->{registry}->add_default('text', 'general', 'show_url_titles', $conf{show_url_titles} // 1); - $self->{pbot}->{registry}->add_default('array', 'general', 'show_url_titles_channels', $conf{show_url_titles_channels} // '.*'); - $self->{pbot}->{registry}->add_default('array', 'general', 'show_url_titles_ignore_channels', $conf{show_url_titles_ignore_channels} // 'none'); $self->{pbot}->{registry}->add_default('text', 'general', 'compile_blocks', $conf{compile_blocks} // 1); $self->{pbot}->{registry}->add_default('array', 'general', 'compile_blocks_channels', $conf{compile_blocks_channels} // '.*'); $self->{pbot}->{registry}->add_default('array', 'general', 'compile_blocks_ignore_channels', $conf{compile_blocks_ignore_channels} // 'none'); @@ -53,10 +50,10 @@ sub process_line { my ($from, $nick, $user, $host, $text) = @_; my $command; - my $has_url; my $has_code; my $nick_override; my $botnick = $self->{pbot}->{registry}->get_value('irc', 'botnick'); + my $processed = 0; $from = lc $from if defined $from; @@ -75,9 +72,10 @@ sub process_line { $flood_threshold, $flood_time_threshold, $pbot->{messagehistory}->{MSG_CHAT}) if defined $from; + my $preserve_whitespace = 0; + $text =~ s/^\s+//; $text =~ s/\s+$//; - my $preserve_whitespace = 0; my $cmd_text = $text; $cmd_text =~ s/^\/me\s+//; @@ -94,24 +92,26 @@ sub process_line { while (++$count <= 3) { $referenced = 0; $command = undef; - $has_url = undef; $has_code = undef; if($cmd_text =~ s/^(?:$bot_trigger|$botnick.?)?\s*{\s*(.*)\s*}\s*$//) { $has_code = $1 if length $1; $preserve_whitespace = 1; - } elsif($cmd_text =~ s/^$bot_trigger(.*)$//) { - $command = $1; - } elsif($cmd_text =~ s/^.?$botnick.?\s*(.*?)$//i) { - $command = $1; - } elsif($cmd_text =~ s/^(.*?),?\s*$botnick[?!.]*$//i) { - $command = $1; - } elsif($cmd_text =~ s/https?:\/\/([^\s]+)//i) { - $has_url = $1; + $processed += 100; } elsif($cmd_text =~ s/^\s*([^,:\(\)\+\*\/ ]+)[,:]*\s*{\s*(.*)\s*}\s*$//) { $nick_override = $1; - $has_code = $2 if length $2 and $nick_override ne 'enum' and $nick_override ne 'struct'; + $has_code = $2 if length $2 and $nick_override !~ /^(?:enum|struct|union)$/; $preserve_whitespace = 1; + $processed += 100; + } elsif($cmd_text =~ s/^$bot_trigger(.*)$//) { + $command = $1; + $processed += 100; + } elsif($cmd_text =~ s/^.?$botnick.?\s*(.*?)$//i) { + $command = $1; + $processed += 100; + } elsif($cmd_text =~ s/^(.*?),?\s*$botnick[?!.]*$//i) { + $command = $1; + $processed += 100; } elsif ($cmd_text =~ s/\B$bot_trigger([^ ]+)//) { my $cmd = $1; $cmd =~ s/(.)[.!?;,)]$/$1/; @@ -125,23 +125,18 @@ sub process_line { $referenced = 1; } - last if not defined $command and not defined $has_url and not defined $has_code; + last if not defined $command and not defined $has_code; - if((!defined $command || $command !~ /^login/) && defined $from && $pbot->{ignorelist}->check_ignore($nick, $user, $host, $from)) { + if((!defined $command || $command !~ /^login /) && defined $from && $pbot->{ignorelist}->check_ignore($nick, $user, $host, $from)) { my $admin = $pbot->{admins}->loggedin($from, "$nick!$user\@$host"); if (!defined $admin || $admin->{level} < 10) { # ignored hostmask - return; + return 1; } } - if(defined $has_url) { - if($pbot->{registry}->get_value('general', 'show_url_titles') and not $pbot->{registry}->get_value($from, 'no_url_titles') - and not grep { $from =~ /$_/i } $pbot->{registry}->get_value('general', 'show_url_titles_ignore_channels') - and grep { $from =~ /$_/i } $pbot->{registry}->get_value('general', 'show_url_titles_channels')) { - $pbot->{factoids}->{factoidmodulelauncher}->execute_module($from, undef, $nick, $user, $host, $text, "title", "$nick http://$has_url", $preserve_whitespace); - } - } elsif(defined $has_code) { + if(defined $has_code) { + $processed += 100; # ensure no other plugins try to parse this message if($pbot->{registry}->get_value('general', 'compile_blocks') and not $pbot->{registry}->get_value($from, 'no_compile_blocks') and not grep { $from =~ /$_/i } $pbot->{registry}->get_value('general', 'compile_blocks_ignore_channels') and grep { $from =~ /$_/i } $pbot->{registry}->get_value('general', 'compile_blocks_channels')) { @@ -150,9 +145,10 @@ sub process_line { } } } else { - $self->handle_result($from, $nick, $user, $host, $text, $command, $self->interpret($from, $nick, $user, $host, 1, $command, undef, $referenced), 1, $preserve_whitespace); + $processed++ if $self->handle_result($from, $nick, $user, $host, $text, $command, $self->interpret($from, $nick, $user, $host, 1, $command, undef, $referenced), 1, $preserve_whitespace); } } + return $processed; } sub interpret { @@ -248,7 +244,7 @@ sub handle_result { my ($self, $from, $nick, $user, $host, $text, $command, $result, $checkflood, $preserve_whitespace) = @_; if (not defined $result or length $result == 0) { - return; + return 0; } my $original_result = $result; @@ -324,6 +320,7 @@ sub handle_result { } } $self->{pbot}->{logger}->log("---------------------------------------------\n"); + return 1; } sub output_result { diff --git a/PBot/Plugins/UrlTitles.pm b/PBot/Plugins/UrlTitles.pm new file mode 100644 index 00000000..1ed5961d --- /dev/null +++ b/PBot/Plugins/UrlTitles.pm @@ -0,0 +1,63 @@ +# File: UrlTitles.pm +# Author: pragma- +# +# Purpose: Display titles of URLs in channel messages. + +package PBot::Plugins::UrlTitles; + +use warnings; +use strict; + +use Carp (); + +sub new { + Carp::croak("Options to " . __FILE__ . " should be key/value pairs, not hash reference") if ref $_[1] eq 'HASH'; + my ($class, %conf) = @_; + my $self = bless {}, $class; + $self->initialize(%conf); + return $self; +} + +sub initialize { + my ($self, %conf) = @_; + + $self->{pbot} = delete $conf{pbot} // Carp::croak("Missing pbot reference to " . __FILE__); + + $self->{pbot}->{registry}->add_default('text', 'general', 'show_url_titles', $conf{show_url_titles} // 1); + $self->{pbot}->{registry}->add_default('array', 'general', 'show_url_titles_channels', $conf{show_url_titles_channels} // '.*'); + $self->{pbot}->{registry}->add_default('array', 'general', 'show_url_titles_ignore_channels', $conf{show_url_titles_ignore_channels} // 'none'); + + $self->{pbot}->{event_dispatcher}->register_handler('irc.public', sub { $self->show_url_titles(@_) }); + $self->{pbot}->{event_dispatcher}->register_handler('irc.caction', sub { $self->show_url_titles(@_) }); +} + +sub unload { + my $self = shift; +} + +sub show_url_titles { + my ($self, $event_type, $event) = @_; + my $channel = $event->{event}->{to}[0]; + my ($nick, $user, $host) = ($event->{event}->nick, $event->{event}->user, $event->{event}->host); + my $msg = $event->{event}->{args}[0]; + + if ($self->{pbot}->{ignorelist}->check_ignore($nick, $user, $host, $channel)) { + my $admin = $self->{pbot}->{admins}->loggedin($channel, "$nick!$user\@$host"); + if (!defined $admin || $admin->{level} < 10) { + return 0; + } + } + + while ($msg =~ s/(https?:\/\/[^\s]+)//i && ++$event->{interpreted} <= 3) { + my $url = $1; + if($self->{pbot}->{registry}->get_value('general', 'show_url_titles') and not $self->{pbot}->{registry}->get_value($channel, 'no_url_titles') + and not grep { $channel =~ /$_/i } $self->{pbot}->{registry}->get_value('general', 'show_url_titles_ignore_channels') + and grep { $channel =~ /$_/i } $self->{pbot}->{registry}->get_value('general', 'show_url_titles_channels')) { + $self->{pbot}->{factoids}->{factoidmodulelauncher}->execute_module($channel, undef, $nick, $user, $host, $msg, "title", "$nick $url"); + } + } + + return 0; +} + +1;