* riece-identity.el (riece-identity-member-no-server): Abolish.
[elisp/riece.git] / lisp / riece-channel.el
1 ;;; riece-channel.el --- a channel object
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-options)
28 (require 'riece-identity)
29
30 ;;; String representation of a channel:
31 (defconst riece-channel-regexp "^[+&#!]")
32
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))
37
38 ;;; Channel object:
39 (defun riece-find-channel (name)
40   "Get a channel object named NAME from the server buffer."
41   (let ((symbol (intern-soft (riece-identity-canonicalize-prefix name)
42                              riece-obarray)))
43     (if symbol
44         (symbol-value symbol))))
45
46 (defun riece-forget-channel (name)
47   (let ((symbol (intern-soft (riece-identity-canonicalize-prefix name)
48                              riece-obarray)))
49     (when symbol
50       (makunbound symbol)
51       (unintern (symbol-name symbol) riece-obarray))))
52
53 (defun riece-make-channel (users operators speakers
54                                  topic modes banned invited uninvited
55                                  key)
56   "Make an instance of channel object.
57 Arguments are appropriate to channel users, operators, speakers
58 \(+v), topic, modes, banned users, invited users, uninvited users, and
59 the channel key, respectively."
60   (vector users operators speakers topic modes banned invited uninvited))
61
62 (defun riece-get-channel (name)
63   (let ((symbol (intern-soft (riece-identity-canonicalize-prefix name)
64                              riece-obarray)))
65     (if symbol
66         (symbol-value symbol)
67       (set (intern (riece-identity-canonicalize-prefix name)
68                    riece-obarray)
69            (riece-make-channel nil nil nil nil nil nil nil nil nil)))))
70
71 (defun riece-channel-users (channel)
72   "Return the users of CHANNEL."
73   (aref channel 0))
74
75 (defun riece-channel-operators (channel)
76   "Return the operators of CHANNEL."
77   (aref channel 1))
78
79 (defun riece-channel-speakers (channel)
80   "Return the speakers of CHANNEL."
81   (aref channel 2))
82
83 (defun riece-channel-topic (channel)
84   "Return the topic of CHANNEL."
85   (aref channel 3))
86
87 (defun riece-channel-modes (channel)
88   "Return the modes of CHANNEL."
89   (aref channel 4))
90
91 (defun riece-channel-banned (channel)
92   "Return the banned users of CHANNEL."
93   (aref channel 5))
94
95 (defun riece-channel-invited (channel)
96   "Return the invited users of CHANNEL."
97   (aref channel 6))
98
99 (defun riece-channel-uninvited (channel)
100   "Return the uninvited users of CHANNEL."
101   (aref channel 7))
102
103 (defun riece-channel-key (channel)
104   "Return the key of CHANNEL."
105   (aref channel 8))
106
107 (defun riece-channel-set-users (channel value)
108   "Set the users of CHANNEL to VALUE."
109   (aset channel 0 value))
110
111 (defun riece-channel-set-operators (channel value)
112   "Set the operators of CHANNEL to VALUE."
113   (aset channel 1 value))
114
115 (defun riece-channel-set-speakers (channel value)
116   "Set the speakers of CHANNEL to VALUE."
117   (aset channel 2 value))
118
119 (defun riece-channel-set-topic (channel value)
120   "Set the topic of CHANNEL to VALUE."
121   (aset channel 3 value))
122
123 (defun riece-channel-set-modes (channel value)
124   "Set the modes of CHANNEL to VALUE."
125   (aset channel 4 value))
126
127 (defun riece-channel-set-banned (channel value)
128   "Set the banned users of CHANNEL to VALUE."
129   (aset channel 5 value))
130
131 (defun riece-channel-set-invited (channel value)
132   "Set the invited users of CHANNEL to VALUE."
133   (aset channel 6 value))
134
135 (defun riece-channel-set-uninvited (channel value)
136   "Set the uninvited users of CHANNEL to VALUE."
137   (aset channel 7 value))
138
139 (defun riece-channel-set-key (channel value)
140   "Set the key of CHANNEL to VALUE."
141   (aset channel 8 value))
142
143 (defun riece-channel-get-users (name)
144   "Return channel's users as list."
145   (riece-channel-users (riece-get-channel name)))
146
147 (defun riece-channel-get-operators (name)
148   "Return channel's operators as list."
149   (riece-channel-operators (riece-get-channel name)))
150
151 (defun riece-channel-get-speakers (name)
152   "Return channel's speakers as list."
153   (riece-channel-speakers (riece-get-channel name)))
154
155 (defun riece-channel-get-topic (name)
156   "Return channel's topic."
157   (riece-channel-topic (riece-get-channel name)))
158
159 (defun riece-channel-get-modes (name)
160   "Return channel's modes as list."
161   (riece-channel-modes (riece-get-channel name)))
162
163 (defun riece-channel-get-banned (name)
164   "Return channel's banned users as list."
165   (riece-channel-banned (riece-get-channel name)))
166
167 (defun riece-channel-get-invited (name)
168   "Return channel's invited users as list."
169   (riece-channel-invited (riece-get-channel name)))
170
171 (defun riece-channel-get-uninvited (name)
172   "Return channel's uninvited users as list."
173   (riece-channel-uninvited (riece-get-channel name)))
174
175 (defun riece-channel-get-key (name)
176   "Return channel's key."
177   (riece-channel-key (riece-get-channel name)))
178
179 ;;; Functions called from `riece-handle-mode-message':
180 (defun riece-channel-toggle-mode (name mode flag)
181   "Add or remove channel MODE of channel."
182   (let* ((channel (riece-get-channel name))
183          (modes (riece-channel-modes channel)))
184     (if flag
185         (unless (memq mode modes)
186           (riece-channel-set-modes channel (cons mode modes)))
187       (if (memq mode modes)
188           (riece-channel-set-modes channel (delq mode modes))))))
189
190 (defun riece-channel-toggle-banned (name pattern flag)
191   "Add or remove banned PATTERN of channel."
192   (let* ((channel (riece-get-channel name))
193          (banned (riece-channel-banned channel)))
194     (if flag
195         (unless (member pattern banned)
196           (riece-channel-set-banned channel (cons pattern banned)))
197       (if (setq pattern (car (member pattern banned)))
198           (riece-channel-set-banned channel (delq pattern banned))))))
199
200 (defun riece-channel-toggle-invited (name pattern flag)
201   "Add or remove invited PATTERN of channel."
202   (let* ((channel (riece-get-channel name))
203          (invited (riece-channel-invited channel)))
204     (if flag
205         (unless (member pattern invited)
206           (riece-channel-set-invited channel (cons pattern invited)))
207       (if (setq pattern (car (member pattern invited)))
208           (riece-channel-set-invited channel (delq pattern invited))))))
209
210 (defun riece-channel-toggle-uninvited (name pattern flag)
211   "Add or remove uninvited PATTERN to channel."
212   (let* ((channel (riece-get-channel name))
213          (uninvited (riece-channel-uninvited channel)))
214     (if flag
215         (unless (member pattern uninvited)
216           (riece-channel-set-uninvited channel (cons pattern uninvited)))
217       (if (setq pattern (car (member pattern uninvited)))
218           (riece-channel-set-uninvited
219            channel (delq pattern uninvited))))))
220
221 (defun riece-channel-toggle-user (name user flag)
222   "Add or remove an user to channel."
223   (let* ((channel (riece-get-channel name))
224          (users (riece-channel-users channel)))
225     (if flag
226         (unless (member user users)
227           (riece-channel-set-users channel (cons user users)))
228       (if (setq user (car (member user users)))
229           (riece-channel-set-users channel (delq user users))))))
230
231 (defun riece-channel-toggle-operator (name user flag)
232   "Add or remove an operator to channel."
233   (let* ((channel (riece-get-channel name))
234          (operators (riece-channel-operators channel)))
235     (if flag
236         (unless (member user operators)
237           (riece-channel-set-operators channel (cons user operators)))
238       (if (setq user (car (member user operators)))
239           (riece-channel-set-operators channel (delq user operators))))))
240
241 (defun riece-channel-toggle-speaker (name user flag)
242   "Add or remove an speaker to channel."
243   (let* ((channel (riece-get-channel name))
244          (speakers (riece-channel-speakers channel)))
245     (if flag
246         (unless (member user speakers)
247           (riece-channel-set-speakers channel (cons user speakers)))
248       (if (setq user (car (member user speakers)))
249           (riece-channel-set-speakers channel (delq user speakers))))))
250
251 (provide 'riece-channel)
252
253 ;;; riece-channel.el ends here