X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=demos%2Fircbot.scm;h=350611138924e7a58254875e67afee5d1e21f768;hb=0d10b58e73e1ef034b2f1b47fdd31b4ff45d3ce3;hp=a72ae40649e14a58bf2d113fa49296d627e35314;hpb=f6a77e5e588057731d5c4f98ae575a20936d4415;p=8sync.git diff --git a/demos/ircbot.scm b/demos/ircbot.scm index a72ae40..3506111 100755 --- a/demos/ircbot.scm +++ b/demos/ircbot.scm @@ -1,9 +1,9 @@ -#!/usr/bin/guile \ +#! /usr/bin/env guile \ -e main -s !# ;;; 8sync --- Asynchronous programming for Guile -;;; Copyright (C) 2015 Christopher Allan Webber +;;; Copyright © 2015, 2016, 2017 Christopher Allan Webber ;;; ;;; This file is part of 8sync. ;;; @@ -20,36 +20,123 @@ ;;; You should have received a copy of the GNU Lesser General Public ;;; License along with 8sync. If not, see . -(use-modules (eightsync systems irc) - (eightsync agenda) +(use-modules (8sync) + (8sync contrib irc) + (8sync systems irc) + (8sync repl) + (oop goops) + (srfi srfi-37) + (ice-9 format) (ice-9 match)) -(define (handle-message socket my-name speaker - channel message is-action) +(define-class ()) + +(define-method (handle-message (irc-bot ) message) + (define my-name (irc-bot-username irc-bot)) (define (looks-like-me? str) (or (equal? str my-name) (equal? str (string-concatenate (list my-name ":"))))) - (match (string-split message #\space) - (((? looks-like-me? _) action action-args ...) - (match action - ("botsnack" - (irc-format socket "PRIVMSG ~a :Yippie! *does a dance!*" channel)) - ((or "hello" "hello!" "hello." "greetings" "greetings." "greetings!" - "hei" "hei." "hei!") - (irc-format socket "PRIVMSG ~a :Oh hi ~a!" channel speaker)) - ;; Add yours here + + (match message + ((and ($ ) + (= irc:message-line line) + (= irc:message-command 'PRIVMSG) + (= irc:message-speaker speaker) + (= irc:message-channel channel) + (= irc:message-message message) + (= irc:message-emote? emote?)) + + (match (string-split message #\space) + (((? looks-like-me? _) action action-args ...) + (match action + ;; The classic botsnack! + ("botsnack" + (<- (actor-id irc-bot) 'send-line channel + "Yippie! *does a dance!*")) + ;; Return greeting + ((or "hello" "hello!" "hello." "greetings" "greetings." "greetings!" + "hei" "hei." "hei!" "hi" "hi!") + (<- (actor-id irc-bot) 'send-line channel + (format #f "Oh hi ~a!" speaker))) + + ;; ---> Add yours here <--- + + ;; Default + (_ + (<- (actor-id irc-bot) 'send-line channel + "*stupid puppy look*")))) + ;; Otherwise... just spit the output to current-output-port or whatever (_ - (irc-format socket "PRIVMSG ~a :*stupid puppy look*" channel)))) - (_ - (cond - (is-action - (format #t "~a emoted ~s in channel ~a\n" - speaker message channel)) - (else - (format #t "~a said ~s in channel ~a\n" - speaker message channel)))))) - -(define main - (make-irc-bot-cli (make-handle-line - #:handle-privmsg (wrap-apply handle-message)))) + (if emote? + (format #t "~a emoted ~s in channel ~a\n" + speaker message channel) + (format #t "~a said ~s in channel ~a\n" + speaker message channel))))) + (_ #f))) + + +(define (display-help scriptname) + (format #t "Usage: ~a [OPTION] username" scriptname) + (display " + -h, --help display this text + --server=SERVER-NAME connect to SERVER-NAME + defaults to \"irc.freenode.net\" + --channels=CHANNEL1,CHANNEL2 + join comma-separated list of channels on connect + defaults to \"##botchat\"") + (newline)) + +(define (parse-args scriptname args) + (args-fold (cdr args) + (list (option '(#\h "help") #f #f + (lambda _ + (display-help scriptname) + (exit 0))) + (option '("server") #t #f + (lambda (opt name arg result) + `(#:server ,arg ,@result))) + (option '("channels") #t #f + (lambda (opt name arg result) + `(#:channels ,(string-split arg #\,) + ,@result))) + (option '("repl") #f #t + (lambda (opt name arg result) + `(#:repl ,(or arg #t) ,@result)))) + (lambda (opt name arg result) + (format #t "Unrecognized option `~a'\n" name) + (exit 1)) + (lambda (option result) + `(#:username ,option ,@result)) + '())) + +(define* (run-bot #:key (username "examplebot") + (server "irc.freenode.net") + (channels '("##botchat")) + (repl #f)) + (define hive (make-hive)) + (define irc-bot + (bootstrap-actor* hive "irc-bot" + #:username username + #:server server + #:channels channels)) + (define repl-manager + (cond + ((string? repl) + (bootstrap-actor* hive "repl" + #:path repl)) + (repl + (bootstrap-actor* hive "repl")))) + + ;; TODO: load REPL + (run-hive hive '())) +(define (main args) + (define parsed-args (parse-args "ircbot.scm" args)) + (apply (lambda* (#:key username #:allow-other-keys) + (when (not username) + (display "Error: username not specified!") + (newline) (newline) + (display-help "ircbot.scm") + (exit 1))) + parsed-args) + (apply run-bot parsed-args))