changeset 87202:60375ad7809c

Sync from ERC upstream Changes include: - Add nickserv support for GRnet. - Parse 275 (secure connection) response. - Provide new hook `erc-nickserv-identified-hook' that runs when nickserv confirms that the user has successfully identified.
author Michael Olson <mwolson@gnu.org>
date Sun, 09 Dec 2007 06:40:47 +0000
parents 3281ac5730e1
children ecb9fe2736a4
files lisp/erc/ChangeLog lisp/erc/erc-backend.el lisp/erc/erc-services.el lisp/erc/erc.el
diffstat 4 files changed, 99 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/erc/ChangeLog	Sun Dec 09 04:14:11 2007 +0000
+++ b/lisp/erc/ChangeLog	Sun Dec 09 06:40:47 2007 +0000
@@ -1,9 +1,33 @@
+2007-12-09  Michael Olson  <mwolson@gnu.org>
+
+	* erc-services.el (erc-nickserv-alist): Fix regexps for GRnet.
+
+2007-12-09  Giorgos Keramidas  <keramida@ceid.upatras.gr>  (tiny change)
+
+	* erc-backend.el, erc.el:
+	Parse 275 (secure connection) responses.
+
+	* erc-services.el: Add identification hooks for GRnet, the Greek
+	IRC network <http://www.irc.gr>.
+
 2007-12-08  David Kastrup  <dak@gnu.org>
 
 	* erc-stamp.el (erc-echo-timestamp):
 	* erc-lang.el (language):
 	* erc-backend.el (erc-server-connect): Fix buggy call to `message'.
 
+2007-12-07  Edward O'Connor  <ted@oconnor.cx>
+
+	* erc-services.el: Provide a hook that runs when nickserv confirms
+	that the user has successfully identified.
+	(services, erc-nickserv-identify-mode): Add and remove
+	erc-nickserv-identification-autodetect from
+	erc-server-NOTICE-functions.
+	(erc-nickserv-alist): Add SUCCESS-REGEXP to each entry.
+	(erc-nickserv-alist-identified-regexp)
+	(erc-nickserv-identification-autodetect): New functions.
+	(erc-nickserv-identified-hook): New hook.
+
 2007-12-06  D. Goel  <deego3@gmail.com>
 
 	* erc-match.el (erc-add-entry-to-list): Fix buggy call to `error'.
--- a/lisp/erc/erc-backend.el	Sun Dec 09 04:14:11 2007 +0000
+++ b/lisp/erc/erc-backend.el	Sun Dec 09 06:40:47 2007 +0000
@@ -1538,6 +1538,16 @@
 See `erc-display-server-message'." nil
   (erc-display-server-message proc parsed))
 
+(define-erc-response-handler (275)
+  "Display secure connection message." nil
+  (multiple-value-bind (nick user message)
+      (cdr (erc-response.command-args parsed))
+    (erc-display-message
+     parsed 'notice 'active 's275
+     ?n nick
+     ?m (mapconcat 'identity (cddr (erc-response.command-args parsed))
+                   " "))))
+
 (define-erc-response-handler (290)
   "Handle dancer-ircd CAPAB messages." nil nil)
 
--- a/lisp/erc/erc-services.el	Sun Dec 09 04:14:11 2007 +0000
+++ b/lisp/erc/erc-services.el	Sun Dec 09 06:40:47 2007 +0000
@@ -29,9 +29,10 @@
 ;; are made to test if NickServ is the real NickServ for a given network or
 ;; server.
 
-;; As a default, ERC has the data for the official nickname services on the
-;; networks Austnet, BrasNET, Dalnet, freenode, GalaxyNet, and Slashnet.
-;; You can add more by using M-x customize-variable RET erc-nickserv-alist.
+;; As a default, ERC has the data for the official nickname services on
+;; the networks Austnet, BrasNET, Dalnet, freenode, GalaxyNet, GRnet,
+;; and Slashnet.  You can add more by using M-x customize-variable RET
+;; erc-nickserv-alist.
 
 ;; Usage:
 ;;
