From: Chong Yidong <cyd@stupidchicken.com>
To: Michael Olson <mwolson@gnu.org>
Cc: 5521@debbugs.gnu.org, Vivek Dasmohapatra <vivek@etla.org>
Subject: bug#5521: 23.1; erc - allow autojoin to be delayed till after services ident
Date: Sat, 17 Jul 2010 19:37:16 -0400 [thread overview]
Message-ID: <871vb1he8j.fsf@stupidchicken.com> (raw)
In-Reply-To: <alpine.DEB.2.00.1002040254510.27997@octopus.pepperfish.net>
> Some irc channels can only be joined by identified users, but since
> identification may not happen until some time after a server
> connection is established, autojoin currently happens too early for
> these channels.
> This patch allows the autojoin timing to be selected:
> - on connect (as currently)
> - after successful ident
> If after-ident is chosen, there is also a customiseable timeout which
> kicks in and starts autojoin anyway if an ident isn't received in the
> alloted time.
Hi Michael,
Any objection to checking in this patch? (I did some cleanup of what
Vivek originally sent).
*** lisp/erc/erc-join.el 2010-01-13 08:35:10 +0000
--- lisp/erc/erc-join.el 2010-07-17 23:34:40 +0000
***************
*** 42,50 ****
--- 42,52 ----
(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,71 ****
--- 68,91 ----
(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,86 ****
:group 'erc-autojoin
:type 'boolean)
(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))))))
(defun erc-autojoin-add (proc parsed)
"Add the channel being joined to `erc-autojoin-channels-alist'."
--- 95,154 ----
: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'."
! (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'."
next prev parent reply other threads:[~2010-07-17 23:37 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-04 2:58 bug#5521: 23.1; erc - allow autojoin to be delayed till after services ident Vivek Dasmohapatra
2010-02-07 17:41 ` bug#5521: Works for me Phil Hagelberg
2010-06-27 12:36 ` bug#5521: Deniz Dogan
2010-07-16 16:24 ` bug#5521: Seems to work Criveti Mihai
2010-07-17 23:37 ` Chong Yidong [this message]
2010-07-18 4:21 ` bug#5521: 23.1; erc - allow autojoin to be delayed till after services ident Michael Olson
[not found] ` <AANLkTimNL_9MS9bAQcp6Bc3d_n6A9JyUBA1lY3TSjjX7@mail.gmail.com>
2010-08-14 22:58 ` Chong Yidong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=871vb1he8j.fsf@stupidchicken.com \
--to=cyd@stupidchicken.com \
--cc=5521@debbugs.gnu.org \
--cc=mwolson@gnu.org \
--cc=vivek@etla.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.