diff options
| author | Scott Ostler <sostler@deathmachine.local> | 2010-03-11 08:02:51 -0500 |
|---|---|---|
| committer | Scott Ostler <sostler@deathmachine.local> | 2010-03-11 08:02:51 -0500 |
| commit | 7d969b406bc472f86617df9697ad19f6dd15008d (patch) | |
| tree | ad0fb996fde2b59f4a14037e7ffd3b80084a6011 /src | |
| parent | 3d83db95469600000f4fbc1337bfc6aac9efd9a4 (diff) | |
| parent | fefadd9fb388e04c2ecc4b9757138c097572e2d1 (diff) | |
Merge site.clj
Diffstat (limited to 'src')
| -rwxr-xr-x | src/site.clj | 62 |
1 files changed, 50 insertions, 12 deletions
diff --git a/src/site.clj b/src/site.clj index d05686b..9a1ac79 100755 --- a/src/site.clj +++ b/src/site.clj @@ -81,7 +81,7 @@ (defn today [] (.format YYYYMMDD-format (new Date))) -(def formatter (new SimpleDateFormat "h:mm EEE M/d")) +(def formatter (new SimpleDateFormat "h:mm a EEE M/d")) (defn non-empty-string? [s] (and s (> (count s) 0))) @@ -134,6 +134,9 @@ ;; Output +(defn stringify-and-escape [m] + (zipmap (map name (keys m)) (map escape-html (vals m)))) + (defn process-message-for-json [d] (assoc d :created_on (.getTime (d :created_on)))) @@ -366,7 +369,7 @@ (with-connection *db* (update-values "users" ["user_id = ?" user-id] {attr val}))) -(defn update-avatar [session url] +(defn update-avatar [session url] (update-user-db (session :user_id) "avatar" url) [(session-assoc :avatar url) (resp-success url)]) @@ -385,23 +388,57 @@ ;; Directory +(def *directory-agent* (agent nil)) +(def *directory-listing* (ref [])) (def *per-directory-page* 25) -(def *update-directory* true) -(def *update-directory-ms* (* 60 60 1000)) +(def *run-update-directory* true) +(def *update-directory-sleep-ms* (* 60 60 1000)) (defn directory-search [offset] - (let [qry (str "SELECT u.nick, u.avatar, m.content " + (let [directory @*directory-listing* + users (subvec directory + (* offset *per-directory-page*) + (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)")] + (when (> (count user-ids) 0) + (let [res (do-select [qry]) + keys (map :user_id res) + dict (zipmap keys res)] + (map (fn [u] + (let [u-id (u :user_id)] + (stringify-and-escape (merge u (dict u-id))))) + users))))) + +(defn update-directory! [] + (let [qry (str "SELECT u.user_id, COUNT(m) as cnt " "FROM users u, messages m " - "WHERE m.message_id = " - " (SELECT n.message_id FROM messages n " - " WHERE n.user_id = u.user_id ORDER BY n.created_on DESC LIMIT 1) " - "ORDER BY (SELECT COUNT(*) FROM messages where user_id = u.user_id) " - "LIMIT ? OFFSET ?")] - (do-select [qry *per-directory-page* (* offset *per-directory-page*)]))) + "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*) + (when *run-update-directory* + (send *directory-agent* #'update-directory-agent-func)) + x) + +(defn start-directory-updater! [] + (send *directory-agent* update-directory-agent-func)) (defn directory [session offset] (let [st (fetch-template "directory" session) - users (to-array (map process-directory-listing (directory-search offset)))] + users (to-array (directory-search offset))] (.setAttribute st "users" users) (cond (= offset 0) (.setAttribute st "prev" false) (= offset 1) (.setAttribute st "prev" "") @@ -825,4 +862,5 @@ (start-user-flusher!) (start-session-pruner!) +(start-directory-updater!) (start-server (options :port))
\ No newline at end of file |
