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