1 ;;; riece-channel.el --- a channel object
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)) ;string-assoc-ignore-case, etc.
29 (require 'riece-options)
30 (require 'riece-identity)
32 ;;; String representation of a channel:
33 (defconst riece-channel-regexp "^[+&#!]")
34 (defconst riece-channel-modeless-regexp "^[+!]")
36 (defun riece-channel-p (string)
37 "Return t if STRING is a channel.
38 \(i.e. it matches `riece-channel-regexp')"
39 (string-match riece-channel-regexp string))
41 (defun riece-channel-modeless-p (string)
42 "Return t if STRING is a modeless channel.
43 \(i.e. it matches `riece-channel-modeless-regexp')"
44 (string-match riece-channel-modeless-regexp string))
47 (defun riece-find-channel (name)
48 "Get a channel object named NAME from the server buffer."
49 (riece-with-server-buffer
50 (let ((symbol (intern-soft (downcase (riece-identity-prefix name))
53 (symbol-value symbol)))))
55 (defun riece-forget-channel (name)
56 (riece-with-server-buffer
57 (let ((symbol (intern-soft (downcase (riece-identity-prefix name)))))
60 (unintern (symbol-name symbol) riece-obarray)))))
62 (defun riece-make-channel (&optional users operators speakers
63 topic modes banned invited uninvited
65 "Make an instance of channel object.
66 Arguments are appropriate to channel users, operators, speakers
67 \(+v), topic, modes, banned users, invited users, uninvited users, and
68 the channel key, respectively."
69 (vector users operators speakers topic modes banned invited uninvited))
71 (defun riece-get-channel (name)
72 (riece-with-server-buffer
73 (let ((symbol (intern-soft (downcase (riece-identity-prefix name))
77 (set (intern (downcase (riece-identity-prefix name))
79 (riece-make-channel))))))
81 (defun riece-channel-users (channel)
82 "Return the users of CHANNEL."
85 (defun riece-channel-operators (channel)
86 "Return the operators of CHANNEL."
89 (defun riece-channel-speakers (channel)
90 "Return the speakers of CHANNEL."
93 (defun riece-channel-topic (channel)
94 "Return the topic of CHANNEL."
97 (defun riece-channel-modes (channel)
98 "Return the modes of CHANNEL."
101 (defun riece-channel-banned (channel)
102 "Return the banned users of CHANNEL."
105 (defun riece-channel-invited (channel)
106 "Return the invited users of CHANNEL."
109 (defun riece-channel-uninvited (channel)
110 "Return the uninvited users of CHANNEL."
113 (defun riece-channel-key (channel)
114 "Return the key of CHANNEL."
117 (defun riece-channel-set-users (channel value)
118 "Set the users of CHANNEL to VALUE."
119 (aset channel 0 value))
121 (defun riece-channel-set-operators (channel value)
122 "Set the operators of CHANNEL to VALUE."
123 (aset channel 1 value))
125 (defun riece-channel-set-speakers (channel value)
126 "Set the speakers of CHANNEL to VALUE."
127 (aset channel 2 value))
129 (defun riece-channel-set-topic (channel value)
130 "Set the topic of CHANNEL to VALUE."
131 (aset channel 3 value))
133 (defun riece-channel-set-modes (channel value)
134 "Set the modes of CHANNEL to VALUE."
135 (aset channel 4 value))
137 (defun riece-channel-set-banned (channel value)
138 "Set the banned users of CHANNEL to VALUE."
139 (aset channel 5 value))
141 (defun riece-channel-set-invited (channel value)
142 "Set the invited users of CHANNEL to VALUE."
143 (aset channel 6 value))
145 (defun riece-channel-set-uninvited (channel value)
146 "Set the uninvited users of CHANNEL to VALUE."
147 (aset channel 7 value))
149 (defun riece-channel-set-key (channel value)
150 "Set the key of CHANNEL to VALUE."
151 (aset channel 8 value))
153 (defun riece-channel-get-users (&optional name)
154 "Return channel's users as list."
156 (riece-get-channel (or name riece-current-channel))))
158 (defun riece-channel-get-operators (&optional name)
159 "Return channel's operators as list."
160 (riece-channel-operators
161 (riece-get-channel (or name riece-current-channel))))
163 (defun riece-channel-get-speakers (&optional name)
164 "Return channel's speakers as list."
165 (riece-channel-speakers
166 (riece-get-channel (or name riece-current-channel))))
168 (defun riece-channel-get-topic (&optional name)
169 "Return channel's topic."
171 (riece-get-channel (or name riece-current-channel))))
173 (defun riece-channel-get-modes (&optional name)
174 "Return channel's modes as list."
176 (riece-get-channel (or name riece-current-channel))))
178 (defun riece-channel-get-banned (&optional name)
179 "Return channel's banned users as list."
180 (riece-channel-banned
181 (riece-get-channel (or name riece-current-channel))))
183 (defun riece-channel-get-invited (&optional name)
184 "Return channel's invited users as list."
185 (riece-channel-invited
186 (riece-get-channel (or name riece-current-channel))))
188 (defun riece-channel-get-uninvited (&optional name)
189 "Return channel's uninvited users as list."
190 (riece-channel-uninvited
191 (riece-get-channel (or name riece-current-channel))))
193 (defun riece-channel-get-key (&optional name)
194 "Return channel's key."
196 (riece-get-channel (or name riece-current-channel))))
198 ;;; Functions called from `riece-handle-mode-message':
199 (defun riece-channel-toggle-mode (name mode flag)
200 "Add or remove channel MODE of channel."
201 (let* ((channel (riece-get-channel (or name riece-current-channel)))
202 (modes (riece-channel-modes channel)))
204 (unless (memq mode modes)
205 (riece-channel-set-modes channel (cons mode modes)))
206 (if (memq mode modes)
207 (riece-channel-set-modes channel (delq mode modes))))))
209 (defun riece-channel-toggle-banned (name pattern flag)
210 "Add or remove banned PATTERN of channel."
211 (let* ((channel (riece-get-channel (or name riece-current-channel)))
212 (banned (riece-channel-banned channel)))
214 (unless (member pattern banned)
215 (riece-channel-set-banned channel (cons pattern banned)))
216 (if (setq pattern (car (member pattern banned)))
217 (riece-channel-set-banned channel (delq pattern banned))))))
219 (defun riece-channel-toggle-invited (name pattern flag)
220 "Add or remove invited PATTERN of channel."
221 (let* ((channel (riece-get-channel (or name riece-current-channel)))
222 (invited (riece-channel-invited channel)))
224 (unless (member pattern invited)
225 (riece-channel-set-invited channel (cons pattern invited)))
226 (if (setq pattern (car (member pattern invited)))
227 (riece-channel-set-invited channel (delq pattern invited))))))
229 (defun riece-channel-toggle-uninvited (name pattern flag)
230 "Add or remove uninvited PATTERN to channel."
231 (let* ((channel (riece-get-channel (or name riece-current-channel)))
232 (uninvited (riece-channel-uninvited channel)))
234 (unless (member pattern uninvited)
235 (riece-channel-set-uninvited channel (cons pattern uninvited)))
236 (if (setq pattern (car (member pattern uninvited)))
237 (riece-channel-set-uninvited
238 channel (delq pattern uninvited))))))
240 (defun riece-channel-toggle-user (name user flag)
241 "Add or remove an user to channel."
242 (let* ((channel (riece-get-channel (or name riece-current-channel)))
243 (users (riece-channel-users channel)))
245 (unless (member user users)
246 (riece-channel-set-users channel (cons user users)))
247 (if (setq user (car (member user users)))
248 (riece-channel-set-users channel (delq user users))))))
250 (defun riece-channel-toggle-operator (name user flag)
251 "Add or remove an operator to channel."
252 (let* ((channel (riece-get-channel (or name riece-current-channel)))
253 (operators (riece-channel-operators channel)))
255 (unless (member user operators)
256 (riece-channel-set-operators channel (cons user operators)))
257 (if (setq user (car (member user operators)))
258 (riece-channel-set-operators channel (delq user operators))))))
260 (defun riece-channel-toggle-speaker (name user flag)
261 "Add or remove an speaker to channel."
262 (let* ((channel (riece-get-channel (or name riece-current-channel)))
263 (speakers (riece-channel-speakers channel)))
265 (unless (member user speakers)
266 (riece-channel-set-speakers channel (cons user speakers)))
267 (if (setq user (car (member user speakers)))
268 (riece-channel-set-speakers channel (delq user speakers))))))
270 (provide 'riece-channel)
272 ;;; riece-channel.el ends here