mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-15 10:30:25 -08:00
Allow delayed autojoin in ERC (Bug#5521).
* erc/erc-join.el (erc-autojoin-timing, erc-autojoin-delay): New vars. (erc-autojoin-channels-delayed, erc-autojoin-after-ident): New functions. (erc-autojoin-channels): Allow autojoining after ident (Bug#5521).
This commit is contained in:
parent
ab731e1cf3
commit
8a8d54cd2a
3 changed files with 87 additions and 4 deletions
|
|
@ -42,9 +42,11 @@
|
|||
(define-erc-module autojoin nil
|
||||
"Makes ERC autojoin on connects and reconnects."
|
||||
((add-hook 'erc-after-connect 'erc-autojoin-channels)
|
||||
(add-hook 'erc-nickserv-identified-hook 'erc-autojoin-after-ident)
|
||||
(add-hook 'erc-server-JOIN-functions 'erc-autojoin-add)
|
||||
(add-hook 'erc-server-PART-functions 'erc-autojoin-remove))
|
||||
((remove-hook 'erc-after-connect 'erc-autojoin-channels)
|
||||
(remove-hook 'erc-nickserv-identified-hook 'erc-autojoin-after-ident)
|
||||
(remove-hook 'erc-server-JOIN-functions 'erc-autojoin-add)
|
||||
(remove-hook 'erc-server-PART-functions 'erc-autojoin-remove)))
|
||||
|
||||
|
|
@ -66,6 +68,24 @@ time is used again."
|
|||
(repeat :tag "Channels"
|
||||
(string :tag "Name")))))
|
||||
|
||||
(defcustom erc-autojoin-timing 'connect
|
||||
"When ERC should attempt to autojoin a channel.
|
||||
If the value is `connect', autojoin immediately on connecting.
|
||||
If the value is `ident', autojoin after successful NickServ
|
||||
identification, or after `erc-autojoin-delay' seconds.
|
||||
Any other value means the same as `connect'."
|
||||
:group 'erc-autojoin
|
||||
:type '(choice (const :tag "On Connection" 'connect)
|
||||
(const :tag "When Identified" 'ident)))
|
||||
|
||||
(defcustom erc-autojoin-delay 30
|
||||
"Number of seconds to wait before attempting to autojoin channels.
|
||||
This only takes effect if `erc-autojoin-timing' is `ident'.
|
||||
If NickServ identification occurs before this delay expires, ERC
|
||||
autojoins immediately at that time."
|
||||
:group 'erc-autojoin
|
||||
:type 'integer)
|
||||
|
||||
(defcustom erc-autojoin-domain-only t
|
||||
"Truncate host name to the domain name when joining a server.
|
||||
If non-nil, and a channel on the server a.b.c is joined, then
|
||||
|
|
@ -75,12 +95,60 @@ servers, presumably in the same domain."
|
|||
:group 'erc-autojoin
|
||||
:type 'boolean)
|
||||
|
||||
(defvar erc--autojoin-timer nil)
|
||||
(make-variable-buffer-local 'erc--autojoin-timer)
|
||||
|
||||
(defun erc-autojoin-channels-delayed (server nick buffer)
|
||||
"Attempt to autojoin channels.
|
||||
This is called from a timer set up by `erc-autojoin-channels'."
|
||||
(if erc--autojoin-timer
|
||||
(setq erc--autojoin-timer
|
||||
(erc-cancel-timer erc--autojoin-timer)))
|
||||
(with-current-buffer buffer
|
||||
;; Don't kick of another delayed autojoin or try to wait for
|
||||
;; another ident response:
|
||||
(let ((erc-autojoin-delay -1)
|
||||
(erc-autojoin-timing 'connect))
|
||||
(erc-log "Delayed autojoin started (no ident success detected yet)")
|
||||
(erc-autojoin-channels server nick))))
|
||||
|
||||
(defun erc-autojoin-after-ident (network nick)
|
||||
"Autojoin channels in `erc-autojoin-channels-alist'.
|
||||
This function is run from `erc-nickserv-identified-hook'."
|
||||
(if erc--autojoin-timer
|
||||
(setq erc--autojoin-timer
|
||||
(erc-cancel-timer erc--autojoin-timer)))
|
||||
(when (eq erc-autojoin-timing 'ident)
|
||||
(let ((server (or erc-server-announced-name erc-session-server))
|
||||
(joined (mapcar (lambda (buf)
|
||||
(with-current-buffer buf (erc-default-target)))
|
||||
(erc-channel-list erc-server-process))))
|
||||
;; We may already be in these channels, e.g. because the
|
||||
;; autojoin timer went off.
|
||||
(dolist (l erc-autojoin-channels-alist)
|
||||
(when (string-match (car l) server)
|
||||
(dolist (chan (cdr l))
|
||||
(unless (erc-member-ignore-case chan joined)
|
||||
(erc-server-send (concat "join " chan))))))))
|
||||
nil)
|
||||
|
||||
(defun erc-autojoin-channels (server nick)
|
||||
"Autojoin channels in `erc-autojoin-channels-alist'."
|
||||
(dolist (l erc-autojoin-channels-alist)
|
||||
(when (string-match (car l) server)
|
||||
(dolist (chan (cdr l))
|
||||
(erc-server-send (concat "join " chan))))))
|
||||
(if (eq erc-autojoin-timing 'ident)
|
||||
;; Prepare the delayed autojoin timer, in case ident doesn't
|
||||
;; happen within the allotted time limit:
|
||||
(when (> erc-autojoin-delay 0)
|
||||
(setq erc--autojoin-timer
|
||||
(run-with-timer erc-autojoin-delay nil
|
||||
'erc-autojoin-channels-delayed
|
||||
server nick (current-buffer))))
|
||||
;; `erc-autojoin-timing' is `connect':
|
||||
(dolist (l erc-autojoin-channels-alist)
|
||||
(when (string-match (car l) server)
|
||||
(dolist (chan (cdr l))
|
||||
(erc-server-send (concat "join " chan))))))
|
||||
;; Return nil to avoid stomping on any other hook funcs.
|
||||
nil)
|
||||
|
||||
(defun erc-autojoin-add (proc parsed)
|
||||
"Add the channel being joined to `erc-autojoin-channels-alist'."
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue