Synch to No Gnus 200502120211.
[elisp/gnus.git-] / lisp / spam-report.el
index b4ed75b..dcd9557 100644 (file)
@@ -43,7 +43,7 @@ If you are using spam.el, consider setting gnus-spam-process-newsgroups
 or the gnus-group-spam-exit-processor-report-gmane group/topic parameter
 instead."
   :type '(radio (const nil)
-               (regexp :format "%t: %v\n" :size 0 :value "^nntp\+.*:gmane\."))
+               (regexp :value "^nntp\+.*:gmane\."))
   :group 'spam-report)
 
 (defcustom spam-report-gmane-spam-header
@@ -79,18 +79,59 @@ The function must accept the arguments `host' and `report'."
   :type 'file
   :group 'spam-report)
 
+(defcustom spam-report-resend-to nil
+  "Email address that spam articles are resent to when reporting.
+If not set, the user will be prompted to enter a value which will be
+saved for future use."
+  :type 'string
+  :group 'spam-report)
+
+(defvar spam-report-url-ping-temp-agent-function nil
+  "Internal variable for `spam-report-agentize' and `spam-report-deagentize'.
+This variable will store the value of `spam-report-url-ping-function' from
+before `spam-report-agentize' was run, so that `spam-report-deagentize' can
+undo that change.")
+
+(defun spam-report-resend (articles &optional ham)
+  "Report an article as spam by resending via email.
+Reports is as ham when HAM is set."
+  (dolist (article articles)
+    (gnus-message 6 
+                 "Reporting %s article %d to <%s>..."
+                 (if ham "ham" "spam")
+                 article spam-report-resend-to)
+    (unless spam-report-resend-to
+      (customize-set-variable 
+       spam-report-resend-to
+       (read-from-minibuffer "email address to resend SPAM/HAM to? ")))
+    ;; This is ganked from the `gnus-summary-resend-message' function.
+    ;; It involves rendering the SPAM, which is undesirable, but there does
+    ;; not seem to be a nicer way to achieve this.
+    ;; select this particular article
+    (gnus-summary-select-article nil nil nil article)
+    ;; resend it to the destination address
+    (save-excursion
+      (set-buffer gnus-original-article-buffer)
+      (message-resend spam-report-resend-to))))
+
+(defun spam-report-resend-ham (articles)
+  "Report an article as ham by resending via email."
+  (spam-report-resend articles t))
+
 (defun spam-report-gmane (&rest articles)
-  "Report an article as spam through Gmane"
+  "Report an article as spam through Gmane."
+  (interactive (gnus-summary-work-articles current-prefix-arg))
   (dolist (article articles)
     (when (and gnus-newsgroup-name
               (or (null spam-report-gmane-regex)
                   (string-match spam-report-gmane-regex gnus-newsgroup-name)))
       (gnus-message 6 "Reporting spam article %d to spam.gmane.org..." article)
       (if spam-report-gmane-use-article-number
-         (spam-report-url-ping "spam.gmane.org"
-                               (format "/%s:%d"
-                                       (gnus-group-real-name gnus-newsgroup-name)
-                                       article))
+         (spam-report-url-ping 
+          "spam.gmane.org"
+          (format "/%s:%d"
+                  (gnus-group-real-name gnus-newsgroup-name)
+                  article))
        (with-current-buffer nntp-server-buffer
          (gnus-request-head article gnus-newsgroup-name)
          (goto-char (point-min))
@@ -103,6 +144,7 @@ The function must accept the arguments `host' and `report'."
            (gnus-message 3 "Could not find X-Report-Spam in article %d..."
                          article)))))))
 
+
 (defun spam-report-url-ping (host report)
   "Ping a host through HTTP, addressing a specific GET resource using
 the function specified by `spam-report-url-ping-function'."
@@ -125,24 +167,25 @@ the function specified by `spam-report-url-ping-function'."
        (format "GET %s HTTP/1.1\nUser-Agent: %s (spam-report.el)\nHost: %s\n\n"
               report (gnus-emacs-version) host)))))
 
