From 5001e9543a8d48fc714dd4b1395b5a75b8b15476 Mon Sep 17 00:00:00 2001 From: Andreas Scherbaum Date: Fri, 8 Jun 2012 23:04:36 +0200 Subject: [PATCH] - add "learn" function - add translations for "learn" --- docbot.conf | 6 ++ docbot.pl | 195 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 201 insertions(+) diff --git a/docbot.conf b/docbot.conf index 68802e0..c63bbc1 100644 --- a/docbot.conf +++ b/docbot.conf @@ -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' diff --git a/docbot.pl b/docbot.pl index 792f789..a142dc7 100755 --- 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 ###################################################################### -- 2.39.5