diff lisp/gnus/spam-report.el @ 61822:de8a95c880bd

Revision: miles@gnu.org--gnu-2005/emacs--cvs-trunk--0--patch-277 Merge from gnus--rel--5.10 Patches applied: * gnus--rel--5.10 (patch 67) - Update from CVS 2005-04-24 Teodor Zlatanov <tzz@lifelogs.com> * lisp/gnus/spam-report.el (spam-report-unplug-agent) (spam-report-plug-agent, spam-report-deagentize) (spam-report-agentize, spam-report-url-ping-temp-agent-function): support for the Agent in spam-report: when unplugged, report to a file; when plugged, submit all the requests. [Added missing offline functionality from trunk.] 2005-04-24 Reiner Steib <Reiner.Steib@gmx.de> * lisp/gnus/spam-report.el (spam-report-url-to-file) (spam-report-requests-file): New function and variable for offline reporting. (spam-report-url-ping-function): Add `spam-report-url-to-file' and user defined function. (spam-report-process-queue): New function. Process requests from `spam-report-requests-file'. (spam-report-url-ping-mm-url): Autoload. [Added missing offline functionality from trunk.]
author Miles Bader <miles@gnu.org>
date Mon, 25 Apr 2005 04:36:12 +0000
parents 9bdd97960431
children 9f49da4a429d
line wrap: on
line diff
--- a/lisp/gnus/spam-report.el	Mon Apr 25 04:30:38 2005 +0000
+++ b/lisp/gnus/spam-report.el	Mon Apr 25 04:36:12 2005 +0000
@@ -59,14 +59,32 @@
 
 (defcustom spam-report-url-ping-function
   'spam-report-url-ping-plain
-  "Function to use for url ping spam reporting."
+  "Function to use for url ping spam reporting.
+The function must accept the arguments `host' and `report'."
   :type '(choice
 	  (const :tag "Connect directly"
 		 spam-report-url-ping-plain)
 	  (const :tag "Use the external program specified in `mm-url-program'"
-		 spam-report-url-ping-mm-url))
+		 spam-report-url-ping-mm-url)
+	  (const :tag "Store request URLs in `spam-report-requests-file'"
+		 spam-report-url-to-file)
+	  (function :tag "User defined function" nil))
   :group 'spam-report)
 
+(defcustom spam-report-requests-file
+  (nnheader-concat gnus-directory "spam/" "spam-report-requests.url")
+  ;; Is there a convention for the extension of such a file?
+  ;; Should we use `spam-directory'?
+  "File where spam report request are stored."
+  :type 'file
+  :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-gmane (&rest articles)
   "Report an article as spam through Gmane"
   (dolist (article articles)
@@ -75,10 +93,11 @@
 		   (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))
@@ -113,14 +132,113 @@
        (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 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))
+	 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'."))
+    (gnus-message 7 "Processing requests using `%s'."
+		  spam-report-url-ping-function))
+  (or file (setq file spam-report-requests-file))
+  (save-excursion
+    (set-buffer (find-file-noselect file))
+    (goto-char (point-min))
+    (while (and (not (eobp))
+		(re-search-forward
+		 "http://\\([^/]+\\)\\(/.*\\) *$" (point-at-eol) t))
+      (funcall spam-report-url-ping-function (match-string 1) (match-string 2))
+      (forward-line 1))
+    (if (or (eq keep nil)
+	    (and (eq keep 'ask)
+		 (y-or-n-p
+		  (format
+		   "Flush requests from `%s'? " (current-buffer)))))
+	(progn
+	  (gnus-message 7 "Flushing request file `%s'"
+			spam-report-requests-file)
+	  (erase-buffer)
+	  (save-buffer)
+	  (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
 server."
   (with-temp-buffer
-    (let ((url (concat "http://" host "/" report)))
+    (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."
+  (let ((url (concat "http://" host report))
+	(file spam-report-requests-file))
+    (gnus-make-directory (file-name-directory file))
+    (gnus-message 9 "Writing URL `%s' to file `%s'" url file)
+    (with-temp-buffer
+      (insert url)
+      (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)
 
 ;;; arch-tag: f6683295-ec89-4ab5-8803-8cc842293022