diff options
| author | sostler <sbostler@gmail.com> | 2009-11-15 22:54:20 -0500 |
|---|---|---|
| committer | sostler <sbostler@gmail.com> | 2009-11-15 22:54:20 -0500 |
| commit | 31b8a27fbaa272a7990f452194912d229a3eede4 (patch) | |
| tree | 75766f72979f8db2ce9169d357422b9600d5735c /src/site.clj | |
| parent | 6a0934931cbccbb5a4b26b1ca470d93236f47ea3 (diff) | |
Checkin
Diffstat (limited to 'src/site.clj')
| -rw-r--r-- | src/site.clj | 52 |
1 files changed, 29 insertions, 23 deletions
diff --git a/src/site.clj b/src/site.clj index cce5da1..4e29e2b 100644 --- a/src/site.clj +++ b/src/site.clj @@ -8,13 +8,12 @@ (defstruct user-struct :nick :last-seen) (defstruct message-struct :nick :content :timestamp) - (def users (ref {})) (def messages (ref [])) (def run-flusher true) (def flusher-sleep-ms 4000) -(def user-timeout-ms 30000) +(def user-timeout-ms 5000) (defn swap [f] (fn [& more] (apply f (reverse more)))) @@ -38,38 +37,44 @@ (defn resp-success [message] {:status 200 :headers {} :body (json-str message)}) -(defn join-success [nick] - (alter users assoc nick (struct user-struct nick (System/currentTimeMillis))) - (let [users (sort (keys @users)) - messages (reverse (take 40 @messages)) - data {"users" users "messages" messages}] - [(session-assoc :nick nick) - (resp-success data)])) +(defn new-messages + ([since] (reverse (take-while (fn [m] (> (m :timestamp) since)) @messages))) + ([] (reverse (take 25 @messages)))) -(defn try-join [params] - (let [nick (escape-html (params :nick))] - (dosync - (if (contains? @users nick) - (resp-error "NICK_TAKEN") - (join-success nick))))) +(def random (java.util.Random.)) +(def max-user-int 1000000) + +(defn make-random-nick [] + (let [nick (str "user-" (.nextInt random max-user-int))] + (if (contains? @users nick) + (make-random-nick) + nick))) -(defn new-messages [since] - (reverse (take-while (fn [m] (> (m :timestamp) since)) @messages))) +(defn updates + ([] {"users" (keys @users) "messages" (new-messages)}) + ([since] {"users" (keys @users) "messages" (new-messages since)})) + +(defn init [session] + (let [new-nick (make-random-nick)] + (dosync + (alter users assoc new-nick + (struct user-struct new-nick (System/currentTimeMillis))) + [(session-assoc :nick new-nick) + (resp-success (assoc (updates) :nick new-nick))]))) (defn refresh [nick] (dosync (if (contains? @users nick) - (let [last-seen (get-in @users [nick :last-seen]) - user-list (sort (keys @users))] + (let [last-seen (get-in @users [nick :last-seen])] (alter users assoc-in [nick :last-seen] (System/currentTimeMillis)) - (resp-success {"messages" (new-messages last-seen) - "users" user-list})) + (resp-success (updates last-seen))) (resp-error "UNKNOWN_USER")))) + (defn msg [session params] (dosync (let [nick (session :nick) - content (escape-html (params :content)) + content (params :content) msg (struct message-struct nick content (System/currentTimeMillis))] (if (contains? @users nick) (do (alter messages (swap cons) msg) @@ -80,7 +85,8 @@ (GET "/" (serve-file "static" "index.html")) (GET "/static/*" (or (serve-file "static" (params :*)) :next)) - (GET "/join" (try-join params)) + (GET "/favicon.ico" (serve-file "static" "favicon.ico")) + (GET "/init" (init (session :nick))) (GET "/refresh" (refresh (session :nick))) (GET "/msg" (msg session params)) (ANY "*" [404 "Page not found"])) |
