1 ;;; riece-handle.el --- basic message handlers
2 ;; Copyright (C) 1998-2003 Daiki Ueno
4 ;; Author: Daiki Ueno <ueno@unixuser.org>
6 ;; Keywords: IRC, riece
8 ;; This file is part of Riece.
10 ;; This program is free software; you can redistribute it and/or modify
11 ;; it under the terms of the GNU General Public License as published by
12 ;; the Free Software Foundation; either version 2, or (at your option)
15 ;; This program is distributed in the hope that it will be useful,
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ;; GNU General Public License for more details.
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the
22 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
28 (require 'riece-message)
29 (require 'riece-channel)
30 (require 'riece-naming)
31 (require 'riece-signal)
39 (defun riece-default-handle-numeric-reply
40 (client-prefix prefix number name string)
42 (list riece-dialogue-buffer riece-others-buffer)
44 (riece-concat-server-name
45 (mapconcat #'identity (riece-split-parameters string) " "))
48 (defun riece-handle-nick-message (prefix string)
49 (let* ((old (riece-prefix-nickname prefix))
50 (new (car (riece-split-parameters string)))
51 (old-identity (riece-make-identity old riece-server-name))
52 (new-identity (riece-make-identity new riece-server-name))
53 (channels (riece-user-get-channels old))
54 (visible (riece-identity-member
56 (mapcar (lambda (channel)
57 (riece-make-identity channel riece-server-name))
59 (riece-naming-assert-rename old new)
60 (if (riece-identity-member old-identity riece-current-channels)
61 (setq channels (cons new channels)))
62 (riece-insert-change (mapcar
64 (riece-channel-buffer (riece-make-identity
65 channel riece-server-name)))
68 (riece-format-identity old-identity t)
69 (riece-format-identity new-identity t)))
70 (riece-insert-change (if visible
72 (list riece-dialogue-buffer riece-others-buffer))
74 (riece-concat-server-name
76 (riece-format-identity old-identity t)
77 (riece-format-identity new-identity t)))
80 (defun riece-handle-privmsg-message (prefix string)
81 (let* ((user (riece-prefix-nickname prefix))
82 (parameters (riece-split-parameters string))
83 (targets (split-string (car parameters) ","))
84 (message (nth 1 parameters)))
85 (riece-display-message
86 (riece-make-message (riece-make-identity user
88 (riece-make-identity (car targets)
91 (riece-identity-equal-no-server
92 user riece-real-nickname)))))
94 (defun riece-handle-notice-message (prefix string)
95 (let* ((user (if prefix
96 (riece-prefix-nickname prefix)))
97 (parameters (riece-split-parameters string))
98 (targets (split-string (car parameters) ","))
99 (message (nth 1 parameters)))
101 (riece-display-message
102 (riece-make-message (riece-make-identity user
104 (riece-make-identity (car targets)
107 (riece-identity-equal-no-server
108 user riece-real-nickname)))
109 ;; message from server
111 (list riece-dialogue-buffer riece-others-buffer)
112 (concat (riece-concat-server-name message) "\n")))))
114 (defun riece-handle-ping-message (prefix string)
115 (riece-send-string (format "PONG :%s\r\n"
116 (if (eq (aref string 0) ?:)
120 (defun riece-handle-join-message (prefix string)
121 (let* ((user (riece-prefix-nickname prefix))
122 ;; RFC2812 3.2.1 doesn't recommend server to send join
123 ;; messages which contain multiple targets.
124 (channels (split-string (car (riece-split-parameters string)) ","))
125 (user-identity (riece-make-identity user riece-server-name)))
127 (riece-naming-assert-join user (car channels))
128 (if (and riece-gather-channel-modes
129 (riece-identity-equal-no-server user riece-real-nickname))
130 (riece-send-string (format "MODE %s\r\n" (car channels))))
131 (let* ((channel-identity (riece-make-identity (car channels)
133 (buffer (riece-channel-buffer channel-identity)))
136 (format "%s (%s) has joined %s\n"
137 (riece-format-identity user-identity t)
138 (riece-user-get-user-at-host user)
139 (riece-format-identity channel-identity t)))
141 (if (and riece-channel-buffer-mode
142 (not (eq buffer riece-channel-buffer)))
143 (list riece-dialogue-buffer riece-others-buffer)
144 riece-dialogue-buffer)
146 (riece-concat-server-name
147 (format "%s (%s) has joined %s"
148 (riece-format-identity user-identity t)
149 (riece-user-get-user-at-host user)
150 (riece-format-identity channel-identity t)))
152 (setq channels (cdr channels)))))
154 (defun riece-handle-part-message (prefix string)
155 (let* ((user (riece-prefix-nickname prefix))
156 (parameters (riece-split-parameters string))
157 ;; RFC2812 3.2.2 doesn't recommend server to send part
158 ;; messages which contain multiple targets.
159 (channels (split-string (car parameters) ","))
160 (message (nth 1 parameters))
161 (user-identity (riece-make-identity user riece-server-name)))
163 (riece-naming-assert-part user (car channels))
164 (let* ((channel-identity (riece-make-identity (car channels)
166 (buffer (riece-channel-buffer channel-identity)))
170 (riece-concat-message
171 (format "%s has left %s"
172 (riece-format-identity user-identity t)
173 (riece-format-identity channel-identity t))
177 (if (and riece-channel-buffer-mode
178 (not (eq buffer riece-channel-buffer)))
179 (list riece-dialogue-buffer riece-others-buffer)
180 riece-dialogue-buffer)
182 (riece-concat-server-name
183 (riece-concat-message
184 (format "%s has left %s"
185 (riece-format-identity user-identity t)
186 (riece-format-identity channel-identity t))
189 (setq channels (cdr channels)))))
191 (defun riece-handle-kick-message (prefix string)
192 (let* ((kicker (riece-prefix-nickname prefix))
193 (parameters (riece-split-parameters string))
194 (channel (car parameters))
195 (user (nth 1 parameters))
196 (message (nth 2 parameters))
197 (kicker-identity (riece-make-identity kicker riece-server-name))
198 (channel-identity (riece-make-identity channel riece-server-name))
199 (user-identity (riece-make-identity user riece-server-name)))
200 (riece-naming-assert-part user channel)
201 (let ((buffer (riece-channel-buffer channel-identity)))
205 (riece-concat-message
206 (format "%s kicked %s out from %s"
207 (riece-format-identity kicker-identity t)
208 (riece-format-identity user-identity t)
209 (riece-format-identity channel-identity t))
213 (if (and riece-channel-buffer-mode
214 (not (eq buffer riece-channel-buffer)))
215 (list riece-dialogue-buffer riece-others-buffer)
216 riece-dialogue-buffer)
218 (riece-concat-server-name
219 (riece-concat-message
220 (format "%s kicked %s out from %s\n"
221 (riece-format-identity kicker-identity t)
222 (riece-format-identity user-identity t)
223 (riece-format-identity channel-identity t))
227 (defun riece-handle-quit-message (prefix string)
228 (let* ((user (riece-prefix-nickname prefix))
229 (channels (copy-sequence (riece-user-get-channels user)))
231 (parameters (riece-split-parameters string))
232 (message (car parameters))
233 (user-identity (riece-make-identity user riece-server-name)))
234 ;; If you are talking with the user, quit it.
235 (if (riece-identity-member user-identity riece-current-channels)
236 (riece-part-channel user))
237 (setq pointer channels)
239 (riece-naming-assert-part user (car pointer))
240 (setq pointer (cdr pointer)))
244 (riece-channel-buffer (riece-make-identity channel
250 (riece-concat-message
251 (format "%s has left IRC"
252 (riece-format-identity user-identity t))
256 (if (and riece-channel-buffer-mode
257 (not (memq riece-channel-buffer buffers)))
258 (list riece-dialogue-buffer riece-others-buffer)
259 riece-dialogue-buffer)
261 (riece-concat-server-name
262 (riece-concat-message
263 (format "%s has left IRC"
264 (riece-format-identity user-identity t))
268 (defun riece-handle-kill-message (prefix string)
269 (let* ((killer (riece-prefix-nickname prefix))
270 (parameters (riece-split-parameters string))
271 (user (car parameters))
272 (message (nth 1 parameters))
273 (channels (copy-sequence (riece-user-get-channels user)))
274 (killer-identity (riece-make-identity killer riece-server-name))
275 (user-identity (riece-make-identity user riece-server-name))
277 ;; If you are talking with the user, quit it.
278 (if (riece-identity-member user-identity riece-current-channels)
279 (riece-part-channel user))
280 (setq pointer channels)
282 (riece-naming-assert-part user (car pointer))
283 (setq pointer (cdr pointer)))
287 (riece-channel-buffer (riece-make-identity channel
293 (riece-concat-message
294 (format "%s killed %s"
295 (riece-format-identity killer-identity t)
296 (riece-format-identity user-identity t))
300 (if (and riece-channel-buffer-mode
301 (not (memq riece-channel-buffer buffers)))
302 (list riece-dialogue-buffer riece-others-buffer)
303 riece-dialogue-buffer)
305 (riece-concat-server-name
306 (riece-concat-message
307 (format "%s killed %s"
308 (riece-format-identity killer-identity t)
309 (riece-format-identity user-identity t))
313 (defun riece-handle-invite-message (prefix string)
314 (let* ((user (riece-prefix-nickname prefix))
315 (parameters (riece-split-parameters string))
316 (invited (car parameters))
317 (channel (nth 1 parameters))
318 (channel-identity (riece-make-identity channel riece-server-name)))
319 (if (riece-identity-equal-no-server invited riece-real-nickname)
320 (setq riece-join-channel-candidate channel-identity))
322 (list riece-dialogue-buffer riece-others-buffer)
324 (riece-concat-server-name
325 (format "%s invites %s to %s"
326 (riece-format-identity (riece-make-identity
327 user riece-server-name))
328 (riece-format-identity (riece-make-identity
329 invited riece-server-name))
330 (riece-format-identity channel-identity)))
333 (defun riece-handle-topic-message (prefix string)
334 (let* ((user (riece-prefix-nickname prefix))
335 (parameters (riece-split-parameters string))
336 (channel (car parameters))
337 (topic (nth 1 parameters))
338 (user-identity (riece-make-identity user riece-server-name))
339 (channel-identity (riece-make-identity channel riece-server-name)))
340 (riece-channel-set-topic (riece-get-channel channel) topic)
341 (riece-emit-signal 'channel-topic-changed
342 channel-identity topic)
343 (let ((buffer (riece-channel-buffer channel-identity)))
346 (format "Topic by %s: %s\n"
347 (riece-format-identity user-identity t)
350 (if (and riece-channel-buffer-mode
351 (not (eq buffer riece-channel-buffer)))
352 (list riece-dialogue-buffer riece-others-buffer)
353 riece-dialogue-buffer)
355 (riece-concat-server-name
356 (format "Topic on %s by %s: %s"
357 (riece-format-identity channel-identity t)
358 (riece-format-identity user-identity t)
362 (defun riece-handle-mode-message (prefix string)
363 (let* ((user (riece-prefix-nickname prefix))
364 (user-identity (riece-make-identity user riece-server-name))
366 (when (string-match "^\\([^ ]+\\) *:?" string)
367 (setq channel (match-string 1 string)
368 string (substring string (match-end 0)))
369 (if (string-match (concat "^" riece-channel-regexp "$") channel)
370 (riece-naming-assert-channel-modes channel
371 (riece-parse-modes string)))
372 (let* ((channel-identity (riece-make-identity channel riece-server-name))
373 (buffer (riece-channel-buffer channel-identity)))
376 (format "Mode by %s: %s\n"
377 (riece-format-identity user-identity t)
380 (if (and riece-channel-buffer-mode
381 (not (eq buffer riece-channel-buffer)))
382 (list riece-dialogue-buffer riece-others-buffer)
383 riece-dialogue-buffer)
385 (riece-concat-server-name
386 (format "Mode on %s by %s: %s"
387 (riece-format-identity channel-identity t)
388 (riece-format-identity user-identity t)
392 (provide 'riece-handle)
394 ;;; riece-handle.el ends here