+;;; User-defined responses
+
+
+(defvar lurk-autoreply-table nil
+ "Table of autoreply messages.
+
+Each autoreply is a list of two elements: (matcher reply)
+
+Here matcher is a list:
+
+(network src cmd params ...)
+
+and reply is another list:
+
+ (cmd params ...)
+
+Each entry in the matcher list is a regular expression tested against the
+corresponding values in the incomming message. Entries can be nil,
+in which case they match anything.")
+
+(defun lurk--lists-equal (l1 l2)
+ (if (and l1 l2)
+ (if (or (not (and (car l1) (car l2)))
+ (string-match (car l1) (car l2)))
+ (lurk--lists-equal (cdr l1) (cdr l2))
+ nil)
+ t))
+
+(defun lurk-process-autoreply (msg autoreply)
+ (let ((matcher (car autoreply))
+ (reply (cadr autoreply)))
+ (let ((network (car matcher)))
+ (when (and (or (not network)
+ (and (get-process "lurk")
+ (equal (car (process-contact (get-process "lurk")))
+ (cadr (assoc network lurk-networks)))))
+ (lurk--lists-equal (cdr matcher)
+ (append (list (lurk-msg-src msg)
+ (lurk-msg-cmd msg))
+ (lurk-msg-params msg))))
+ (lurk-send-msg
+ (lurk-msg nil nil (car reply) (cdr reply)))))))
+
+(defun lurk-process-autoreplies (msg)
+ (mapc
+ (lambda (autoreply)
+ (lurk-process-autoreply msg autoreply))
+ lurk-autoreply-table))
+