X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=8sync%2Fsystems%2Firc.scm;h=fff346177859e9d0125b53d4336f0dd5cc319aae;hb=HEAD;hp=e912e5fb959b9c3654d0bc06d3f839b66d755a63;hpb=3e27bb39df3dbaf65bd0581131610bfe6c824720;p=8sync.git diff --git a/8sync/systems/irc.scm b/8sync/systems/irc.scm index e912e5f..fff3461 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. ;;; @@ -33,8 +29,12 @@ #:use-module (ice-9 match) #:use-module (oop goops) #:export ( - irc-bot-username irc-bot-server irc-bot-channels - irc-bot-port irc-bot-handler + 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 default-irc-port)) @@ -157,15 +157,14 @@ (port #:init-keyword #:port #:init-value default-irc-port #:getter irc-bot-port) - (line-handler #:init-keyword #:line-handler - #:init-value (wrap-apply echo-message) - #:getter irc-bot-line-handler) (socket #:accessor irc-bot-socket) (actions #:allocation #:each-subclass - #:init-value (build-actions - (init irc-bot-init) + #:init-thunk (build-actions + (*init* irc-bot-init) + (*cleanup* irc-bot-cleanup) (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) @@ -188,12 +187,15 @@ (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 (irc-bot-cleanup irc-bot message) + (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)) - (irc-bot-dispatch-line irc-bot line) + (dispatch-raw-line irc-bot line) (cond ;; The port's been closed for some reason, so stop looping ((port-closed? socket) @@ -211,26 +213,50 @@ ;; 'done) ;; Otherwise, let's read till the next line! (else - (<- irc-bot (actor-id irc-bot) 'main-loop)))) + (<- (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)) + -(define-method (irc-bot-dispatch-line (irc-bot ) line) +;;; Likely-to-be-overridden generic methods + +(define-method (dispatch-raw-line (irc-bot ) raw-line) + "Dispatch a raw line of input" (receive (line-prefix line-command line-params) - (parse-line line) + (parse-line raw-line) (match line-command ("PING" - (display "PONG" (irc-bot-socket irc-bot))) + (display (string-append "PONG" irc-eol) + (irc-bot-socket irc-bot))) ("PRIVMSG" (receive (channel-name line-text emote?) (condense-privmsg-line line-params) (let ((username (irc-line-username line-prefix))) - ((irc-bot-line-handler irc-bot) irc-bot username - channel-name line-text emote?)))) - (_ - (display line) - (newline))))) - -(define* (irc-bot-send-line irc-bot message - channel line #:key emote?) - ;; TODO: emote? handling - (format (irc-bot-socket irc-bot) "PRIVMSG ~a :~a~a" - channel line irc-eol)) + (<- (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 ) 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) + (display raw-line) + (newline)) + +(define-method (handle-user-join (irc-bot ) user channel) + 'TODO) + +(define-method (handle-user-quit (irc-bot ) user channel) + 'TODO) +