(if lurk-debug
(lurk-display-string nil nil string))
(let* ((msg (lurk-string->msg string)))
+ (lurk-process-autoreplies msg)
(pcase (lurk-msg-cmd msg)
("PING"
(lurk-send-msg
(lurk-display-notice nil (lurk-msg->string msg))))))
+;;; 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))
+
;;; Command entering
;;
(defun lurk-enter-string (string)
(if (string-prefix-p "/" string)
(pcase (substring string 1)
- ((rx "DEBUG")
- (setq lurk-debug (not lurk-debug))
+ ((rx (: "DEBUG" (opt (: " " (let setting (or "ON" "OFF"))))))
+ (setq lurk-debug
+ (if setting
+ (if (equal (upcase setting) "ON")
+ t
+ nil)
+ (not lurk-debug)))
(lurk-display-notice nil "Debug mode now " (if lurk-debug "on" "off") "."))
((rx "HEADER")