@@ -109,7 +110,9 @@
    (remove-hook 'erc-after-connect
 		'erc-nickserv-identify-on-connect)
    (remove-hook 'erc-nick-changed-functions
-		'erc-nickserv-identify-on-nick-change)))
+		'erc-nickserv-identify-on-nick-change)
+   (remove-hook 'erc-server-NOTICE-functions
+		'erc-nickserv-identification-autodetect)))
 
 ;;;###autoload
 (defun erc-nickserv-identify-mode (mode)
@@ -118,6 +121,8 @@
    (list (intern (completing-read
 		  "Choose Nickserv identify mode (RET to disable): "
 		  '(("autodetect") ("nick-change") ("both")) nil t))))
+  (add-hook 'erc-server-NOTICE-functions
+	    'erc-nickserv-identification-autodetect)
   (cond ((eq mode 'autodetect)
 	 (setq erc-nickserv-identify-mode 'autodetect)
 	 (add-hook 'erc-server-NOTICE-functions
@@ -149,7 +154,9 @@
 	 (remove-hook 'erc-after-connect
 		      'erc-nickserv-identify-on-connect)
 	 (remove-hook 'erc-nick-changed-functions
-		      'erc-nickserv-identify-on-nick-change))))
+		      'erc-nickserv-identify-on-nick-change)
+	 (remove-hook 'erc-server-NOTICE-functions
+		      'erc-nickserv-identification-autodetect))))
 
 (defcustom erc-prompt-for-nickserv-password t
   "Ask for the password when identifying to NickServ."
@@ -176,6 +183,7 @@
 			(const DALnet)
 			(const freenode)
 			(const GalaxyNet)
+			(const GRnet)
 			(const iip)
 			(const OFTC)
 			(const QuakeNet)
@@ -192,63 +200,70 @@
   '((Ars
      nil nil
      "Census"
-     "IDENTIFY" nil nil)
+     "IDENTIFY" nil nil nil)
     (Austnet
      "NickOP!service@austnet.org"
      "/msg\\s-NickOP@austnet.org\\s-identify\\s-<password>"
      "nickop@austnet.org"
-     "identify" nil nil)
+     "identify" nil nil nil)
     (Azzurra
      "NickServ!service@azzurra.org"
      "/ns\\s-IDENTIFY\\s-password"
      "NickServ"
-     "IDENTIFY" nil nil)
+     "IDENTIFY" nil nil nil)
     (BitlBee
      nil nil
      "&bitlbee"
-     "identify" nil nil)
+     "identify" nil nil nil)
     (BRASnet
      "NickServ!services@brasnet.org"
      "/NickServ\\s-IDENTIFY\\s-senha"
      "NickServ"
-     "IDENTIFY" nil "")
+     "IDENTIFY" nil "" nil)
     (DALnet
      "NickServ!service@dal.net"
      "/msg\\s-NickServ@services.dal.net\\s-IDENTIFY\\s-<password>"
      "NickServ@services.dal.net"
-     "IDENTIFY" nil nil)
+     "IDENTIFY" nil nil nil)
     (freenode
      "NickServ!NickServ@services."
      "/msg\\s-NickServ\\s-IDENTIFY\\s-<password>"
      "NickServ"
-     "IDENTIFY" nil nil)
+     "IDENTIFY" nil nil
+     "Password\\s-accepted\\s--\\s-you\\s-are\\s-now\\s-recognized")
     (GalaxyNet
      "NS!nickserv@galaxynet.org"
      "Please\\s-change\\s-nicks\\s-or\\s-authenticate."
      "NS@services.galaxynet.org"
-     "AUTH" t nil)
+     "AUTH" t nil nil)
+    (GRnet
+     "NickServ!service@irc.gr"
+     "This\\s-nickname\\s-is\\s-registered\\s-and\\s-protected."
+     "NickServ"
+     "IDENTIFY" nil nil
+     "Password\\s-accepted\\s--\\s-you\\s-are\\s-now\\s-recognized.")
     (iip
      "Trent@anon.iip"
      "type\\s-/squery\\s-Trent\\s-identify\\s-<password>"
      "Trent@anon.iip"
-     "IDENTIFY" nil "SQUERY")
+     "IDENTIFY" nil "SQUERY" nil)
     (OFTC
      "NickServ!services@services.oftc.net"
      "type\\s-/msg\\s-NickServ\\s-IDENTIFY\\s-password."
      "NickServ"
-     "IDENTIFY" nil nil)
+     "IDENTIFY" nil nil nil)
     (QuakeNet
      nil nil
      "Q@CServe.quakenet.org"
-     "auth" t nil)
+     "auth" t nil nil)
     (SlashNET
      "NickServ!services@services.slashnet.org"
      "/msg\\s-NickServ\\s-IDENTIFY\\s-password"
      "NickServ@services.slashnet.org"
-     "IDENTIFY" nil nil))
+     "IDENTIFY" nil nil nil))
    "Alist of NickServer details, sorted by network.
 Every element in the list has the form
-  \(SYMBOL NICKSERV REGEXP NICK KEYWORD USE-CURRENT ANSWER)
+  \(SYMBOL NICKSERV REGEXP NICK KEYWORD USE-CURRENT ANSWER SUCCESS-REGEXP)
 
 SYMBOL is a network identifier, a symbol, as used in `erc-networks-alist'.
 NICKSERV is the description of the nickserv in the form nick!user@host.
@@ -258,7 +273,9 @@
 USE-CURRENT indicates whether the current nickname must be used when
   identifying.
 ANSWER is the command to use for the answer.  The default is 'privmsg.
-  This last element is optional."
+SUCCESS-REGEXP is a regular expression matching the message nickserv
+  sends when you've successfully identified.
+The last two elements are optional."
    :group 'erc-services
    :type '(repeat
 	   (list :tag "Nickserv data"
@@ -292,8 +309,36 @@
 (defsubst erc-nickserv-alist-ident-command (network &optional entry)
   (nth 6 (or entry (assoc network erc-nickserv-alist))))
 
+(defsubst erc-nickserv-alist-identified-regexp (network &optional entry)
+  (nth 7 (or entry (assoc network erc-nickserv-alist))))
+
 ;; Functions:
 
+(defcustom erc-nickserv-identified-hook nil
+  "Run this hook when NickServ acknowledged successful identification.
+Hooks are called with arguments (NETWORK NICK)."
+  :group 'erc-services
+  :type 'hook)
+
+(defun erc-nickserv-identification-autodetect (proc parsed)
+  "Check for NickServ's successful identification notice.
+Make sure it is the real NickServ for this network and that it has
+specifically confirmed a successful identification attempt.
+If this is the case, run `erc-nickserv-identified-hook'."
+  (let* ((network (erc-network))
+	 (sender (erc-nickserv-alist-sender network))
+	 (success-regex (erc-nickserv-alist-identified-regexp network))
+	 (sspec (erc-response.sender parsed))
+	 (nick (car (erc-response.command-args parsed)))
+	 (msg (erc-response.contents parsed)))
+    ;; continue only if we're sure it's the real nickserv for this network
+    ;; and it's told us we've successfully identified
+    (when (and sender (equal sspec sender)
+	       (string-match success-regex msg))
+      (erc-log "NickServ IDENTIFY success notification detected")
+      (run-hook-with-args 'erc-nickserv-identified-hook network nick)
+      nil)))
+
 (defun erc-nickserv-identify-autodetect (proc parsed)
   "Check for a NickServ identify request everytime a notice is received.
 Make sure it is the real NickServ for this network and that it has
--- a/lisp/erc/erc.el	Sun Dec 09 04:14:11 2007 +0000
+++ b/lisp/erc/erc.el	Sun Dec 09 06:40:47 2007 +0000
@@ -6213,6 +6213,7 @@
    (s252   . "%i operator(s) online")
    (s253   . "%i unknown connection(s)")
    (s254   . "%i channels formed")
+   (s275   . "%n %m")
    (s301   . "%n is AWAY: %r")
    (s303   . "Is online: %n")
    (s305   . "%m")