- add "forget" functionality
authorAndreas Scherbaum <andreas@scherbaum.biz>
Mon, 11 Jun 2012 21:00:55 +0000 (23:00 +0200)
committerAndreas Scherbaum <andreas@scherbaum.biz>
Mon, 11 Jun 2012 21:00:55 +0000 (23:00 +0200)
docbot.conf
docbot.pl

index c63bbc1c55bf841048fe52d285aac759ec6a6e59..88e3eafee5aa0f5c5de27d0d7f78f6c21244e860 100644 (file)
@@ -93,6 +93,11 @@ translations:
     search_add_n_keywords: '%1 Schlüsselwörter erfolgreich hinzugefügt'
     search_add_url_1_keyword: 'URL mit 1 Schlüsselwort erfolgreich hinzugefügt'
     search_add_url_n_keywords: 'URL mit %1 Schlüsselwörtern erfolgreich hinzugefügt'
+    forget_nothing_to_forget: 'Nichts zu vergessen'
+    forget_forgot_1_url: '1 URL vergessen'
+    forget_forgot_n_urls: '%1 URLs vergessen'
+    forget_forgot_1_key: '1 Schlüsselwort vergessen'
+    forget_forgot_n_keys: '%1 Schlüsselwörter vergessen'
   fr:
     learn: 'apprendre'
     forget: 'oublier'
