From 5ab76e6e6ce20385807583e5ba9ef9fa940948ae Mon Sep 17 00:00:00 2001 From: Pragmatic Software Date: Fri, 23 Jan 2015 11:44:38 -0800 Subject: [PATCH] Add -x/-context flag to limit recall -before/-after context to that nick --- PBot/MessageHistory.pm | 23 ++++++++++++++++++---- PBot/MessageHistory_SQLite.pm | 36 ++++++++++++++++++++++++++--------- 2 files changed, 46 insertions(+), 13 deletions(-) diff --git a/PBot/MessageHistory.pm b/PBot/MessageHistory.pm index 02503207..f652b5bb 100644 --- a/PBot/MessageHistory.pm +++ b/PBot/MessageHistory.pm @@ -123,7 +123,7 @@ sub recall_message { return ""; } - my $usage = 'Usage: recall [nick [history [channel]]] [-c,channel ] [-t,text,h,history ] [-b,before ] [-a,after ] [+ ...]'; + my $usage = 'Usage: recall [nick [history [channel]]] [-c,channel ] [-t,text,h,history ] [-b,before ] [-a,after ] [-x,context ] [+ ...]'; if(not defined $arguments or not length $arguments) { return $usage; @@ -142,13 +142,14 @@ sub recall_message { my $recall_text; foreach my $recall (@recalls) { - my ($recall_nick, $recall_history, $recall_channel, $recall_before, $recall_after); + my ($recall_nick, $recall_history, $recall_channel, $recall_before, $recall_after, $recall_context); my ($ret, $args) = GetOptionsFromString($recall, 'channel|c=s' => \$recall_channel, 'text|t|history|h=s' => \$recall_history, 'before|b=s' => \$recall_before, - 'after|a=s' => \$recall_after); + 'after|a=s' => \$recall_after, + 'context|x=s' => \$recall_context); return "$getopt_error -- $usage" if defined $getopt_error; @@ -184,6 +185,10 @@ sub recall_message { # set channel to current channel if not specified $recall_channel = $from if not defined $recall_channel; + if (not defined $recall_nick and defined $recall_context) { + $recall_nick = $recall_context; + } + my ($account, $found_nick); if(defined $recall_nick) { @@ -228,7 +233,17 @@ sub recall_message { return "You may only select 200 lines of surrounding context."; } - my $messages = $self->{database}->get_message_context($message, $recall_before, $recall_after); + my $context_account; + + if (defined $recall_context) { + ($context_account) = $self->{database}->find_message_account_by_nick($recall_context); + + if(not defined $context_account) { + return "I don't know anybody named $recall_context."; + } + } + + my $messages = $self->{database}->get_message_context($message, $recall_before, $recall_after, $context_account); foreach my $msg (@$messages) { $self->{pbot}->{logger}->log("$nick ($from) recalled <$msg->{nick}/$msg->{channel}> $msg->{msg}\n"); diff --git a/PBot/MessageHistory_SQLite.pm b/PBot/MessageHistory_SQLite.pm index b1c07e9d..d0f1c387 100644 --- a/PBot/MessageHistory_SQLite.pm +++ b/PBot/MessageHistory_SQLite.pm @@ -442,16 +442,25 @@ SQL } sub get_message_context { - my ($self, $message, $before, $after) = @_; + my ($self, $message, $before, $after, $context_id) = @_; my ($messages_before, $messages_after); if (defined $before and $before > 0) { $messages_before = eval { - my $sth = $self->{dbh}->prepare('SELECT id, msg, mode, timestamp, channel FROM Messages WHERE channel = ? AND timestamp < ? AND mode != 1 ORDER BY timestamp DESC LIMIT ?'); - $sth->bind_param(1, $message->{channel}); - $sth->bind_param(2, $message->{timestamp}); - $sth->bind_param(3, $before); + my $sth; + if (defined $context_id) { + $sth = $self->{dbh}->prepare('SELECT id, msg, mode, timestamp, channel FROM Messages WHERE id = ? AND channel = ? AND timestamp < ? AND mode != 1 ORDER BY timestamp DESC LIMIT ?'); + $sth->bind_param(1, $context_id); + $sth->bind_param(2, $message->{channel}); + $sth->bind_param(3, $message->{timestamp}); + $sth->bind_param(4, $before); + } else { + $sth = $self->{dbh}->prepare('SELECT id, msg, mode, timestamp, channel FROM Messages WHERE channel = ? AND timestamp < ? AND mode != 1 ORDER BY timestamp DESC LIMIT ?'); + $sth->bind_param(1, $message->{channel}); + $sth->bind_param(2, $message->{timestamp}); + $sth->bind_param(3, $before); + } $sth->execute(); return [reverse @{$sth->fetchall_arrayref({})}]; }; @@ -460,10 +469,19 @@ sub get_message_context { if (defined $after and $after > 0) { $messages_after = eval { - my $sth = $self->{dbh}->prepare('SELECT id, msg, mode, timestamp, channel FROM Messages WHERE channel = ? AND timestamp > ? AND mode != 1 LIMIT ?'); - $sth->bind_param(1, $message->{channel}); - $sth->bind_param(2, $message->{timestamp}); - $sth->bind_param(3, $after); + my $sth; + if (defined $context_id) { + $sth = $self->{dbh}->prepare('SELECT id, msg, mode, timestamp, channel FROM Messages WHERE id = ? AND channel = ? AND timestamp > ? AND mode != 1 LIMIT ?'); + $sth->bind_param(1, $context_id); + $sth->bind_param(2, $message->{channel}); + $sth->bind_param(3, $message->{timestamp}); + $sth->bind_param(4, $after); + } else { + $sth = $self->{dbh}->prepare('SELECT id, msg, mode, timestamp, channel FROM Messages WHERE channel = ? AND timestamp > ? AND mode != 1 LIMIT ?'); + $sth->bind_param(1, $message->{channel}); + $sth->bind_param(2, $message->{timestamp}); + $sth->bind_param(3, $after); + } $sth->execute(); return $sth->fetchall_arrayref({}); };