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 | |
| parent | 6a0934931cbccbb5a4b26b1ca470d93236f47ea3 (diff) | |
Checkin
Diffstat (limited to 'src')
| -rwxr-xr-x | src/benchmark.clj | 12 | ||||
| -rw-r--r-- | src/site.clj | 52 |
2 files changed, 36 insertions, 28 deletions
diff --git a/src/benchmark.clj b/src/benchmark.clj index 3adf843..d963b74 100755 --- a/src/benchmark.clj +++ b/src/benchmark.clj @@ -53,13 +53,15 @@ (struct message-struct nick msg (System/currentTimeMillis)))) (alter users assoc-in [nick :last-seen] (System/currentTimeMillis)) "OK"))) - + +(defn out [x] + "out") (defn do-bench [] (let [r (.nextDouble random)] - (cond (< r 0.8) (json-str (refresh)) - (< r 0.9) (json-str (add-user)) - (< r 1) (json-str (post-message))))) + (cond (< r 0.8) (out (refresh)) + (< r 0.9) (out (add-user)) + (< r 1) (out (post-message))))) (defn hello-world [] "hello world!") @@ -71,4 +73,4 @@ (add-user) (run-server {:port 8080} - "/*" (servlet benchmark))
\ No newline at end of file + "/*" (servlet benchmark))
\ No newline at end of file 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"])) |
