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 (require 'riece-options)
28 (require 'riece-identity)
30 ;;; String representation of a channel:
31 (defconst riece-channel-regexp "^[+&#!]")
33 (defun riece-channel-p (string)
34 "Return t if STRING is a channel.
35 \(i.e. it matches `riece-channel-regexp')"
36 (string-match riece-channel-regexp string))
39 (defun riece-find-channel (name)
40 "Get a channel object named NAME from the server buffer."
41 (riece-with-server-buffer
42 (let ((symbol (intern-soft (riece-identity-canonicalize-prefix
43 (riece-identity-prefix name))
46 (symbol-value symbol)))))
48 (defun riece-forget-channel (name)
49 (riece-with-server-buffer
50 (let ((symbol (intern-soft (riece-identity-canonicalize-prefix
51 (riece-identity-prefix name))
55 (unintern (symbol-name symbol) riece-obarray)))))
57 (defun riece-make-channel (&optional users operators speakers
58 topic modes banned invited uninvited
60 "Make an instance of channel object.
61 Arguments are appropriate to channel users, operators, speakers
62 \(+v), topic, modes, banned users, invited users, uninvited users, and
63 the channel key, respectively."
64 (vector users operators speakers topic modes banned invited uninvited))
66 (defun riece-get-channel (name)
67 (riece-with-server-buffer
68 (let ((symbol (intern-soft (riece-identity-canonicalize-prefix
69 (riece-identity-prefix name))
73 (set (intern (riece-identity-canonicalize-prefix
74 (riece-identity-prefix name))
76 (riece-make-channel))))))
78 (defun riece-channel-users (channel)
79 "Return the users of CHANNEL."
82 (defun riece-channel-operators (channel)
83 "Return the operators of CHANNEL."
86 (defun riece-channel-speakers (channel)
87 "Return the speakers of CHANNEL."
90 (defun riece-channel-topic (channel)
91 "Return the topic of CHANNEL."
94 (defun riece-channel-modes (channel)
95 "Return the modes of CHANNEL."
98 (defun riece-channel-banned (channel)
99 "Return the banned users of CHANNEL."
102 (defun riece-channel-invited (channel)
103 "Return the invited users of CHANNEL."
106 (defun riece-channel-uninvited (channel)
107 "Return the uninvited users of CHANNEL."
110 (defun riece-channel-key (channel)
111 "Return the key of CHANNEL."
114 (defun riece-channel-set-users (channel value)
115 "Set the users of CHANNEL to VALUE."
116 (aset channel 0 value))
118 (defun riece-channel-set-operators (channel value)
119 "Set the operators of CHANNEL to VALUE."
120 (aset channel 1 value))
122 (defun riece-channel-set-speakers (channel value)
123 "Set the speakers of CHANNEL to VALUE."
124 (aset channel 2 value))
126 (defun riece-channel-set-topic (channel value)
127 "Set the topic of CHANNEL to VALUE."
128 (aset channel 3 value))
130 (defun riece-channel-set-modes (channel value)
131 "Set the modes of CHANNEL to VALUE."
132 (aset channel 4 value))
134 (defun riece-channel-set-banned (channel value)
135 "Set the banned users of CHANNEL to VALUE."
136 (aset channel 5 value))
138 (defun riece-channel-set-invited (channel value)
139 "Set the invited users of CHANNEL to VALUE."
140 (aset channel 6 value))
142 (defun riece-channel-set-uninvited (channel value)
143 "Set the uninvited users of CHANNEL to VALUE."
144 (aset channel 7 value))
146 (defun riece-channel-set-key (channel value)
147 "Set the key of CHANNEL to VALUE."
148 (aset channel 8 value))
150 (defun riece-channel-get-users (&optional name)
151 "Return channel's users as list."
153 (riece-get-channel (or name riece-current-channel))))
155 (defun riece-channel-get-operators (&optional name)
156 "Return channel's operators as list."
157 (riece-channel-operators
158 (riece-get-channel (or name riece-current-channel))))
160 (defun riece-channel-get-speakers (&optional name)
161 "Return channel's speakers as list."
162 (riece-channel-speakers
163 (riece-get-channel (or name riece-current-channel))))
165 (defun riece-channel-get-topic (&optional name)
166 "Return channel's topic."
168 (riece-get-channel (or name riece-current-channel))))
170 (defun riece-channel-get-modes (&optional name)
171 "Return channel's modes as list."
173 (riece-get-channel (or name riece-current-channel))))
175 (defun riece-channel-get-banned (&optional name)
176 "Return channel's banned users as list."
177 (riece-channel-banned
178 (riece-get-channel (or name riece-current-channel))))
180 (defun riece-channel-get-invited (&optional name)
181 "Return channel's invited users as list."
182 (riece-channel-invited
183 (riece-get-channel (or name riece-current-channel))))
185 (defun riece-channel-get-uninvited (&optional name)
186 "Return channel's uninvited users as list."
187 (riece-channel-uninvited
188 (riece-get-channel (or name riece-current-channel))))
190 (defun riece-channel-get-key (&optional name)
191 "Return channel's key."
193 (riece-get-channel (or name riece-current-channel))))
195 ;;; Functions called from `riece-handle-mode-message':
196 (defun riece-channel-toggle-mode (name mode flag)
197 "Add or remove channel MODE of channel."
198 (let* ((channel (riece-get-channel (or name riece-current-channel)))
199 (modes (riece-channel-modes channel)))
201 (unless (memq mode modes)
202 (riece-channel-set-modes channel (cons mode modes)))
203 (if (memq mode modes)
204 (riece-channel-set-modes channel (delq mode modes))))))
206 (defun riece-channel-toggle-banned (name pattern flag)
207 "Add or remove banned PATTERN of channel."
208 (let* ((channel (riece-get-channel (or name riece-current-channel)))
209 (banned (riece-channel-banned channel)))
211 (unless (member pattern banned)
212 (riece-channel-set-banned channel (cons pattern banned)))
213 (if (setq pattern (car (member pattern banned)))
214 (riece-channel-set-banned channel (delq pattern banned))))))
216 (defun riece-channel-toggle-invited (name pattern flag)
217 "Add or remove invited PATTERN of channel."
218 (let* ((channel (riece-get-channel (or name riece-current-channel)))
219 (invited (riece-channel-invited channel)))
221 (unless (member pattern invited)
222 (riece-channel-set-invited channel (cons pattern invited)))
223 (if (setq pattern (car (member pattern invited)))
224 (riece-channel-set-invited channel (delq pattern invited))))))
226 (defun riece-channel-toggle-uninvited (name pattern flag)
227 "Add or remove uninvited PATTERN to channel."
228 (let* ((channel (riece-get-channel (or name riece-current-channel)))
229 (uninvited (riece-channel-uninvited channel)))
231 (unless (member pattern uninvited)
232 (riece-channel-set-uninvited channel (cons pattern uninvited)))
233 (if (setq pattern (car (member pattern uninvited)))
234 (riece-channel-set-uninvited
235 channel (delq pattern uninvited))))))
237 (defun riece-channel-toggle-user (name user flag)
238 "Add or remove an user to channel."
239 (let* ((channel (riece-get-channel (or name riece-current-channel)))
240 (users (riece-channel-users channel)))
242 (unless (member user users)
243 (riece-channel-set-users channel (cons user users)))
244 (if (setq user (car (member user users)))
245 (riece-channel-set-users channel (delq user users))))))
247 (defun riece-channel-toggle-operator (name user flag)
248 "Add or remove an operator to channel."
249 (let* ((channel (riece-get-channel (or name riece-current-channel)))
250 (operators (riece-channel-operators channel)))
252 (unless (member user operators)
253 (riece-channel-set-operators channel (cons user operators)))
254 (if (setq user (car (member user operators)))
255 (riece-channel-set-operators channel (delq user operators))))))
257 (defun riece-channel-toggle-speaker (name user flag)
258 "Add or remove an speaker to channel."
259 (let* ((channel (riece-get-channel (or name riece-current-channel)))
260 (speakers (riece-channel-speakers channel)))
262 (unless (member user speakers)
263 (riece-channel-set-speakers channel (cons user speakers)))
264 (if (setq user (car (member user speakers)))
265 (riece-channel-set-speakers channel (delq user speakers))))))
267 (provide 'riece-channel)
269 ;;; riece-channel.el ends here