summaryrefslogtreecommitdiff
path: root/src/datalayer.clj
diff options
context:
space:
mode:
Diffstat (limited to 'src/datalayer.clj')
-rw-r--r--src/datalayer.clj68
1 files changed, 66 insertions, 2 deletions
diff --git a/src/datalayer.clj b/src/datalayer.clj
index 38a597e..0d328b6 100644
--- a/src/datalayer.clj
+++ b/src/datalayer.clj
@@ -2,6 +2,7 @@
(:require redis
tags)
(:use config
+ jedis
utils))
@@ -28,14 +29,42 @@ WHERE u.user_id = ANY(?)"
user-id)
", false AS favorited")))
+(defn recent-posts-nick-query [user-id]
+ (format "
+SELECT u.user_id, u.nick, u.avatar,
+ m.content, m.message_id%s
+FROM users u
+LEFT JOIN messages m on m.message_id =
+ (SELECT message_id FROM messages
+ WHERE user_id = u.user_id
+ AND is_image
+ AND room_id IN (SELECT room_id from rooms where admin_only = false)
+ ORDER BY created_on desc LIMIT 1)
+WHERE u.nick = ANY(?)"
+ (if user-id
+ (format
+ ",
+ EXISTS (SELECT 1 FROM tags
+ WHERE tag = 'favorite' AND user_id = %s AND message_id = m.message_id) AS favorited"
+ user-id)
+ ", false AS favorited")))
+
(defn lookup-recent-posts [user-tag-id user-ids]
(do-select [(recent-posts-query user-tag-id)
(sql-array "int" user-ids)]))
-(defn lookup-recent-posts-tagless [user-tag-id user-ids]
+(defn lookup-recent-posts-tagless [user-ids]
(do-select [(recent-posts-query nil)
(sql-array "int" user-ids)]))
+(defn lookup-recent-posts-by-nicks [user-tag-id nicks]
+ (do-select [(recent-posts-nick-query user-tag-id)
+ (sql-array "varchar" nicks)]))
+
+(defn lookup-recent-posts-tagless-by-nicks [nicks]
+ (do-select [(recent-posts-nick-query nil)
+ (sql-array "text" nicks)]))
+
(defn fetch-message-by-id [m-id]
(let [query "SELECT m.message_id, m.content, m.created_on, m.user_id,
u.nick, u.avatar, r.key, r.admin_only
@@ -63,7 +92,7 @@ order by count desc limit ? offset ?")
(defn fetch-popular-dumps [nick viewer-nick]
(for [d (do-select [popular-dumps-qry nick 40 0])]
- (let [favers (vec (.getArray (:user_nicks d)))]
+ (let [favers (.getArray (:user_nicks d))]
(assoc d
:favers favers
:favorited (some #(= % viewer-nick) favers)))))
@@ -75,3 +104,38 @@ order by count desc limit ? offset ?")
msg-ids (map maybe-parse-int msg-ids)]
(if-not (empty? msg-ids)
(tags/fetch-dumps-by-ids msg-ids viewer-nick))))
+
+
+;;;; Redis Favscores
+
+(defn fetch-redis-directory [offset num]
+ (vec
+ (for [t (with-jedis
+ #(.zrevrangeWithScores % "favscores" offset (dec num)))]
+ {:nick (.getElement t)
+ :score (int (.getScore t))})))
+
+(defn fetch-redis-favscore [nick]
+ (maybe-parse-int
+ (redis/with-server redis-server
+ (redis/zscore "favscores" (lower-case nick)))
+ 0))
+
+(defn incrby-redis-favscore! [nick msg-id inc]
+ (let [msg-id (str msg-id)
+ inc (double inc)]
+ (with-jedis
+ #(doto %
+ (.zincrby "favscores" inc (lower-case nick))
+ (.zincrby (str "popular:" nick) inc msg-id)
+ (.zincrby "hall" inc msg-id)))))
+
+
+;;;; Redis Hall of Fame
+
+(defn fetch-redis-hall [viewer-nick]
+ (let [ids (map maybe-parse-int
+ (redis/with-server redis-server
+ (redis/zrevrange "hall" 0 (dec num-hall-dumps))))]
+ (if-not (empty? ids)
+ (tags/fetch-dumps-by-ids ids viewer-nick))))