unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
From: Michael Olson <mwolson@gnu.org>
To: Chong Yidong <cyd@stupidchicken.com>,
	Giorgos Keramidas <keramida@ceid.upatras.gr>,
	ERC Discussion <erc-discuss@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 21:21:29 -0700	[thread overview]
Message-ID: <AANLkTimNL_9MS9bAQcp6Bc3d_n6A9JyUBA1lY3TSjjX7__27918.1092315868$1279427441$gmane$org@mail.gmail.com> (raw)
In-Reply-To: <871vb1he8j.fsf@stupidchicken.com>

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/





  reply	other threads:[~2010-07-18  4:21 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 ` bug#5521: 23.1; erc - allow autojoin to be delayed till after services ident Chong Yidong
2010-07-18  4:21   ` Michael Olson [this message]
     [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='AANLkTimNL_9MS9bAQcp6Bc3d_n6A9JyUBA1lY3TSjjX7__27918.1092315868$1279427441$gmane$org@mail.gmail.com' \
    --to=mwolson@gnu.org \
    --cc=5521@debbugs.gnu.org \
    --cc=cyd@stupidchicken.com \
    --cc=erc-discuss@gnu.org \
    --cc=keramida@ceid.upatras.gr \
    --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 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).