From d6c8d8ab019721ba47a289de97c95e9786dd5ded Mon Sep 17 00:00:00 2001 From: Scott Ostler Date: Mon, 21 Feb 2011 23:28:46 -0500 Subject: sostler add favorite to frontpage --- src/datalayer.clj | 14 ++++--- src/multikey_cache.clj | 15 ++++--- src/site.clj | 4 +- src/tags.clj | 5 +-- src/utils.clj | 5 +++ static/js/pichat.js | 83 +++++++++++++++++++++---------------- template/frontpage.st | 6 +-- template/frontpage_share_buttons.st | 10 +++++ template/hall_log_dump.st | 17 +++----- 9 files changed, 93 insertions(+), 66 deletions(-) create mode 100644 template/frontpage_share_buttons.st diff --git a/src/datalayer.clj b/src/datalayer.clj index c74315a..56d5a60 100644 --- a/src/datalayer.clj +++ b/src/datalayer.clj @@ -85,7 +85,8 @@ WHERE u.nick = ANY(?)" (def message-cache-size 50000) (def message-cache (multikey-lru-cache fetch-messages-by-id-uncached - message-cache-size)) + message-cache-size + to-int)) (defn fetch-messages-by-id [m-ids] (get-keys message-cache m-ids)) @@ -154,14 +155,17 @@ WHERE u.nick = ANY(?)" {symbol (.getElement t) :score (int (.getScore t))})) -(defn fetch-redis-daily-hall [date-str offset num] +(defn fetch-redis-daily-hall [date-str offset num user-id] (let [msg-ids (fetch-redis-zset (redis-daily-hall-key date-str) :message_id offset num) - full-msgs (fetch-messages-by-id (map :message_id msg-ids))] - (for [[info full] (map list msg-ids full-msgs)] - (assoc full :score (:score info))))) + full-msgs (fetch-messages-by-id (map :message_id msg-ids)) + full-msgs (for [[info full] (map list msg-ids full-msgs)] + (assoc full :score (:score info)))] + (if user-id + (tags/add-user-favs-to-msgs full-msgs user-id) + full-msgs))) (defn fetch-redis-directory [page num] (vec diff --git a/src/multikey_cache.clj b/src/multikey_cache.clj index 74822a8..ac462ca 100644 --- a/src/multikey_cache.clj +++ b/src/multikey_cache.clj @@ -5,14 +5,16 @@ cache-dot-clj.cache )) -(defn multikey-lru-cache [f max-size] - {:f f - :lru (java.util.Collections/synchronizedMap (LRUMap. max-size)) +(defn multikey-lru-cache [func max-size canonicalizer] + {:func func + :lru (java.util.Collections/synchronizedMap (LRUMap. max-size)) + :canonicalizer canonicalizer }) (defn get-keys [c keys] - (let [f (:f c) + (let [f (:func c) lru (:lru c) + keys (map (:canonicalizer c) keys) uncached (filter (complement #(.containsKey lru %)) keys)] (when-not (empty? uncached) (doseq [[k v] (map list uncached (f uncached))] @@ -23,8 +25,9 @@ (first (get-keys c [key]))) (defn has-key [c key] - (.containsKey (:lru c) key)) + (.containsKey (:lru c) + ((:canonicalizer c) key))) (defn invalidate-key [c key] - (.remove (:lru c) key) + (.remove (:lru c) ((:canonicalizer c) key)) nil) diff --git a/src/site.clj b/src/site.clj index 2e1bfe8..98524d4 100644 --- a/src/site.clj +++ b/src/site.clj @@ -196,7 +196,7 @@ (let [st (fetch-template "frontpage" session) date-str (format-yyyymmdd (Date.)) dumps (map process-message-for-output - (fetch-redis-daily-hall date-str 0 20))] + (fetch-redis-daily-hall date-str 0 20 (:user_id session)))] (.setAttribute st "dumps" dumps) (.toString st))) @@ -788,8 +788,8 @@ WHERE user_id IN (let [nick (session :nick) user-id (session :user_id) msg-id (params :message_id) - tag (validate-tag (params :tag)) msg (fetch-message-by-id msg-id) + tag (validate-tag (params :tag)) access (or (is-vip? session) (not (:admin_only msg)))] (cond (not msg) (resp-error "NO_MSG") diff --git a/src/tags.clj b/src/tags.clj index 76bc762..19b2531 100644 --- a/src/tags.clj +++ b/src/tags.clj @@ -86,9 +86,8 @@ WHERE EXISTS (sql-array "int" (map :message_id msgs)) user-id])))] (for [m msgs] - (if (contains? faved-ids (:message_id m)) - (assoc m :favorited true) - m)))) + (assoc m :favorited + (contains? faved-ids (:message_id m)))))) (defn explain-query [query] (str "EXPLAIN ANALYZE " query)) diff --git a/src/utils.clj b/src/utils.clj index eb89cf1..22a0b5d 100755 --- a/src/utils.clj +++ b/src/utils.clj @@ -321,6 +321,11 @@ ;; Parsing +(defn to-int [x] + (cond (integer? x) x + (string? x) (Integer/parseInt x) + :else (throw (Exception. (str "Invalid argument " x))))) + (defn maybe-parse-int ([s] (maybe-parse-int s 0)) ([s a] diff --git a/static/js/pichat.js b/static/js/pichat.js index 24b8f0c..8d849bf 100644 --- a/static/js/pichat.js +++ b/static/js/pichat.js @@ -1124,42 +1124,55 @@ Share = { } Tag = { - "favorite": function(button){ - var message = getMessageInfo(button) - var favorited = ($(button).parents(".dump").hasClass("favorite")) ? true : false - if (favorited) { - Tag.rm(message.id, "favorite") - $(button).parents(".dump").removeClass("favorite") - if (RawFavs[message.id]) { - delete RawFavs[message.id] - paletteImageCache = false - } - } else { - Tag.add(message.id, "favorite") - $(button).parents(".dump").addClass("favorite") - if (RawFavs && MessageContentCache[message.id]) { // chat ui stuff - if ($("#palette-button").css("display") == "none") - paletteButtonShowAnim() - RawFavs[message.id] = MessageContentCache[message.id] - paletteImageCache = false - } + "favorite": function(button) { + var message = getMessageInfo(button); + var favorited = $(button).parents(".dump").hasClass("favorite"); + if (favorited) { + Tag.rm(message.id, "favorite"); + $(button).parents(".dump").removeClass("favorite"); + if (RawFavs[message.id]) { + delete RawFavs[message.id]; + paletteImageCache = false; + } + } else { + Tag.add(message.id, "favorite"); + $(button).parents(".dump").addClass("favorite"); + if (RawFavs && MessageContentCache[message.id]) { // chat ui stuff + if ($("#palette-button").css("display") == "none") + paletteButtonShowAnim(); + RawFavs[message.id] = MessageContentCache[message.id]; + paletteImageCache = false; + } + } + }, + "add": function(message_id, tag) { + Tag.ajax("/cmd/tag/add", {"message_id": message_id, "tag": tag}); + }, + "rm": function(message_id, tag) { + Tag.ajax("/cmd/tag/rm", {"message_id": message_id, "tag": tag}); + }, + "ajax": function(url, data) { + $.ajax({ + "type": 'POST', + "timeout": 5000, + "url": url, + "data": data, + "cache": false + }); + }, + "frontpage_fav": function(button) { + Tag.favorite(button); + console.log("frontpage_fav"); + var dump = $(button).parents(".dump"); + var $score = dump.find('.hallscore'); + var inc = dump.hasClass("favorite") ? 1 : -1; + var oldScore = parseInt($score.text(), 10); + console.log($score, oldScore + inc); + $score.text(oldScore + inc); + $score.animate({ 'font-size': '60px' }, 250, function() { + $score.animate({ 'font-size': '40px' }, 250); + }); } - }, - "add": function(message_id, tag){ - Tag.ajax("/cmd/tag/add", {"message_id": message_id, "tag": tag}) - }, - "rm": function(message_id, tag){ - Tag.ajax("/cmd/tag/rm", {"message_id": message_id, "tag": tag}) - }, - "ajax": function(url, data) { - $.ajax({ - "type": 'POST', - "timeout": 5000, - "url": url, - "data": data, - "cache": false - }); - } } /* diff --git a/template/frontpage.st b/template/frontpage.st index f75f9db..be10d14 100644 --- a/template/frontpage.st +++ b/template/frontpage.st @@ -104,7 +104,7 @@ z-index:4; .thumb.favorite { position: absolute; - margin-left: 40px; + margin-left: 5px; margin-top: 0px; height: 27px; width: 27px;z-index:4; @@ -133,9 +133,9 @@ z-index:4; -moz-box-shadow:#777 0 0 0 1px; -webkit-box-shadow:#777 0 0 0 1px; text-shadow:rgba(0,0,0,.4) 0 1px 0;} -#hallscore{margin-right:-20px;color:#fff;text-align:center;margin-top:-20px;float:right;font-size:40px;z-index:1;padding:6px;background-image:url('/static/img/hallheart.png');background-position:top left;font-style: oblique;font-weight:100;height:50px;width:50px;text-shadow:-1px 1px 0px #000;line-height:37px;text-indent:4px; +.hallscore{margin-right:-20px;color:#fff;text-align:center;margin-top:-20px;float:right;font-size:40px;z-index:1;padding:6px;background-image:url('/static/img/hallheart.png');background-position:top left;font-style: oblique;font-weight:100;height:50px;width:50px;text-shadow:-1px 1px 0px #000;line-height:37px;text-indent:4px; } -#hallnick{font-size:16px;} +.hallnick{font-size:16px;} #login-container { float: right; diff --git a/template/frontpage_share_buttons.st b/template/frontpage_share_buttons.st new file mode 100644 index 0000000..003795e --- /dev/null +++ b/template/frontpage_share_buttons.st @@ -0,0 +1,10 @@ + + +$if(dump.favorited)$ + +$else$ +
+ +
+$endif$ +
diff --git a/template/hall_log_dump.st b/template/hall_log_dump.st index 0056e6f..9cde345 100644 --- a/template/hall_log_dump.st +++ b/template/hall_log_dump.st @@ -1,13 +1,6 @@ -$if(dump.ztags)$ -
-$else$ -
-$endif$ - - - $dump.nick$ $if(dump.score)$ $dump.score$$endif$ -
$dump.content$
-
- -$share_buttons()$ +
+ $dump.nick$$if(dump.score)$$dump.score$$endif$ +
$dump.content$
+
+ $frontpage_share_buttons()$
-- cgit v1.2.3-70-g09d2