;; : out omnibot ;; ;; Usage with ii: ;; ;; tail -f \#omni/out | guile -L $CODEROOT -s Omni/Bot.scm ;; (define-module (Omni Bot) #:export (main)) (import (ice-9 rdelim)) (import (ice-9 match)) (import (ice-9 regex)) (import (ice-9 receive)) (import (bs core)) (import (prefix (bs string) string.)) (define (log msg) (display msg (current-error-port))) (define (is-command? msg) (string.prefix? msg "omnibot:")) (define (parse-line line) (if (eof-object? line) (exit) (let ([matches (regexp-exec (make-regexp "<(\\S*)>(.*)" regexp/extended) (string-drop line 11))]) (if matches `(user ,(match:substring matches 1) ,(string.lstrip (match:substring matches 2) #\space)) `(system ,(string-drop line 11)))))) (define (dispatch user msg) (let ([msg (-> msg (string-drop (string-length "omnibot:")) (string.lstrip #\space))]) (cond ((equal? msg "hi") (display (fmt "~a: well, hello!" user))) (else (display (fmt "command not understood: ~a" msg)))))) (define (main args) (while #t (match (parse-line (read-line)) [('user user msg) (if (is-command? msg) (dispatch user msg) (begin (log (fmt "user: ~a " user)) (log (fmt "message: ~a" msg))))] [('system msg) (log (fmt "system: ~a" msg))]) (newline) (force-output)))