47 lines
1.3 KiB
Racket
47 lines
1.3 KiB
Racket
#lang syndicate
|
|
|
|
(require/activate syndicate/drivers/tcp2)
|
|
(require/activate syndicate/drivers/timestate)
|
|
|
|
(define (random-selection items)
|
|
(list-ref items (random (length items))))
|
|
|
|
(define id (make-parameter #f))
|
|
|
|
(define (random-sleep secs)
|
|
(define duration (/ (random (* secs 1000)) 1000.0))
|
|
(printf "Bot ~a sleeping for ~a seconds\n" (id) duration)
|
|
(sleep duration))
|
|
|
|
(define *utterances* (list "Lovely weather we're having!\n"
|
|
"It's a bit cold today\n"
|
|
"I've got a lovely bunch of coconuts\n"))
|
|
|
|
(assertion-struct bot-running (id))
|
|
|
|
(define (bot)
|
|
(parameterize ((id (gensym 'chatbot)))
|
|
(spawn (assert (tcp-connection (id) (tcp-address "localhost" 5999)))
|
|
(stop-when (retracted (tcp-accepted (id))))
|
|
|
|
(on-start (printf "Bot ~a starting\n" (id)))
|
|
(assert (bot-running (id)))
|
|
(on-stop (printf "Bot ~a stopping\n" (id)))
|
|
|
|
(on-start (random-sleep 30)
|
|
(stop-current-facet))
|
|
|
|
(on-start (let loop ()
|
|
(random-sleep 10)
|
|
(send! (tcp-out (id) (random-selection *utterances*)))
|
|
(loop))))))
|
|
|
|
(parameterize ((id 'monitor))
|
|
(spawn (on (retracted (bot-running $id))
|
|
(random-sleep 5)
|
|
(bot))))
|
|
|
|
(bot)
|
|
(bot)
|
|
(bot)
|