}
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'}++;
}
+# 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
######################################################################