summaryrefslogtreecommitdiff
path: root/src/site.clj
diff options
context:
space:
mode:
Diffstat (limited to 'src/site.clj')
-rw-r--r--src/site.clj52
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"]))