iii.lisp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. ;;;; iii.lisp
  2. (in-package #:iii-impl)
  3. (defvar *connection*)
  4. (defvar *connections*)
  5. (defvar *channel*)
  6. (defvar *logging-stream* t)
  7. (defclass iii-connection (irc:connection) ())
  8. (defun log-hook (message)
  9. (irc:client-log *connection* message)
  10. t)
  11. (defmethod irc:add-default-hooks ((connection iii-connection))
  12. (call-next-method)
  13. (dolist (message '(irc:irc-rpl_isupport-message
  14. irc:irc-rpl_whoisuser-message
  15. irc:irc-rpl_banlist-message
  16. irc:irc-rpl_endofbanlist-message
  17. irc:irc-rpl_exceptlist-message
  18. irc:irc-rpl_endofexceptlist-message
  19. irc:irc-rpl_invitelist-message
  20. irc:irc-rpl_endofinvitelist-message
  21. irc:irc-rpl_list-message
  22. irc:irc-rpl_topic-message
  23. irc:irc-rpl_namreply-message
  24. irc:irc-rpl_endofnames-message
  25. irc:irc-rpl_welcome-message
  26. ; irc:irc-ping-message
  27. irc:irc-join-message
  28. irc:irc-topic-message
  29. irc:irc-part-message
  30. irc:irc-quit-message
  31. irc:irc-kick-message
  32. irc:irc-nick-message
  33. irc:irc-mode-message
  34. irc:irc-rpl_channelmodeis-message
  35. irc:ctcp-time-message
  36. irc:ctcp-source-message
  37. irc:ctcp-finger-message
  38. irc:ctcp-version-message
  39. irc:ctcp-ping-message
  40. irc:irc-privmsg-message
  41. ))
  42. (irc:add-hook connection message 'log-hook)))
  43. (defmethod irc:privmsg ((connection iii-connection) (target string) message)
  44. (irc:irc-message-event *connection* (make-instance 'irc:irc-privmsg-message
  45. :source (irc:nickname (irc:user *connection*))
  46. :command :privmsg
  47. :connection *connection*
  48. :arguments (list target message)
  49. :received-time (get-universal-time)))
  50. (call-next-method))
  51. (defun setup-irc (&key nickname username realname password server (logging-stream *logging-stream*))
  52. (when *connection*
  53. (ignore-errors (close (irc:network-stream *connection*))))
  54. (setf *connection* (irc:connect :connection-type 'iii-connection
  55. :nickname nickname
  56. :server server
  57. :logging-stream logging-stream
  58. :username username
  59. :realname realname
  60. :password password))
  61. (push *connection* *connections*)
  62. (bt:make-thread (lambda () (irc:read-message-loop *connection*)) :name "irc"))
  63. (defparameter *part-reason* nil)
  64. (defparameter *quit-message* nil)
  65. (defun privmsg (message &key (channel *channel*) (connection *connection*))
  66. (irc:privmsg connection channel message))
  67. (defun join (channel &key (connection *connection*) password)
  68. (irc:join connection channel :password password))
  69. (defun part (channel &key (connection *connection*) (reason *part-reason*))
  70. (irc:part connection channel reason))
  71. (defun quit (&key (connection *connection*) (message *quit-message*))
  72. (irc:quit connection message))