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