-(defvar lirc-current-channel nil)
-(defvar lirc-channel-list nil)
-
-(defun lirc-add-channel (channel-name)
- (add-to-list 'lirc-channel-list
- (list channel-name)))
-
-(defun lirc-del-channel (channel-name)
- (setq lirc-channel-list
- (assoc-delete-all channel-name lirc-channel-list)))
-
-(defun lirc-get-channel-users (channel-name)
- (cdr (assoc channel-name lirc-channel-list)))
-
-(defun lirc-set-channel-users (channel-name users)
- (setcdr (assoc channel-name lirc-channel-list) users))
-
-(defun lirc-add-channel-users (channel-name &rest users)
- (let ((current-users (lirc-get-channel-users channel-name)))
- (lirc-set-channel-users channel-name (append users current-users))))
-
-(defun lirc-del-channel-users (channel-name &rest users)
- (let ((current-users (lirc-get-channel-users channel-name)))
- (lirc-set-channel-users channel-name
- (cl-set-difference current-users users :test #'equal))))
+(defvar lirc-context-table
+ '((channel lirc-display-channel-message)
+ (nick lirc-display-private-message)
+ (host lirc-diaplay-server-message)))
+
+(defvar lirc-current-context nil)
+(defvar lirc-contexts (make-hash-table :test #'equal))
+
+(defun lirc-add-context (name)
+ (puthash name nil lirc-contexts))
+
+(defun lirc-del-context (name)
+ (remhash name lirc-contexts))
+
+(defun lirc-get-context-users (name)
+ (gethash name lirc-contexts))
+
+(defun lirc-add-context-users (context users)
+ (puthash context
+ (append users
+ (gethash context lirc-contexts))
+ lirc-contexts))
+
+(defun lirc-del-context-user (context user)
+ (puthash context
+ (remove user (gethash context lirc-contexts))
+ lirc-contexts))
+
+(defun lirc-del-user (user)
+ (dolist (context (lirc-get-context-list))
+ (lirc-del-context-user context user)))
+
+(defun lirc-get-context-type (name)
+ (cond
+ ((string-prefix-p "#" name) 'channel)
+ ((string-match-p (rx (or "." "localhost")) name) 'host)
+ (t 'nick)))
+
+(defun lirc-get-context-list ()
+ (let ((res nil))
+ (maphash (lambda (key val)
+ (cl-pushnew key res))
+ lirc-contexts)
+ res))
+
+(defun lirc-get-next-context (&optional prev)
+ (if lirc-current-context
+ (let* ((context-list (if prev
+ (reverse (lirc-get-context-list))
+ (lirc-get-context-list)))
+ (context-list* (member lirc-current-context context-list)))
+ (if (> (length context-list*) 1)
+ (cadr context-list*)
+ (car context-list)))
+ nil))