summaryrefslogtreecommitdiff
path: root/src/datalayer.clj
diff options
context:
space:
mode:
authorScott Ostler <sbsotler@gmail.com>2010-11-29 01:15:49 -0500
committerScott Ostler <sbsotler@gmail.com>2010-11-29 01:15:49 -0500
commitdd46cb29fa939546908db15fc92491bc49f3130f (patch)
tree50b8f74086728540cbc49249d4b98aacb9040d12 /src/datalayer.clj
parentd82ee6e32595edef8b7c5782f72eacac24d8a0c2 (diff)
Commit initial vip-only direct messaging
Diffstat (limited to 'src/datalayer.clj')
-rw-r--r--src/datalayer.clj70
1 files changed, 67 insertions, 3 deletions
diff --git a/src/datalayer.clj b/src/datalayer.clj
index 139274b..28ef3bf 100644
--- a/src/datalayer.clj
+++ b/src/datalayer.clj
@@ -1,8 +1,13 @@
(ns datalayer
(:require redis
tags)
- (:use config
+ (:use clojure.contrib.sql
+ clojure.contrib.json.write
+ clojure.contrib.json.read
+ config
jedis
+ message
+ user
utils))
@@ -74,8 +79,6 @@ WHERE u.nick = ANY(?)"
AND m.message_id = ?"]
(first (do-select [query (maybe-parse-int m-id -1)]))))
-
-
;;;; Popular Posts
(def popular-dumps-qry "
@@ -145,3 +148,64 @@ order by count desc limit ? offset ?")
(redis/zrevrange "hall" 0 (dec num-hall-dumps))))]
(if-not (empty? ids)
(tags/fetch-dumps-by-ids ids viewer-nick))))
+
+;;;; Message insertion
+
+(def msg-insert-query
+ "INSERT INTO messages (user_id, room_id, content, is_image, is_text)
+ VALUES (?, ?, ?, ?, ?) RETURNING message_id, created_on")
+
+(defn insert-message-into-postgres! [author-id room-id content is-image is-text recips]
+ (with-connection *db*
+ (transaction
+ (let [{msg-id :message_id ts :created_on}
+ (first
+ (do-select [msg-insert-query
+ author-id room-id content is-image is-text]))]
+ (doseq [r recips]
+ (insert-values
+ :direct_messages
+ [:message_id :author_id :recip_id]
+ [msg-id author-id (:user_id r)]))
+ [msg-id ts]))))
+
+(defn insert-recips-into-redis! [recips author-id ts content]
+ (let [dm-json (json-str {"author_id" author-id
+ "recips" (map :nick recips)
+ "content" content})]
+ (redis/with-server redis-server
+ (redis/atomically
+ (doseq [r recips]
+ (redis/zadd (str "directmessage:" (:user_id r))
+ (.getTime ts)
+ dm-json))))))
+
+(defn insert-message! [author-id author-nick room-id content]
+ (let [msg-type (classify-msg content)
+ is-image (boolean (#{:image :mixed} msg-type))
+ is-text (boolean (#{:mixed :text} msg-type))
+ recips (get-recips content)
+ [msg-id ts] (insert-message-into-postgres! author-id
+ room-id
+ content
+ is-image
+ is-text
+ recips)]
+ (if-not (empty? recips)
+ (insert-recips-into-redis! recips author-id ts content))
+ {:author author-nick
+ :msg-id msg-id
+ :room room-id
+ :db-ts ts
+ :content content
+ :recips (map (comp lower-case :nick) recips)}))
+
+(defn fetch-private-messages [user-id]
+ (for [dm (redis/with-server redis-server
+ (redis/zrevrange (str "directmessage:" user-id) 0 40))]
+ (let [dm (read-json dm)
+ info (fetch-user-id (get dm "author_id"))]
+ {"nick" (:nick info)
+ "content" (get dm "content")
+ "recips" (get dm "recips")
+ "avatar" (:avatar info)})))