Update of /project/cl-irc/cvsroot/cl-irc/example
In directory common-lisp.net:/home/bmastenbrook/cl-irc/example
Modified Files:
cliki.lisp
Added Files:
cliki-bot.asd eliza-rules.lisp mp2eliza.lisp
Log Message:
Commit latest cliki bot
Date: Sat Jan 17 14:19:55 2004
Author: bmastenbrook
Index: cl-irc/example/cliki.lisp
diff -u cl-irc/example/cliki.lisp:1.2 cl-irc/example/cliki.lisp:1.3
--- cl-irc/example/cliki.lisp:1.2 Mon Jan 5 09:53:15 2004
+++ cl-irc/example/cliki.lisp Sat Jan 17 14:19:55 2004
@@ -1,13 +1,14 @@
-;;;; $Id: cliki.lisp,v 1.2 2004/01/05 14:53:15 bmastenbrook Exp $
+;;;; $Id: cliki.lisp,v 1.3 2004/01/17 19:19:55 bmastenbrook Exp $
;;;; $Source: /project/cl-irc/cvsroot/cl-irc/example/cliki.lisp,v $
;;;; cliki.lisp - CLiki as an infobot; only works on SBCL.
-;;; To use it, load the cl-irc and cl-ppcre systems, load
+;;; To use it, load the net-nittin-irc and cl-ppcre systems, load
;;; cliki.lisp, and invoke (cliki::start-cliki-bot "desirednickname"
;;; "desiredserver" "#channel1" "#channel2" "#channel3" ...)
-(defpackage :cliki (:use :common-lisp :irc :sb-bsd-sockets :cl-ppcre))
+(defpackage :cliki (:use :common-lisp :irc :sb-bsd-sockets :cl-ppcre)
+ (:export :start-cliki-bot))
(in-package :cliki)
(defvar *small-definitions* nil)
@@ -98,7 +99,8 @@
(setf url (cdr (assoc :location headers))))))
(unwind-protect
(if (not (eql response 200))
- (format nil "The term ~A was not found in CLiki." term)
+ nil
+ ;;(format nil "The term ~A was not found in CLiki." term)
(let ((first-line ""))
(loop for i from 1 to 5 do ;; scan the first 5 lines
(progn
@@ -131,7 +133,7 @@
(symbol-macrolet ((it ,test))
,else))))
-(defparameter *cliki-attention-prefix* "minion: ")
+(defparameter *cliki-attention-prefix* "")
(defparameter *cliki-bot-help* "The minion bot supplies small definitions and performs lookups on CLiki. To use it, try ``minion: term?''. To add a term for IRC, try saying ``minion: add \"term\" as: definition'' or ``minion: alias \"term\" as: term''; otherwise, edit the corresponding CLiki page.")
@@ -149,24 +151,42 @@
(defn (regex-replace "^alias \"[^\"]+\" as: (.+)$" first-pass "\\1")))
(add-small-definition term (list defn))
"OK, done.")
+ (progn
+ (setf first-pass (regex-replace-all "(:|/|\\\\|\\#)" first-pass ""))
(or
(if (string-equal first-pass "help") *cliki-bot-help*)
- (if (scan "^(?i)do my bidding!*$" first-pass) "Yes, my master.")
- (concatenate 'string first-pass ": "
- (or (let ((term (cdr (assoc first-pass *small-definitions* :test #'string-equal))))
- (if term (if (stringp term) term (cliki-lookup (car term)))))
- (cliki-first-sentence first-pass))))))))
+ (if (scan "^(?i)hello(\\s|$)" first-pass) "what's up?")
+ (if (scan "^(?i)hi(\\s|$)" first-pass) "what's up?")
+ (if (scan "^(?i)yo(\\s|$)" first-pass) "what's up?")
+ (if (scan "^(?i)(?i)do my bidding!*$" first-pass) "Yes, my master.")
+ (aif (or (let ((term (cdr (assoc first-pass *small-definitions* :test #'string-equal))))
+ (if term (if (stringp term) term (cliki-lookup (car term)))))
+ (cliki-first-sentence first-pass)) (concatenate 'string first-pass ": " it))
+ (if (scan "(!|\\.|\\s.+\\?|\\)|\\()\\s*$" term-with-question)
+ ;;(generate-text (+ 20 (random 6)))
+ (ignore-errors (eliza::eliza first-pass))
+ )
+ (format nil "Sorry, I couldn't find anything in the database for ``~A''.~A" first-pass (if (scan " " first-pass) " Maybe you meant to end with punctuation?" ""))
+ ))))))
(defun valid-cliki-message (message)
(eql (search *cliki-attention-prefix* (trailing-argument message) :test #'char-equal) 0))
+(defparameter *respond-to-hello* nil)
+
+(defun anybody-here (string)
+ (or (scan "(?i)(anybody|aynbody|any body|anyone|aynone|any one|ne1|any1|n e 1|ne 1) (here|awake|there|home|know).*\\?*" string)
+ (scan "^(?i)\\s*(hello|hi|yo)\\s*(channel|room|people|ppl|all|peeps|)\\s*$" string)))
+
(defun msg-hook (message)
(if (string-equal (first (arguments message)) *cliki-nickname*)
(if (valid-cliki-message message)
(privmsg *cliki-connection* (source message) (cliki-lookup (subseq (trailing-argument message) (length *cliki-attention-prefix*))))
(privmsg *cliki-connection* (source message) (cliki-lookup (trailing-argument message))))
(if (valid-cliki-message message)
- (privmsg *cliki-connection* (first (arguments message)) (cliki-lookup (subseq (trailing-argument message) (length *cliki-attention-prefix*)))))))
+ (privmsg *cliki-connection* (first (arguments message)) (cliki-lookup (subseq (trailing-argument message) (length *cliki-attention-prefix*))))
+ (if (and *respond-to-hello* (anybody-here (trailing-argument message)))
+ (privmsg *cliki-connection* (first (arguments message)) (format nil "~A: hello." (source message)))))))
(defvar *cliki-nickserv-password* "")
@@ -178,6 +198,7 @@
(defun start-cliki-bot (nick server &rest channels)
(read-small-definitions)
(setf *cliki-nickname* nick)
+ (setf *cliki-attention-prefix* (format nil "~A: " nick))
(setf *cliki-connection* (connect :nickname *cliki-nickname* :server server))
(mapcar #'(lambda (channel) (join *cliki-connection* channel)) channels)
(add-hook *cliki-connection* 'irc::irc-privmsg-message 'msg-hook)