X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=8sync%2Fsystems%2Firc.scm;h=404d1f4641506da35bab58aefbfcd080591433f4;hb=39469a161ea198b675075967cda847c1ed99c434;hp=5d2b66bc679e260d111658ebb9a2bb4f91984283;hpb=4998e7a9fe3b303923d918cd6087633d5302274f;p=8sync.git diff --git a/8sync/systems/irc.scm b/8sync/systems/irc.scm index 5d2b66b..404d1f4 100755 --- a/8sync/systems/irc.scm +++ b/8sync/systems/irc.scm @@ -159,9 +159,7 @@ #:getter irc-bot-port) (socket #:accessor irc-bot-socket) (actions #:allocation #:each-subclass - #:init-value (build-actions - (*init* irc-bot-init) - (*cleanup* irc-bot-cleanup) + #:init-thunk (build-actions (main-loop irc-bot-main-loop) (handle-line handle-line) (send-line irc-bot-send-line-action)))) @@ -170,11 +168,12 @@ (or (slot-ref irc-bot 'realname) (irc-bot-username irc-bot))) -(define (irc-bot-init irc-bot message) +(define-method (actor-init! (irc-bot )) "Initialize the IRC bot" (define socket (irc-socket-setup (irc-bot-server irc-bot) (irc-bot-port irc-bot))) + (pk 'initing-irc) (set! (irc-bot-socket irc-bot) socket) (format socket "USER ~a ~a ~a :~a~a" (irc-bot-username irc-bot) @@ -189,31 +188,26 @@ (<- (actor-id irc-bot) 'main-loop)) -(define (irc-bot-cleanup irc-bot message) +(define-method (actor-cleanup! (irc-bot )) (close (irc-bot-socket irc-bot))) (define (irc-bot-main-loop irc-bot message) (define socket (irc-bot-socket irc-bot)) (define line (string-trim-right (read-line socket) #\return)) - (dispatch-raw-line irc-bot line) - (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) - ;; ;; Looks like we've been killed somehow... well, stop running - ;; ;; then! - ;; ((actor-am-i-dead? irc-bot) - ;; (if (not (port-closed? socket)) - ;; (close socket)) - ;; 'done) - ;; Otherwise, let's read till the next line! - (else - (<- (actor-id irc-bot) 'main-loop)))) + (with-actor-nonblocking-ports + (lambda () + (dispatch-raw-line irc-bot line) + (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) + (else + (<- (actor-id irc-bot) 'main-loop)))))) (define* (irc-bot-send-line-action irc-bot message channel line #:key emote?)