bugafriend/bugafriend/room.scm

48 lines
1.4 KiB
Scheme

(define-module (bugafriend room)
#:use-module (bugafriend logging)
#:use-module (goblins)
#:use-module (goblins actor-lib pubsub)
#:use-module (goblins actor-lib methods)
#:export (^room ^room-presence))
(define (^room bcom creator-presence)
"The creator owns the canonical room which publishes to subscribers."
(define pubsub (spawn ^pubsub creator-presence))
(methods
[(add-user presence)
($ pubsub 'subscribe presence)
($ pubsub 'publish 'join presence)]
[(kick-user presence)
($ pubsub 'unsubscribe presence)
($ pubsub 'publish 'leave presence)]
[(say presence message)
($ pubsub 'publish 'say presence message)]
[(me presence message)
($ pubsub 'publish 'me presence message)]))
(define (^room-presence bcom logger name)
"Each user has a presence in the room"
(define (run-with-name user thunk)
(on (<- user 'name)
(λ (name)
(thunk name))))
(methods
[(name) name]
[(join user)
(run-with-name user
(λ (name)
(log-format logger "~a joined." name)))]
[(leave user)
(run-with-name user
(λ (name)
(log-format logger "~a left." name)))]
[(say user message)
(run-with-name user
(λ (name)
(log-format logger "~a: ~a" name message)))]
[(me user message)
(run-with-name user
(λ (name)
(log-format logger "* ~a ~a" name message)))]))