X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=8sync%2Fsystems%2Firc.scm;h=1ca32439113c18928dcd231ad1a4053d711b2f82;hb=d21f6b70e8efcfe5ebd00bd2e5293fe1656afdff;hp=495cbca4f968dfe4b4c4b03c7629c78cc2e12110;hpb=382af9f4ada1170faab3efda78ae5e3b5e1d4d42;p=8sync.git diff --git a/8sync/systems/irc.scm b/8sync/systems/irc.scm index 495cbca..1ca3243 100755 --- a/8sync/systems/irc.scm +++ b/8sync/systems/irc.scm @@ -1,9 +1,5 @@ -#!/usr/bin/guile \ --e main -s -!# - ;;; 8sync --- Asynchronous programming for Guile -;;; Copyright (C) 2015 Christopher Allan Webber +;;; Copyright © 2015, 2016, 2017 Christopher Allan Webber ;;; ;;; This file is part of 8sync. ;;; @@ -22,7 +18,6 @@ (define-module (8sync systems irc) #:use-module (8sync repl) - #:use-module (8sync agenda) #:use-module (8sync actors) #:use-module (srfi srfi-9) #:use-module (ice-9 getopt-long) @@ -35,6 +30,8 @@ #:export ( irc-bot-username irc-bot-server irc-bot-channels irc-bot-port + irc-bot-send-line + handle-line handle-misc-input handle-user-join handle-user-quit @@ -161,20 +158,21 @@ #:getter irc-bot-port) (socket #:accessor irc-bot-socket) (actions #:allocation #:each-subclass - #:init-value (build-actions - (init irc-bot-init) + #:init-thunk (build-actions (main-loop irc-bot-main-loop) - (send-line irc-bot-send-line)))) + (handle-line handle-line) + (send-line irc-bot-send-line-action)))) (define (irc-bot-realname irc-bot) (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) @@ -187,37 +185,41 @@ (format socket "JOIN ~a~a" channel irc-eol)) (irc-bot-channels irc-bot)) - (<- irc-bot (actor-id irc-bot) 'main-loop)) + (<- (actor-id irc-bot) 'main-loop)) + +(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 - (<- irc-bot (actor-id irc-bot) 'main-loop)))) - -(define* (irc-bot-send-line irc-bot message - channel line #:key emote?) + (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?) + "Action handler for sending lines. Real behavior happens in +irc-bot-send-line." + (irc-bot-send-line irc-bot channel line #:emote? emote?)) + +(define* (irc-bot-send-line irc-bot channel line #:key emote?) ;; TODO: emote? handling (format (irc-bot-socket irc-bot) "PRIVMSG ~a :~a~a" channel line irc-eol)) + ;;; Likely-to-be-overridden generic methods (define-method (dispatch-raw-line (irc-bot ) raw-line) @@ -232,12 +234,13 @@ (receive (channel-name line-text emote?) (condense-privmsg-line line-params) (let ((username (irc-line-username line-prefix))) - (handle-line irc-bot username channel-name - line-text emote?)))) + (<- (actor-id irc-bot) 'handle-line + username channel-name + line-text emote?)))) (_ (handle-misc-input irc-bot raw-line))))) -(define-method (handle-line (irc-bot ) username channel-name - line-text emote?) +(define-method (handle-line (irc-bot ) message + username channel-name line-text emote?) (echo-message irc-bot username channel-name line-text emote?)) (define-method (handle-misc-input (irc-bot ) raw-line)