From: Vivek Dasmohapatra <vivek@etla.org>
To: 5521@debbugs.gnu.org
Subject: bug#5521: 23.1; erc - allow autojoin to be delayed till after services ident
Date: Thu, 4 Feb 2010 02:58:54 +0000 (GMT) [thread overview]
Message-ID: <alpine.DEB.2.00.1002040254510.27997@octopus.pepperfish.net> (raw)
[-- Attachment #1: Type: TEXT/PLAIN, Size: 494 bytes --]
Tags: patch
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.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: TEXT/x-diff; name=0002-Implement-customisable-autojoin-timing.patch, Size: 5270 bytes --]
diff --git a/lisp/erc/erc-join.el b/lisp/erc/erc-join.el
--- a/lisp/erc/erc-join.el
+++ b/lisp/erc/erc-join.el
@@ -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,25 @@ time is used again."
(repeat :tag "Channels"
(string :tag "Name")))))
+(defcustom erc-autojoin-timing :connect
+ "When erc should try to autojoin channels, assuming this feature has been
+enabled. Valid values are:\n
+ :connect - immediately upon connection to the server
+ :ident - upon successful identification to services\n
+If :ident is chosen, but no identification has occurred after
+`erc-autojoin-patience' seconds, erc will attempt to autojoin anyway.
+Any unrecognised value will be treated as the default (currently :connect)"
+ :group 'erc-autojoin
+ :type '(choice (const :tag "On Connection" :connect)
+ (const :tag "When Identified" :ident)))
+
+(defcustom erc-autojoin-patience 30
+ "Number of seconds to wait for successful services identification before
+attempting to autojoin channels anyway. Values of 0 or less disable this.\n
+See also: `erc-autojoin-timing'"
+ :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 +96,67 @@ servers, presumably in the same domain."
:group 'erc-autojoin
:type 'boolean)
+(defun erc-autojoin-timing-internal ()
+ (if (eq :ident erc-autojoin-timing) :ident :connect))
+
+(defvar erc-autojoin-delayed-timer nil)
+(make-variable-buffer-local 'erc-autojoin-delayed-timer)
+
+(defun erc-autojoin-channels-delayed (server nick buffer)
+ "Kick of a delayed channel autojoin (intended for use when we are waiting
+for a successful ident response before autojoining and run out of patience"
+ (if erc-autojoin-delayed-timer
+ (setq erc-autojoin-delayed-timer
+ (erc-cancel-timer erc-autojoin-delayed-timer)))
+ (with-current-buffer buffer
+ ;; make sure we don't kick of another delayed autojoin or try to wait for
+ ;; another ident response:
+ (let ((erc-autojoin-patience -1)
+ (erc-autojoin-timing :connect))
+ (erc-log "delayed autojoin started (no ident success detected yet)")
+ (erc-autojoin-channels server nick)) ))
+
(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))))))
+ "Autojoin channels in `erc-autojoin-channels-alist'.
+See also `erc-autojoin-timing'"
+ (if (eq (erc-autojoin-timing-internal) :connect)
+ (dolist (l erc-autojoin-channels-alist)
+ (when (string-match (car l) server)
+ (dolist (chan (cdr l))
+ (erc-server-send (concat "join " chan)))))
+ ;; ok, we want post-ident autojoin: prepare the delayed autojoin timer
+ ;; in case ident doesn't happen within the allotted time limit:
+ (when (< 0 erc-autojoin-patience)
+ (setq erc-autojoin-delayed-timer
+ (run-with-timer erc-autojoin-patience nil
+ 'erc-autojoin-channels-delayed
+ server nick (current-buffer)))
+ ;; make sure we return nil so we don't stomp on any other hook funcs:
+ nil)))
+
+(defun erc-autojoin-after-ident (network nick)
+ "Autojoin channels in `erc-autojoin-channels-alist' after
+successful identification to services, or after `erc-autojoin-patience'
+seconds otherwise."
+ (if erc-autojoin-delayed-timer
+ (setq erc-autojoin-delayed-timer
+ (erc-cancel-timer erc-autojoin-delayed-timer)))
+ (when (eq (erc-autojoin-timing-internal) :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, because the autojoin timer
+ ;; went off, or random server weirdness (at least one server I know
+ ;; of automatically pumps all users into a global channel)
+ (dolist (l erc-autojoin-channels-alist)
+ (when (string-match (car l) server)
+ (dolist (chan (cdr l))
+ (if (erc-member-ignore-case chan joined)
+ (erc-log (format "erc-join-after-indent: already in %s" chan))
+ (erc-log (format "erc-join-after-indent: joining %s" chan))
+ (erc-server-send (concat "join " chan)) )) )) ))
+ nil)
(defun erc-autojoin-add (proc parsed)
"Add the channel being joined to `erc-autojoin-channels-alist'."
next reply other threads:[~2010-02-04 2:58 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-04 2:58 Vivek Dasmohapatra [this message]
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 ` bug#5521: 23.1; erc - allow autojoin to be delayed till after services ident Chong Yidong
2010-07-18 4:21 ` 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
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.DEB.2.00.1002040254510.27997@octopus.pepperfish.net \
--to=vivek@etla.org \
--cc=5521@debbugs.gnu.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 public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).