+;;;###autoload
 (defun spam-report-process-queue (&optional file keep)
   "Report all queued requests from `spam-report-requests-file'.
 
-If KEEP is t, leave old requests in the file.  If KEEP is
-the symbol `ask', query before flushing the queue file."
+If FILE is given, use it instead of `spam-report-requests-file'.
+If KEEP is t, leave old requests in the file.  If KEEP is the
+symbol `ask', query before flushing the queue file."
   (interactive
    (list (read-file-name
          "File: "
          (file-name-directory spam-report-requests-file)
          spam-report-requests-file
          nil
-         (file-name-nondirectory spam-report-requests-file)
-         spam-report-requests-file)
+         (file-name-nondirectory spam-report-requests-file))
         current-prefix-arg))
   (if (eq spam-report-url-ping-function 'spam-report-url-to-file)
       (error (concat "Cannot process requests when "
                     "`spam-report-url-ping-function' is "
-                    "`spam-report-url-to-file'"))
+                    "`spam-report-url-to-file'."))
     (gnus-message 7 "Processing requests using `%s'."
                  spam-report-url-ping-function))
   (or file (setq file spam-report-requests-file))
@@ -167,6 +210,7 @@ the symbol `ask', query before flushing the queue file."
          (kill-buffer (current-buffer)))
       (gnus-message 7 "Keeping requests in `%s'" spam-report-requests-file))))
 
+;;;###autoload
 (defun spam-report-url-ping-mm-url (host report)
   "Ping a host through HTTP, addressing a specific GET resource. Use
 the external program specified in `mm-url-program' to connect to
@@ -175,6 +219,7 @@ server."
     (let ((url (concat "http://" host report)))
       (mm-url-insert url t))))
 
+;;;###autoload
 (defun spam-report-url-to-file (host report)
   "Collect spam report requests in `spam-report-requests-file'.
 Customize `spam-report-url-ping-function' to use this function."
@@ -187,6 +232,48 @@ Customize `spam-report-url-ping-function' to use this function."
       (newline)
       (append-to-file (point-min) (point-max) file))))
 
+;;;###autoload
+(defun spam-report-agentize ()
+  "Add spam-report support to the Agent.
+Spam reports will be queued with \\[spam-report-url-to-file] when
+the Agent is unplugged, and will be submitted in a batch when the
+Agent is plugged."
+  (interactive)
+  (add-hook 'gnus-agent-plugged-hook 'spam-report-plug-agent)
+  (add-hook 'gnus-agent-unplugged-hook 'spam-report-unplug-agent))
+
+;;;###autoload
+(defun spam-report-deagentize ()
+  "Remove spam-report support from the Agent.
+Spam reports will be queued with the method used when
+\\[spam-report-agentize] was run."
+  (interactive)
+  (remove-hook 'gnus-agent-plugged-hook 'spam-report-plug-agent)
+  (remove-hook 'gnus-agent-unplugged-hook 'spam-report-unplug-agent))
+
+(defun spam-report-plug-agent ()
+  "Adjust spam report settings for plugged state.
+Process queued spam reports."
+  ;; Process the queue, unless the user only wanted to report to a file
+  ;; anyway.
+  (unless (equal spam-report-url-ping-temp-agent-function
+                'spam-report-url-to-file)
+    (spam-report-process-queue))
+  ;; Set the reporting function, if we have memorized something otherwise,
+  ;; stick with plain URL reporting.
+  (setq spam-report-url-ping-function
+       (or spam-report-url-ping-temp-agent-function
+           'spam-report-url-ping-plain)))
+
+(defun spam-report-unplug-agent ()
+  "Restore spam report settings for unplugged state."
+  ;; save the old value
+  (setq spam-report-url-ping-temp-agent-function
+       spam-report-url-ping-function)
+  ;; store all reports to file
+  (setq spam-report-url-ping-function
+       'spam-report-url-to-file))
+
 (provide 'spam-report)
 
 ;;; spam-report.el ends here.