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