summaryrefslogtreecommitdiff
path: root/Omni/Bot.scm
diff options
context:
space:
mode:
Diffstat (limited to 'Omni/Bot.scm')
-rwxr-xr-xOmni/Bot.scm59
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)))