-(define (main)
- (let loop ((args (cdr (argv)))
- (host "localhost")
- (port 8000))
- (match args
- ((or "-h" "--help")
- (print-usage))
- (((or "-p" "--port") pstr rest ...)
- (loop rest host (string->number pstr)))
- (("--hostname" hstr rest ...)
- (loop rest hstr port))
- (()
- (make-sam host port)
- (send-message client 'start)))))
+(define (make-client-beh system)
+ (let ((name "name")
+ (rollodex (make-actor (make-rollodex-beh system)))
+ (receiver (make-actor (make-receiver-beh system))))
+ (make-beh (self)
+ (('start) =>
+ (send-message system 'print "Welcome to chat!\n"
+ "Your client address is " (address->string receiver) ".\n"
+ "Type '/help' for a list of commands.\n")
+ (send-message system 'read self))
+ (((? string? str)) =>
+ (if (string-prefix? "/" str)
+ (let* ((maybe-idx (string-index str #\space))
+ (idx (if maybe-idx maybe-idx (string-length str)))
+ (cmd (substring str 1 idx))
+ (arg (string-trim (substring str idx))))
+ (match cmd
+ ((or "h" "help")
+ (send-message system 'print
+ "Command | Description\n"
+ "------------------------------\n"
+ "/help List commands\n"
+ "/name Name Set name to use in chat.\n"
+ "/add <address> Add specified client as recipient\n"
+ "/clear Clear recipients\n"
+ "/list List current recipients\n"
+ "/quit Quit chat"))
+ ((or "a" "add")
+ (if (string-null? arg)
+ (send-message system 'print "Missing address of client.")
+ (send-message rollodex 'add arg)))
+ ((or "c" "clear")
+ (send-message rollodex 'clear))
+ ((or "n" "name")
+ (set! name arg)
+ (send-message system 'print "Name now set to '" name "'."))
+ ((or "l" "list")
+ (send-message rollodex 'list))
+ ((or "q" "quit")
+ (send-message system 'shutdown))
+ (else
+ (send-message system 'print "Unrecognised command '" cmd "'"))))
+ (send-message rollodex 'send name str))
+ (send-message system 'read self)))))
+
+(define-beh main-beh (self)
+ ((system) =>
+ (send-message (make-actor (make-client-beh system)) 'start)
+ 'done))