- add "learn" function
authorAndreas Scherbaum <[email protected]>
Fri, 8 Jun 2012 21:04:36 +0000 (23:04 +0200)
committerAndreas Scherbaum <[email protected]>
Fri, 8 Jun 2012 21:04:36 +0000 (23:04 +0200)
- add translations for "learn"

docbot.conf
docbot.pl

index 68802e08d5136713cb181733cb2662a693aa27a4..c63bbc1c55bf841048fe52d285aac759ec6a6e59 100644 (file)
@@ -87,6 +87,12 @@ translations:
     help_general_line_1: 'Allgemeine Hilfe'
     help_general_line_2: 'Starte eine Suche mit zwei Fragezeichen, danach der Suchbegriff'
     help_general_line_3: 'Die folgenden Befehle stehen außerdem zur Verfügung'
+    search_bad_parameters: 'Falsche Parameter'
+    search_no_new_keywords: 'Alle Schlüsselwörter existieren bereits in der Datenbank'
+    search_add_1_keyword: '1 Schlüsselwort erfolgreich hinzugefügt'
+    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'
   fr:
     learn: 'apprendre'
     forget: 'oublier'
index 792f789747fe6f9b948f77ef4e311bf34eb935ab..a142dc7df745bb2509d1b0e022b6d32a427f9bc8 100755 (executable)
--- a/docbot.pl
+++ b/docbot.pl
@@ -1785,6 +1785,7 @@ sub handle_command {
         }
         case('learn') {
             $main::statistics{'command_counter_learn'}++;
+            return handle_command_learn($command, $string, $mode, $kernel, $heap, $who, $nick, $where, $msg, $sender, $irc, $channel);
         }
         case('forget') {
             $main::statistics{'command_counter_forget'}++;
@@ -2185,6 +2186,200 @@ sub handle_command_help {
 }
 
 
+# handle_command_learn()
+#
+# command handler for the 'learn' 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_learn {
+    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');
+
+    # parse query
+    foreach my $keyword (@keys) {
+        if ($keyword =~ /^$url_pattern/) {
+            $url = $keyword;
+            # rewrite to current
+            if ($url =~ /^(http:\/\/.*?postgresql\.org\/docs\/)[0-9\.]+(\/.*)$/i) {
+                $url = $1 . "current" . $2;
+            }
+            # rewrite to static
+            if ($url =~ /^(http:\/\/\/\/.*?postgresql\.org\/docs\/current\/)interactive(\/.*)$/i) {
+                $url = $1 . "static" . $2;
+            }
+            last;
+        }
+
+        push(@keywords, lc($keyword));
+    }
+
+
+    if (scalar(@keywords) == 0 || !defined($url)) {
+        my $answer = "Bad parameters";
+        # translate message
+        $answer = translate_text_for_channel($channel, 'search_bad_parameters', $answer);
+        return $answer;
+    }
+    my %keywords = map { $_, 1 } @keywords;
+    @keywords = keys(%keywords);
+
+
+    $main::db->rollback();
+
+    # insert keywords
+    my $st = $main::db->query("SELECT id FROM docbot_url WHERE url = ?", $url);
+    if (!$st) {
+        $main::db->rollback();
+        return $database_error;
+    }
+
+    if ($st->rows > 0) {
+        # url already exists in database
+        my $kurl = $st->fetchrow_hashref;
+        $kurl = $kurl->{'id'};
+        print_msg("url id: " . $kurl, DEBUG);
+        $st->finish;
+
+        my $new_keys = 0;
+        foreach my $keyword (@keywords) {
+            my $st2 = $main::db->query("SELECT has_key (?, ?) AS has_key", $kurl, $keyword);
+            if (!$st2) {
+                $main::db->rollback();
+                return $database_error;
+            }
+            my ($row2) = $st2->fetchrow;
+            if (!$row2) {
+                # keyword not yet linked to url
+                if (!$main::db->query("INSERT INTO docbot_key (key, kurl) VALUES (?, ?)", $keyword, $kurl)) {
+                    $main::db->rollback();
+                    return $database_error;
+                }
+                $new_keys++;
+            }
+            $st2->finish;
+        }
+
+        if ($new_keys == 0) {
+            # no new keys at all
+            $main::db->rollback();
+            my $answer = "All keywords already exist in database";
+            print_msg($answer, DEBUG);
+            # translate message
+            $answer = translate_text_for_channel($channel, 'search_no_new_keywords', $answer);
+            return $answer;
+        } else {
+            # some new keys
+            $main::db->commit();
+            if ($new_keys == 1) {
+                my $answer = "Successfully added 1 keyword";
+                print_msg($answer, DEBUG);
+                # translate message
+                $answer = translate_text_for_channel($channel, 'search_add_1_keyword', $answer);
+                return $answer;
+            } else {
+                my $answer = "Successfully added %1 keywords";
+                $answer =~ s/\%1/$new_keys/;
+                print_msg($answer, DEBUG);
+                $answer = "Successfully added %1 keywords";
+                # translate message
+                $answer = translate_text_for_channel($channel, 'search_add_n_keywords', $answer);
+                $answer =~ s/\%1/$new_keys/;
+                return $answer;
+            }
+        }
+    } else {
+        # url does not yet exist in database
+        print_msg('url not yet in database', DEBUG);
+        $st->finish;
+        if (!$main::db->query("INSERT INTO docbot_url (url) VALUES (?)", $url)) {
+            $main::db->rollback();
+            return $database_error;
+        }
+
+        my $st2 = $main::db->query("SELECT currval(pg_get_serial_sequence('docbot_url', 'id'))");
+        if (!$st2) {
+            $main::db->rollback();
+            return $database_error;
+        }
+        my ($kurl) = $st2->fetchrow;
+        $st2->finish;
+        print_msg("url id: " . $kurl, DEBUG);
+
+        my $new_keys = 0;
+        foreach my $keyword (@keywords) {
+            if (!$main::db->query("INSERT INTO docbot_key (key, kurl) VALUES (?, ?)", $keyword, $kurl)) {
+                $main::db->rollback();
+                return $database_error;
+            }
+            $new_keys++;
+        }
+
+        $main::db->commit();
+        if ($new_keys == 1) {
+            my $answer = "Successfully added URL with 1 keyword";
+            print_msg($answer, DEBUG);
+            # translate message
+            $answer = translate_text_for_channel($channel, 'search_add_url_1_keyword', $answer);
+            return $answer;
+        } else {
+            my $answer = "Successfully added URL with %1 keywords";
+            $answer =~ s/\%1/$new_keys/;
+            print_msg($answer, DEBUG);
+            $answer = "Successfully added URL with %1 keywords";
+            # translate message
+            $answer = translate_text_for_channel($channel, 'search_add_url_n_keywords', $answer);
+            $answer =~ s/\%1/$new_keys/;
+            return $answer;
+        }
+    }
+
+
+    return 'ERROR';
+}
+
+
 ######################################################################
 # IRC functions
 ######################################################################