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.
27 (eval-when-compile (require 'riece-inlines))
30 (require 'riece-message)
31 (require 'riece-channel)
32 (require 'riece-naming)
33 (require 'riece-display)
35 (defun riece-handle-nick-message (prefix string)
36 (let* ((old (riece-prefix-nickname prefix))
37 (new (car (riece-split-parameters string)))
38 (channels (riece-user-get-channels old))
39 (visible (riece-identity-member-no-server
40 riece-current-channel channels)))
41 (riece-naming-assert-rename old new)
42 (let ((pointer (riece-identity-member-no-server
43 (riece-make-identity old)
44 riece-current-channels)))
46 (setcar pointer (riece-make-identity new))
47 (setcar (riece-identity-assoc-no-server (riece-make-identity old)
48 riece-channel-buffer-alist)
49 (riece-make-identity new))
50 (setcar (riece-identity-assoc-no-server (riece-make-identity old)
51 riece-user-list-buffer-alist)
52 (riece-make-identity new))
53 (if (riece-identity-equal-no-server (riece-make-identity old)
54 riece-current-channel)
55 (riece-switch-to-channel (riece-make-identity new)))
56 (setq channels (cons (riece-make-identity new) channels))))
57 (riece-insert-change (mapcar
59 (cdr (riece-identity-assoc-no-server
60 (riece-make-identity channel)
61 riece-channel-buffer-alist)))
63 (format "%s -> %s\n" old new))
64 (riece-insert-change (if visible
66 (list riece-dialogue-buffer riece-others-buffer))
68 (riece-concat-server-name
69 (format "%s -> %s" old new))
71 (riece-redisplay-buffers)))
73 (defun riece-handle-privmsg-message (prefix string)
74 (let* ((user (riece-prefix-nickname prefix))
75 (parameters (riece-split-parameters string))
76 (targets (split-string (car parameters) ","))
77 (message (nth 1 parameters)))
78 (unless (equal message "") ;not ignored by server?
79 (riece-display-message
80 (riece-make-message user (riece-make-identity (car targets))
83 (defun riece-handle-notice-message (prefix string)
84 (let* ((user (if prefix
85 (riece-prefix-nickname prefix)))
86 (parameters (riece-split-parameters string))
87 (targets (split-string (car parameters) ","))
88 (message (nth 1 parameters)))
89 (unless (equal message "") ;not ignored by server?
91 (riece-display-message
92 (riece-make-message user (riece-make-identity (car targets))
94 ;; message from server
96 (list riece-dialogue-buffer riece-others-buffer)
97 (concat (riece-concat-server-name message) "\n"))))))
99 (defun riece-handle-ping-message (prefix string)
100 (riece-send-string (format "PONG :%s\r\n"
101 (if (eq (aref string 0) ?:)
105 (defun riece-handle-join-message (prefix string)
106 (let ((user (riece-prefix-nickname prefix))
107 (channels (split-string (car (riece-split-parameters string)) ",")))
109 (riece-naming-assert-join user (car channels))
111 (if (string-equal-ignore-case user riece-real-nickname)
112 (riece-switch-to-channel (riece-make-identity (car channels))))
113 (let ((buffer (cdr (riece-identity-assoc-no-server
114 (riece-make-identity (car channels))
115 riece-channel-buffer-alist))))
118 (format "%s (%s) has joined %s\n"
120 (riece-user-get-user-at-host user)
123 (if (and riece-channel-buffer-mode
124 (not (eq buffer riece-channel-buffer)))
125 (list riece-dialogue-buffer riece-others-buffer)
126 riece-dialogue-buffer)
128 (riece-concat-server-name
129 (format "%s (%s) has joined %s"
131 (riece-user-get-user-at-host user)
134 (setq channels (cdr channels)))
135 (riece-redisplay-buffers)))
137 (defun riece-handle-part-message (prefix string)
138 (let* ((user (riece-prefix-nickname prefix))
139 (parameters (riece-split-parameters string))
140 (channels (split-string (car parameters) ","))
141 (message (nth 1 parameters)))
143 (riece-naming-assert-part user (car channels))
144 (let ((buffer (cdr (riece-identity-assoc-no-server
145 (riece-make-identity (car channels))
146 riece-channel-buffer-alist))))
150 (riece-concat-message
151 (format "%s has left %s" user (car channels))
155 (if (and riece-channel-buffer-mode
156 (not (eq buffer riece-channel-buffer)))
157 (list riece-dialogue-buffer riece-others-buffer)
158 riece-dialogue-buffer)
160 (riece-concat-server-name
161 (riece-concat-message
162 (format "%s has left %s" user (car channels))
165 (setq channels (cdr channels)))
166 (riece-redisplay-buffers)))
168 (defun riece-handle-kick-message (prefix string)
169 (let* ((kicker (riece-prefix-nickname prefix))
170 (parameters (riece-split-parameters string))
171 (channel (car parameters))
172 (user (nth 1 parameters))
173 (message (nth 2 parameters)))
174 (riece-naming-assert-part user channel)
175 (let ((buffer (cdr (riece-identity-assoc-no-server
176 (riece-make-identity channel)
177 riece-channel-buffer-alist))))
181 (riece-concat-message
182 (format "%s kicked %s out from %s" kicker user channel)
186 (if (and riece-channel-buffer-mode
187 (not (eq buffer riece-channel-buffer)))
188 (list riece-dialogue-buffer riece-others-buffer)
189 riece-dialogue-buffer)
191 (riece-concat-server-name
192 (riece-concat-message
193 (format "%s kicked %s out from %s\n" kicker user channel)
196 (riece-redisplay-buffers)))
198 (defun riece-handle-quit-message (prefix string)
199 (let* ((user (riece-prefix-nickname prefix))
200 (channels (copy-sequence (riece-user-get-channels user)))
202 (message (car (riece-split-parameters string))))
203 ;; If you are quitting, no need to cleanup.
204 (unless (string-equal-ignore-case user riece-real-nickname)
205 ;; You were talking with the user.
206 (if (riece-identity-member-no-server (riece-make-identity user)
207 riece-current-channels)
208 (riece-part-channel user)) ;XXX
209 (setq pointer channels)
211 (riece-naming-assert-part user (car pointer))
212 (setq pointer (cdr pointer)))
216 (cdr (riece-identity-assoc-no-server
217 (riece-make-identity channel)
218 riece-channel-buffer-alist)))
220 (riece-insert-change buffers
221 (concat (riece-concat-message
222 (format "%s has left IRC" user)
225 (riece-insert-change (if (and riece-channel-buffer-mode
226 (not (memq riece-channel-buffer
228 (list riece-dialogue-buffer
230 riece-dialogue-buffer)
232 (riece-concat-server-name
233 (riece-concat-message
234 (format "%s has left IRC" user)
237 (riece-redisplay-buffers)))
239 (defun riece-handle-kill-message (prefix string)
240 (let* ((killer (riece-prefix-nickname prefix))
241 (parameters (riece-split-parameters string))
242 (user (car parameters))
243 (message (nth 1 parameters))
244 (channels (copy-sequence (riece-user-get-channels user)))
246 ;; You were talking with the user.
247 (if (riece-identity-member-no-server (riece-make-identity user)
248 riece-current-channels)
249 (riece-part-channel user)) ;XXX
250 (setq pointer channels)
252 (riece-naming-assert-part user (car pointer))
253 (setq pointer (cdr pointer)))
257 (cdr (riece-identity-assoc-no-server
258 (riece-make-identity channel)
259 riece-channel-buffer-alist)))
261 (riece-insert-change buffers
262 (concat (riece-concat-message
263 (format "%s killed %s" killer user)
266 (riece-insert-change (if (and riece-channel-buffer-mode
267 (not (memq riece-channel-buffer
269 (list riece-dialogue-buffer
271 riece-dialogue-buffer)
273 (riece-concat-server-name
274 (riece-concat-message
275 (format "%s killed %s" killer user)
278 (riece-redisplay-buffers)))
280 (defun riece-handle-invite-message (prefix string)
281 (let* ((user (riece-prefix-nickname prefix))
282 (parameters (riece-split-parameters string))
283 (channel (car parameters)))
285 (list riece-dialogue-buffer riece-others-buffer)
287 (riece-concat-server-name
288 (format "%s invites you to %s" user channel))
291 (defun riece-handle-topic-message (prefix string)
292 (let* ((user (riece-prefix-nickname prefix))
293 (parameters (riece-split-parameters string))
294 (channel (car parameters))
295 (topic (nth 1 parameters)))
296 (riece-channel-set-topic (riece-get-channel channel) topic)
297 (let ((buffer (cdr (riece-identity-assoc-no-server
298 (riece-make-identity channel)
299 riece-channel-buffer-alist))))
302 (format "Topic by %s: %s\n" user topic))
304 (if (and riece-channel-buffer-mode
305 (not (eq buffer riece-channel-buffer)))
306 (list riece-dialogue-buffer riece-others-buffer)
307 riece-dialogue-buffer)
309 (riece-concat-server-name
310 (format "Topic on %s by %s: %s" channel user topic))
312 (riece-redisplay-buffers))))
314 (defsubst riece-parse-channel-modes (string channel)
315 (while (string-match "^[-+]\\([^ ]*\\) *" string)
316 (let ((toggle (aref string 0))
317 (modes (string-to-list (match-string 1 string))))
318 (setq string (substring string (match-end 0)))
320 (if (and (memq (car modes) '(?O ?o ?v ?k ?l ?b ?e ?I))
321 (string-match "\\([^-+][^ ]*\\) *" string))
322 (let ((parameter (match-string 1 string)))
323 (setq string (substring string (match-end 0)))
326 (riece-channel-toggle-operator channel parameter
329 (riece-channel-toggle-speaker channel parameter
332 (riece-channel-toggle-banned channel parameter
335 (riece-channel-toggle-uninvited channel parameter
338 (riece-channel-toggle-invited channel parameter
340 (riece-channel-toggle-mode channel (car modes)
342 (setq modes (cdr modes))))))
344 (defun riece-handle-mode-message (prefix string)
345 (let ((user (riece-prefix-nickname prefix))
347 (when (string-match "\\([^ ]+\\) *:?" string)
348 (setq channel (match-string 1 string)
349 string (substring string (match-end 0)))
350 (riece-parse-channel-modes string channel)
351 (let ((buffer (cdr (riece-identity-assoc-no-server
352 (riece-make-identity channel)
353 riece-channel-buffer-alist))))
356 (format "Mode by %s: %s\n" user string))
358 (if (and riece-channel-buffer-mode
359 (not (eq buffer riece-channel-buffer)))
360 (list riece-dialogue-buffer riece-others-buffer)
361 riece-dialogue-buffer)
363 (riece-concat-server-name
364 (format "Mode on %s by %s: %s" channel user string))
366 (riece-redisplay-buffers)))))
368 (provide 'riece-handle)
370 ;;; riece-handle.el ends here