summaryrefslogtreecommitdiff
path: root/src/site.clj
diff options
context:
space:
mode:
Diffstat (limited to 'src/site.clj')
-rwxr-xr-xsrc/site.clj98
1 files changed, 54 insertions, 44 deletions
diff --git a/src/site.clj b/src/site.clj
index fe78633..6efbd2f 100755
--- a/src/site.clj
+++ b/src/site.clj
@@ -15,14 +15,15 @@
clojure.contrib.sql
clojure.contrib.str-utils
compojure
+ origin-check
utils
cookie-login
session-sweeper
feed))
(def *run-flusher* true)
-(def *flusher-sleep-ms* 4000)
-(def *user-timeout-ms* 15000)
+(def *flusher-sleep* (seconds 4))
+(def *user-timeout* (seconds 15))
(def template-group (new StringTemplateGroup "dumpfm" "template"))
(.setRefreshInterval template-group 3)
@@ -42,10 +43,10 @@
(dosync
(let [users (room :users)
now (System/currentTimeMillis)
- alive? (fn [[n u]] (> (u :last-seen) (- now *user-timeout-ms*)))]
+ alive? (fn [[n u]] (> (u :last-seen) (- now *user-timeout*)))]
(ref-set users
(into {} (filter alive? @users))))))
- (Thread/sleep *flusher-sleep-ms*)
+ (Thread/sleep *flusher-sleep*)
(when *run-flusher*
(send *agent* #'flush-inactive-users!))
x)
@@ -183,42 +184,42 @@
(def *dumps-per-page* 20)
(defn count-messages-by-room [room-id image-only]
- (let [query (str "SELECT COUNT(*) "
- "FROM messages m, users u "
- "WHERE room_id = ? AND m.user_id = u.user_id "
- (if image-only "AND m.is_image = true " ""))]
+ (let [query (str "SELECT COUNT(*)
+ FROM messages m, users u
+ WHERE room_id = ? AND m.user_id = u.user_id"
+ (if image-only " AND m.is_image = true " ""))]
(do-count [query room-id])))
(defn fetch-messages-by-room
([room-id image-only] (fetch-messages-by-room room-id image-only 0))
([room-id image-only offset]
- (let [query (str "SELECT m.content, m.message_id, m.created_on, u.nick, u.avatar "
- "FROM messages m, users u "
- "WHERE room_id = ? AND m.user_id = u.user_id "
+ (let [query (str "SELECT m.content, m.message_id, m.created_on, u.nick, u.avatar
+ FROM messages m, users u
+ WHERE room_id = ? AND m.user_id = u.user_id "
(if image-only "AND m.is_image = true " "")
- "ORDER BY created_on DESC "
- "LIMIT " *dumps-per-page* " OFFSET ?")]
- (do-select [query room-id offset]))))
+ "ORDER BY created_on DESC
+ LIMIT ? OFFSET ?")]
+ (do-select [query room-id *dumps-per-page* offset]))))
(defn count-messages-by-nick [nick image-only]
- (let [query (str "SELECT COUNT(*) "
- "FROM messages m, users u, rooms r "
- "WHERE m.user_id = u.user_id AND u.nick = ? "
- "AND r.room_id = m.room_id AND r.admin_only = false "
+ (let [query (str "SELECT COUNT(*)
+ FROM messages m, users u, rooms r
+ WHERE m.user_id = u.user_id AND u.nick = ?
+ AND r.room_id = m.room_id AND r.admin_only = false "
(if image-only "AND m.is_image = true " ""))]
(do-count [query nick])))
(defn fetch-messages-by-nick
([nick image-only] (fetch-messages-by-nick nick image-only 0))
([nick image-only offset]
- (let [query (str "SELECT m.content, m.created_on, u.nick, u.avatar "
- "FROM messages m, users u, rooms r "
- "WHERE m.user_id = u.user_id AND u.nick = ? "
- "AND r.room_id = m.room_id AND r.admin_only = false "
+ (let [query (str "SELECT m.content, m.created_on, u.nick, u.avatar
+ FROM messages m, users u, rooms r
+ WHERE m.user_id = u.user_id AND u.nick = ?
+ AND r.room_id = m.room_id AND r.admin_only = false "
(if image-only "AND m.is_image = true " "")
- "ORDER BY created_on DESC "
- "LIMIT " *dumps-per-page* " OFFSET ?")]
- (do-select [query nick offset]))))
+ "ORDER BY created_on DESC
+ LIMIT ? OFFSET ?")]
+ (do-select [query nick *dumps-per-page* offset]))))
(defn build-room-map-from-db [room-db]
{:admin_only (room-db :admin_only)
@@ -253,12 +254,13 @@
:is_admin (user-info :is_admin)
:avatar (user-info :avatar)})
-(defn session-assoc-from-db
+(defn session-assoc-from-db
[user-info]
(session-assoc :user_id (user-info :user_id)
:nick (user-info :nick)
:is_admin (user-info :is_admin)
- :avatar (user-info :avatar)))
+ :avatar (user-info :avatar)
+ :password_login true))
;; login-token functions
@@ -392,7 +394,7 @@
(def *directory-listing* (ref []))
(def *per-directory-page* 25)
(def *run-update-directory* true)
-(def *update-directory-sleep-ms* (* 60 60 1000))
+(def *update-directory-sleep* (minutes 15))
(defn directory-search [offset]
(let [directory @*directory-listing*
@@ -401,12 +403,15 @@
(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)")]
+ 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.message_id = (SELECT message_id FROM messages
+ WHERE user_id = u.user_id
+ AND room_id = 1
+ AND is_image = true
+ ORDER BY created_on LIMIT 1)")]
(when (> (count user-ids) 0)
(let [res (do-select [qry])
keys (map :user_id res)
@@ -414,21 +419,22 @@
(map (fn [u]
(let [u-id (u :user_id)]
(stringify-and-escape (merge u (dict u-id)))))
- users)))))
+ users))
+ [])))
(defn update-directory! []
- (let [qry (str "SELECT u.user_id, COUNT(m) as cnt "
- "FROM users u, messages m "
- "WHERE u.user_id = m.user_id "
- "GROUP BY u.user_id "
- "ORDER BY COUNT(m) DESC")
+ (let [qry "SELECT u.user_id, COUNT(m) as cnt
+ FROM users u, messages m
+ 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*)
+ (Thread/sleep *update-directory-sleep*)
(when *run-update-directory*
(send *directory-agent* #'update-directory-agent-func))
x)
@@ -436,7 +442,7 @@
(defn start-directory-updater! []
(send *directory-agent* update-directory-agent-func))
-(defn directory [session offset]
+(defn directory [session offset]
(let [st (fetch-template "directory" session)
users (to-array (directory-search offset))]
(.setAttribute st "users" users)
@@ -444,8 +450,10 @@
(= offset 1) (.setAttribute st "prev" "")
:else (.setAttribute st "prev" (str "/" (dec offset))))
(.setAttribute st "next" (str "/" (inc offset)))
+ (if (zero? (count @*directory-listing*))
+ (.setAttribute st "notloaded" true))
(.toString st)))
-
+
;; Topics
(defn valid-topic? [topic]
@@ -823,11 +831,13 @@
(with-mimetypes {:mimetypes mimetypes}))
(decorate pichat
+ (with-origin-check)
(with-mimetypes {:mimetypes mimetypes})
(with-cookie-login (comp not logged-in?) make-login-token read-login-token)
(with-session {:type :memory, :expires (* 60 60)}))
(decorate multipart
+ (with-origin-check)
(with-mimetypes {:mimetypes mimetypes})
(with-session {:type :memory, :expires (* 60 60)})
(with-multipart))
@@ -855,7 +865,7 @@
(def options (apply parse-command-args *command-line-args*))
+(start-server (options :port))
(start-user-flusher!)
(start-session-pruner!)
(start-directory-updater!)
-(start-server (options :port)) \ No newline at end of file