erc-timestamp-right-column 68
erc-fill-prefix " "
erc-max-buffer-size (* 60 3000))
-(erc-scrolltobottom-enable)
(load "~/.erc-local.el")
Evaluate MESSAGE-FORM and sent to BOT-NICK when connected to a server which
matches SERVER-REGEXP.")
+(defvar mdw-erc-ircop-alist nil
+ "*Alist of (SERVER-REGEXP ACCT PASSWD).
+Login details for claiming server admin rights.")
+
+(defun mdw-remprop-nondestructive (indic plist)
+ "Return a plist like PLIST, only without the first entry for INDIC.
+The PLIST is not itself modified."
+ (if (getf plist indic)
+ (let* ((head (cons nil nil))
+ (tail head))
+ (while (and plist (not (eq (car plist) indic)))
+ (let* ((i (pop plist)) (v (pop plist))
+ (vv (cons v nil)) (ii (cons i vv)))
+ (rplacd tail ii)
+ (setq tail vv)))
+ (rplacd tail (cddr plist))
+ (cdr head))
+ plist))
+
+(defmacro* mdw-pushnew-replace
+ (item place &rest keys &key (key '#'identity) &allow-other-keys)
+ "Add ITEM to the list PLACE, replacing any existing matching item.
+Specifically, any item in the list satisfying the test are removed
+\(nondestructively), and then the new ITEM is added to the front.
+
+Evaluation order for the keywords is a bit screwy: don't rely on it."
+ ;; `cl-setf-do-modify' returns a list (LETS STORE FETCH).
+ (let ((setf-things (cl-setf-do-modify place (cons 'list keys)))
+ (keyfn (gensym "key"))
+ (itemvar (gensym "item")))
+ `(let ((,keyfn ,key)
+ (,itemvar ,item)
+ ,@(car setf-things))
+ ,(cl-setf-do-store (cadr setf-things)
+ `(cons ,itemvar
+ (remove* (funcall ,keyfn ,itemvar)
+ ,(caddr setf-things)
+ :key ,keyfn
+ ,@(mdw-remprop-nondestructive
+ :key keys)))))))
+
(defun mdw-define-bot-greeting (server bot greeting)
"Define a new bot greeting."
- (push (list server bot greeting) mdw-erc-auto-greet-bots-alist))
+ (mdw-pushnew-replace (list server bot greeting)
+ mdw-erc-auto-greet-bots-alist
+ :test #'string= :key #'car))
+(defun mdw-add-ircop-credentials (server acct passwd)
+ "Define a new set of `ircop' credentials."
+ (mdw-pushnew-replace (list server acct passwd)
+ mdw-erc-ircop-alist
+ :test #'string= :key #'car))
(load "~/.erc-auth.el")
+(defun mdw-assoc-regexp (regexp alist)
+ "Return the association in ALIST whose car matches REGEXP."
+ (let ((answer nil))
+ (dolist (l alist)
+ (when (string-match (car l) regexp)
+ (setq answer l)))
+ answer))
+
(defun mdw-erc-auto-greet-bots (server nick)
"Send greeting message to bots."
- (dolist (l mdw-erc-auto-greet-bots-alist)
- (when (string-match (car l) server)
- (let ((bot (cadr l))
- (message (caddr l)))
+ (let ((a (mdw-assoc-regexp server mdw-erc-auto-greet-bots-alist)))
+ (when a
+ (let ((bot (cadr a))
+ (message (caddr a)))
(erc-server-send (concat "PRIVMSG " bot " :" message))))))
(add-hook 'erc-after-connect 'mdw-erc-auto-greet-bots)
(defun erc-cmd-GREET ()
"Send greeting messages, according to `mdw-erc-auto-greet-bots-alist'."
(mdw-erc-auto-greet-bots erc-session-server (erc-current-nick)))
+
+(defun erc-cmd-IRCOP ()
+ "Claim `ircop' privileges."
+ (let ((a (mdw-assoc-regexp erc-session-server mdw-erc-ircop-alist)))
+ (when a
+ (let ((acct (cadr a))
+ (passwd (caddr a)))
+ (erc-server-send (concat "OPER " acct " " passwd))))))