irc: Convert handle-line to a message handler.
authorChristopher Allan Webber <cwebber@dustycloud.org>
Fri, 6 Jan 2017 21:58:16 +0000 (15:58 -0600)
committerChristopher Allan Webber <cwebber@dustycloud.org>
Fri, 6 Jan 2017 21:58:16 +0000 (15:58 -0600)
* 8sync/systems/irc.scm (<irc-bot>): Add 'handle-line action handler,
which points to handle-line generic.
(dispatch-raw-line): Send message to our own actor to call handle-line.
(handle-line): Convert to be an action handler.

* demos/ircbot.scm:
* doc/8sync-new-manual.org: Update implementers of handle-line generic
method.

8sync/systems/irc.scm
demos/ircbot.scm
doc/8sync-new-manual.org

index e6ad361ae322cfa7bc8308629c24840f8f3b173d..a3c5815b9aa081ca26c7429074c720019471eb2a 100755 (executable)
                          (*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)
@@ -244,12 +245,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)
index 6f32d61de746f07f3db3240d7f6144ec96ad06eb..22d2a1d3a386a35f81a11662b8428c7a5d8ccc75 100755 (executable)
@@ -30,8 +30,8 @@
 
 (define-class <my-irc-bot> (<irc-bot>))
 
-(define-method (handle-line (irc-bot <my-irc-bot>) speaker channel
-                            line emote?)
+(define-method (handle-line (irc-bot <my-irc-bot>) message
+                            speaker channel line emote?)
   (define my-name (irc-bot-username irc-bot))
   (define (looks-like-me? str)
     (or (equal? str my-name)
index 3c81bc8499d9bb665d73ba2db8276a28866a77c2..2545b1643e0f1323cc90accf2e5eaec58b790218 100644 (file)
@@ -103,8 +103,8 @@ Now we need to add our bot.  Initially, it won't do much.
 #+BEGIN_SRC scheme
   (define-class <my-irc-bot> (<irc-bot>))
 
-  (define-method (handle-line (irc-bot <my-irc-bot>) speaker channel
-                              line emote?)
+  (define-method (handle-line (irc-bot <my-irc-bot>) message
+                              speaker channel line emote?)
     (if emote?
         (format #t "~a emoted ~s in channel ~a\n"
                 speaker line channel)
@@ -117,6 +117,11 @@ This is an 8sync actor.
 (8sync uses GOOPS to define actors.)
 We extended the handle-line generic method, so this is the code that
 will be called whenever the IRC bot "hears" anything.
+This method is itself an action handler, hence the second argument
+for =message=, which we can ignore for now.
+Pleasantly, the message's argument body is passed in as the rest of
+the arguments.
+
 For now the code is pretty basic: it just outputs whatever it "hears"
 from a user in a channel to the current output port.
 Pretty boring!
@@ -174,8 +179,8 @@ Let's get it to echo whatever we say back to us.
 Change handle-line to this:
 
 #+BEGIN_SRC scheme
-  (define-method (handle-line (irc-bot <my-irc-bot>) speaker channel
-                              line emote?)
+  (define-method (handle-line (irc-bot <my-irc-bot>) message
+                              speaker channel line emote?)
     (<- (actor-id irc-bot) 'send-line channel
         (format #f "Bawwwwk! ~a says: ~a" speaker line)))
 #+END_SRC
@@ -241,8 +246,8 @@ Indeed, we do have such a method, so we /could/ rewrite handle-line
 like so:
 
 #+BEGIN_SRC scheme
-  (define-method (handle-line (irc-bot <my-irc-bot>) speaker channel
-                              line emote?)
+  (define-method (handle-line (irc-bot <my-irc-bot>) message
+                              speaker channel line emote?)
     (irc-bot-send-line irc-bot channel
                        (format #f "Bawwwwk! ~a says: ~a" speaker line)))
 #+END_SRC
@@ -269,8 +274,8 @@ Whee, that looks like fun!
 To implement it, we're going to pull out Guile's pattern matcher.
 
 #+BEGIN_SRC scheme
-  (define-method (handle-line (irc-bot <my-irc-bot>) speaker channel
-                              line emote?)
+  (define-method (handle-line (irc-bot <my-irc-bot>) message
+                              speaker channel line emote?)
     (define my-name (irc-bot-username irc-bot))
     (define (looks-like-me? str)
       (or (equal? str my-name)
@@ -306,8 +311,8 @@ If you're getting the sense that we could make this a bit less wordy,
 you're right:
 
 #+BEGIN_SRC scheme
-  (define-method (handle-line (irc-bot <my-irc-bot>) speaker channel
-                              line emote?)
+  (define-method (handle-line (irc-bot <my-irc-bot>) message
+                              speaker channel line emote?)
     (define my-name (irc-bot-username irc-bot))
     (define (looks-like-me? str)
       (or (equal? str my-name)
@@ -929,8 +934,8 @@ Edit the respond section to see what channel it's really sending
 things to:
 
 #+BEGIN_SRC scheme
-  (define-method (handle-line (irc-bot <my-irc-bot>) speaker channel
-                              line emote?)
+  (define-method (handle-line (irc-bot <my-irc-bot>) message
+                              speaker channel line emote?)
     ;; [... snip ...]
     (define (respond respond-line)
       (<- (actor-id irc-bot) 'send-line (pk 'channel channel)
@@ -959,8 +964,8 @@ to looks like our own username that we respond back to the sender.
 (We can remove the pk now that we know what's going on.)
 
 #+BEGIN_SRC scheme
-  (define-method (handle-line (irc-bot <my-irc-bot>) speaker channel
-                              line emote?)
+  (define-method (handle-line (irc-bot <my-irc-bot>) message
+                              speaker channel line emote?)
     ;; [... snip ...]
     (define (respond respond-line)
       (<- (actor-id irc-bot) 'send-line