- speaker message channel-name)))
-
-(define default-handle-privmsg echo-back-message)
-
-(define* (make-handle-line #:key
- (handle-privmsg default-handle-privmsg))
- (define (handle-line socket line my-username)
- (let ((parsed-line (parse-line line)))
- (match (irc-line-command parsed-line)
- ("PING"
- (irc-display "PONG" socket))
- ("PRIVMSG"
- (receive (channel-name message is-action)
- (condense-privmsg-line (irc-line-params parsed-line))
- (let ((username (irc-line-username parsed-line)))
- (handle-privmsg socket my-username username
- channel-name message is-action))))
- (_
- (display line)
- (newline)))))
- handle-line)
-
-(define (irc-loop socket handle-line username)
- (define (loop)
- (define line (string-trim-right (read-line socket) #\return))
- (handle-line socket line username)
- (cond
- ;; The port's been closed for some reason, so stop looping
- ((port-closed? socket)
- 'done)
- ;; We've reached the EOF object, which means we should close
- ;; the port ourselves and stop looping
- ((eof-object? (peek-char socket))
- (close socket)
- 'done)
- ;; Otherwise, let's read till the next line!
- (else (loop))))
- (loop))
-
-(define default-line-handler (make-handle-line))
-
-(define* (queue-and-start-irc-agenda! agenda socket #:key
- (username "syncbot")
- (inet-port default-irc-port)
- (line-handler default-line-handler)
- (channels '()))
- (dynamic-wind
- (lambda () #f)
- (lambda ()
- (enq! (agenda-queue agenda)
- (wrap (irc-loop socket line-handler username)))
- (enq! (agenda-queue agenda) (wrap (handle-login socket username
- #:channels channels)))
- (start-agenda agenda))
- (lambda ()
- (display "Cleaning up...\n")
- (close socket))))
-