48 lines
1.4 KiB
Scheme
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)))]))
|