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-display)
33 (defun riece-handle-nick-message (prefix string)
34 (let* ((old (riece-prefix-nickname prefix))
35 (new (car (riece-split-parameters string)))
36 (channels (riece-user-get-channels old))
37 (visible (riece-identity-member
39 (mapcar (lambda (channel)
40 (riece-make-identity channel riece-server-name))
42 (riece-naming-assert-rename old new)
43 (let ((pointer (riece-identity-member
44 (riece-make-identity old riece-server-name)
45 riece-current-channels)))
47 (setcar pointer (riece-make-identity new riece-server-name))
48 (with-current-buffer (riece-channel-buffer-name
50 old riece-server-name))
51 (rename-buffer (riece-channel-buffer-name
52 (riece-make-identity new riece-server-name))))
53 (if (riece-identity-equal (riece-make-identity
54 old riece-server-name)
55 riece-current-channel)
56 (riece-switch-to-channel (riece-make-identity
57 new riece-server-name)))
58 (setq channels (cons (riece-make-identity new riece-server-name)
60 (riece-insert-change (mapcar
62 (riece-channel-buffer-name
63 (riece-make-identity channel riece-server-name)))
65 (format "%s -> %s\n" old new))
66 (riece-insert-change (if visible
68 (list riece-dialogue-buffer riece-others-buffer))
70 (riece-concat-server-name
71 (format "%s -> %s" old new))
73 (riece-redisplay-buffers)))
75 (defun riece-handle-privmsg-message (prefix string)
76 (let* ((user (riece-prefix-nickname prefix))
77 (parameters (riece-split-parameters string))
78 (targets (split-string (car parameters) ","))
79 (message (riece-decode-coding-string (nth 1 parameters))))
80 (riece-display-message
81 (riece-make-message (riece-make-identity user
83 (riece-make-identity (car targets)
87 (defun riece-handle-notice-message (prefix string)
88 (let* ((user (if prefix
89 (riece-prefix-nickname prefix)))
90 (parameters (riece-split-parameters string))
91 (targets (split-string (car parameters) ","))
92 (message (riece-decode-coding-string (nth 1 parameters))))
94 (riece-display-message
95 (riece-make-message (riece-make-identity user
97 (riece-make-identity (car targets)
100 ;; message from server
102 (list riece-dialogue-buffer riece-others-buffer)
103 (concat (riece-concat-server-name message) "\n")))))
105 (defun riece-handle-ping-message (prefix string)
106 (riece-send-string (format "PONG :%s\r\n"
107 (if (eq (aref string 0) ?:)
111 (defun riece-handle-join-message (prefix string)
112 (let ((user (riece-prefix-nickname prefix))
113 (channels (split-string (car (riece-split-parameters string)) ",")))
115 (riece-naming-assert-join user (car channels))
117 (if (riece-identity-equal-no-server user riece-real-nickname)
118 (riece-switch-to-channel (riece-make-identity (car channels)
120 (let ((buffer (riece-channel-buffer-name
121 (riece-make-identity (car channels) riece-server-name))))
124 (format "%s (%s) has joined %s\n"
126 (riece-user-get-user-at-host user)
127 (riece-decode-coding-string (car channels))))
129 (if (and riece-channel-buffer-mode
130 (not (eq buffer riece-channel-buffer)))
131 (list riece-dialogue-buffer riece-others-buffer)
132 riece-dialogue-buffer)
134 (riece-concat-server-name
135 (format "%s (%s) has joined %s"
137 (riece-user-get-user-at-host user)
138 (riece-decode-coding-string (car channels))))
140 (setq channels (cdr channels)))
141 (riece-redisplay-buffers)))
143 (defun riece-handle-part-message (prefix string)
144 (let* ((user (riece-prefix-nickname prefix))
145 (parameters (riece-split-parameters string))
146 (channels (split-string (car parameters) ","))
147 (message (riece-decode-coding-string (nth 1 parameters))))
149 (riece-naming-assert-part user (car channels))
150 (let ((buffer (riece-channel-buffer-name
151 (riece-make-identity (car channels) riece-server-name))))
155 (riece-concat-message
156 (format "%s has left %s"
157 user (riece-decode-coding-string (car channels)))
161 (if (and riece-channel-buffer-mode
162 (not (eq buffer riece-channel-buffer)))
163 (list riece-dialogue-buffer riece-others-buffer)
164 riece-dialogue-buffer)
166 (riece-concat-server-name
167 (riece-concat-message
168 (format "%s has left %s"
169 user (riece-decode-coding-string (car channels)))
172 (setq channels (cdr channels)))
173 (riece-redisplay-buffers)))
175 (defun riece-handle-kick-message (prefix string)
176 (let* ((kicker (riece-prefix-nickname prefix))
177 (parameters (riece-split-parameters string))
178 (channel (car parameters))
179 (user (nth 1 parameters))
180 (message (riece-decode-coding-string (nth 2 parameters))))
181 (riece-naming-assert-part user channel)
182 (let ((buffer (riece-channel-buffer-name
183 (riece-make-identity channel riece-server-name))))
187 (riece-concat-message
188 (format "%s kicked %s out from %s"
189 kicker user (riece-decode-coding-string channel))
193 (if (and riece-channel-buffer-mode
194 (not (eq buffer riece-channel-buffer)))
195 (list riece-dialogue-buffer riece-others-buffer)
196 riece-dialogue-buffer)
198 (riece-concat-server-name
199 (riece-concat-message
200 (format "%s kicked %s out from %s\n"
201 kicker user (riece-decode-coding-string channel))
204 (riece-redisplay-buffers)))
206 (defun riece-handle-quit-message (prefix string)
207 (let* ((user (riece-prefix-nickname prefix))
208 (channels (copy-sequence (riece-user-get-channels user)))
210 (message (riece-decode-coding-string
211 (car (riece-split-parameters string)))))
212 ;; You were talking with the user.
213 (if (riece-identity-member (riece-make-identity user riece-server-name)
214 riece-current-channels)
215 (riece-part-channel user)) ;XXX
216 (setq pointer channels)
218 (riece-naming-assert-part user (car pointer))
219 (setq pointer (cdr pointer)))
223 (riece-channel-buffer-name
224 (riece-make-identity channel riece-server-name)))
226 (riece-insert-change buffers
227 (concat (riece-concat-message
228 (format "%s has left IRC" user)
231 (riece-insert-change (if (and riece-channel-buffer-mode
232 (not (memq riece-channel-buffer
234 (list riece-dialogue-buffer
236 riece-dialogue-buffer)
238 (riece-concat-server-name
239 (riece-concat-message
240 (format "%s has left IRC" user)
243 (riece-redisplay-buffers))
245 (defun riece-handle-kill-message (prefix string)
246 (let* ((killer (riece-prefix-nickname prefix))
247 (parameters (riece-split-parameters string))
248 (user (car parameters))
249 (message (riece-decode-coding-string (nth 1 parameters)))
250 (channels (copy-sequence (riece-user-get-channels user)))
252 ;; You were talking with the user.
253 (if (riece-identity-member (riece-make-identity user riece-server-name)
254 riece-current-channels)
255 (riece-part-channel user)) ;XXX
256 (setq pointer channels)
258 (riece-naming-assert-part user (car pointer))
259 (setq pointer (cdr pointer)))
263 (riece-channel-buffer-name
264 (riece-make-identity channel riece-server-name)))
266 (riece-insert-change buffers
267 (concat (riece-concat-message
268 (format "%s killed %s" killer user)
271 (riece-insert-change (if (and riece-channel-buffer-mode
272 (not (memq riece-channel-buffer
274 (list riece-dialogue-buffer
276 riece-dialogue-buffer)
278 (riece-concat-server-name
279 (riece-concat-message
280 (format "%s killed %s" killer user)
283 (riece-redisplay-buffers)))
285 (defun riece-handle-invite-message (prefix string)
286 (let* ((user (riece-prefix-nickname prefix))
287 (parameters (riece-split-parameters string))
288 (channel (car parameters)))
290 (list riece-dialogue-buffer riece-others-buffer)
292 (riece-concat-server-name
293 (format "%s invites you to %s"
294 user (riece-decode-coding-string channel)))
297 (defun riece-handle-topic-message (prefix string)
298 (let* ((user (riece-prefix-nickname prefix))
299 (parameters (riece-split-parameters string))
300 (channel (car parameters))
301 (topic (riece-decode-coding-string (nth 1 parameters))))
302 (riece-channel-set-topic (riece-get-channel channel) topic)
303 (let ((buffer (riece-channel-buffer-name
304 (riece-make-identity channel riece-server-name))))
307 (format "Topic by %s: %s\n" user topic))
309 (if (and riece-channel-buffer-mode
310 (not (eq buffer riece-channel-buffer)))
311 (list riece-dialogue-buffer riece-others-buffer)
312 riece-dialogue-buffer)
314 (riece-concat-server-name
315 (format "Topic on %s by %s: %s"
316 (riece-decode-coding-string channel) user topic))
318 (riece-redisplay-buffers))))
320 (defsubst riece-parse-channel-modes (string channel)
321 (while (string-match "^[-+]\\([^ ]*\\) *" string)
322 (let ((toggle (aref string 0))
323 (modes (string-to-list (match-string 1 string))))
324 (setq string (substring string (match-end 0)))
326 (if (and (memq (car modes) '(?O ?o ?v ?k ?l ?b ?e ?I))
327 (string-match "\\([^-+][^ ]*\\) *" string))
328 (let ((parameter (match-string 1 string)))
329 (setq string (substring string (match-end 0)))
332 (riece-channel-toggle-operator channel parameter
335 (riece-channel-toggle-speaker channel parameter
338 (riece-channel-toggle-banned channel parameter
341 (riece-channel-toggle-uninvited channel parameter
344 (riece-channel-toggle-invited channel parameter
346 (riece-channel-toggle-mode channel (car modes)
348 (setq modes (cdr modes))))))
350 (defun riece-handle-mode-message (prefix string)
351 (let ((user (riece-prefix-nickname prefix))
353 (when (string-match "\\([^ ]+\\) *:?" string)
354 (setq channel (match-string 1 string)
355 string (substring string (match-end 0)))
356 (riece-parse-channel-modes string channel)
357 (let ((buffer (riece-channel-buffer-name
358 (riece-make-identity channel riece-server-name))))
361 (format "Mode by %s: %s\n" user string))
363 (if (and riece-channel-buffer-mode
364 (not (eq buffer riece-channel-buffer)))
365 (list riece-dialogue-buffer riece-others-buffer)
366 riece-dialogue-buffer)
368 (riece-concat-server-name
369 (format "Mode on %s by %s: %s"
370 (riece-decode-coding-string channel) user string))
372 (riece-redisplay-buffers)))))
374 (provide 'riece-handle)
376 ;;; riece-handle.el ends here