[project @ 2005-07-07 21:19:26 by unknown_lamer]
[clinton/bobotpp.git] / scripts / bobot-utils.scm
CommitLineData
ce02032f 1;;; This file is automatically loaded by Bobot++. This is required for
2;;; the bot to function.
6e78bd19 3
4;;; This file is covered by the GPL version 2 or (at your option) any
5;;; later version
6
ce02032f 7;;; the-bot-module must be available to guile-user so that scripts
8;;; loaded with Interp::Load have access to the bot: procedures
9(module-use! (resolve-module '(guile-user) #f)
10 the-bot-module)
6e78bd19 11
c7d9fb19 12(use-modules (srfi srfi-13))
13
ce02032f 14(define-public %bot:loadpath (list
15 (string-append (getenv "HOME")
16 "/.bobotpp/scripts/")
17 bot:sys-scripts-dir))
eb3864fb 18
ce02032f 19(define-public %bot:load-extensions %load-extensions)
6e78bd19 20
c7d9fb19 21;;; bot:log: Write as many messages as you want to the log. If the
ce02032f 22;;; arg is a thunk it will be executed and it's output will be
23;;; written to the log
24(define-public (bot:log . messages)
25 (for-each
26 (lambda (x)
27 (if (thunk? x)
133eff7a 28 (display (x) (bot:logport))
29 (display x (bot:logport))))
c7d9fb19 30 messages)
ce02032f 31 (bot:flushport))
6e78bd19 32
ce02032f 33(define-public (bot:load file)
34 (let path-loop ((load-path %bot:loadpath))
3d05febb 35 (cond ((not (null? load-path))
36 (if (not
37 (let ext-loop ((extensions %bot:load-extensions))
38 (if (not (null? extensions))
39 (if (catch 'system-error
40 (lambda ()
41 (load
42 (string-append (car load-path)
43 file
44 (car extensions))))
45 (lambda args
46 #f ))
47 #t
48 (ext-loop (cdr extensions))))))
49 (path-loop (cdr load-path))))
50 (else
51 (begin (bot:log "ERROR: File " file " Not Found!\n") #f)))))
ce02032f 52
53(define-public (bot:load-module module-spec)
54 (let ((module->string
55 (lambda (module)
56 (apply
57 (lambda (s . rest)
58 (string-append
59 s
60 (apply string-append
61 (map (lambda (str) (string-append "/" str)) rest))))
62 (map symbol->string module))))
63 (new-module
64 (make-module))
65 (old-module (current-module)))
66 (module-use! new-module the-bot-module)
67 (set-current-module new-module)
68 (bot:load (module->string module-spec))
69 (set-current-module old-module)
70 new-module))
71
72(define-public (bot:use-module module-spec)
73 (module-use! (current-module)
74 (bot:load-module module-spec)))
75
6e78bd19 76
77;;; REGEX UTILS
78
79;;; match-not-channel adds a prefix regex to your regex so it doesn't
80;;; match the sender or channel in a PUBLIC message
ce02032f 81(define-public (bot:match-not-channel regex)
528799bd 82 (string-append "^[[:graph:]]* [&#+!][^ ,\a]+ [[:graph:][:space:]]*"
83 regex))
6e78bd19 84
85;;; match-to-me matches text that was addressed to the bot with a
86;;; ':',',', or nothing after the bot name
ce02032f 87(define-public (bot:match-to-me regex)
88 (string-append (bot:match-not-channel (bot:getnickname))
6e78bd19 89 "[[:space:][:graph:]]*" regex))
90
528799bd 91(define-public bot:sent-to-me?
4edefeb6 92 (let ((to-me (make-regexp (bot:match-to-me ""))))
528799bd 93 (lambda (message)
94 (if (regexp-exec to-me message) #t #f))))
4edefeb6 95
6e78bd19 96;;;; string-utils
ce02032f 97(define-public str-app string-append) ; shorter
6e78bd19 98
99;;; Message sending utils
100
c7d9fb19 101;;; Returns the CTCP quoted message
102;;; Input _MUST NOT_ contain the trailing \r\n
103;;; (it is added by the message sending code)
029f60d9 104(define-public (bot:ctcp-quote message)
c7d9fb19 105 ;; TODO: Not very efficient, it may be worth reimplementing
106 (let ((ls (string->list message)))
107 (string-concatenate
108 (map (lambda (chr) ; CTCP level quoting
109 (case (char->integer chr)
528799bd 110 ((#o134) (string (integer->char #o134) (integer->char
111 #o134)))
c7d9fb19 112 ((#o01) (string (integer->char #o134) #\a)) ; X-DELIM
113 (else (string chr))))
114 (string->list
115 (string-concatenate
116 (map (lambda (chr) ; Low-level
117 (let ((m-quote (integer->char #o20)))
118 (case chr
119 ((m-quote) (string m-quote m-quote))
120 ((#\nul) (string m-quote #\0))
121 ((#\nl) (string m-quote #\n))
122 ((#\cr) (string m-quote #\r))
123 (else (string chr)))))
124 ls)))))))
125
126
6e78bd19 127
128;;; DEPRECATED FUNCTION NAMES
129;;; These are provided for backwards compatibility
c7d9fb19 130;;; and will be removed in the 3.0 release
ae97d6ec 131(begin-deprecated
132
133 (define-macro (_deprecated-fun old-name new-name)
134 `(define-public ,old-name
135 (lambda args
2427f0c9 136 (let ((old-error
137 (set-current-error-port (bot:logport))))
138 (issue-deprecation-warning
139 (string-append
140 (symbol->string ',old-name)
141 " is a deprecated function. Please use "
142 (symbol->string ',new-name) " instead."))
143 (bot:flushport)
144 (set-current-error-port old-error))
145 (apply ,new-name args))))
ae97d6ec 146
147 (_deprecated-fun bot-load bot:load)
148 (_deprecated-fun bot-action bot:action)
149 (_deprecated-fun bot-adduser bot:adduser)
150 (_deprecated-fun bot-addserver bot:addserver)
151 (_deprecated-fun bot-addshit bot:addshit)
152 (_deprecated-fun bot-ban bot:ban)
153 (_deprecated-fun bot-cycle bot:cycle)
154 (_deprecated-fun bot-deban bot:deban)
155 (_deprecated-fun bot-delserver bot:delserver)
156 (_deprecated-fun bot-deluser bot:deluser)
157 (_deprecated-fun bot-delshit bot:delshit)
158 (_deprecated-fun bot-deop bot:deop)
159 (_deprecated-fun bot-die bot:die)
160 (_deprecated-fun bot-do bot:do)
161 (_deprecated-fun bot-invite bot:invite)
162 (_deprecated-fun bot-join bot:join)
163 (_deprecated-fun bot-keep bot:keep)
164 (_deprecated-fun bot-kick bot:kick)
165 (_deprecated-fun bot-kickban bot:kickban)
166 (_deprecated-fun bot-lock bot:lock)
167 (_deprecated-fun bot-logport bot:logport)
168 (_deprecated-fun bot-mode bot:mode)
169 (_deprecated-fun bot-msg bot:msg)
170 (_deprecated-fun bot-nextserver bot:nextserver)
171 (_deprecated-fun bot-nick bot:nick)
172 (_deprecated-fun bot-op bot:op)
173 (_deprecated-fun bot-part bot:part)
174 (_deprecated-fun bot-reconnect bot:reconnect)
175 (_deprecated-fun bot-say bot:say)
176 (_deprecated-fun bot-server bot:server)
177 (_deprecated-fun bot-setversion bot:setversion)
178 (_deprecated-fun bot-tban bot:tban)
179 (_deprecated-fun bot-tkban bot:tkban)
180 (_deprecated-fun bot-topic bot:topic)
181 (_deprecated-fun bot-unlock bot:unlock)
182 (_deprecated-fun bot-getnickname bot:getnickname)
183 (_deprecated-fun bot-getserver bot:getserver)
184 (_deprecated-fun bot-getserverlist bot:getserverlist)
185 (_deprecated-fun bot-flush bot:flush)
186 (_deprecated-fun bot-flushport bot:flushport)
187 (_deprecated-fun bot-random bot:random)
188 (_deprecated-fun bot-addcommand bot:addcommand)
189 (_deprecated-fun bot-delcommand bot:delcommand)
190 (_deprecated-fun bot-addhook bot:addhook)
191 (_deprecated-fun bot-addtimer bot:addtimer)
192 (_deprecated-fun bot-deltimer bot:deltimer)
193
194 (define-public hooks/leave hooks/part))