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;