rlm@2: (ns chat.room rlm@2: (:use [clojure.contrib server-socket duck-streams str-utils]) rlm@2: (:gen-class)) rlm@2: rlm@2: rlm@2: ;; CHAT ROOMS rlm@2: rlm@2: (def rooms (ref {})) rlm@2: rlm@2: (defn get-room! "Returns the chat room with the given name, creating it if necessary." [name] rlm@2: (dosync rlm@2: (or (@rooms name) rlm@2: (let [new-room (agent '())] rlm@2: (do (alter *rooms* assoc name new-room)))))) rlm@2: rlm@2: (defn say-in-room[room message] rlm@2: (doseq [[_ output] room] rlm@2: (binding [*out* output] rlm@2: (println message)))) rlm@2: rlm@2: rlm@2: ;; USERS rlm@2: rlm@2: (defn user-join[room username output-channel] rlm@2: (conj room [username output-channel])) rlm@2: (defn user-leave[room username] rlm@2: (remove #(= (% 0) username) room)) rlm@2: rlm@2: rlm@2: (def *username* "Someone") rlm@2: (defn- join-room [room] rlm@2: (send room user-join *username* *out*) rlm@2: (send room rlm@2: )