Basically functional.
[botbot.git] / examples / pgbot.scm
1 (let ((url-alist '())
2       (url-list-file "phlog_list.txt"))
3
4   (import matchable srfi-1
5           (chicken file)
6           (chicken string)
7           (chicken pretty-print))
8
9   (if (file-exists? url-list-file)
10       (let ((res (with-input-from-file url-list-file read)))
11         (if (pair? res)
12             (set! url-alist res))))
13
14   (define (save-url-list)
15     (with-output-to-file url-list-file
16       (lambda () (pretty-print url-alist))))
17
18   (define (set-url nick url)
19     (let ((nick-symb (string->symbol nick)))
20       (set! url-alist
21         (alist-cons nick-symb url (alist-delete  nick-symb url-alist)))
22       (save-url-list)))
23
24   (define (get-url nick)
25     (let* ((nick-symb (string->symbol nick))
26            (record (assoc nick-symb url-alist)))
27       (and record (cdr record))))
28
29   (define (clear-url nick)
30     (let* ((nick-symb (string->symbol nick)))
31       (set! url-alist (alist-delete nick-symb url-alist))
32       (save-url-list)))
33
34   (lambda (source args privmsg)
35     (match (string-split (car args))
36       (("hello")
37        (privmsg source "hello yourself!"))
38
39       ((",seturl" url)
40        (set-url source url)
41        (privmsg source "updated url"))
42
43       ((",geturl" nick)
44        (print "in geturl")
45        (privmsg source
46                 (let ((url (get-url nick)))
47                   (if url
48                       (conc "URL for " nick ": " url)
49                       (conc "No URL for " nick " in database")))))
50
51       ((",rmurl")
52        (clear-url source)
53        (privmsg source "cleared url"))
54
55       ((",list")
56        (if (null? url-alist)
57            (privmsg source "No registered phlog/gemlog/blog URLs. :(")
58            (begin
59              (privmsg source "Current URL list:")
60              (for-each
61               (lambda (record)
62                 (let ((nick (symbol->string (car record)))
63                       (url (cdr record)))
64                   (privmsg source (conc "  " nick ": " url))))
65               url-alist))))
66
67       ((",announce")
68        (let ((url (get-url source)))
69          (if url
70              (privmsg "#phloggersgarage"
71                       (conc source " has published a new post at " url "!"))
72              (privmsg source "Register your *log URL first using ,seturl <URL>."))))
73
74       (_
75        (privmsg source "Hi!  Here are the valid pgbot commands:")
76        (privmsg source " ,seturl [url] : Save your *log URL for others to see")
77        (privmsg source " ,rmurl : Remove your *log URL if one is saved.")
78        (privmsg source " ,geturl [nick] : Retrieve the *log URL belonging to [nick].")
79        (privmsg source " ,list : List all currently stored *log URLs.")
80        (privmsg source " ,accounce : Announce a new *log entry to #phloggersgarage! Huzzah!")))))