X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=8sync%2Fsystems%2Firc.scm;h=0007de8499748d5c3ae73b806f521a8a6247eed5;hb=1542b79f05d4bb6a6f1d330270c195b711fedd28;hp=aad138d09bb62a9de32c5f6bfc1fa0614236040d;hpb=88ad8bc99a14d0037bad27ff3c576ebbabbf14f4;p=8sync.git diff --git a/8sync/systems/irc.scm b/8sync/systems/irc.scm old mode 100755 new mode 100644 index aad138d..0007de8 --- a/8sync/systems/irc.scm +++ b/8sync/systems/irc.scm @@ -1,9 +1,6 @@ -#!/usr/bin/guile \ --e main -s -!# - ;;; 8sync --- Asynchronous programming for Guile -;;; Copyright (C) 2015 Christopher Allan Webber +;;; Copyright © 2015, 2016, 2017 Christopher Allan Webber +;;; Copyright © 2023 Janneke Nieuwenhuizen ;;; ;;; This file is part of 8sync. ;;; @@ -52,11 +49,13 @@ (let* ((s (socket PF_INET SOCK_STREAM 0)) (flags (fcntl s F_GETFL)) (ip-address (inet-ntop AF_INET (car (hostent:addr-list (gethost hostname)))))) - (fcntl s F_SETFL (logior O_NONBLOCK flags)) - (connect s AF_INET - (inet-pton AF_INET ip-address) - inet-port) - s)) + (cond (s + (fcntl s F_SETFL (logior O_NONBLOCK flags)) + (connect s AF_INET (inet-pton AF_INET ip-address) inet-port) + s) + (else + (8sleep 1) + (irc-socket-setup hostname inet-port))))) (define irc-eol "\r\n") @@ -136,13 +135,13 @@ #f))))) ;;; A goofy default -(define (echo-message irc-bot speaker channel-name - line-text emote?) - "Simply echoes the message to the current-output-port." +(define* (echo-message irc-bot speaker channel-name + line-text emote? #:key (port (current-output-port))) + "Simply echoes the message to the PORT." (if emote? - (format #t "~a emoted ~s in channel ~a\n" + (format port "~a emoted ~s in channel ~a\n" speaker line-text channel-name) - (format #t "~a said ~s in channel ~a\n" + (format port "~a said ~s in channel ~a\n" speaker line-text channel-name))) @@ -163,9 +162,11 @@ #: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 + (*init* irc-bot-init) + (*cleanup* irc-bot-cleanup) (main-loop irc-bot-main-loop) + (handle-line handle-line) (send-line irc-bot-send-line-action)))) (define (irc-bot-realname irc-bot) @@ -189,7 +190,10 @@ (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)) @@ -212,7 +216,7 @@ ;; '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?) @@ -240,13 +244,15 @@ irc-bot-send-line." (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?) - (echo-message 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? + #:port (current-error-port))) (define-method (handle-misc-input (irc-bot ) raw-line) (display raw-line)