* riece-handle.el (riece-300): Require 'riece-000, 'riece-200,
[riece] / lisp / riece-handle.el
1 ;;; riece-handle.el --- basic message handlers
2 ;; Copyright (C) 1998-2003 Daiki Ueno
3
4 ;; Author: Daiki Ueno <ueno@unixuser.org>
5 ;; Created: 1998-09-28
6 ;; Keywords: IRC, riece
7
8 ;; This file is part of Riece.
9
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)
13 ;; any later version.
14
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.
19
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.
24
25 ;;; Code:
26
27 (require 'riece-misc)
28 (require 'riece-message)
29 (require 'riece-channel)
30 (require 'riece-naming)
31 (require 'riece-signal)
32 (require 'riece-mode)
33 (require 'riece-000)
34 (require 'riece-200)
35 (require 'riece-300)
36 (require 'riece-400)
37 (require 'riece-500)
38
39 (defun riece-default-handle-numeric-reply
40   (client-prefix prefix number name string)
41   (riece-insert
42    (list riece-dialogue-buffer riece-others-buffer)
43    (concat client-prefix
44            (riece-concat-server-name
45             (mapconcat #'identity (riece-split-parameters string) " "))
46            "\n")))
47
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
55                    riece-current-channel
56                    (mapcar (lambda (channel)
57                              (riece-make-identity channel riece-server-name))
58                            channels))))
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
63                           (lambda (channel)
64                             (riece-channel-buffer (riece-make-identity
65                                                    channel riece-server-name)))
66                           channels)
67                          (format "%s -> %s\n"
68                                  (riece-format-identity old-identity t)
69                                  (riece-format-identity new-identity t)))
70     (riece-insert-change (if visible
71                              riece-dialogue-buffer
72                            (list riece-dialogue-buffer riece-others-buffer))
73                          (concat
74                           (riece-concat-server-name
75                            (format "%s -> %s"
76                                  (riece-format-identity old-identity t)
77                                  (riece-format-identity new-identity t)))
78                           "\n"))))
79
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
87                                               riece-server-name)
88                          (riece-make-identity (car targets)
89                                               riece-server-name)
90                          message nil
91                          (riece-identity-equal-no-server
92                           user riece-real-nickname)))))
93
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)))
100     (if user
101         (riece-display-message
102          (riece-make-message (riece-make-identity user
103                                                   riece-server-name)
104                              (riece-make-identity (car targets)
105                                                   riece-server-name)
106                              message 'notice
107                              (riece-identity-equal-no-server
108                               user riece-real-nickname)))
109       ;; message from server
110       (riece-insert-notice
111        (list riece-dialogue-buffer riece-others-buffer)
112        (concat (riece-concat-server-name message) "\n")))))
113
114 (defun riece-handle-ping-message (prefix string)
115   (riece-send-string (format "PONG :%s\r\n"
116                              (if (eq (aref string 0) ?:)
117                                  (substring string 1)
118                                string))))
119
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)))
126     (while channels
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)
132                                                     riece-server-name))
133              (buffer (riece-channel-buffer channel-identity)))
134         (riece-insert-change
135          buffer
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)))
140         (riece-insert-change
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)
145          (concat
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)))
151           "\n")))
152       (setq channels (cdr channels)))))
153
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)))
162     (while channels
163       (riece-naming-assert-part user (car channels))
164       (let* ((channel-identity (riece-make-identity (car channels)
165                                                     riece-server-name))
166              (buffer (riece-channel-buffer channel-identity)))
167         (riece-insert-change
168          buffer
169          (concat
170           (riece-concat-message
171            (format "%s has left %s"
172                    (riece-format-identity user-identity t)
173                    (riece-format-identity channel-identity t))
174            message)
175           "\n"))
176         (riece-insert-change
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)
181          (concat
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))
187             message))
188           "\n")))
189       (setq channels (cdr channels)))))
190
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)))
202       (riece-insert-change
203        buffer
204        (concat
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))
210          message)
211         "\n"))
212       (riece-insert-change
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)
217        (concat
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))
224           message))
225         "\n")))))
226
227 (defun riece-handle-quit-message (prefix string)
228   (let* ((user (riece-prefix-nickname prefix))
229          (channels (copy-sequence (riece-user-get-channels user)))
230          (pointer channels)
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)
238     (while pointer
239       (riece-naming-assert-part user (car pointer))
240       (setq pointer (cdr pointer)))
241     (let ((buffers
242            (mapcar
243             (lambda (channel)
244               (riece-channel-buffer (riece-make-identity channel
245                                                          riece-server-name)))
246             channels)))
247       (riece-insert-change
248        buffers
249        (concat
250         (riece-concat-message
251          (format "%s has left IRC"
252                  (riece-format-identity user-identity t))
253          message)
254         "\n"))
255       (riece-insert-change
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)
260        (concat
261         (riece-concat-server-name
262          (riece-concat-message
263           (format "%s has left IRC"
264                   (riece-format-identity user-identity t))
265           message))
266         "\n")))))
267
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))
276          pointer)
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)
281     (while pointer
282       (riece-naming-assert-part user (car pointer))
283       (setq pointer (cdr pointer)))
284     (let ((buffers
285            (mapcar
286             (lambda (channel)
287               (riece-channel-buffer (riece-make-identity channel
288                                                          riece-server-name)))
289             channels)))
290       (riece-insert-change
291        buffers
292        (concat
293         (riece-concat-message
294          (format "%s killed %s"
295                  (riece-format-identity killer-identity t)
296                  (riece-format-identity user-identity t))
297          message)
298         "\n"))
299       (riece-insert-change
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)
304        (concat
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))
310           message))
311         "\n")))))
312
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))
321     (riece-insert-info
322      (list riece-dialogue-buffer riece-others-buffer)
323      (concat
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)))
331       "\n"))))
332
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)))
344       (riece-insert-change
345        buffer
346        (format "Topic by %s: %s\n"
347                (riece-format-identity user-identity t)
348                topic))
349       (riece-insert-change
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)
354        (concat
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)
359                  topic))
360         "\n")))))
361
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))
365          channel)
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)))
374         (riece-insert-change
375          buffer
376          (format "Mode by %s: %s\n"
377                  (riece-format-identity user-identity t)
378                  string))
379         (riece-insert-change
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)
384          (concat
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)
389                    string))
390           "\n"))))))
391
392 (provide 'riece-handle)
393
394 ;;; riece-handle.el ends here