*** empty log message ***
[gnus] / lisp / gnus-nocem.el
index 6510a83..31dc6c8 100644 (file)
@@ -1,5 +1,5 @@
 ;;; gnus-nocem.el --- NoCeM pseudo-cancellation treatment
-;; Copyright (C) 1995,96 Free Software Foundation, Inc.
+;; Copyright (C) 1995,96,97 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
 ;; Keywords: news
 (require 'gnus)
 (require 'nnmail)
 (require 'gnus-art)
+(require 'gnus-sum)
 (require 'gnus-range)
 
 (defgroup gnus-nocem nil
   "NoCeM pseudo-cancellation treatment"
   :group 'gnus-score)
 
-(defcustom gnus-nocem-groups 
-  '("alt.nocem.misc" "news.admin.net-abuse.announce")
+(defcustom gnus-nocem-groups
+  '("news.lists.filters" "news.admin.net-abuse.bulletins"
+    "alt.nocem.misc" "news.admin.net-abuse.announce")
   "List of groups that will be searched for NoCeM messages."
   :group 'gnus-nocem
   :type '(repeat (string :tag "Group")))
 
-(defcustom gnus-nocem-issuers 
+(defcustom gnus-nocem-issuers
  '("AutoMoose-1" "Automoose-1"   ; CancelMoose[tm]
    "rbraver@ohww.norman.ok.us"   ; Robert Braver
    "clewis@ferret.ocunix.on.ca;" ; Chris Lewis
@@ -52,7 +54,7 @@
   :group 'gnus-nocem
   :type '(repeat string))
 
-(defcustom gnus-nocem-directory 
+(defcustom gnus-nocem-directory
   (nnheader-concat gnus-article-save-directory "NoCeM/")
   "*Directory where NoCeM files will be stored."
   :group 'gnus-nocem
@@ -71,12 +73,20 @@ isn't bound, the message will be used unconditionally."
   :type '(radio (function-item mc-verify)
                (function :tag "other")))
 
+(defcustom gnus-nocem-liberal-fetch nil
+  "*If t try to fetch all messages which have @@NCM in the subject.
+Otherwise don't fetch messages which have references or whose messsage-id
+matches an previously scanned and verified nocem message."
+  :group 'gnus-nocem
+  :type 'boolean)
+
 ;;; Internal variables
 
 (defvar gnus-nocem-active nil)
 (defvar gnus-nocem-alist nil)
 (defvar gnus-nocem-touched-alist nil)
 (defvar gnus-nocem-hashtb nil)
+(defvar gnus-nocem-seen-message-ids nil)
 
 ;;; Functions
 
@@ -97,11 +107,10 @@ isn't bound, the message will be used unconditionally."
     ;; Read the active file if it hasn't been read yet.
     (and (file-exists-p (gnus-nocem-active-file))
         (not gnus-nocem-active)
-        (condition-case ()
-            (load (gnus-nocem-active-file) t t t)
-          (error nil)))
+        (ignore-errors
+          (load (gnus-nocem-active-file) t t t)))
     ;; Go through all groups and see whether new articles have
-    ;; arrived.  
+    ;; arrived.
     (while (setq group (pop groups))
       (if (not (setq gactive (gnus-activate-group group)))
          ()                            ; This group doesn't exist.
@@ -113,28 +122,35 @@ isn't bound, the message will be used unconditionally."
          ;; headers.
          (save-excursion
            (let ((dependencies (make-vector 10 nil))
-                 headers)
+                 headers header)
              (nnheader-temp-write nil
                (setq headers
                      (if (eq 'nov
-                             (gnus-retrieve-headers 
+                             (gnus-retrieve-headers
                               (setq articles
                                     (gnus-uncompress-range
-                                     (cons 
+                                     (cons
                                       (if active (1+ (cdr active))
                                         (car gactive))
                                       (cdr gactive))))
                               group))
-                         (gnus-get-newsgroup-headers-xover 
+                         (gnus-get-newsgroup-headers-xover
                           articles nil dependencies)
                        (gnus-get-newsgroup-headers dependencies)))
-               (while headers
+               (while (setq header (pop headers))
                  ;; We take a closer look on all articles that have
-                 ;; "@@NCM" in the subject.  
-                 (when (string-match "@@NCM"
-                                     (mail-header-subject (car headers)))
-                   (gnus-nocem-check-article group (car headers)))
-                 (setq headers (cdr headers)))))))
+                 ;; "@@NCM" in the subject.  Unless we already read
+                 ;; this cross posted message.  Nocem messages
+                 ;; are not allowed to have references, so we can
+                 ;; ignore scanning followups.
+                 (and (string-match "@@NCM" (mail-header-subject header))
+                      (or gnus-nocem-liberal-fetch
+                          (and (or (string= "" (mail-header-references
+                                                header))
+                                   (null (mail-header-references header)))
+                               (not (member (mail-header-message-id header)
+                                            gnus-nocem-seen-message-ids))))
+                      (gnus-nocem-check-article group header)))))))
        (setq gnus-nocem-active
              (cons (list group gactive)
                    (delq (assoc group gnus-nocem-active)
@@ -151,7 +167,7 @@ isn't bound, the message will be used unconditionally."
   (let ((date (mail-header-date header))
        issuer b e)
     (when (or (not date)
-             (nnmail-time-less 
+             (nnmail-time-less
               (nnmail-time-since (nnmail-date-to-time date))
               (nnmail-days-to-time gnus-nocem-expiry-wait)))
       (gnus-request-article-this-buffer (mail-header-number header) group)
@@ -168,10 +184,12 @@ isn't bound, the message will be used unconditionally."
        (narrow-to-region b e)
        (setq issuer (mail-fetch-field "issuer"))
        (widen)
-       (and (member issuer gnus-nocem-issuers) ; We like her...
-            (gnus-nocem-verify-issuer issuer) ; She is who she says she is..
-            (gnus-nocem-enter-article)))))) ; We gobble the message.
-  
+       (and (member issuer gnus-nocem-issuers) ; We like her....
+            (gnus-nocem-verify-issuer issuer) ; She is who she says she is...
+            (gnus-nocem-enter-article) ; We gobble the message..
+            (push (mail-header-message-id header) ; But don't come back for
+                  gnus-nocem-seen-message-ids)))))) ; second helpings.
+
 (defun gnus-nocem-verify-issuer (person)
   "Verify using PGP that the canceler is who she says she is."
   (if (fboundp gnus-nocem-verifyer)
@@ -190,38 +208,48 @@ isn't bound, the message will be used unconditionally."
       (narrow-to-region b (1+ (match-beginning 0)))
       (goto-char (point-min))
       (while (search-forward "\t" nil t)
-       (condition-case nil
-           (setq group (let ((obarray gnus-active-hashtb)) (read buf)))
-         (error nil))
-       (if (not (boundp group))
-           ;; Make sure all entries in the hashtb are bound.
-           (set group nil)
+       (cond
+        ((not (ignore-errors
+                (setq group (let ((obarray gnus-active-hashtb)) (read buf)))))
+         ;; An error.
+         )
+        ((not (symbolp group))
+         ;; Ignore invalid entries.
+         )
+        ((not (boundp group))
+         ;; Make sure all entries in the hashtb are bound.
+         (set group nil))
+        (t
          (when (gnus-gethash (symbol-name group) gnus-newsrc-hashtb)
            ;; Valid group.
            (beginning-of-line)
            (while (= (following-char) ?\t)
              (forward-line -1))
            (setq id (buffer-substring (point) (1- (search-forward "\t"))))
-           (push id ncm)
-           (gnus-sethash id t gnus-nocem-hashtb)
+           (unless (gnus-gethash id gnus-nocem-hashtb)
+             ;; only store if not already present
+             (gnus-sethash id t gnus-nocem-hashtb)
+             (push id ncm))
            (forward-line 1)
            (while (= (following-char) ?\t)
-             (forward-line 1)))))
+             (forward-line 1))))))
       (when ncm
        (setq gnus-nocem-touched-alist t)
        (push (cons (let ((time (current-time))) (setcdr (cdr time) nil) time)
                    ncm)
-             gnus-nocem-alist)))))
+             gnus-nocem-alist))
+      t)))
 
 (defun gnus-nocem-load-cache ()
   "Load the NoCeM cache."
+  (interactive)
   (unless gnus-nocem-alist
     ;; The buffer doesn't exist, so we create it and load the NoCeM
-    ;; cache.  
+    ;; cache.
     (when (file-exists-p (gnus-nocem-cache-file))
       (load (gnus-nocem-cache-file) t t t)
       (gnus-nocem-alist-to-hashtb))))
-      
+
 (defun gnus-nocem-save-cache ()
   "Save the NoCeM cache."
   (when (and gnus-nocem-alist
@@ -262,7 +290,8 @@ isn't bound, the message will be used unconditionally."
   (setq gnus-nocem-alist nil
        gnus-nocem-hashtb nil
        gnus-nocem-active nil
-       gnus-nocem-touched-alist nil))
+       gnus-nocem-touched-alist nil
+       gnus-nocem-seen-message-ids nil))
 
 (defun gnus-nocem-unwanted-article-p (id)
   "Say whether article ID in the current group is wanted."