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