38 lines
1.2 KiB
Scheme
38 lines
1.2 KiB
Scheme
(define-module (bugafriend user)
|
|
#:use-module (bugafriend room)
|
|
#:use-module (goblins)
|
|
#:use-module (goblins ocapn ids)
|
|
#:use-module (goblins actor-lib methods)
|
|
#:use-module (srfi srfi-1)
|
|
#:use-module (srfi srfi-9)
|
|
#:export (^user))
|
|
|
|
(define-record-type <room-data>
|
|
(make-room-data room presence)
|
|
room-data?
|
|
(room room-data-room)
|
|
(presence room-data-presence))
|
|
|
|
(define (^user bcom logger name room-data)
|
|
(methods
|
|
[(room) (and room-data (room-data-room room-data))]
|
|
[(presence) (and room-data (room-data-presence room-data))]
|
|
[(make-room)
|
|
(let* ((my-presence (spawn ^room-presence logger name))
|
|
(room (spawn ^room my-presence))
|
|
(room-data (make-room-data room my-presence)))
|
|
(bcom (^user bcom logger name room-data)))]
|
|
|
|
[(join-room room)
|
|
(let ((my-presence (spawn ^room-presence logger name)))
|
|
(when room-data
|
|
(<-np (room-data-room room-data) 'kick-user (room-data-presence room-data)))
|
|
|
|
(<- room 'add-user my-presence)
|
|
(bcom (^user bcom logger name (make-room-data room my-presence))))]
|
|
|
|
[(leave-room room)
|
|
(when (eq? room (room-data-room room-data))
|
|
(<-np room 'kick-user (room-data-presence room-data))
|
|
(bcom (^user bcom logger name #f)))]))
|