Refactored message handlers

master
Abhinav Sarkar 2011-05-11 23:27:20 +05:30
parent 68602f3942
commit e01f05c5f2
1 changed files with 127 additions and 85 deletions

View File

@ -149,7 +149,8 @@
(write-lines filename line-list))) (write-lines filename line-list)))
(defn send-message [bot channel message] (defn send-message [bot channel message]
(.sendMessage bot channel message)) (do (println ">> Sending message:" message)
(.sendMessage bot channel message)))
(defn send-action [bot channel action] (defn send-action [bot channel action]
(.sendAction bot channel action)) (.sendAction bot channel action))
@ -178,6 +179,21 @@
(.setBotName bot-name))) (.setBotName bot-name)))
(defn create-on-message-callback (defn create-on-message-callback
[message-reaction-fns default-fn msg-count]
(fn [bot channel sender login hostname message]
(let [message (trim message)]
(try
(swap! msg-count inc)
(loop [message-reaction-fns message-reaction-fns]
(if (empty? message-reaction-fns)
(default-fn bot channel sender login hostname message)
(let [[pred reaction] (first message-reaction-fns)]
(if (pred bot channel sender login hostname message)
(reaction bot channel sender login hostname message)
(recur (next message-reaction-fns))))))
(catch Exception e (.printStackTrace e))))))
(defn create-message-reaction-fns
[trained-map-atom [trained-map-atom
startphrase-list-atom startphrase-list-atom
endphrase-set-atom endphrase-set-atom
@ -187,86 +203,100 @@
save-interval save-interval
speak-interval speak-interval
min-sentence-length min-sentence-length
max-sentence-length] max-sentence-length
(let [msg-count (atom 0) msg-count]
bot-talking? (atom true)] (let [bot-talking? (atom true)
(fn [bot channel sender login hostname message] message-reaction-fns
(let [speak-about-pattern (re-pattern (str "speak about (.*) " (Pattern/quote (.getNick bot)))) [
message (trim message) ;shutup handler
create-statement-and-send [(fn [bot _ _ _ _ message] (= message (str "shutup " (.getNick bot))))
(fn (fn [bot channel _ _ _ _]
([] (do (println "Shutting up")
(let [sentence (reset! bot-talking? false)
(create-sentence (send-action bot channel "shuts up")
@trained-map-atom (change-nick bot (str (.getName bot) "|muted"))))]
@startphrase-list-atom
@endphrase-set-atom ;talk handler
min-sentence-length [(fn [bot _ _ _ _ message] (= message (str "talk " (.getNick bot))))
max-sentence-length)] (fn [bot channel _ _ _ _]
(println ">> Sending message:" sentence) (do (println "Talking")
(send-message bot channel sentence))) (reset! bot-talking? true)
([start] (send-action bot channel "can talk now")
(let [sentence (change-nick bot (.getName bot))))]
(create-sentence
[start] ;speak handler
@trained-map-atom [(fn [bot _ _ _ _ message] (= message (str "speak " (.getNick bot))))
@startphrase-list-atom (fn [bot channel _ _ _ message]
@endphrase-set-atom (do (println "Replying to speak command:" message)
min-sentence-length (send-message bot channel
max-sentence-length)] (create-sentence
(println ">> Sending message:" sentence) @trained-map-atom
(send-message bot channel sentence))))] @startphrase-list-atom
(try @endphrase-set-atom
(swap! msg-count inc) min-sentence-length
(cond max-sentence-length))))]
(= message (str "shutup " (.getNick bot)))
(do (println "Shutting up") ;speak about handler
(reset! bot-talking? false) [(fn [bot _ _ _ _ message]
(send-action bot channel "shuts up") (not
(change-nick bot (str (.getName bot) "|muted"))) (nil?
(= message (str "talk " (.getNick bot))) (re-matches
(do (println "Talking") (re-pattern
(reset! bot-talking? true) (str "speak about (.*) " (Pattern/quote (.getNick bot))))
(send-action bot channel "can talk now") message))))
(change-nick bot (.getName bot))) (fn [bot channel _ _ _ message]
(= message (str "speak " (.getNick bot))) (do (println "Replying to speak about command:" message)
(do (println "Replying to speak command:" message) (->>
(create-statement-and-send)) message
(not (nil? (re-matches speak-about-pattern message))) (re-matches
(do (println "Replying to speak about command:" message) (re-pattern
(->> (str "speak about (.*) " (Pattern/quote (.getNick bot)))))
message second
(re-matches speak-about-pattern) (split #"\s+")
second first
(split #"\s+") lower-case
first (fn [start]
lower-case (send-message bot channel
create-statement-and-send)) (create-sentence
:else [start]
(do @trained-map-atom
(doseq [line (sentencize-text message)] @startphrase-list-atom
(let [urls (map first (re-seq url-pattern line))] @endphrase-set-atom
(if (not (empty? urls)) min-sentence-length
(doseq [url urls] (println "Url Found >" url)) max-sentence-length))))))]]
(when-not (= 1 (count (tokenize-line line)))
(do default-fn
(println ">" sender ":" line) (fn [bot channel sender _ _ message]
(process-line (do
line (doseq [line (sentencize-text message)]
trained-map-atom (let [urls (map first (re-seq url-pattern line))]
startphrase-list-atom (if (not (empty? urls))
endphrase-set-atom (doseq [url urls] (println "Url Found >" url))
line-list-atom (when-not (= 1 (count (tokenize-line line)))
key-size (do
history-size) (println ">" sender ":" line)
(when (and (process-line
@bot-talking? line
(<= (rand) (/ 1 speak-interval))) trained-map-atom
(create-statement-and-send))))))) startphrase-list-atom
(when (zero? (mod @msg-count save-interval)) endphrase-set-atom
(println "Saving memory") line-list-atom
(save-memory bot @line-list-atom)))) key-size
(catch Exception e (.printStackTrace e))))))) history-size)
(when (and
@bot-talking?
(<= (rand) (/ 1 speak-interval)))
(send-message bot channel
(create-sentence
@trained-map-atom
@startphrase-list-atom
@endphrase-set-atom
min-sentence-length
max-sentence-length))))))))
(when (zero? (mod @msg-count save-interval))
(println "Saving memory")
(save-memory bot @line-list-atom))))]
[message-reaction-fns default-fn]))
(defn run-bot (defn run-bot
[server [server
@ -278,12 +308,14 @@
speak-interval speak-interval
min-sentence-length min-sentence-length
max-sentence-length] max-sentence-length]
(let [trained-map-atom (atom {}) (let [key-size (if (or (< key-size 0) (> key-size 2)) 2 key-size)
trained-map-atom (atom {})
startphrase-list-atom (atom []) startphrase-list-atom (atom [])
endphrase-set-atom (atom #{}) endphrase-set-atom (atom #{})
line-list-atom (atom []) line-list-atom (atom [])
on-message-callback msg-count (atom 0)
(create-on-message-callback [message-reaction-fns default-fn]
(create-message-reaction-fns
trained-map-atom trained-map-atom
startphrase-list-atom startphrase-list-atom
endphrase-set-atom endphrase-set-atom
@ -293,7 +325,10 @@
save-interval save-interval
speak-interval speak-interval
min-sentence-length min-sentence-length
max-sentence-length) max-sentence-length
msg-count)
on-message-callback
(create-on-message-callback message-reaction-fns default-fn msg-count)
bot (make-bot bot-name bot (make-bot bot-name
on-message-callback on-message-callback
(fn [bot sender login hostname target action] (fn [bot sender login hostname target action]
@ -309,6 +344,13 @@
(do (println "Kicked. Rejoining.") (do (println "Kicked. Rejoining.")
(.joinChannel bot channel))))] (.joinChannel bot channel))))]
(println "Running" bot-name "on" server channel) (println "Running" bot-name "on" server channel)
(println "Configuration:")
(println "> key size =" key-size)
(println "> history size =" history-size)
(println "> save interval =" save-interval)
(println "> speak interval =" speak-interval)
(println "> min sentence length =" min-sentence-length)
(println "> max sentence length =" max-sentence-length)
(doto bot (doto bot
(recall-memory (recall-memory
trained-map-atom trained-map-atom