X-Git-Url: http://cgit.sxemacs.org/?p=riece;a=blobdiff_plain;f=lisp%2Friece-channel.el;h=a4fc8bde1892693007327811b72d80db24e57865;hp=5805fafaf3f0e4e5cdd4b96bbd31c2e1013bd1eb;hb=7a05558868018a20692857f1134a7e0ff028c1e7;hpb=005a2a7642c9f43d699922799801124a77d56f5d diff --git a/lisp/riece-channel.el b/lisp/riece-channel.el index 5805faf..a4fc8bd 100644 --- a/lisp/riece-channel.el +++ b/lisp/riece-channel.el @@ -19,132 +19,113 @@ ;; 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))) @@ -173,12 +154,13 @@ the channel key, respectively." (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." @@ -216,30 +198,36 @@ the channel key, respectively." (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)