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