diff options
Diffstat (limited to 'Omni/Bot.scm')
-rwxr-xr-x | Omni/Bot.scm | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/Omni/Bot.scm b/Omni/Bot.scm new file mode 100755 index 0000000..c526507 --- /dev/null +++ b/Omni/Bot.scm @@ -0,0 +1,59 @@ +;; : 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))) |