Use *init* and *cleanup* in existing actors.
[8sync.git] / 8sync / systems / irc.scm
index 536c9a26ce38ff3e2002fa6b7e15f18db375625f..e6ad361ae322cfa7bc8308629c24840f8f3b173d 100755 (executable)
@@ -35,6 +35,8 @@
   #:export (<irc-bot>
             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
 
   (socket #:accessor irc-bot-socket)
   (actions #:allocation #:each-subclass
            #:init-value (build-actions
-                         (init irc-bot-init)
+                         (*init* irc-bot-init)
+                         (*cleanup* irc-bot-cleanup)
                          (main-loop irc-bot-main-loop)
-                         (send-line irc-bot-send-line))))
+                         (send-line irc-bot-send-line-action))))
 
 (define (irc-bot-realname irc-bot)
   (or (slot-ref irc-bot 'realname)
      (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))
    ;;  '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 irc-bot message
-                            channel line #:key emote?)
+(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 <irc-bot>) raw-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-handle-line irc-bot username channel-name
-                                line-text emote?))))
-      (_ (irc-bot-handle-misc-input irc-bot raw-line)))))
+           (handle-line irc-bot 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?)