diff options
author | Christopher Allan Webber <cwebber@dustycloud.org> | 2017-01-06 15:58:16 -0600 |
---|---|---|
committer | Christopher Allan Webber <cwebber@dustycloud.org> | 2017-01-06 15:58:16 -0600 |
commit | 8a163053ad2008ef8be013224a8fd15b96287bdf (patch) | |
tree | 89baef47db5e12d16aa628ae093d5153708a90d1 | |
parent | 83296548874c931ee51280571292b46339aea32b (diff) | |
download | 8sync-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-x | 8sync/systems/irc.scm | 10 | ||||
-rwxr-xr-x | demos/ircbot.scm | 4 | ||||
-rw-r--r-- | doc/8sync-new-manual.org | 33 |
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 |