irc: Remove import of (8sync agenda) module.
[8sync.git] / 8sync / systems / irc.scm
index 40d02eb6eb1a6a34c4464e43e25d7fb15c9fd9f5..1ca32439113c18928dcd231ad1a4053d711b2f82 100755 (executable)
@@ -1,9 +1,5 @@
-#!/usr/bin/guile \
--e main -s
-!#
-
 ;;; 8sync --- Asynchronous programming for Guile
-;;; Copyright (C) 2015 Christopher Allan Webber <cwebber@dustycloud.org>
+;;; Copyright © 2015, 2016, 2017 Christopher Allan Webber <cwebber@dustycloud.org>
 ;;;
 ;;; 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)
         #: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)
+                         (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 <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)
 
   (<- (actor-id irc-bot) 'main-loop))
 
+(define-method (actor-cleanup! (irc-bot <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?)
@@ -240,12 +234,13 @@ 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 <irc-bot>) username channel-name
-                                    line-text emote?)
+(define-method (handle-line (irc-bot <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 <irc-bot>) raw-line)