summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Allan Webber <cwebber@dustycloud.org>2017-01-06 15:58:16 -0600
committerChristopher Allan Webber <cwebber@dustycloud.org>2017-01-06 15:58:16 -0600
commit8a163053ad2008ef8be013224a8fd15b96287bdf (patch)
tree89baef47db5e12d16aa628ae093d5153708a90d1
parent83296548874c931ee51280571292b46339aea32b (diff)
download8sync-8a163053ad2008ef8be013224a8fd15b96287bdf.tar.gz
irc: Convert handle-line to a message handler.
* 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.
-rwxr-xr-x8sync/systems/irc.scm10
-rwxr-xr-xdemos/ircbot.scm4
-rw-r--r--doc/8sync-new-manual.org33
3 files changed, 27 insertions, 20 deletions
diff --git a/8sync/systems/irc.scm b/8sync/systems/irc.scm
index e6ad361..a3c5815 100755
--- a/8sync/systems/irc.scm
+++ b/8sync/systems/irc.scm
@@ -167,6 +167,7 @@
(*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)
diff --git a/demos/ircbot.scm b/demos/ircbot.scm
index 6f32d61..22d2a1d 100755
--- a/demos/ircbot.scm
+++ b/demos/ircbot.scm
@@ -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)
diff --git a/doc/8sync-new-manual.org b/doc/8sync-new-manual.org
index 3c81bc8..2545b16 100644
--- a/doc/8sync-new-manual.org
+++ b/doc/8sync-new-manual.org
@@ -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