summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorScott Ostler <sostler@deathmachine.local>2010-03-11 08:02:51 -0500
committerScott Ostler <sostler@deathmachine.local>2010-03-11 08:02:51 -0500
commit7d969b406bc472f86617df9697ad19f6dd15008d (patch)
treead0fb996fde2b59f4a14037e7ffd3b80084a6011 /src
parent3d83db95469600000f4fbc1337bfc6aac9efd9a4 (diff)
parentfefadd9fb388e04c2ecc4b9757138c097572e2d1 (diff)
Merge site.clj
Diffstat (limited to 'src')
-rwxr-xr-xsrc/site.clj62
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