3f9f0b50f5e10747058c60cbf5c7bd5f4cf133f1
[riece] / lisp / riece-300.el
1 ;;; riece-300.el --- handlers for 300 replies
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
29 (require 'riece-filter)                 ;riece-default-handle-message
30
31 (eval-when-compile
32   (autoload 'riece-default-handle-numeric-reply "riece-filter"))
33 (defun riece-handle-default-300-message (prefix number name string)
34   (riece-default-handle-numeric-reply
35    riece-info-prefix prefix number name string))
36
37 (defun riece-handle-302-message (prefix number name string)
38   "RPL_USERHOST \":*1<reply> *( \" \" <reply> )\""
39   (let ((replies (split-string (substring string 1) " ")))
40     (while replies
41       (if (string-match
42            (concat "^\\(" riece-user-regexp
43                    "\\)\\(\\*\\)?=\\([-+]\\)\\([^ ]+\\)")
44            (car replies))
45           (let ((user (match-string 1 (car replies)))
46                 (away (eq (match-string 3 (car replies)) ?-))
47                 (user-at-host (match-string 4 (car replies)))
48                 (operator (not (null (match-beginning 2)))))
49             (riece-user-toggle-away user away)
50             (riece-user-toggle-operator user operator)
51             (riece-insert-info
52              (list riece-dialogue-buffer riece-others-buffer)
53              (concat
54               (riece-concat-server-name
55                (format "%s is (%s) [%s, %s]"
56                        (riece-format-identity
57                         (riece-make-identity user riece-server-name)
58                         t)
59                        (riece-strip-user-at-host user-at-host)
60                        (if operator
61                            "operator"
62                          "not operator")
63                        (if away
64                            "away"
65                          "not away")))
66               "\n"))))
67       (setq replies (cdr replies)))
68   (riece-update-status-indicators)
69   (force-mode-line-update t)))
70
71 (defun riece-handle-303-message (prefix number name string)
72   (riece-insert-info
73    (list riece-dialogue-buffer riece-others-buffer)
74    (concat
75     (riece-concat-server-name
76      (concat "Online: "
77              (mapconcat
78               (lambda (user)
79                 (riece-format-identity
80                  (riece-make-identity user riece-server-name)
81                  t))
82               (split-string (substring string 1) " ")
83               "")))
84     "\n")))
85
86 (defun riece-handle-301-message (prefix number name string)
87   (if (string-match (concat "^\\(" riece-user-regexp "\\) :") string)
88       (let ((user (match-string 1 string))
89             (message (substring string (match-end 0))))
90         (riece-user-toggle-away user t)
91         (riece-insert-info
92          (list riece-dialogue-buffer riece-others-buffer)
93          (concat
94           (riece-concat-server-name
95            (format "%s is away: %s"
96                    (riece-format-identity
97                     (riece-make-identity user riece-server-name)
98                     t)
99                    message))
100           "\n"))))
101   (riece-update-status-indicators)
102   (force-mode-line-update t))
103
104 (defun riece-handle-305-message (prefix number name string)
105   (riece-user-toggle-away riece-real-nickname nil)
106   (riece-update-status-indicators)
107   (force-mode-line-update t))
108
109 (defun riece-handle-306-message (prefix number name string)
110   (riece-user-toggle-away riece-real-nickname t)
111   (riece-update-status-indicators)
112   (force-mode-line-update t))
113
114 (defun riece-handle-311-message (prefix number name string)
115   (if (string-match
116        (concat "^\\(" riece-user-regexp
117                "\\) \\([^ ]+\\) \\([^ ]+\\) \\* :")
118        string)
119       (let ((user (match-string 1 string))
120             (name (substring string (match-end 0)))
121             (user-at-host (concat (match-string 2 string) "@"
122                                   (match-string 3 string))))
123         (riece-insert-info
124          (list riece-dialogue-buffer riece-others-buffer)
125          (concat
126           (riece-concat-server-name
127            (format "%s is %s (%s)"
128                    (riece-format-identity
129                     (riece-make-identity user riece-server-name)
130                     t)
131                    name
132                    user-at-host))
133           "\n")))))
134
135 (defun riece-handle-312-message (prefix number name string)
136   (if (string-match
137        (concat "^\\(" riece-user-regexp "\\) \\([^ ]+\\) :")
138        string)
139       (riece-insert-info
140        (list riece-dialogue-buffer riece-others-buffer)
141        (concat
142         (riece-concat-server-name
143          (format "on via server %s: %s"
144                  riece-real-server-name
145                  (substring string (match-end 0))))
146         "\n"))))
147
148 (defun riece-handle-313-message (prefix number name string)
149   (if (string-match (concat "^" riece-user-regexp) string)
150       (let ((user (match-string 0 string)))
151         (riece-insert-info
152          (list riece-dialogue-buffer riece-others-buffer)
153          (concat
154           (riece-concat-server-name
155            (concat (riece-format-identity
156                     (riece-make-identity user riece-server-name)
157                     t)
158                    " is an IRC operator"))
159           "\n")))))
160
161 (defun riece-handle-317-message (prefix number name string)
162   (if (string-match
163        (concat "^\\(" riece-user-regexp "\\) \\([0-9]+\\) :")
164        string)
165       (let ((user (match-string 1 string))
166             (idle (match-string 2 string)))
167         (riece-insert-info
168          (list riece-dialogue-buffer riece-others-buffer)
169          (concat
170           (riece-concat-server-name
171            (format "%s is %s seconds idle"
172                    (riece-format-identity
173                     (riece-make-identity user riece-server-name)
174                     t)
175                    idle))
176           "\n")))))
177
178 (defun riece-handle-319-message (prefix number name string)
179   (if (string-match (concat "^\\(" riece-user-regexp "\\) :") string)
180       (let ((user (match-string 1 string))
181             (channels
182              (mapconcat
183               (lambda (channel)
184                 (if (string-match
185                      (concat "^\\([@+]?\\)\\(" riece-channel-regexp "\\)")
186                      channel)
187                     (concat
188                      (match-string 1 channel)
189                      (riece-format-identity
190                       (riece-make-identity (match-string 2 channel)
191                                            riece-server-name)
192                       t))))
193               (split-string (substring string (match-end 0)) " ")
194               " ")))
195         (riece-insert-info
196          (list riece-dialogue-buffer riece-others-buffer)
197          (concat
198           (riece-concat-server-name
199            (format "%s: %s"
200                    (riece-format-identity
201                     (riece-make-identity user riece-server-name)
202                     t)
203                    channels))
204           "\n")))))
205
206 (defun riece-handle-351-message (prefix number name string)
207   (if (string-match "\\([^ ]+\\.[^ ]+\\) \\([^ ]+\\) :" string)
208       (riece-insert-info
209        (list riece-dialogue-buffer riece-others-buffer)
210        (concat
211         (riece-concat-server-name
212          (format "%s is running on %s: %s"
213                  (match-string 1 string)
214                  (match-string 2 string)
215                  (substring string (match-end 0))))
216         "\n"))))
217
218 (defun riece-handle-353-message (prefix number name string)
219   "RPL_NAMREPLY \"<channel> :[[@|+]<nick> [[@|+]<nick> [...]]]\"."
220   (if (string-match "^[=\*@] *\\([^ ]+\\) +:" string)
221       (let ((channel (match-string 1 string))
222             users)
223         (setq string (substring string (match-end 0)))
224         (if (string-match " *$" string)
225             (setq string (substring string 0 (match-beginning 0))))
226         (setq users (split-string string))
227         (while users
228           (if (eq (aref (car users) 0) ?@)
229               (progn
230                 (riece-naming-assert-join (substring (car users) 1) channel)
231                 (riece-channel-toggle-operator
232                  channel (substring (car users) 1) t))
233             (if (eq (aref (car users) 0) ?+)
234                 (progn
235                   (riece-naming-assert-join (substring (car users) 1) channel)
236                   (riece-channel-toggle-speaker
237                    channel (substring (car users) 1) t))
238               (riece-naming-assert-join (car users) channel)))
239           (setq users (cdr users)))
240         (riece-redisplay-buffers))))
241
242 (defun riece-handle-322-message (prefix number name string)
243   (if (string-match "^\\([^ ]+\\) \\([0-9]+\\) :" string)
244       (let* ((channel (match-string 1 string))
245              (visible (match-string 2 string))
246              (topic (substring string (match-end 0))))
247         (riece-channel-set-topic (riece-get-channel channel) topic)
248         (let* ((channel-identity (riece-make-identity channel
249                                                       riece-server-name))
250                (buffer (riece-channel-buffer-name channel-identity)))
251           (riece-insert-info buffer (concat visible " users, topic: "
252                                             topic "\n"))
253           (riece-insert-info
254            (if (and riece-channel-buffer-mode
255                     (not (eq buffer riece-channel-buffer)))
256                (list riece-dialogue-buffer riece-others-buffer)
257              riece-dialogue-buffer)
258            (concat
259             (riece-concat-server-name
260              (format "%s: %s users, topic: %s"
261                      (riece-format-identity channel-identity t) visible topic))
262             "\n"))))))
263
264 (defun riece-handle-324-message (prefix number name string)
265   (if (string-match "^\\([^ ]+\\) \\([^ ]+\\) " string)
266       (let* ((channel (match-string 1 string))
267              (mode-string (substring string (match-beginning 2)))
268              (modes (string-to-list (match-string 2 string)))
269              (toggle (car modes)))
270         (setq modes (cdr modes))
271         (while modes
272           (riece-channel-toggle-mode channel (car modes) (eq toggle ?+))
273           (setq modes (cdr modes)))
274         (let* ((channel-identity (riece-make-identity channel
275                                                       riece-server-name))
276                (buffer (riece-channel-buffer-name channel-identity)))
277           (riece-insert-info buffer (concat "Mode: " mode-string "\n"))
278           (riece-insert-info
279            (if (and riece-channel-buffer-mode
280                     (not (eq buffer riece-channel-buffer)))
281                (list riece-dialogue-buffer riece-others-buffer)
282              riece-dialogue-buffer)
283            (concat
284             (riece-concat-server-name
285              (format "Mode for %s: %s"
286                      (riece-format-identity channel-identity t)
287                      mode-string))
288             "\n")))
289         (riece-update-channel-indicator)
290         (force-mode-line-update t))))
291
292 (defun riece-handle-set-topic (prefix number name string remove)
293   (if (string-match "^\\([^ ]+\\) :" string)
294       (let* ((channel (match-string 1 string))
295              (message (substring string (match-end 0)))
296              (channel-identity (riece-make-identity channel riece-server-name))
297              (buffer (riece-channel-buffer-name channel-identity)))
298         (if remove
299             (riece-channel-set-topic (riece-get-channel channel) nil)
300           (riece-channel-set-topic (riece-get-channel channel) message)
301         (riece-insert-info buffer (concat "Topic: " message "\n"))
302         (riece-insert-info
303          (if (and riece-channel-buffer-mode
304                   (not (eq buffer riece-channel-buffer)))
305              (list riece-dialogue-buffer riece-others-buffer)
306            riece-dialogue-buffer)
307          (concat
308           (riece-concat-server-name
309            (format "Topic for %s: %s"
310                    (riece-format-identity channel-identity t)
311                    message))
312           "\n"))
313         (riece-update-channel-indicator)))))
314
315 (defun riece-handle-331-message (prefix number name string)
316   (riece-handle-set-topic prefix number name string t))
317
318 (defun riece-handle-332-message (prefix number name string)
319   (riece-handle-set-topic prefix number name string nil))
320
321 (defun riece-handle-341-message (prefix number name string)
322   (if (string-match "^\\([^ ]+\\) " string)
323       (let* ((channel (match-string 1 string))
324              (user (substring string (match-end 0)))
325              (channel-identity (riece-make-identity channel riece-server-name))
326              (buffer (riece-channel-buffer-name channel-identity)))
327         (riece-insert-info buffer (concat "Inviting " user "\n"))
328         (riece-insert-info
329          (if (and riece-channel-buffer-mode
330                   (not (eq buffer riece-channel-buffer)))
331              (list riece-dialogue-buffer riece-others-buffer)
332            riece-dialogue-buffer)
333          (concat
334           (riece-concat-server-name
335            (format "Inviting %s to %s" user
336                    (riece-format-identity channel-identity t)))
337           "\n")))))
338
339 (defun riece-handle-352-message (prefix number name string)
340   (if (string-match "^\\([^ ]+\\) \\([^ ]+\\) \\([^ ]+\\) \\([^ ]+\\) \\([^ ]+\\) \\([HG]\\)\\(\\*\\)?\\([@+]\\)? :\\([0-9]+\\) " string)
341       (let* ((channel (match-string 1 string))
342              (user (match-string 2 string))
343              (host (match-string 3 string))
344              (server (match-string 4 string))
345              (nick (match-string 5 string))
346              (away (equal (match-string 6 string) "G"))
347              (operator (not (null (match-beginning 7))))
348              (flag (match-string 8 string))
349              (hops (match-string 9 string))
350              (name (substring string (match-end 0)))
351              (buffer (riece-channel-buffer-name
352                       (riece-make-identity channel riece-server-name)))
353              (info (format "%10s = %s (%s) [%s, %s, %s hops, on %s]"
354                            (concat
355                             (if (memq flag '(?@ ?+))
356                                 (char-to-string flag)
357                               " ")
358                             (riece-format-identity
359                              (riece-make-identity nick riece-server-name)
360                              t))
361                            name
362                            (riece-strip-user-at-host
363                             (concat user "@" host))
364                            (if operator
365                                "operator"
366                              "not operator")
367                            (if away
368                                "away"
369                              "not away")
370                            hops
371                            server)))
372         (riece-naming-assert-join nick channel)
373         (riece-user-toggle-away user away)
374         (riece-user-toggle-operator user operator)
375         (riece-insert-info buffer (concat info "\n"))
376         (riece-insert-info
377          (if (and riece-channel-buffer-mode
378                   (not (eq buffer riece-channel-buffer)))
379              (list riece-dialogue-buffer riece-others-buffer)
380            riece-dialogue-buffer)
381          (concat
382           (riece-concat-server-name
383            (concat
384             (riece-format-identity
385              (riece-make-identity channel riece-server-name)
386              t)
387             " "
388             info))
389           "\n"))
390         (riece-redisplay-buffers))))
391
392 (defun riece-handle-315-message (prefix number name string))
393 (defun riece-handle-318-message (prefix number name string))
394 (defun riece-handle-323-message (prefix number name string))
395 (defun riece-handle-366-message (prefix number name string))
396
397 (provide 'riece-300)
398
399 ;;; riece-300.el ends here