source: tags/pre_mode_tracking/event.lisp

Last change on this file was 85, checked in by Erik Huelsmann, 19 years ago

Don't set 'user' and 'hostname' fields on users created in RPL_NAMREPLY,
since we simply Don't Know.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.7 KB
Line 
1;;;; $Id: event.lisp 85 2005-03-20 11:41:30Z ehuelsmann $
2;;;; $Source$
3
4;;;; See LICENSE for licensing information.
5
6(in-package :irc)
7
8(defgeneric irc-message-event (message)
9  (:documentation "Upon receipt of an IRC message from the
10connection's stream, irc-message-event will be called with the
11message."))
12
13(defmethod irc-message-event ((message irc-message))
14  (apply-to-hooks message)
15  (client-log (connection message) message "UNHANDLED-EVENT:"))
16
17
18(defgeneric default-hook (message)
19  (:documentation "Minimum action to be executed upon reception
20of the IRC message to keep the connection, channel and user
21objects in sync."))
22
23(defmethod default-hook ((message irc-rpl_isupport-message))
24  (let* ((capabilities (cdr (arguments message)))
25         (connection (connection message))
26         (current-case-mapping (case-map-name connection)))
27    (setf (server-capabilities connection)
28          (let ((new-values (mapcar #'(lambda (x)
29                                        (let ((eq-pos (position #\= x)))
30                                          (if eq-pos
31                                              (list (subseq x 0 eq-pos)
32                                                    (subseq x (1+ eq-pos)))
33                                            (list x)))) capabilities)))
34            (mapcar #'(lambda (x)
35                        (or (assoc x new-values :test #'string=)
36                            (assoc x *default-isupport-values*
37                                   :test #'string=)))
38                    (remove-duplicates
39                     (mapcar #'first (append new-values
40                                             *default-isupport-values*))
41                             :test #'string=))))
42
43    (when (not (equal current-case-mapping
44                      (case-map-name connection)))
45      ;; we need to re-normalize nicks and channel names
46      (re-apply-case-mapping connection))))
47
48(defmethod default-hook ((message irc-rpl_whoisuser-message))
49  (let ((user (find-user (connection message)
50                         (second (arguments message))))
51        (realname (trailing-argument message))
52        (username (third (arguments message)))
53        (hostname (fourth (arguments message))))
54    (when user
55      (setf (realname user) realname)
56      (setf (username user) username)
57      (setf (hostname user) hostname))))
58
59(defmethod default-hook ((message irc-rpl_list-message))
60  (let ((connection (connection message))
61        (channel (second (arguments message)))
62        (user-count (parse-integer (or (third (arguments message)) "0")))
63        (topic (trailing-argument message)))
64    (add-channel connection (or (find-channel connection channel)
65                                (make-channel connection
66                                              :name channel
67                                              :topic topic
68                                              :user-count user-count)))))
69
70(defmethod default-hook ((message irc-rpl_topic-message))
71  (setf (topic (find-channel (connection message)
72                             (second (arguments message))))
73        (trailing-argument message)))
74
75(defmethod default-hook ((message irc-rpl_namreply-message))
76  (let* ((connection (connection message))
77         (channel (find-channel connection (car (last (arguments message))))))
78    (dolist (nickname (tokenize-string (trailing-argument message)))
79      (let ((user (find-or-make-user connection
80                                     (canonicalize-nickname connection
81                                                            nickname))))
82        (unless (equal user (user connection))
83          (add-user connection user)
84          (add-user channel user))))))
85
86(defmethod default-hook ((message irc-ping-message))
87  (pong (connection message) (trailing-argument message)))
88
89(defmethod default-hook ((message irc-join-message))
90  (let* ((connection (connection message))
91         (user (find-or-make-user
92                (connection message)
93                (source message)
94                :hostname (host message)
95                :username (user message)))
96         (channel (or (find-channel connection (trailing-argument message))
97                      (make-channel connection
98                                    :name (trailing-argument message)))))
99    (if (self-message-p message)
100        (add-channel connection channel)
101        (progn
102          (add-user connection user)
103          (add-user channel user)))))
104
105(defmethod default-hook ((message irc-topic-message))
106  (setf (topic (find-channel (connection message)
107                             (first (arguments message))))
108        (trailing-argument message)))
109
110(defmethod default-hook ((message irc-part-message))
111  (let* ((connection (connection message))
112         (channel (find-channel connection (first (arguments message))))
113         (user (find-user connection (source message))))
114    (if (self-message-p message)
115        (remove-channel user channel)
116        (remove-user channel user))))
117
118(defmethod default-hook ((message irc-quit-message))
119  (let ((connection (connection message)))
120    (remove-user-everywhere connection (find-user connection (source message)))))
121
122(defmethod default-hook ((message irc-nick-message))
123  (let ((con (connection message)))
124    (change-nickname con (find-user con (source message))
125                     (trailing-argument message))))
126
127(defmethod default-hook ((message irc-kick-message))
128  (let* ((connection (connection message))
129         (channel (find-channel connection (first (arguments message))))
130         (user (find-user connection (second (arguments message)))))
131    (if (self-message-p message)
132        (remove-channel user channel)
133        (remove-user channel user))))
134
135(defmethod default-hook ((message ctcp-time-message))
136  (multiple-value-bind (second minute hour date month year day) (get-decoded-time)
137    (send-irc-message
138     (connection message)
139     :notice (make-ctcp-message
140              (format nil "TIME ~A"
141                      (make-time-message second minute hour date month year day)))
142     (source message))))
143
144(defmethod default-hook ((message ctcp-source-message))
145  (send-irc-message
146   (connection message)
147   :notice (make-ctcp-message
148            (format nil "SOURCE ~A:~A:~A"
149                    *download-host*
150                    *download-directory*
151                    *download-file*))
152   (source message)))
153
154(defmethod default-hook ((message ctcp-finger-message))
155  (let* ((user (user (connection message)))
156         (finger-info (if (not (zerop (length (realname user))))
157                          (realname user)
158                          (nickname user))))
159    (send-irc-message
160     (connection message)
161     :notice (make-ctcp-message
162              (format nil "FINGER ~A" finger-info))
163     (source message))))
164
165(defmethod default-hook ((message ctcp-version-message))
166  (send-irc-message
167   (connection message)
168   :notice (make-ctcp-message
169            (format nil "VERSION ~A" *ctcp-version*))
170   (source message)))
171
172(defmethod default-hook ((message ctcp-ping-message))
173  (send-irc-message
174   (connection message)
175   :notice (make-ctcp-message
176            (format nil "PING ~A" (trailing-argument message)))
177   (source message)))
178
179(defmethod irc-message-event ((message ctcp-dcc-chat-request-message))
180  (apply-to-hooks message)
181  (client-log (connection message) message))
182;  (when (automatically-accept-dcc-connections (configuration (connection message)))
183;    (let* ((user (find-user (connection message) (source message)))
184;           (args (tokenize-string (trailing-argument message)))
185;           (remote-address (hbo-to-vector-quad (parse-integer (fourth args))))
186;           (remote-port (parse-integer (fifth args) :junk-allowed t)))
187;      (push (make-dcc-connection :user user
188;                                 :remote-address remote-address
189;                                 :remote-port remote-port)
190;            *dcc-connections*))))
191 
192(defmethod irc-message-event ((message ctcp-dcc-send-request-message))
193  (apply-to-hooks message)
194  (client-log (connection message) message))
195;  (when (automatically-accept-dcc-downloads (configuration (connection message)))
196;    (let* ((user (find-user (connection message) (source message)))
197;           (args (tokenize-string (trailing-argument message)))
198;           (filename (third args))
199;           (remote-address (hbo-to-vector-quad (parse-integer (fourth args))))
200;           (remote-port (parse-integer (fifth args)))
201;           (filesize (parse-integer (sixth args) :junk-allowed t)))
202;      (let ((dcc-connection (make-dcc-connection :user user
203;                                                 :remote-address remote-address
204;                                                 :remote-port remote-port)))
205;      (with-open-file (stream filename :direction :output
206;                              :if-exists :supersede)
207;        (write-sequence (read-message-loop dcc-connection) stream))))))
208 
Note: See TracBrowser for help on using the repository browser.