52 lines
1.4 KiB
Racket
52 lines
1.4 KiB
Racket
#lang racket/base
|
|
(require irc racket/async-channel)
|
|
(provide pasterack-irc-connect irc-paste)
|
|
|
|
;; pasterack irc bot
|
|
|
|
(define MIRROR? #f)
|
|
|
|
(define FREENODE "chat.freenode.net")
|
|
(define PORT 6667)
|
|
(define NAME (if MIRROR? "pasteracktest" "pasterack"))
|
|
|
|
|
|
(define irc-channels (if MIRROR? '("#racktest") '("#racket")))
|
|
|
|
(define current-irc-connection #f)
|
|
(define current-irc-listener (thread void))
|
|
(define current-irc-monitor (thread void))
|
|
|
|
|
|
(define (irc-connect/internal)
|
|
(define-values (irc-connection ready)
|
|
(irc-connect FREENODE PORT NAME NAME NAME #:return-eof #t))
|
|
(define achan (irc-connection-incoming irc-connection))
|
|
(set! current-irc-connection irc-connection)
|
|
(set! current-irc-listener
|
|
(thread
|
|
(lambda ()
|
|
(let loop ()
|
|
(unless (eof-object? (async-channel-get achan))
|
|
(loop))))))
|
|
ready)
|
|
|
|
;; creates an irc monitor thread
|
|
(define (pasterack-irc-connect)
|
|
(set! current-irc-monitor
|
|
(thread
|
|
(lambda ()
|
|
(let loop ()
|
|
(when (thread-dead? current-irc-listener)
|
|
(sync (irc-connect/internal))
|
|
(join-channels))
|
|
(sleep 60)
|
|
(loop))))))
|
|
|
|
(define (join-channels)
|
|
(for ([c irc-channels]) (irc-join-channel current-irc-connection c)))
|
|
|
|
(define (irc-paste msg)
|
|
(for ([c irc-channels]) (irc-send-message current-irc-connection c msg)))
|
|
|