anchor.diff:               ("character" . ,user)
                ("dialogue" . ,dialogue))))))
   
  +(defun session-websocket-clients (session)
  +  (session-value 'websocket-clients session))
  +(defun (setf session-websocket-clients) (new-value session)
  +  (setf (session-value 'websocket-clients session) new-value))
   
   ;; clws stuff
   (defgeneric add-client (chat-server client))
  
positive.code: (defgeneric validate-client (chat-server client))
  
  (defun disconnect-client (client)
    (let ((ws-client (client-ws-client client))
          (session (client-session client)))
      (ws:write-to-client ws-client :close)
      ;; Chrome doesn't seem to pay attention to :close.
      ;; _3b proposes sending a custom 'close' command to Chrome, and closing the socket client-side.
      (ws::client-disconnect ws-client :abort t)
      (when session
        (deletef (session-value 'websocket-clients session)
                 client))))
  
  (defstruct client uri host headers user-agent ws-client session account-name character-id)
  
negative.code: ;; Server startup/teardown.
  (defun logout (session)
    (let ((account-name (session-value 'account-name session))
          (websocket-clients (session-websocket-clients session)))
      (when account-name
        (format t "~&~A logged out.~%" account-name))
      (when websocket-clients
  