git.fiddlerwoaroof.com
Raw Blame History
(in-package :documentation-server)

(defclass chat-room (hunchensocket:websocket-resource)
  ((name :initarg :name :initform (error "Name this room!") :reader name))
  (:default-initargs :client-class 'user))

(defclass user (hunchensocket:websocket-client)
  ((name :initarg :user-agent :reader name :initform (error "Name this user!"))))


(defvar *chat-room* (list (make-instance 'chat-room :name "/bongo")
                          (make-instance 'chat-room :name "/fury")))

(defun find-room (request)
  (find (hunchentoot:script-name request) *chat-room*
        :test #'string=
        :key #'name))

(defun broadcast (room message &rest args)
  (loop for peer in (hunchensocket:clients room)
     do (hunchensocket:send-text-message peer (apply #'format nil message args))))

(defmethod hunchensocket:client-connected ((room chat-room) user)
  (broadcast room "user connected ~a" (name user)))

(defmethod hunchensocket:client-disconnected ((room chat-room) user)
  (broadcast room "user disconnected ~a" (name user)))

(defmethod hunchensocket:text-message-received ((room chat-room) user message)
  (broadcast room "~a says ~a" (name user) message))