;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
;;; Code:
(require 'riece-options)
(require 'riece-globals)
(require 'riece-identity)
+(require 'riece-mode)
+(require 'riece-cache)
;;; Channel object:
(defun riece-find-channel (name)
"Get a channel object named NAME from the server buffer."
+ (riece-cache-get riece-channel-cache name)
(let ((symbol (intern-soft (riece-identity-canonicalize-prefix name)
- riece-obarray)))
+ riece-channel-obarray)))
(if symbol
(symbol-value symbol))))
(defun riece-forget-channel (name)
+ (riece-cache-delete riece-channel-cache name)
(let ((symbol (intern-soft (riece-identity-canonicalize-prefix name)
- riece-obarray)))
+ riece-channel-obarray)))
(when symbol
(makunbound symbol)
- (unintern (symbol-name symbol) riece-obarray))))
+ (unintern (symbol-name symbol) riece-channel-obarray))))
-(defun riece-make-channel (users operators speakers
- topic modes banned invited uninvited
- key)
+(defun riece-make-channel (users topic modes banned invited uninvited key)
"Make an instance of channel object.
-Arguments are appropriate to channel users, operators, speakers
-\(+v), topic, modes, banned users, invited users, uninvited users, and
-the channel key, respectively."
- (vector users operators speakers topic modes banned invited uninvited))
+Arguments are appropriate to channel users, topic, modes, banned
+users, invited users, uninvited users, and the channel key,
+respectively."
+ (vector users topic modes banned invited uninvited))
(defun riece-get-channel (name)
(let ((symbol (intern-soft (riece-identity-canonicalize-prefix name)
- riece-obarray)))
+ riece-channel-obarray)))
(if symbol
- (symbol-value symbol)
+ (progn
+ (riece-cache-get riece-channel-cache name)
+ (symbol-value symbol))
+ (riece-cache-set riece-channel-cache name name)
(set (intern (riece-identity-canonicalize-prefix name)
- riece-obarray)
- (riece-make-channel nil nil nil nil nil nil nil nil nil)))))
+ riece-channel-obarray)
+ (riece-make-channel nil nil nil nil nil nil nil)))))
(defun riece-channel-users (channel)
"Return the users of CHANNEL."
(aref channel 0))
-(defun riece-channel-operators (channel)
- "Return the operators of CHANNEL."
- (aref channel 1))
-
-(defun riece-channel-speakers (channel)
- "Return the speakers of CHANNEL."
- (aref channel 2))
-
(defun riece-channel-topic (channel)
"Return the topic of CHANNEL."
- (aref channel 3))
+ (aref channel 1))
(defun riece-channel-modes (channel)
"Return the modes of CHANNEL."
- (aref channel 4))
+ (aref channel 2))
(defun riece-channel-banned (channel)
"Return the banned users of CHANNEL."
- (aref channel 5))
+ (aref channel 3))
(defun riece-channel-invited (channel)
"Return the invited users of CHANNEL."
- (aref channel 6))
+ (aref channel 4))
(defun riece-channel-uninvited (channel)
"Return the uninvited users of CHANNEL."
- (aref channel 7))
+ (aref channel 5))
(defun riece-channel-key (channel)
"Return the key of CHANNEL."
- (aref channel 8))
+ (aref channel 6))
(defun riece-channel-set-users (channel value)
"Set the users of CHANNEL to VALUE."
(aset channel 0 value))
-(defun riece-channel-set-operators (channel value)
- "Set the operators of CHANNEL to VALUE."
- (aset channel 1 value))
-
-(defun riece-channel-set-speakers (channel value)
- "Set the speakers of CHANNEL to VALUE."
- (aset channel 2 value))
-
(defun riece-channel-set-topic (channel value)
"Set the topic of CHANNEL to VALUE."
- (aset channel 3 value))
+ (aset channel 1 value))
(defun riece-channel-set-modes (channel value)
"Set the modes of CHANNEL to VALUE."
- (aset channel 4 value))
+ (aset channel 2 value))
(defun riece-channel-set-banned (channel value)
"Set the banned users of CHANNEL to VALUE."
- (aset channel 5 value))
+ (aset channel 3 value))
(defun riece-channel-set-invited (channel value)
"Set the invited users of CHANNEL to VALUE."
- (aset channel 6 value))
+ (aset channel 4 value))
(defun riece-channel-set-uninvited (channel value)
"Set the uninvited users of CHANNEL to VALUE."
- (aset channel 7 value))
+ (aset channel 5 value))
(defun riece-channel-set-key (channel value)
"Set the key of CHANNEL to VALUE."
- (aset channel 8 value))
+ (aset channel 6 value))
(defun riece-channel-get-users (name)
"Return channel's users as list."
(riece-channel-users (riece-get-channel name)))
-(defun riece-channel-get-operators (name)
- "Return channel's operators as list."
- (riece-channel-operators (riece-get-channel name)))
-
-(defun riece-channel-get-speakers (name)
- "Return channel's speakers as list."
- (riece-channel-speakers (riece-get-channel name)))
-
(defun riece-channel-get-topic (name)
"Return channel's topic."
(riece-channel-topic (riece-get-channel name)))
(defun riece-channel-toggle-mode (name mode flag)
"Add or remove channel MODE of channel."
(let* ((channel (riece-get-channel name))
- (modes (riece-channel-modes channel)))
+ (modes (riece-channel-modes channel))
+ (old (riece-mode-assoc (riece-mode-flag mode) modes)))
(if flag
- (unless (memq mode modes)
+ (unless old
(riece-channel-set-modes channel (cons mode modes)))
- (if (memq mode modes)
- (riece-channel-set-modes channel (delq mode modes))))))
+ (if old
+ (riece-channel-set-modes channel (delq old modes))))))
(defun riece-channel-toggle-banned (name pattern flag)
"Add or remove banned PATTERN of channel."
(let* ((channel (riece-get-channel name))
(users (riece-channel-users channel)))
(if flag
- (unless (member user users)
- (riece-channel-set-users channel (cons user users)))
- (if (setq user (car (member user users)))
+ (unless (riece-identity-assoc user users t)
+ (riece-channel-set-users channel (cons (list user) users)))
+ (if (setq user (riece-identity-assoc user users t))
(riece-channel-set-users channel (delq user users))))))
(defun riece-channel-toggle-operator (name user flag)
"Add or remove an operator to channel."
(let* ((channel (riece-get-channel name))
- (operators (riece-channel-operators channel)))
+ (users (riece-channel-users channel)))
+ (setq user (riece-identity-assoc user users t))
(if flag
- (unless (member user operators)
- (riece-channel-set-operators channel (cons user operators)))
- (if (setq user (car (member user operators)))
- (riece-channel-set-operators channel (delq user operators))))))
+ (if user
+ (unless (memq ?o (cdr user))
+ (setcdr user (cons ?o (cdr user))))
+ (riece-channel-set-users channel (cons (list user ?o) users)))
+ (if user
+ (setcdr user (delq ?o (cdr user)))))))
(defun riece-channel-toggle-speaker (name user flag)
"Add or remove an speaker to channel."
(let* ((channel (riece-get-channel name))
- (speakers (riece-channel-speakers channel)))
+ (users (riece-channel-users channel)))
+ (setq user (riece-identity-assoc user users t))
(if flag
- (unless (member user speakers)
- (riece-channel-set-speakers channel (cons user speakers)))
- (if (setq user (car (member user speakers)))
- (riece-channel-set-speakers channel (delq user speakers))))))
+ (if user
+ (unless (memq ?v (cdr user))
+ (setcdr user (cons ?v (cdr user))))
+ (riece-channel-set-users channel (cons (list user ?v) users)))
+ (if user
+ (setcdr user (delq ?v (cdr user)))))))
(provide 'riece-channel)