irc: Move irc-bot code to make use of generic methods
authorChristopher Allan Webber <cwebber@dustycloud.org>
Fri, 23 Dec 2016 20:22:28 +0000 (14:22 -0600)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Fri, 23 Dec 2016 20:22:28 +0000 (14:22 -0600)
ircbot.scm demo also now makes use of subclassing.

* 8sync/systems/irc.scm (<irc-bot>): Removed line-handler field.
(irc-bot-dispatch-line): Renamed from irc-bot-dispatch-raw-line.
All callers changed.
(irc-bot-send-line): Moved position in file.
(irc-bot-handle-line): New method.
(irc-bot-handle-misc-input, irc-bot-handle-user-join)
(irc-bot-handle-user-quit): New stub methods.

* demos/ircbot.scm (<my-irc-bot>): New variable.
(irc-bot-handle-line): Now a generic method extending same named
method in 8sync/systems/irc.scm.  Previously was `handle-line'.
(run-bot): Use <my-irc-bot>.
(main): Remove debugging pk.

8sync/systems/irc.scm
demos/ircbot.scm

index e912e5fb959b9c3654d0bc06d3f839b66d755a63..01a83c8f6535526c6d0f625a73dfc5f625d7cfcc 100755 (executable)
   #:use-module (ice-9 match)
   #:use-module (oop goops)
   #:export (<irc-bot>
-            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-handle-line irc-bot-handle-misc-input
+            irc-bot-handle-user-join irc-bot-handle-user-quit
 
             default-irc-port))
 
   (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
 (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)
+  (irc-bot-dispatch-raw-line irc-bot line)
   (cond
    ;; The port's been closed for some reason, so stop looping
    ((port-closed? socket)
    (else
     (<- irc-bot (actor-id irc-bot) 'main-loop))))
 
-(define-method (irc-bot-dispatch-line (irc-bot <irc-bot>) line)
+(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))
+
+;;; Likely-to-be-overridden generic methods
+
+(define-method (irc-bot-dispatch-raw-line (irc-bot <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)))
        (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)))))
+           (irc-bot-handle-line irc-bot username channel-name
+                                line-text emote?))))
+      (_ (irc-bot-handle-misc-input irc-bot raw-line)))))
+
+(define-method (irc-bot-handle-line (irc-bot <irc-bot>) username channel-name
+                                    line-text emote?)
+  (echo-message irc-bot username channel-name line-text emote?))
+
+(define-method (irc-bot-handle-misc-input (irc-bot <irc-bot>) raw-line)
+  (display raw-line)
+  (newline))
+
+(define-method (irc-bot-handle-user-join (irc-bot <irc-bot>) user channel)
+  'TODO)
+
+(define-method (irc-bot-handle-user-quit (irc-bot <irc-bot>) user channel)
+  'TODO)
 
-(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))
index ec381f0b83ea3b03b356fdc9e3b6eaed85a270a6..bfcd723fca8f9722b014192c75d48e366dd35748 100755 (executable)
 
 (use-modules (8sync)
              (8sync systems irc)
+             (oop goops)
              (srfi srfi-37)
              (ice-9 match))
 
-(define (handle-line irc-bot speaker channel line emote?)
+(define-class <my-irc-bot> (<irc-bot>))
+
+(define-method (irc-bot-handle-line (irc-bot <my-irc-bot>) speaker channel
+                                    line emote?)
   (define my-name (irc-bot-username irc-bot))
   (define (looks-like-me? str)
     (or (equal? str my-name)
@@ -95,9 +99,7 @@
                   (repl #f))
   (define hive (make-hive))
   (define irc-bot
-    (hive-create-actor* hive <irc-bot> "irc-bot"
-                        #:line-handler handle-line
-                        ;; TODO: move these to argument parsing
+    (hive-create-actor* hive <my-irc-bot> "irc-bot"
                         #:username username
                         #:server server
                         #:channels channels))
   (ez-run-hive hive (list (bootstrap-message hive irc-bot 'init))))
 
 (define (main args)
-  (define parsed-args (parse-args "ircbot.scm" (pk 'args args)))
+  (define parsed-args (parse-args "ircbot.scm" args))
   (apply (lambda* (#:key username #:allow-other-keys)
            (when (not username)
              (display "Error: username not specified!")