X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;ds=sidebyside;f=demos%2Firc.scm;h=7a8d2ab020e478b740699b893e12fb24cd525c00;hb=c390e803039940bf3f7337a4d3a1d7591345f58d;hp=62c241a0f381b62f3bad5ba3355b46fa7958f2e7;hpb=1c55e6d9c384c9504fb76bc64ee582d79b4827af;p=8sync.git diff --git a/demos/irc.scm b/demos/irc.scm index 62c241a..7a8d2ab 100755 --- a/demos/irc.scm +++ b/demos/irc.scm @@ -22,6 +22,7 @@ (use-modules (eightsync repl) (eightsync agenda) (ice-9 getopt-long) + (ice-9 format) (ice-9 q) (ice-9 match)) @@ -43,6 +44,40 @@ (display "Installing socket...\n") ; debugging :) (make-port-request socket #:read handler)) +(define irc-eol "\r\n") + +(define (irc-line line) + (string-concatenate (list line irc-eol))) + +(define-syntax-rule (irc-format dest format-string rest ...) + (let ((line (string-concatenate + (list (format #f format-string rest ...) + irc-eol)))) + (match dest + (#f line) + (#t (display line)) + (else + (display line dest))))) + +(define* (irc-display line #:optional dest) + (if dest + (display (irc-line line) dest) + (display (irc-line dest)))) + +(define* (handle-login socket username + #:key + (hostname "*") + (servername "*") + (realname username) + (channels '())) + (irc-format socket "USER ~a ~a ~a :~a" + username hostname servername realname) + (irc-format socket "NICK ~a" username) + (for-each + (lambda (channel) + (irc-format socket "JOIN ~a" channel)) + channels)) + (define (handle-line socket line) (display line) (newline)) @@ -67,12 +102,16 @@ irc-handler)) (define* (queue-and-start-irc-agenda! agenda socket #:key + (username "syncbot") (inet-port default-irc-port) - (handler (make-simple-irc-handler handle-line))) + (handler (make-simple-irc-handler handle-line)) + (channels '())) (dynamic-wind (lambda () #f) (lambda () (enq! (agenda-queue agenda) (wrap (install-socket socket handler))) + (enq! (agenda-queue agenda) (wrap (handle-login socket username + #:channels channels))) (start-agenda agenda)) (lambda () (display "Cleaning up...\n") @@ -91,15 +130,24 @@ ,(lambda (s) (if (string->number s) #t #f)))) (username (single-char #\u) (required? #t) (value #t)) + (channels (value #t)) (listen))) (define (main args) (let* ((options (getopt-long args option-spec)) - (server (option-ref options 'server #f)) + (hostname (option-ref options 'server #f)) (port (or (option-ref options 'port #f) default-irc-port)) (username (option-ref options 'username #f)) - (listen (option-ref options 'listen #f))) - (display `((server ,server) (port ,port) (username ,username) - (listen ,listen))) - (newline))) + (listen (option-ref options 'listen #f)) + (channels (option-ref options 'channels ""))) + (display `((server ,hostname) (port ,port) (username ,username) + (listen ,listen) (channels-split ,(string-split channels #\space)))) + (newline) + (queue-and-start-irc-agenda! + (make-agenda) + (irc-socket-setup hostname port) + #:inet-port port + #:username username + #:handler (make-simple-irc-handler handle-line) + #:channels (string-split channels #\space))))