+(defclass session ()
+ ((update-queue
+ :accessor update-queue
+ :initform (locked-queue:create)
+ :documentation "Updates to be sent to the browser")
+ (update-thread
+ :accessor update-thread
+ :initform nil
+ :documentation "COMET thread waiting for updates of non-NIL")
+ (connection
+ :accessor connection
+ :documentation "Connection to the empire game server")))
+
+(defun make-session (username password)
+ (let* ((session (make-instance 'session))
+ (connection (empire:connect :user username
+ :password password
+ :session session)))
+ (setf (slot-value session 'connection) connection)
+ session))
+
+(defgeneric send (session string))
+(defgeneric prompt (session string))
+(defgeneric data (session message))
+
+(defvar *empire-session*)
+
+(defmacro with-session (&body body)
+ `(let ((*empire-session* (hunchentoot:session-value 'session)))
+ (if *empire-session*
+ (progn ,@body)
+ (hunchentoot:redirect +login-page+))))