+(defun murk-string->context (string)
+ (if (not (string-prefix-p "#" string))
+ (murk-get-context string)
+ (let* ((parts (string-split string "@"))
+ (channel (elt parts 0))
+ (server (elt parts 1)))
+ (murk-get-context server channel))))
+
+(defun murk-get-context (server &optional channel)
+ (if (and channel (string-prefix-p "#" channel))
+ (let ((test-ctx (list server channel)))
+ (seq-find (lambda (ctx)
+ (equal (seq-take ctx 2) test-ctx))
+ murk-contexts))
+ (car (member (list server) murk-contexts))))
+
+(defun murk-cycle-contexts (&optional reverse)
+ (setq murk-contexts
+ (if reverse
+ (let ((nminus1 (- (length murk-contexts) 1)))
+ (cons
+ (elt murk-contexts nminus1)
+ (seq-take murk-contexts nminus1)))
+ (append (cdr murk-contexts) (list (car murk-contexts))))))
+
+(defun murk-switch-to-context (ctx)
+ (setq murk-contexts
+ (let* ((new-head (memq ctx murk-contexts))
+ (new-tail (take (- (length murk-contexts)
+ (length new-head)))))
+ (append new-head new-tail))))
+
+(defun murk-add-context-users (ctx users)
+ (murk-set-context-users
+ ctx
+ (cl-union users (murk-context-users ctx))))
+
+(defun murk-del-context-user (ctx user)
+ (murk-set-context-users
+ ctx
+ (delete user (murk-context-users ctx))))
+
+(defun murk-del-server-user (server user)
+ (dolist (ctx murk-contexts)
+ (if (and (equal (murk-context-server ctx) server)
+ (not (murk-server-context-p ctx)))
+ (murk-del-context-user ctx user))))
+
+(defun murk-rename-server-user (server old-nick new-nick)
+ (dolist (ctx murk-contexts)
+ (when (and (equal (murk-context-server ctx) server)
+ (member old-nick (murk-context-users ctx)))
+ (murk-del-context-user ctx old-nick)
+ (murk-add-context-users ctx (list new-nick)))))