;;;   -*- lisp -*-
;;; 
;;;  ----------------------------------------------------------------------
;;;  Handle global kill ctcp messages
;;;  ----------------------------------------------------------------------
;;;  Created      : Mon Mar 10 17:07:39 1997 tri
;;;  Last modified: Fri Mar 14 00:41:25 1997 tri
;;;
;;;  Copyright © 1997
;;;                         Timo J. Rinne
;;;                         Janne Liimatainen
;;;
;;;                         All rights reserved
;;;
(require 'irchat)
(provide 'irchat-global-kills)

(defvar irchat-global-kill-valid-senders '()
  "String list containing valid KILL senders.  Eg. '(\".*@.*\\.fi\")")

;;(setq irchat-global-kill-valid-senders (list ".*@.*\\.fi"))

(defun irchat-ctl-a-kill-msg-hook (from rest)
  (if (and (stringp rest)
	   (string-match "^\\(.+\\) \\([0-9][0-9]?\\) \\(.+\\)" rest))
      (let ((nick (matching-substring rest 1))
	    (timeout (string-to-int (matching-substring rest 2)))
	    (reason (matching-substring rest 3))
	    (valid-sender (> (length (mapconcat
				      (function
				       (lambda (uah)
					 (if (string-match uah
							   irchat-userathost)
					     "t")))
				      irchat-global-kill-valid-senders ""))
				     0)))
	(if (and (not (assoc-ci-string nick irchat-kill-nickname))
		 (string= nick (regexp-quote nick)))
	    (if valid-sender
		(progn
		  (irchat-w-insert irchat-D-buffer
				   (format 
				    "*** %s: Ignoring %s for %d minutes (%s)\n"
				    from nick timeout reason))
		  (irchat-Command-kill nick timeout))
	      (message (format "Rejected KILL from %s <%s> (%s, %d, %s)." 
			       from irchat-userathost nick timeout reason))))))
  t)

(defun irchat-Command-global-kill (nickname timeout reason)
  (interactive (let ((nickname-var nil)
		     (timeout 0)
		     (reason ""))
		 (setq nickname
		       (completing-read "Global ignore nickname: "
					irchat-nick-alist
					'(lambda (s) t) nil nil))
		 (if (not (string= "" nickname))
		     (progn
		       (while (not (and (> timeout 0)
					(< timeout 100)))
			 (setq timeout
			       (string-to-int
				(read-from-minibuffer "Timeout [1-99]: "))))
		       (setq reason (read-from-minibuffer "Reason: "))))
		 (list nickname timeout reason)))
  (if (not (string= "" nickname))
      (let* ((k1 (format "%s-kill" irchat-current-channel))
	     (k2 irchat-current-channel)
	     (key (if (assoc-ci-string k1 irchat-default-idea-key-list)
		      k1
		    (if (assoc-ci-string k2 irchat-default-idea-key-list)
			k2
		      nil))))
	(if (null key)
	    (irchat-w-insert irchat-D-buffer
			     (format 
			      "*** error: no default key (%s or %s) set\n"
			      k1 k2))
	  (let ((msg (irchat-encrypt-message
		      (format "KILL %s %d %s" nickname timeout reason)
		      key t)))
	    ; Remove it from ignore list, if it's there.
	    (let ((elem (assoc-ci-string nickname irchat-kill-nickname)))
	      (if elem
		  (setq irchat-kill-nickname
			(remassoc (car elem) irchat-kill-nickname))))
	    ; Ignore
	    (irchat-Command-kill nickname timeout)
	    ; Send ctcp
	    (irchat-send "PRIVMSG %s :%s" irchat-current-channel msg))))))


(setq irchat-ctl-a-kill-msg-hook (function irchat-ctl-a-kill-msg-hook))

;;; eof
