123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- (require 'erc-dcc)
- (defcustom erc-xdcc-files nil
- "*List of files to offer via XDCC.
- Your friends should issue \"/ctcp yournick XDCC list\" to see this."
- :group 'erc-dcc
- :type '(repeat file))
- (defcustom erc-xdcc-verbose-flag t
- "*Report XDCC CTCP requests in the server buffer."
- :group 'erc-dcc
- :type 'boolean)
- (defcustom erc-xdcc-handler-alist
- '(("help" . erc-xdcc-help)
- ("list" . erc-xdcc-list)
- ("send" . erc-xdcc-send))
- "*Sub-command handler alist for XDCC CTCP queries."
- :group 'erc-dcc
- :type '(alist :key-type (string :tag "Sub-command") :value-type function))
- (defcustom erc-xdcc-help-text
- '(("Hey " nick ", wondering how this works? Pretty easy.")
- ("Available commands: XDCC ["
- (mapconcat 'car erc-xdcc-handler-alist "|") "]")
- ("Type \"/ctcp " (erc-current-nick)
- " XDCC list\" to see the list of offered files, then type \"/ctcp "
- (erc-current-nick) " XDCC send #\" to get a particular file number."))
- "*Help text sent in response to XDCC help command.
- A list of messages, each consisting of strings and expressions, expressions
- being evaluated and should return strings."
- :group 'erc-dcc
- :type '(repeat (repeat :tag "Message" (choice string sexp))))
- (define-erc-module xdcc nil
- "Act as an XDCC file-server."
- nil nil)
- (defun erc-xdcc-add-file (file)
- "Add a file to `erc-xdcc-files'."
- (interactive "fFilename to add to XDCC: ")
- (if (file-exists-p file)
- (add-to-list 'erc-xdcc-files file)))
- (defun erc-xdcc-reply (proc nick msg)
- (process-send-string proc
- (format "PRIVMSG %s :%s\n" nick msg)))
- (defvar erc-ctcp-query-XDCC-hook '(erc-xdcc)
- "Hook called whenever a CTCP XDCC message is received.")
- (defun erc-xdcc (proc nick login host to query)
- "Handle incoming CTCP XDCC queries."
- (when erc-xdcc-verbose-flag
- (erc-display-message nil 'notice proc
- (format "XDCC %s (%s@%s) sends %S" nick login host query)))
- (let* ((args (cdr (delete "" (split-string query " "))))
- (handler (cdr (assoc (downcase (car args)) erc-xdcc-handler-alist))))
- (if (and handler (functionp handler))
- (funcall handler proc nick login host (cdr args))
- (erc-xdcc-reply
- proc nick
- (format "Unknown XDCC sub-command, try \"/ctcp %s XDCC help\""
- (erc-current-nick))))))
- (defun erc-xdcc-help (proc nick login host args)
- "Send basic help information to NICK."
- (mapc
- (lambda (msg)
- (erc-xdcc-reply proc nick
- (mapconcat (lambda (elt) (if (stringp elt) elt (eval elt))) msg "")))
- erc-xdcc-help-text))
- (defun erc-xdcc-list (proc nick login host args)
- "Show the contents of `erc-xdcc-files' via privmsg to NICK."
- (if (null erc-xdcc-files)
- (erc-xdcc-reply proc nick "No files offered, sorry")
- (erc-xdcc-reply proc nick "Num Filename")
- (erc-xdcc-reply proc nick "--- -------------")
- (let ((n 0))
- (dolist (file erc-xdcc-files)
- (erc-xdcc-reply proc nick
- (format "%02d. %s"
- (setq n (1+ n))
- (erc-dcc-file-to-name file)))))))
- (defun erc-xdcc-send (proc nick login host args)
- "Send a file to NICK."
- (let ((n (string-to-number (car args)))
- (len (length erc-xdcc-files)))
- (cond
- ((= len 0)
- (erc-xdcc-reply proc nick "No files offered, sorry"))
- ((or (< n 1) (> n len))
- (erc-xdcc-reply proc nick (format "%d out of range" n)))
- (t (erc-dcc-send-file nick (nth (1- n) erc-xdcc-files) proc)))))
- (provide 'erc-xdcc)
|