git.fiddlerwoaroof.com
Browse code

(init)

Ed Langley authored on 29/10/2020 22:01:15
Showing 3 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,16 @@
1
+;;; -*- Mode:Lisp; Syntax:ANSI-Common-Lisp; Package: ASDF-USER -*-
2
+(in-package :asdf-user)
3
+
4
+(defsystem :documentation-server 
5
+  :description ""
6
+  :author "Ed L <edward@elangley.org>"
7
+  :license "MIT"
8
+  :depends-on (#:alexandria
9
+               #:uiop
10
+               #:fwoar-lisputils
11
+               #:serapeum
12
+               #:hunchentoot
13
+               #:hunchensocket)
14
+  :serial t
15
+  :components ((:file "package")
16
+               (:file "main")))
0 17
new file mode 100644
... ...
@@ -0,0 +1,32 @@
1
+(in-package :documentation-server)
2
+
3
+(defclass chat-room (hunchensocket:websocket-resource)
4
+  ((name :initarg :name :initform (error "Name this room!") :reader name))
5
+  (:default-initargs :client-class 'user))
6
+
7
+(defclass user (hunchensocket:websocket-client)
8
+  ((name :initarg :user-agent :reader name :initform (error "Name this user!"))))
9
+
10
+
11
+(defvar *chat-room* (list (make-instance 'chat-room :name "/bongo")
12
+                          (make-instance 'chat-room :name "/fury")))
13
+
14
+(defun find-room (request)
15
+  (find (hunchentoot:script-name request) *chat-room*
16
+        :test #'string=
17
+        :key #'name))
18
+
19
+(defun broadcast (room message &rest args)
20
+  (loop for peer in (hunchensocket:clients room)
21
+     do (hunchensocket:send-text-message peer (apply #'format nil message args))))
22
+
23
+(defmethod hunchensocket:client-connected ((room chat-room) user)
24
+  (broadcast room "user connected ~a" (name user)))
25
+
26
+(defmethod hunchensocket:client-disconnected ((room chat-room) user)
27
+  (broadcast room "user disconnected ~a" (name user)))
28
+
29
+(defmethod hunchensocket:text-message-received ((room chat-room) user message)
30
+  (broadcast room "~a says ~a" (name user) message))
31
+
32
+
0 33
new file mode 100644
... ...
@@ -0,0 +1,4 @@
1
+(defpackage :documentation-server
2
+  (:shadowing-import-from :fwoar.lisputils :op :ensure-list)
3
+  (:use :cl :alexandria :serapeum :fw.lu)
4
+  (:export ))