#:use-module (ice-9 match)
#:export (;; The only things you definitely need if writing a bot
make-irc-bot-cli
- irc-format irc-display
+ irc-format irc-display irc-send-message irc-send-formatted
;; Useful things if you're making something more complicated
irc-line
(display (irc-line line) dest)
(display (irc-line dest))))
+(define (irc-send-message socket channel message)
+ (irc-format socket "PRIVMSG ~a :~a" channel message))
+
+(define-syntax-rule (irc-send-formatted socket channel format-string
+ args ...)
+ (irc-format socket "PRIVMSG ~a :~a" channel
+ (format #f format-string args ...)))
+
(define* (handle-login socket username
#:key
(hostname "*")
(set! buffer (cons (read-char socket) buffer))
(match buffer
((#\newline #\return (? char? line-chars) ...)
- (%sync (%run (handle-line
- socket
- (list->string (reverse line-chars))
- username)))
- ;; reset buffer
- (set! buffer '()))
+ (let ((ready-line (list->string (reverse line-chars))))
+ ;; reset buffer
+ (set! buffer '())
+ ;; run it
+ ;; @@: does this need to be %8sync?
+ (%8sync (%run (handle-line
+ socket
+ ready-line
+ username)))))
(_ #f))))
irc-handler))
(channels (value #t))
(listen)))
-(define* (make-irc-bot-cli #:optional (line-handler default-line-handler))
+(define* (make-irc-bot-cli #:optional
+ (line-handler default-line-handler)
+ (print-and-continue-on-error #t))
(define (main args)
(let* ((options (getopt-long args option-spec))
(hostname (option-ref options 'server #f))
(username (option-ref options 'username #f))
(listen (option-ref options 'listen #f))
(channels (option-ref options 'channels ""))
- (agenda (make-agenda)))
+ (agenda (if print-and-continue-on-error
+ (make-agenda #:pre-unwind-handler print-error-and-continue)
+ (make-agenda))))
(display `((server ,hostname) (port ,port) (username ,username)
(listen ,listen) (channels-split ,(string-split channels #\space))))
(newline)
main)
(define main (make-irc-bot-cli))
-