erc-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Erc-commit] [commit][master] New "successful identification" hook in er


From: mwolson
Subject: [Erc-commit] [commit][master] New "successful identification" hook in erc-services.el.
Date: Fri, 07 Dec 2007 16:30:07 -0500

commit 49c48a2a9a5ef027435edfb664310f9688f4f903
Author: Edward O'Connor <address@hidden>
Date:   Fri Dec 7 13:23:09 2007 -0800

    New "successful identification" hook in erc-services.el.

diff --git a/ChangeLog b/ChangeLog
index b790e6e..e789fd2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2007-12-07  Edward O'Connor  <address@hidden>
+
+       * 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-01  Glenn Morris  <address@hidden>
 
        * erc-backend.el (erc-server-send-ping): Move after definition of
diff --git a/erc-services.el b/erc-services.el
index e6f6c40..6cf21e8 100644
--- a/erc-services.el
+++ b/erc-services.el
@@ -109,7 +109,9 @@ You can also use M-x erc-nickserv-identify-mode to change 
modes."
    (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 +120,8 @@ You can also use M-x erc-nickserv-identify-mode to change 
modes."
    (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 +153,9 @@ You can also use M-x erc-nickserv-identify-mode to change 
modes."
         (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."
@@ -192,63 +198,64 @@ Example of use:
   '((Ars
      nil nil
      "Census"
-     "IDENTIFY" nil nil)
+     "IDENTIFY" nil nil nil)
     (Austnet
      "address@hidden"
      "/address@hidden<password>"
      "address@hidden"
-     "identify" nil nil)
+     "identify" nil nil nil)
     (Azzurra
      "address@hidden"
      "/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
      "address@hidden"
      "/NickServ\\s-IDENTIFY\\s-senha"
      "NickServ"
-     "IDENTIFY" nil "")
+     "IDENTIFY" nil "" nil)
     (DALnet
      "address@hidden"
      "/address@hidden<password>"
      "address@hidden"
-     "IDENTIFY" nil nil)
+     "IDENTIFY" nil nil nil)
     (freenode
      "address@hidden"
      "/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
      "address@hidden"
      "Please\\s-change\\s-nicks\\s-or\\s-authenticate."
      "address@hidden"
-     "AUTH" t nil)
+     "AUTH" t nil nil)
     (iip
      "address@hidden"
      "type\\s-/squery\\s-Trent\\s-identify\\s-<password>"
      "address@hidden"
-     "IDENTIFY" nil "SQUERY")
+     "IDENTIFY" nil "SQUERY" nil)
     (OFTC
      "address@hidden"
      "type\\s-/msg\\s-NickServ\\s-IDENTIFY\\s-password."
      "NickServ"
-     "IDENTIFY" nil nil)
+     "IDENTIFY" nil nil nil)
     (QuakeNet
      nil nil
      "address@hidden"
-     "auth" t nil)
+     "auth" t nil nil)
     (SlashNET
      "address@hidden"
      "/msg\\s-NickServ\\s-IDENTIFY\\s-password"
      "address@hidden"
-     "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 address@hidden
@@ -258,7 +265,9 @@ KEYWORD is the keyword to use in the reply message to 
identify yourself.
 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 +301,36 @@ ANSWER is the command to use for the answer.  The default 
is 'privmsg.
 (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




reply via email to

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