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