(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))