summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/site.clj48
-rwxr-xr-xsrc/utils.clj34
-rwxr-xr-xstatic/js/pichat.js7
-rw-r--r--template/directory.st38
4 files changed, 88 insertions, 39 deletions
diff --git a/src/site.clj b/src/site.clj
index 0e4556f..2717b0e 100755
--- a/src/site.clj
+++ b/src/site.clj
@@ -145,6 +145,15 @@
"avatar" (escape-html (u :avatar))}
{"nick" (u :nick)}))
+(defn process-directory-listing [d]
+ (let [base {"nick" (escape-html (d :nick))
+ "content" (escape-html (d :content))
+ "count" (d :count)}
+ avatar (d :avatar)]
+ (if (non-empty-string? avatar)
+ (assoc base "avatar" avatar)
+ base)))
+
(defn prepare-user-list [room]
(map process-user (sort-by #(% :nick)
(vals @(room :users)))))
@@ -364,10 +373,27 @@
;; Directory
(def *per-directory-page* 25)
+(def *update-directory* true)
+(def *update-directory-ms* (* 60 60 1000))
+
+(defn directory-search [offset]
+ (let [qry (str "SELECT u.nick, u.avatar, m.content "
+ "FROM users u, messages m "
+ "WHERE m.message_id = "
+ " (SELECT n.message_id FROM messages n "
+ " WHERE n.user_id = u.user_id ORDER BY n.created_on DESC LIMIT 1) "
+ "ORDER BY (SELECT COUNT(*) FROM messages where user_id = u.user_id) "
+ "LIMIT ? OFFSET ?")]
+ (do-select [qry *per-directory-page* (* offset *per-directory-page*)])))
(defn directory [session offset]
- (let [st (fetch-template "directory" session)]
-
+ (let [st (fetch-template "directory" session)
+ users (to-array (map process-directory-listing (directory-search offset)))]
+ (.setAttribute st "users" users)
+ (cond (= offset 0) (.setAttribute st "prev" false)
+ (= offset 1) (.setAttribute st "prev" "")
+ :else (.setAttribute st "prev" (str "/" (- offset 1))))
+ (.setAttribute st "next" (str "/" (+ offset 1)))
(.toString st)))
;; Topics
@@ -378,6 +404,21 @@
(defn valid-deadline? [deadline]
deadline)
+(defn topic-map-from-room [r]
+ (let [topic (or @(r :topic) {})]
+ {"key" (r :key)
+ "topic" (topic :topic)
+ "deadline" (topic :deadline)
+ "maker" (topic :maker)}))
+
+(defn validate-topic-list [session]
+ (if (session :is_admin)
+ (let [st (fetch-template "topic_list" session)]
+ (.setAttribute st "rooms"
+ (to-array (map topic-map-from-room (vals @rooms))))
+ (.toString st))
+ [404 "UNKNOWN_ROOM"]))
+
(defn set-topic! [room topic deadline maker]
(ref-set (room :topic)
{:topic topic
@@ -654,11 +695,11 @@
(-> request :route-params :room)
(-> request :route-params :offset)
params))
- (GET "/stats" (validated-stats session params))
;; TODO: validate POST Referrer headers for POSTs
(POST "/msg" (validated-msg session params))
(POST "/submit-registration" (register session params))
(POST "/update-profile" (update-profile session params))
+ (GET "/topic-list" (validate-topic-list session))
(POST "/set-topic" (validate-set-topic session params))
(GET "/directory" (directory session 0))
(GET "/directory/:offset"
@@ -725,7 +766,6 @@
([script] {:port 8080})
([script port] {:port (maybe-parse-int port)}))
-(prn *command-line-args*)
(def options (apply parse-command-args *command-line-args*))
(start-user-flusher!)
diff --git a/src/utils.clj b/src/utils.clj
index 5a2c913..3180e89 100755
--- a/src/utils.clj
+++ b/src/utils.clj
@@ -40,40 +40,6 @@
(doall rs))))
:count))
-
-;; Stats
-
-(defn msg-stats [ts]
- (let [qry (str "SELECT created_on::date, count(*) FROM messages "
- "GROUP BY created_on::date "
- "ORDER BY created_on::date")]
- (do-select [qry])))
-
-(defn new-user-stats [ts]
- (let [qry (str "SELECT created_on::date, count(*) FROM users "
- "GROUP BY created_on::date "
- "ORDER BY created_on::date")]
- (do-select [qry])))
-
-(defn msgs-per-user-stats [ts]
- true)
-
-(def *stat-map* {"msgs" msg-stats
- "new users" new-user-stats
- "msgs per user" msgs-per-user-stats})
-
-(defn stats [session params]
- (let [stat (params :stat)
- ts (params :timescale)]
- (if-let [f (*stat-map* stat)]
- (resp-success (f ts))
- (resp-error "UNKNOWN STAT"))))
-
-(defn validated-stats [session params]
- (if (session :is_admin)
- (stats session params)
- (resp-error "BAD_REQUEST")))
-
;; Parsing
(defn maybe-parse-int
diff --git a/static/js/pichat.js b/static/js/pichat.js
index b322ae9..fd33729 100755
--- a/static/js/pichat.js
+++ b/static/js/pichat.js
@@ -456,4 +456,11 @@ function blinkStart(){
function blinkStop(){
clearInterval(blinkTimer);
+}
+
+function initDirectory() {
+ $(".linkify").each(function() {
+ var text = jQuery(this).text();
+ jQuery(this).html(linkify(text));
+ });
} \ No newline at end of file
diff --git a/template/directory.st b/template/directory.st
index 23960f0..c57c333 100644
--- a/template/directory.st
+++ b/template/directory.st
@@ -16,7 +16,15 @@
top: 57px;
padding: 2em;
}
+ .linkify img {
+ max-height: 300px;
+ max-width: 200px;
+ }
</style>
+ <script>
+ jQuery(document).ready(initDirectory);
+ </script>
+
</head>
<body>
$banner()$
@@ -24,7 +32,35 @@
<div id="headerbar"></div>
<div id="main">
<h3>DUMP STARS</h3>
- </div>
+ <br />
+
+ $if(users)$
+ $users:{ u |
+ <div>
+ <a href="/u/$u.nick$">
+ <h2>$u.nick$</h2>
+ $if(u.avatar)$
+ <img height="50" width="50" src="$u.avatar$"></img>
+ $endif$
+ </a>
+ <div>
+ <span>Last post:</span>
+ <span class="linkify">$u.content$</span>
+ </div>
+ <hr />
+ }$
+ $else$
+ <span>No more users!</span>
+ $endif$
+
+ $if(prev)$
+ <a href="/directory$prev$">BACK</a>
+ $endif$
+ $if(users)$
+ <a href="/directory$next$">MORE</a>
+ $endif$
+
+ </div>
<div id="footer">
$footer()$
</div>