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