index a142dc7df745bb2509d1b0e022b6d32a427f9bc8..539914b0813fa0d933696c160231a7c57f50f389 100755 (executable)
--- a/docbot.pl
+++ b/docbot.pl
@@ -1789,6 +1789,7 @@ sub handle_command {
         }
         case('forget') {
             $main::statistics{'command_counter_forget'}++;
+            return handle_command_forget($command, $string, $mode, $kernel, $heap, $who, $nick, $where, $msg, $sender, $irc, $channel);
         }
         case('config') {
             $main::statistics{'command_counter_config'}++;
@@ -2380,6 +2381,178 @@ sub handle_command_learn {
 }
 
 
+# handle_command_forget()
+#
+# command handler for the 'forget' command
+#
+# parameter:
+#  - the command (lower case)
+#  - the parameter string (may be empty)
+#  - the command mode (admin/operator/user)
+#  - POE kernel
+#  - POE heap
+#  - the full who of the message sender, including the nick name
+#  - the nick name of the message sender
+#  - the full origin of the message
+#  - the message itself
+#  - POE sender
+#  - session irc handle
+#  - the channel name
+# return:
+#  - text to send back to the sender
+sub handle_command_forget {
+    my $command = shift;
+    my $string = shift;
+    my $mode = shift;
+    my $kernel = shift;
+    my $heap = shift;
+    my $who = shift;
+    my $nick = shift;
+    my $where = shift;
+    my $msg = shift;
+    my $sender = shift;
+    my $irc = shift;
+    my $channel = shift;
+
+    my $session = find_irc_session($irc);
+
+
+    # pre-translate this error message
+    my $database_error = "Database error";
+    # translate error message
+    $database_error = translate_text_for_channel($channel, 'database_error', $database_error);
+
+
+    # remove spaces at beginning and end
+    $string =~ s/^[\s\t]+//gs;
+    $string =~ s/[\s\t]+$//gs;
+
+
+    my ($url, @keywords);
+    my @keys = split(/\s+/, $string);
+    my $url_pattern = config_get_key2('search', 'urlpattern');
+
+    $main::db->rollback();
+
+
+    if (($keys[0] !~ /$url_pattern/i) and ($keys[1] =~ /$url_pattern/i) and (scalar(@keys) > 2)) {
+        my $answer = "Bad parameters";
+        # translate message
+        $answer = translate_text_for_channel($channel, 'search_bad_parameters', $answer);
+        return $answer;
+    }
+
+
+    my $rows = 0;
+    if (scalar(@keys) == 2 and $keys[1] =~ /$url_pattern/) {
+        # key url
+
+        my $st = $main::db->query("DELETE FROM docbot_key WHERE key = ? AND kurl IN (SELECT id FROM docbot_url WHERE url = ?)", $keys[0], $keys[1]);
+        if (!$st) {
+            $main::db->rollback();
+            return $database_error;
+        }
+        $rows = $st->rows;
+        $main::db->commit();
+        if ($rows == 0) {
+            my $answer = "Nothing to forget";
+            print_msg($answer, DEBUG);
+            # translate message
+            $answer = translate_text_for_channel($channel, 'forget_nothing_to_forget', $answer);
+            return $answer;
+        } elsif ($rows == 1) {
+            my $answer = "Forgot 1 url";
+            print_msg($answer, DEBUG);
+            # translate message
+            $answer = translate_text_for_channel($channel, 'forget_forgot_1_url', $answer);
+            return $answer;
+        } else {
+            my $answer = "Forgot %1 urls";
+            $answer =~ s/\%1/$rows/;
+            print_msg($answer, DEBUG);
+            # translate message
+            $answer = translate_text_for_channel($channel, 'forget_forgot_n_urls', $answer);
+            $answer =~ s/\%1/$rows/;
+            return $answer;
+        }
+
+    } elsif ($keys[0] =~ /$url_pattern/) {
+        # one or more urls
+
+        foreach my $keyword (@keys) {
+            if ($keyword =~ /^$url_pattern/) {
+                my $st = $main::db->query("DELETE FROM docbot_url WHERE url = ?", $keyword);
+                if (!$st) {
+                    $main::db->rollback();
+                    return $database_error;
+                }
+                $rows += $st->rows;
+            }
+        }
+        $main::db->commit();
+        if ($rows == 0) {
+            my $answer = "Nothing to forget";
+            print_msg($answer, DEBUG);
+            # translate message
+            $answer = translate_text_for_channel($channel, 'forget_nothing_to_forget', $answer);
+            return $answer;
+        } elsif ($rows == 1) {
+            my $answer = "Forgot 1 url";
+            print_msg($answer, DEBUG);
+            # translate message
+            $answer = translate_text_for_channel($channel, 'forget_forgot_1_url', $answer);
+            return $answer;
+        } else {
+            my $answer = "Forgot %1 urls";
+            $answer =~ s/\%1/$rows/;
+            print_msg($answer, DEBUG);
+            # translate message
+            $answer = translate_text_for_channel($channel, 'forget_forgot_n_urls', $answer);
+            $answer =~ s/\%1/$rows/;
+            return $answer;
+        }
+
+    } else {
+        # one or more keys
+
+        foreach my $keyword (@keys) {
+            my $st = $main::db->query("DELETE FROM docbot_key WHERE key = ?", $keyword);
+            if (!$st) {
+                $main::db->rollback();
+                return $database_error;
+            }
+            $rows += $st->rows;
+        }
+        $main::db->commit();
+        if ($rows == 0) {
+            my $answer = "Nothing to forget";
+            print_msg($answer, DEBUG);
+            # translate message
+            $answer = translate_text_for_channel($channel, 'forget_nothing_to_forget', $answer);
+            return $answer;
+        } elsif ($rows == 1) {
+            my $answer = "Forgot 1 key";
+            print_msg($answer, DEBUG);
+            # translate message
+            $answer = translate_text_for_channel($channel, 'forget_forgot_1_key', $answer);
+            return $answer;
+        } else {
+            my $answer = "Forgot %1 keys";
+            $answer =~ s/\%1/$rows/;
+            print_msg($answer, DEBUG);
+            # translate message
+            $answer = translate_text_for_channel($channel, 'forget_forgot_n_keys', $answer);
+            $answer =~ s/\%1/$rows/;
+            return $answer;
+        }
+
+    }
+
+
+    return 'ERROR';
+}
+
+
 ######################################################################
 # IRC functions
 ######################################################################