(ns logan.core
  (:require [clojure.java.io :as io]))

(defn get-log-stream [channel day]
  (-> (format "http://raynes.me/logs/irc.freenode.net/%s/%s.txt" channel day)
      (java.net.URL.)
      (.openStream)))

(defn parse-line [line]
  (re-find #"\[([:\d]+?)\] \*?(\S+?):? (.*)" line))

(defn count-day [f channel day]
  (with-open [r (io/reader (get-log-stream channel day))]
    (reduce f {} (map parse-line (line-seq r)))))

(defn days-for [channel]
  (->> (slurp (str "http://raynes.me/logs/irc.freenode.net/" channel))
       (re-seq #"href=\"([-\d]+)\.txt\"")
       (map second)))

(defn count-channel [f channel]
  (apply merge-with + (map (partial count-day f channel) (days-for channel))))

(defn nick-freqs [freqs [line time nick message]]
  (update-in freqs [nick] (fnil inc 0)))

(def nick-freqs-for-channel (partial count-channel nick-freqs))

;;; Example:
;; (doseq [[nick count] (sort-by val (nick-freqs-for-channel "leiningen"))]
;;   (println nick "-" count))

Generated by Phil Hagelberg using scpaste at Thu May 17 16:52:02 2012. PDT. (original)