diff options
Diffstat (limited to 'src/site.clj')
| -rwxr-xr-x | src/site.clj | 98 |
1 files changed, 54 insertions, 44 deletions
diff --git a/src/site.clj b/src/site.clj index fe78633..6efbd2f 100755 --- a/src/site.clj +++ b/src/site.clj @@ -15,14 +15,15 @@ clojure.contrib.sql clojure.contrib.str-utils compojure + origin-check utils cookie-login session-sweeper feed)) (def *run-flusher* true) -(def *flusher-sleep-ms* 4000) -(def *user-timeout-ms* 15000) +(def *flusher-sleep* (seconds 4)) +(def *user-timeout* (seconds 15)) (def template-group (new StringTemplateGroup "dumpfm" "template")) (.setRefreshInterval template-group 3) @@ -42,10 +43,10 @@ (dosync (let [users (room :users) now (System/currentTimeMillis) - alive? (fn [[n u]] (> (u :last-seen) (- now *user-timeout-ms*)))] + alive? (fn [[n u]] (> (u :last-seen) (- now *user-timeout*)))] (ref-set users (into {} (filter alive? @users)))))) - (Thread/sleep *flusher-sleep-ms*) + (Thread/sleep *flusher-sleep*) (when *run-flusher* (send *agent* #'flush-inactive-users!)) x) @@ -183,42 +184,42 @@ (def *dumps-per-page* 20) (defn count-messages-by-room [room-id image-only] - (let [query (str "SELECT COUNT(*) " - "FROM messages m, users u " - "WHERE room_id = ? AND m.user_id = u.user_id " - (if image-only "AND m.is_image = true " ""))] + (let [query (str "SELECT COUNT(*) + FROM messages m, users u + WHERE room_id = ? AND m.user_id = u.user_id" + (if image-only " AND m.is_image = true " ""))] (do-count [query room-id]))) (defn fetch-messages-by-room ([room-id image-only] (fetch-messages-by-room room-id image-only 0)) ([room-id image-only offset] - (let [query (str "SELECT m.content, m.message_id, m.created_on, u.nick, u.avatar " - "FROM messages m, users u " - "WHERE room_id = ? AND m.user_id = u.user_id " + (let [query (str "SELECT m.content, m.message_id, m.created_on, u.nick, u.avatar + FROM messages m, users u + WHERE room_id = ? AND m.user_id = u.user_id " (if image-only "AND m.is_image = true " "") - "ORDER BY created_on DESC " - "LIMIT " *dumps-per-page* " OFFSET ?")] - (do-select [query room-id offset])))) + "ORDER BY created_on DESC + LIMIT ? OFFSET ?")] + (do-select [query room-id *dumps-per-page* offset])))) (defn count-messages-by-nick [nick image-only] - (let [query (str "SELECT COUNT(*) " - "FROM messages m, users u, rooms r " - "WHERE m.user_id = u.user_id AND u.nick = ? " - "AND r.room_id = m.room_id AND r.admin_only = false " + (let [query (str "SELECT COUNT(*) + FROM messages m, users u, rooms r + WHERE m.user_id = u.user_id AND u.nick = ? + AND r.room_id = m.room_id AND r.admin_only = false " (if image-only "AND m.is_image = true " ""))] (do-count [query nick]))) (defn fetch-messages-by-nick ([nick image-only] (fetch-messages-by-nick nick image-only 0)) ([nick image-only offset] - (let [query (str "SELECT m.content, m.created_on, u.nick, u.avatar " - "FROM messages m, users u, rooms r " - "WHERE m.user_id = u.user_id AND u.nick = ? " - "AND r.room_id = m.room_id AND r.admin_only = false " + (let [query (str "SELECT m.content, m.created_on, u.nick, u.avatar + FROM messages m, users u, rooms r + WHERE m.user_id = u.user_id AND u.nick = ? + AND r.room_id = m.room_id AND r.admin_only = false " (if image-only "AND m.is_image = true " "") - "ORDER BY created_on DESC " - "LIMIT " *dumps-per-page* " OFFSET ?")] - (do-select [query nick offset])))) + "ORDER BY created_on DESC + LIMIT ? OFFSET ?")] + (do-select [query nick *dumps-per-page* offset])))) (defn build-room-map-from-db [room-db] {:admin_only (room-db :admin_only) @@ -253,12 +254,13 @@ :is_admin (user-info :is_admin) :avatar (user-info :avatar)}) -(defn session-assoc-from-db +(defn session-assoc-from-db [user-info] (session-assoc :user_id (user-info :user_id) :nick (user-info :nick) :is_admin (user-info :is_admin) - :avatar (user-info :avatar))) + :avatar (user-info :avatar) + :password_login true)) ;; login-token functions @@ -392,7 +394,7 @@ (def *directory-listing* (ref [])) (def *per-directory-page* 25) (def *run-update-directory* true) -(def *update-directory-sleep-ms* (* 60 60 1000)) +(def *update-directory-sleep* (minutes 15)) (defn directory-search [offset] (let [directory @*directory-listing* @@ -401,12 +403,15 @@ (min (count directory) (* (inc offset) *per-directory-page*))) user-ids (apply str (interpose ", " (map #(%1 :user_id) users))) - qry (str "SELECT u.user_id, u.nick, u.avatar, m.content " - "FROM users u, messages m " - "WHERE u.user_id in (" user-ids ") " - "AND m.user_id = u.user_id " - "AND m.created_on = (select max(created_on) from messages " - " where user_id = u.user_id)")] + qry (str "SELECT u.user_id, u.nick, u.avatar, m.content + FROM users u, messages m + WHERE u.user_id in (" user-ids ") + AND m.user_id = u.user_id + AND m.message_id = (SELECT message_id FROM messages + WHERE user_id = u.user_id + AND room_id = 1 + AND is_image = true + ORDER BY created_on LIMIT 1)")] (when (> (count user-ids) 0) (let [res (do-select [qry]) keys (map :user_id res) @@ -414,21 +419,22 @@ (map (fn [u] (let [u-id (u :user_id)] (stringify-and-escape (merge u (dict u-id))))) - users))))) + users)) + []))) (defn update-directory! [] - (let [qry (str "SELECT u.user_id, COUNT(m) as cnt " - "FROM users u, messages m " - "WHERE u.user_id = m.user_id " - "GROUP BY u.user_id " - "ORDER BY COUNT(m) DESC") + (let [qry "SELECT u.user_id, COUNT(m) as cnt + FROM users u, messages m + WHERE u.user_id = m.user_id + GROUP BY u.user_id + ORDER BY COUNT(m) DESC" res (vec (do-select [qry]))] (dosync (ref-set *directory-listing* res)) res)) (defn update-directory-agent-func [x] (update-directory!) - (Thread/sleep *update-directory-sleep-ms*) + (Thread/sleep *update-directory-sleep*) (when *run-update-directory* (send *directory-agent* #'update-directory-agent-func)) x) @@ -436,7 +442,7 @@ (defn start-directory-updater! [] (send *directory-agent* update-directory-agent-func)) -(defn directory [session offset] +(defn directory [session offset] (let [st (fetch-template "directory" session) users (to-array (directory-search offset))] (.setAttribute st "users" users) @@ -444,8 +450,10 @@ (= offset 1) (.setAttribute st "prev" "") :else (.setAttribute st "prev" (str "/" (dec offset)))) (.setAttribute st "next" (str "/" (inc offset))) + (if (zero? (count @*directory-listing*)) + (.setAttribute st "notloaded" true)) (.toString st))) - + ;; Topics (defn valid-topic? [topic] @@ -823,11 +831,13 @@ (with-mimetypes {:mimetypes mimetypes})) (decorate pichat + (with-origin-check) (with-mimetypes {:mimetypes mimetypes}) (with-cookie-login (comp not logged-in?) make-login-token read-login-token) (with-session {:type :memory, :expires (* 60 60)})) (decorate multipart + (with-origin-check) (with-mimetypes {:mimetypes mimetypes}) (with-session {:type :memory, :expires (* 60 60)}) (with-multipart)) @@ -855,7 +865,7 @@ (def options (apply parse-command-args *command-line-args*)) +(start-server (options :port)) (start-user-flusher!) (start-session-pruner!) (start-directory-updater!) -(start-server (options :port))
\ No newline at end of file |
