diff options
Diffstat (limited to 'src/site.clj')
| -rw-r--r-- | src/site.clj | 86 |
1 files changed, 54 insertions, 32 deletions
diff --git a/src/site.clj b/src/site.clj index 45ee9e5..6c6a9dd 100644 --- a/src/site.clj +++ b/src/site.clj @@ -24,12 +24,6 @@ scheduled-agent user)) -(defstruct user-struct :nick :user_id :avatar :last-seen) - -(defn user-struct-from-session [session] - (struct user-struct (session :nick) (session :user_id) (session :avatar) - (System/currentTimeMillis))) - ;; Configuration (def *server-url* @@ -87,10 +81,13 @@ (assoc d :created_on (format-timestamp (d :created_on))) d)))) -(defn new-messages [room since-ts] - (let [since-date (new Date (long since-ts))] - (reverse (take-while (fn [m] (.after (m :created_on) since-date)) - @(room :messages))))) +(defn new-messages [room ts] + (reverse (take-while #(.after (% :created_on) ts) + @(room :messages)))) + +(defn new-favs [nick ts] + (filter #(.after (:added %) ts) + (get @fav-map nick []))) (defn process-user [u] (stringify-and-escape (strip-empty-vals u))) @@ -103,10 +100,11 @@ ; Sorting is done on client (map process-user (vals @(room :users)))) -(defn updates [room since] +(defn updates [nick room ts] {"users" (prepare-user-list room) "messages" (map process-message-for-json - (new-messages room since))}) + (new-messages room ts)) + "favs" (new-favs nick ts)}) (defn count-messages-by-nick [nick image-only] (let [query (str "SELECT COUNT(*) @@ -128,16 +126,20 @@ LIMIT ? OFFSET ?")] (do-select [query nick *dumps-per-page* offset])))) - -(defn fetch-public-message-by-id [m-id] - (let [query "SELECT m.content, m.created_on, m.user_id, u.nick, u.avatar +(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 FROM messages m, users u, rooms r WHERE m.user_id = u.user_id AND r.room_id = m.room_id - AND r.admin_only = false AND m.message_id = ?"] (first (do-select [query (maybe-parse-int m-id -1)])))) +(defn fetch-public-message-by-id [m-id] + (let [msg (fetch-message-by-id m-id)] + (if (and msg (not (:admin_only msg))) + msg))) + ;; User-id/nick cache ;; I keep needing to grab user-id from a nick so I thought I'd cache them ;; @timb: I just duplicated this in the user-info map :( @@ -544,16 +546,18 @@ FROM users u (defn refresh [session params room] (dosync (let [now (System/currentTimeMillis) - since (maybe-parse-long (params :since) now) + old-ts (new Date (maybe-parse-long (params :since) now)) nick (session :nick) users (room :users)] (if nick (if-let [user-info (@users nick)] ; Incorporate avatar updates (commute users assoc nick (merge user-info {:last-seen now - :avatar (session :avatar)})) + :avatar (session :avatar)})) (commute users assoc nick (user-struct-from-session session)))) - (resp-success (assoc (updates room since) :timestamp now :v *chat-version-number*))))) + (resp-success (assoc (updates nick room old-ts) + :timestamp now + :v *chat-version-number*))))) (defn validated-refresh [session params] (let [room-key (params :room) @@ -675,21 +679,39 @@ FROM users u (let [path-without-domain (nth (re-find #"//[^/]+/(.+)" url) 1)] (nth (re-split #"/|\?" path-without-domain) position))) -(defn add-tag [user-id message-id tag] +(defn add-tag [user msg tag] (try - (do-insert "tags" ["user_id" "message_id" "tag"] [user-id (maybe-parse-int message-id) (normalize-tag-for-db tag)]) - true + (do-insert "tags" + ["user_id" "message_id" "tag"] + [(:user_id user) (msg :message_id) tag]) + (if (and (= tag "favorite") + (not (= (msg :nick) (user :nick)))) + (insert-fav-notification! (msg :nick) + (user :nick) + (user :avatar) + (msg :content))) + true ; catch error when inserting duplicate tags - (catch Exception e false))) + (catch Exception e false))) -; to do: don't let people set tags on messages they can't access (defn validated-add-tag [session params] (if (session :nick) - (if (add-tag (session :user_id) (params :message_id) (params :tag)) - (resp-success "OK") - (resp-error "TAG_EXISTS_ALREADY_OR_SOMETHING_ELSE_IS_FUCKED")) - (resp-error "NO_USER"))) + (let [nick (session :nick) + user-id (session :user_id) + user-admin? (session :admin-only) + msg-id (params :message_id) + tag (validate-tag (params :tag)) + msg (fetch-message-by-id msg-id) + access (or (is-vip? session) + (not (:admin-only msg)))] + (cond (not msg) (resp-error "NO_MSG") + (not access) (resp-error "NO_MSG") + (not tag) (resp-error "NO_TAG") + :else (if (add-tag session msg tag) + (resp-success "OK") + (resp-error "TAG_EXISTS_ALREADY_OR_SOMETHING_ELSE_IS_FUCKED")))) + (resp-error "NO_USER"))) (defn remove-tag [user-id message-id tag] (let [query "user_id = ? AND message_id = ? AND lower(tag) = ?"] @@ -962,14 +984,14 @@ FROM users u (POST "/reset" (reset-account! session params)) ;; Admin stuff (should be own route?) - (GET "/debug" (debug-page session flash)) + (GET "/debug" (debug-page session flash)) (POST "/debug" (debug-commmand! session params)) - (GET "/mutes" (show-mutes session)) + (GET "/mutes" (show-mutes session)) (POST "/mute" (mute! session params)) (POST "/cancel-mute" (handle-cancel-mute! session params)) - (GET "/feed-test" (feed-test-page session)) + (GET "/feed-test" (feed-test-page session)) (POST "/feed-test" (feed-test session params)) - (GET "/profile-test/:t" (profile session "ryder" "0" (params :t))) + (GET "/profile-test/:t" (profile session "ryder" "0" (params :t))) ;; Footer pages (GET "/about_us" (serve-template "about_us" session)) |
