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)))
|