;;; Gossip bot for AIM, using CLAIM. ;;; John Wiseman (defpackage :gossip-bot (:use :common-lisp :com.lemonodor.claim) (:export #:start-gossip-bot)) (in-package :gossip-bot) (defun start-gossip-bot (username password) (let ((bot (make-instance 'gossip-bot :username username :password password))) (open-aim-connection bot) (unwind-protect (receive-events bot) (close-aim-connection bot)))) (defclass gossip-bot (aim-connection) ((messages :accessor messages :initform '()) (users :accessor users :initform nil))) (defun random-elt (seq) (elt seq (random (length seq)))) (defmethod handle-im-in ((self gossip-bot) user auto-p message) (declare (ignore auto-p)) (format T "~&~A: ~A" user message) (if (not (member user (users self) :test #'equalp)) (do-send-im self user (format nil "Hi, ~A. I'm a gossip bot. Tell me some stuff." user)) (progn (push (cons user message) (messages self)) (if (zerop (random 4)) (do-send-im self user (format nil "Someone, maybe ~A, said ~A" (random-elt (users self)) (cdr (random-elt (messages self))))) (do-send-im self user (format nil "Someone said ~A" (cdr (random-elt (messages self)))))))) (pushnew user (users self) :test #'equal)) (defmethod do-send-im :around ((self gossip-bot) user message &key (auto-p)) (declare (ignore user auto-p)) (format T "~&~A: ~A" (aim-connection-username self) message) (call-next-method)) (defmethod handle-warned ((self gossip-bot) warn-level warner) (declare (ignore warn-level)) (do-send-im self warner "I bet that made you feel tough.") (if (zerop (random 2)) (do-warn self warner NIL)))