bug-gnu-emacs
[Top][All Lists]
Advanced

[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 i


From: Chong Yidong
Subject: bug#5521: 23.1; erc - allow autojoin to be delayed till after services ident
Date: Sat, 17 Jul 2010 19:37:16 -0400

> 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'."





reply via email to

[Prev in Thread] Current Thread [Next in Thread]