X-Git-Url: https://git.distorted.org.uk/~mdw/profile/blobdiff_plain/96f2d8b3774ab7fa07a42d2c42d6a690b74f4381..bfdee8c36e31700e3c744c68489cc8de2c4e2c12:/dot/ercrc.el diff --git a/dot/ercrc.el b/dot/ercrc.el index 1c3881f..a539010 100644 --- a/dot/ercrc.el +++ b/dot/ercrc.el @@ -2,7 +2,6 @@ ;;; ;;; ERC configuration -(load "~/.erc-auth.el") (setq erc-nick "mdw" erc-user-full-name "Mark Wooding") @@ -34,24 +33,93 @@ '(("irc.ssdis.loc" "#devel" "#jukebox" "#nextgen") ("cam.irc.devel.ncipher.com" "#devel" "#jukebox" "#nextgen" "#sec-team") - ("chiark.greenend.org.uk" "#chiark"))) - -(defvar mdw-erc-auto-greet-bots-alist - `(("irc.ssdis.loc" "fastness" - ,(format "identpass mwooding %s" mdw-fastness-password)) - ("cam.irc.devel.ncipher.com" "fastness" - ,(format "identpass mwooding %s" mdw-fastness-password)) - ("chiark.greenend.org.uk" "blight" - ,(format "identpass mdw %s" mdw-blight-password))) + ("chiark.greenend.org.uk" "#chiark") + ("irc.distorted.org.uk" "#distorted" "#jukebox") + ("irc.hstg.corp.good.com" "#hstg"))) + +(defvar mdw-erc-auto-greet-bots-alist nil "*Alist of (SERVER-REGEXP BOT-NICK MESSAGE-FORM). 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." + (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))))))