(defvar friends-list '(("#doot" ("mst" "Potplant" "resolve" "Phrogz" "Gadicath" "David" "z0r") astrolink) ("#doot" ("mst" "Potplant" "beth") home))) (defun user-host (nick) (and (gethash nick erc-channel-users) (erc-server-user-host (car (gethash nick erc-channel-users))))) (defun channel-friends (channel &optional network) (cadr (find-if (lambda (list) (and (equalp (car list) channel) (or (not (caddr list)) (not (fboundp 'erc-mst-current-network-name)) (eq (erc-mst-current-network-name) (caddr list))))) friends-list))) (defun friend-p (nick host channel) (or (member* nick (channel-friends channel) :test 'equalp) (some (lambda (friend-nick) (and (user-host friend-nick) (string= (user-host friend-nick) host))) (channel-friends channel)))) (defun op-friends (proc parsed) "Op friends on all channels" (dolist (channel-buffer (erc-channel-list proc)) (with-current-buffer channel-buffer (maphash (lambda (nickname user-details) (when (and (not (equalp nickname (erc-current-nick))) (not (erc-channel-user-op-p nickname)) (erc-channel-user-op-p (erc-current-nick)) (friend-p nickname (user-host nickname) (erc-default-target))) (erc-cmd-OP nickname))) erc-channel-users))) nil) (add-hook 'erc-server-JOIN-functions 'op-friends t) (add-hook 'erc-server-NICK-functions 'op-friends t) (provide 'op-friends)