From 7e061741da7874eea26e71e3b8752b96f428a78d Mon Sep 17 00:00:00 2001 From: Pragmatic Software Date: Tue, 23 Jan 2018 13:58:03 -0800 Subject: [PATCH] Improve nick-prefix/override --- PBot/Commands.pm | 1 + PBot/FactoidModuleLauncher.pm | 2 ++ PBot/Factoids.pm | 17 +++++++++++++++-- PBot/Interpreter.pm | 8 +++++--- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/PBot/Commands.pm b/PBot/Commands.pm index 897f8e20..6dcabec9 100644 --- a/PBot/Commands.pm +++ b/PBot/Commands.pm @@ -110,6 +110,7 @@ sub interpreter { foreach my $ref (@{ $self->{handlers} }) { if ($ref->{name} eq $keyword) { if ($level >= $ref->{level}) { + $stuff->{no_nickoverride} = 1; my $result = &{ $ref->{subref} }($stuff->{from}, $stuff->{nick}, $stuff->{user}, $stuff->{host}, $stuff->{arguments}, $stuff); if ($stuff->{referenced}) { return undef if $result =~ m/(?:usage:|no results)/i; diff --git a/PBot/FactoidModuleLauncher.pm b/PBot/FactoidModuleLauncher.pm index edcbbfb0..6e841f94 100644 --- a/PBot/FactoidModuleLauncher.pm +++ b/PBot/FactoidModuleLauncher.pm @@ -213,6 +213,8 @@ sub module_pipe_reader { # don't override nick if already set if (exists $stuff->{special} and $stuff->{special} ne 'code-factoid' and exists $self->{pbot}->{factoids}->{factoids}->hash->{$stuff->{channel}}->{$stuff->{trigger}}->{add_nick} and $self->{pbot}->{factoids}->{factoids}->hash->{$stuff->{channel}}->{$stuff->{trigger}}->{add_nick} != 0) { $stuff->{nickoverride} = $stuff->{nick}; + $stuff->{no_nickoverride} = 0; + $stuff->{force_nickoverride} = 1; } else { # extract nick-like thing from module result if ($stuff->{result} =~ s/^(\S+): //) { diff --git a/PBot/Factoids.pm b/PBot/Factoids.pm index bfc1295e..7efdb156 100644 --- a/PBot/Factoids.pm +++ b/PBot/Factoids.pm @@ -700,8 +700,15 @@ sub execute_code_factoid_using_vm { my ($self, $stuff) = @_; unless (exists $self->{factoids}->hash->{$stuff->{channel}}->{$stuff->{keyword}}->{interpolate} and $self->{factoids}->hash->{$stuff->{channel}}->{$stuff->{keyword}}->{interpolate} eq '0') { + if ($stuff->{code} =~ m/(?:\$nick\b|\$args\b|\$arg\[)/ and length $stuff->{arguments}) { + $stuff->{no_nickoverride} = 1; + } else { + $stuff->{no_nickoverride} = 0; + } $stuff->{code} = $self->expand_factoid_vars($stuff->{from}, $stuff->{nick}, $stuff->{root_keyword}, $stuff->{code}); $stuff->{code} = $self->expand_action_arguments($stuff->{code}, $stuff->{arguments}, $stuff->{nick}); + } else { + $stuff->{no_nickoverride} = 0; } my %h = (nick => $stuff->{nick}, channel => $stuff->{from}, lang => $stuff->{lang}, code => $stuff->{code}, arguments => $stuff->{arguments}, factoid => "$stuff->{channel}:$stuff->{keyword}"); @@ -842,8 +849,6 @@ sub interpreter { } } - my $type = $self->{factoids}->hash->{$channel}->{$keyword}->{type}; - $self->{factoids}->hash->{$channel}->{$keyword}->{ref_count}++; $self->{factoids}->hash->{$channel}->{$keyword}->{ref_user} = "$stuff->{nick}!$stuff->{user}\@$stuff->{host}"; $self->{factoids}->hash->{$channel}->{$keyword}->{last_referenced_on} = gettimeofday; @@ -890,6 +895,9 @@ sub handle_action { if ($action =~ m/\$args/ or $action =~ m/\$arg\[/) { unless (defined $self->{factoids}->hash->{$channel}->{$keyword}->{interpolate} and $self->{factoids}->hash->{$channel}->{$keyword}->{interpolate} eq '0') { $action = $self->expand_action_arguments($action, $stuff->{arguments}, $stuff->{nick}); + $stuff->{no_nickoverride} = 1; + } else { + $stuff->{no_nickoverride} = 0; } $stuff->{arguments} = ""; } else { @@ -899,12 +907,16 @@ sub handle_action { if ($target and $action !~ /\$(?:nick|args)\b/) { $stuff->{nickoverride} = $target unless $stuff->{force_nickoverride}; + $stuff->{no_nickoverride} = 0; + } else { + $stuff->{no_nickoverride} = 1; } } } } else { # no arguments supplied, replace $args with $nick/$tonick, etc $action = $self->expand_action_arguments($action, undef, $stuff->{nick}); + $stuff->{no_nickoverride} = 0; } # Check if it's an alias @@ -913,6 +925,7 @@ sub handle_action { $command .= " $stuff->{arguments}" if length $stuff->{arguments}; $stuff->{command} = $command; + $stuff->{aliased} = 1; $self->{pbot}->{logger}->log("[" . (defined $stuff->{from} ? $stuff->{from} : "stdin") . "] ($stuff->{nick}!$stuff->{user}\@$stuff->{host}) [$keyword] aliased to: [$command]\n"); return $self->{pbot}->{interpreter}->interpret($stuff); diff --git a/PBot/Interpreter.pm b/PBot/Interpreter.pm index 31a53529..3612c2ca 100644 --- a/PBot/Interpreter.pm +++ b/PBot/Interpreter.pm @@ -186,6 +186,7 @@ sub process_line { $stuff->{text} = $text; $stuff->{command} = $command; $stuff->{nickoverride} = $nick_override if $nick_override; + $stuff->{force_nickoverride} = 1 if $nick_override; $stuff->{referenced} = $embedded; $stuff->{interpret_depth} = 1; $stuff->{preserve_whitespace} = $preserve_whitespace; @@ -511,7 +512,8 @@ sub output_result { return if not defined $line or not length $line; if ($line =~ s/^\/say\s+//i) { - if (defined $stuff->{nickoverride}) { + + if (defined $stuff->{nickoverride} and ($stuff->{no_nickoverride} == 0 or $stuff->{force_nickoverride} == 1)) { $line = "$stuff->{nickoverride}: $line"; } $pbot->{conn}->privmsg($stuff->{from}, $line) if defined $stuff->{from} && $stuff->{from} !~ /\Q$botnick\E/i; @@ -536,7 +538,7 @@ sub output_result { $pbot->{antiflood}->check_flood($to, $botnick, $pbot->{registry}->get_value('irc', 'username'), 'localhost', '/me ' . $line, 0, 0, 0) if $stuff->{checkflood}; } else { $line =~ s/^\/say\s+//i; - if (defined $stuff->{nickoverride}) { + if (defined $stuff->{nickoverride} and ($stuff->{no_nickoverride} == 0 or $stuff->{force_nickoverride} == 1)) { $line = "$stuff->{nickoverride}: $line"; } $pbot->{conn}->privmsg($to, $line) if $to !~ /\Q$botnick\E/i; @@ -564,7 +566,7 @@ sub output_result { $pbot->{conn}->privmsg($stuff->{from}, "$victim: $reason") if defined $stuff->{from} && $stuff->{from} !~ /\Q$botnick\E/i; } } else { - if (defined $stuff->{nickoverride}) { + if (defined $stuff->{nickoverride} and ($stuff->{no_nickoverride} == 0 or $stuff->{force_nickoverride} == 1)) { $line = "$stuff->{nickoverride}: $line"; } $pbot->{conn}->privmsg($stuff->{from}, $line) if defined $stuff->{from} && $stuff->{from} !~ /\Q$botnick\E/i;