-(define (make-basic-irc-handler handle-line username)
- (let ((buffer '()))
- (define (reset-buffer)
- (set! buffer '()))
- (define (should-read-char socket)
- (and (not (port-closed? socket))
- (char-ready? socket)
- (not (eof-object? (peek-char socket)))))
- (define (irc-handler socket)
- (while (should-read-char socket)
- (set! buffer (cons (read-char socket) buffer))
- (match buffer
- ((#\newline #\return (? char? line-chars) ...)
- (let ((ready-line (list->string (reverse line-chars))))
- ;; reset buffer
- (set! buffer '())
- ;; run it
- (8sync (handle-line
- socket
- ready-line
- username))))
- (_ #f)))
- ;; I need to shut things down on EOF object
- (cond
- ((port-closed? socket)
- (display "port closed time\n")
- (port-remove-request socket))
- ((and (char-ready? socket)
- (eof-object? (peek-char socket)))
- (display "port eof time\n")
- (close socket)
- (port-remove-request socket))))
- irc-handler))
+(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))