Added support for searching by prv msg

master
Abhinav Sarkar 2011-06-07 18:36:20 +05:30
parent 7a5f0cd40a
commit c32e315dd6
3 changed files with 42 additions and 13 deletions

View File

@ -1,5 +1,5 @@
(ns irc-search-bot.bot (ns irc-search-bot.bot
(:import [org.pircbotx PircBotX Channel] (:import [org.pircbotx PircBotX Channel User]
[org.pircbotx.hooks Event Listener]) [org.pircbotx.hooks Event Listener])
(:use [clojure.string :only [join lower-case]])) (:use [clojure.string :only [join lower-case]]))
@ -53,7 +53,11 @@
(defn send-message [^PircBotX bot channel message] (defn send-message [^PircBotX bot channel message]
(doto bot (doto bot
(.sendMessage (.sendMessage
(if (instance? Channel channel) (if (instance? Channel channel) channel (.getChannel bot channel))
channel message)))
(.getChannel bot channel))
message))) (defn send-prv-message [^PircBotX bot user message]
(doto bot
(.sendMessage
(if (instance? User user) user (.getUser bot user))
message)))

View File

@ -19,7 +19,9 @@
(stemmer-analyzer (standard-analyzer)) (stemmer-analyzer (standard-analyzer))
#{"message"})) #{"message"}))
(def *max-hits* 3) (def *msg-max-hits* 3)
(def *prv-msg-max-hits* 5)
(def *ignored-users* (def *ignored-users*
(if (.exists (as-file "ignored_users")) (if (.exists (as-file "ignored_users"))
@ -42,7 +44,7 @@
(let [qp (query-parser :message analyzer) (let [qp (query-parser :message analyzer)
raw-query (parse-query qp query-str) raw-query (parse-query qp query-str)
[query filter] (filterify-query raw-query #{"user"}) [query filter] (filterify-query raw-query #{"user"})
[total hits] (search index-searcher query filter max-hits)] [total hits] (search index-searcher query filter max-hits "timestamp")]
(println "Query:" query) (println "Query:" query)
(println "Filter:" filter) (println "Filter:" filter)
(println ">>" total "hits for query:" query-str) (println ">>" total "hits for query:" query-str)
@ -86,21 +88,43 @@
(let [msg (trim (.getMessage ev)) (let [msg (trim (.getMessage ev))
user (.. ev getUser getNick) user (.. ev getUser getNick)
timestamp (.getTimestamp ev) timestamp (.getTimestamp ev)
channel (.getChannel ev)] channel (.getChannel ev)
query (trim (subs msg 2))]
(if (.startsWith msg "!q") (if (.startsWith msg "!q")
(with-open [is (index-searcher (index-dir bot))] (with-open [is (index-searcher (index-dir bot))]
(let [[total results] (search-chat-log is (trim (subs msg 2)) *max-hits* *analyzer*)] (let [[total results]
(search-chat-log is query *msg-max-hits* *analyzer*)]
(if (zero? total) (if (zero? total)
(send-message bot channel "No results found") (send-message bot channel (format "No results found for \"%s\"" query))
(do (do
(send-message (send-message
bot channel bot channel
(str total " results found. Top " (count results) " results:")) (format "%s results found for \"%s\". Top %s results:"
total query (count results)))
(doseq [result results] (doseq [result results]
(send-message bot channel result)))))) (send-message bot channel result))))))
(when (and (not (.startsWith msg "!")) (not (*ignored-users* user))) (when (and (not (.startsWith msg "!")) (not (*ignored-users* user)))
(swap! *chat-log* conj [timestamp user msg]))))) (swap! *chat-log* conj [timestamp user msg])))))
(defmethod event-listener :private-message [^PircBotX bot ^Event ev]
(let [msg (trim (.getMessage ev))
user (.. ev getUser getNick)
timestamp (.getTimestamp ev)
query (trim (subs msg 2))]
(when (.startsWith msg "!q")
(with-open [is (index-searcher (index-dir bot))]
(let [[total results]
(search-chat-log is query *prv-msg-max-hits* *analyzer*)]
(if (zero? total)
(send-prv-message bot user (format "No results found for \"%s\"" query))
(do
(send-prv-message
bot user
(format "%s results found for \"%s\". Top %s results:"
total query (count results)))
(doseq [result results]
(send-prv-message bot user result)))))))))
(defn run-bot [bot-name server channel] (defn run-bot [bot-name server channel]
(let [bot (make-bot bot-name)] (let [bot (make-bot bot-name)]
(connect-bot bot server channel) (connect-bot bot server channel)

View File

@ -45,7 +45,8 @@
(QueryWrapperFilter. filter-query))]) (QueryWrapperFilter. filter-query))])
[query, nil])) [query, nil]))
(defn search [^IndexSearcher index-searcher ^Query query ^Filter filter ^Integer max-hits] (defn search
[^IndexSearcher index-searcher ^Query query ^Filter filter ^Integer max-hits ^String timestamp-field]
(let [top-docs (let [top-docs
(.search (.search
index-searcher index-searcher
@ -54,7 +55,7 @@
max-hits max-hits
(Sort. (Sort.
(into-array (into-array
[SortField/FIELD_SCORE (SortField. "timestamp" SortField/LONG true)])))] [SortField/FIELD_SCORE (SortField. timestamp-field SortField/LONG true)])))]
(vector (vector
(.totalHits top-docs) (.totalHits top-docs)
(->> (->>