Terminal-based IRC client
This commit is contained in:
parent
eb07be548e
commit
16bd0155cc
|
@ -0,0 +1,52 @@
|
|||
#lang syndicate
|
||||
;; Terminal-based IRC client.
|
||||
|
||||
(require/activate syndicate/drivers/irc)
|
||||
(require (only-in racket/port read-bytes-line-evt))
|
||||
|
||||
(define NICK "syndicateuser")
|
||||
(define C (irc-connection "irc.freenode.net" 6667 NICK))
|
||||
|
||||
(define stdin-evt (read-bytes-line-evt (current-input-port) 'any))
|
||||
|
||||
(assertion-struct join (channel))
|
||||
|
||||
(spawn #:name 'input-handler
|
||||
(field [active-channel #f])
|
||||
(begin/dataflow
|
||||
(match (active-channel)
|
||||
[#f (printf "No destination for typed text is selected.\n")]
|
||||
[dest (printf "Typed text will go to ~a.\n" dest)]))
|
||||
(assert C)
|
||||
(stop-when (message (inbound (external-event stdin-evt (list (? eof-object? _)))))
|
||||
(printf "Goodbye!\n"))
|
||||
(on (message (inbound (external-event stdin-evt (list (? bytes? $line)))))
|
||||
(match (bytes->string/utf-8 line)
|
||||
[(pregexp #px"^/join (#.*)$" (list _ chan))
|
||||
(assert! (join chan))
|
||||
(active-channel chan)]
|
||||
[(pregexp #px"^/part( (#.*))?$" (list _ _ chan))
|
||||
(let ((chan (or chan (active-channel))))
|
||||
(retract! (join chan))
|
||||
(when (equal? (active-channel) chan)
|
||||
(active-channel #f)))]
|
||||
[(pregexp #px"^/select (.*)$" (list _ chan))
|
||||
(active-channel chan)]
|
||||
[(pregexp #px"^/" (list _))
|
||||
(printf "Bad command.\n")]
|
||||
[line
|
||||
(if (active-channel)
|
||||
(send! (irc-outbound C (active-channel) line))
|
||||
(printf "No destination for typed text is selected. Use /join or /select.\n"))]))
|
||||
(on (message (irc-inbound C $who NICK $body))
|
||||
(printf "DIRECT: ~a: ~a\n" who body)))
|
||||
|
||||
(spawn #:name 'room-monitor-factory
|
||||
(during/spawn (join $chan)
|
||||
(on-start (printf "Joining channel ~a.\n" chan))
|
||||
(on-stop (printf "Left channel ~a.\n" chan))
|
||||
(on (message (irc-inbound C $who chan $body))
|
||||
(printf "~a: ~a: ~a\n" chan who body))
|
||||
(during (irc-presence C $who chan)
|
||||
(on-start (printf "~a: ~a joined\n" chan who))
|
||||
(on-stop (printf "~a: ~a left\n" chan who)))))
|
Loading…
Reference in New Issue