From 1925e81cc923e4920f147f75b253bdadec64fdc9 Mon Sep 17 00:00:00 2001 From: Stephen Chang Date: Thu, 14 May 2015 19:12:45 +0000 Subject: [PATCH] add irc connection check --- irc-bot.rkt | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++ pasterack.rkt | 23 +++++----------------- 2 files changed, 59 insertions(+), 18 deletions(-) create mode 100644 irc-bot.rkt diff --git a/irc-bot.rkt b/irc-bot.rkt new file mode 100644 index 0000000..2e7f6e2 --- /dev/null +++ b/irc-bot.rkt @@ -0,0 +1,54 @@ +#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))))) + (printf "conn: ~a\n" current-irc-connection)) + +(define (join-channels) + (printf "join: ~a\n" current-irc-connection) + (for ([c irc-channels]) (irc-join-channel current-irc-connection c))) + +(define (irc-paste msg) + (printf "paste: ~a\n" current-irc-connection) + (for ([c irc-channels]) (irc-send-message current-irc-connection c msg))) + diff --git a/pasterack.rkt b/pasterack.rkt index 7a7041f..100926d 100644 --- a/pasterack.rkt +++ b/pasterack.rkt @@ -6,11 +6,7 @@ (require racket/system racket/runtime-path) (require redis data/ring-buffer) (require "pasterack-utils.rkt" "pasterack-parsing-utils.rkt" - "pasterack-test-cases.rkt") - -;; irc bot -(require irc) -(require racket/async-channel) + "pasterack-test-cases.rkt" "irc-bot.rkt") (provide/contract (start (request? . -> . response?))) @@ -43,14 +39,7 @@ (define log-file (build-path here-dir "pasterack.log")) (define log-port (open-output-file log-file #:mode 'text #:exists 'append)) -;irc bot -(define-values (irc-connection ready) -; (irc-connect "chat.freenode.net" 6667 "pasterackm" "pasterackm" "pasterack.org mirror")) - (irc-connect "chat.freenode.net" 6667 "pasterack" "pasterack" "pasterack.org")) -(sync ready) -;(define irc-channels '("#racktest")) -(define irc-channels '("#racket")) -(for ([chan irc-channels]) (irc-join-channel irc-connection chan)) +(pasterack-irc-connect) (define sample-pastes '("8953" ; Sierpinski @@ -489,11 +478,9 @@ 'views 0)) (when (exists-binding? 'irc bs) (define nick (extract-binding/single 'nick bs)) - (for ([c irc-channels]) - (irc-send-message irc-connection c - (++ (if (string=? "" nick) "" (++ nick " pasted: ")) - (if (string=? "" paste-name) "" (++ paste-name ", ")) - paste-url)))) + (irc-paste (++ (if (string=? "" nick) "" (++ nick " pasted: ")) + (if (string=? "" paste-name) "" (++ paste-name ", ")) + paste-url))) (fprintf log-port "~a\t~a\t~a\t~a\n" tm-str paste-num paste-name (request-client-ip request)) (response/xexpr