[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#5521: 23.1; erc - allow autojoin to be delayed till after services
From: |
Michael Olson |
Subject: |
bug#5521: 23.1; erc - allow autojoin to be delayed till after services ident |
Date: |
Sat, 17 Jul 2010 21:21:29 -0700 |
Looks generally OK to me, though I've stepped down as the maintainer
of ERC. Forwarding on to the ERC discussion list and the new
maintainer Giorgos.
One change I would recommend is to change :connect and :ident to be in
normal symbol form ('connect and 'ident) for consistency with the rest
of ERC's code.
On Sat, Jul 17, 2010 at 4:37 PM, Chong Yidong <cyd@stupidchicken.com> wrote:
>> 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'."
>
--
Michael Olson | http://mwolson.org/