summaryrefslogtreecommitdiff
path: root/Omni/Bot.scm
blob: c52650770cf013a12f8c4203649b53863bd97498 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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)))