diff options
| author | Scott Ostler <sostler@ubuntu.(none)> | 2009-12-21 17:21:34 -0500 |
|---|---|---|
| committer | Scott Ostler <sostler@ubuntu.(none)> | 2009-12-21 17:21:34 -0500 |
| commit | 7a1af322fa38e1205613bc4767de7cc59b74c69c (patch) | |
| tree | 1c4cb7dc700d582552668b5dbd5be8c151052e32 /src | |
| parent | 2e3b548249968e8e83ef5f78d81e82064c8e6420 (diff) | |
| parent | 704efb06cd424de7411f198bc4c6ce6b99a9dcbe (diff) | |
Fixed
Diffstat (limited to 'src')
| -rwxr-xr-x | src/site.clj | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/src/site.clj b/src/site.clj index cc7dfd3..7fdd5ed 100755 --- a/src/site.clj +++ b/src/site.clj @@ -1,5 +1,3 @@ -; site.clj - (ns pichat (:import java.lang.System java.text.SimpleDateFormat @@ -25,7 +23,7 @@ (.setRefreshInterval template-group 3) (defstruct user-struct :user-id :nick :last-seen) -(defstruct message-struct :nick :avatar :content :created_on) +(defstruct message-struct :nick :content :created_on) (def users (ref {})) (def messages (ref [])) @@ -101,7 +99,6 @@ (defn process-message-for-output [d] (let [avatar (d :avatar)] {"nick" (encode-html-entities (d :nick)) - "avatar" (if avatar (encode-html-entities avatar) nil) "created_on" (.format formatter (d :created_on)) "content" (encode-html-entities (d :content))})) @@ -118,17 +115,18 @@ "messages" (map process-message-for-json (new-messages since))})) (defn fetch-messages-by-room [room-id] - (let [query (str "SELECT m.content, m.created_on, u.nick, u.avatar " + (let [query (str "SELECT m.content, m.created_on, u.nick " "FROM messages m, users u " "WHERE room_id = ? AND m.user_id = u.user_id " "ORDER BY created_on DESC " "LIMIT 20")] (do-select [query room-id]))) -(defn fetch-messages-by-nick [nick] - (let [query (str "SELECT m.content, m.created_on, u.nick, u.avatar " +(defn fetch-messages-by-nick [nick image-only] + (let [query (str "SELECT m.content, m.created_on, u.nick " "FROM messages m, users u " "WHERE m.user_id = u.user_id AND u.nick = ? " + (if image-only "AND m.is_image = true " "") "ORDER BY created_on DESC " "LIMIT 20")] (do-select [query nick]))) @@ -151,7 +149,7 @@ (defn landing [session] (let [nick (session :nick)] (if nick - (redirect-to (str "/u/" nick)) + (redirect-to "/chat") (serve-file "static" "index.html")))) (defn login [session params] @@ -198,7 +196,7 @@ (let [nick (session :nick) is-home (and nick (= nick profile-nick)) has-avatar (non-empty-string? (user-info :avatar)) - dumps (fetch-messages-by-nick profile-nick) + dumps (fetch-messages-by-nick profile-nick true) st (fetch-template "profile" session)] (do (.setAttribute st "is_home" is-home) @@ -264,26 +262,36 @@ ; TODO: session should store room-id of anon. users (resp-error "NOT_IN_CHAT")))) +;; http://snippets.dzone.com/posts/show/6995 +(def url-regex #"((http\:\/\/|https\:\/\/|ftp\:\/\/)|(www\.))+(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?") +(def pic-regex #"^.*\.(jpg|jpeg|png|gif|bmp)$") + +(defn is-image? [content] + (let [lower-content (.toLowerCase content)] + (if (and (re-matches url-regex lower-content) + (re-matches pic-regex lower-content)) + true false))) + (defn msg-transaction [nick msg] (dosync - (if (contains? (ensure users) nick) - (do (alter messages (swap cons) msg) - true) - false))) + (and (contains? (ensure users) nick) + (do (alter messages (swap cons) msg) + true)))) (defn msg-db [user-id room-id msg] - (with-connection db - (insert-values :messages - [:user_id :room_id :content] - [user-id room-id (msg :content)]))) + (let [content (msg :content) + is-image (is-image? content)] + (with-connection db + (insert-values :messages + [:user_id :room_id :content :is_image] + [user-id room-id content is-image])))) (defn msg [session params] (let [user-id (session :user-id) nick (session :nick) - avatar (session :avatar) - content (params :content) + content (.trim (params :content)) now (new Date) - msg (struct message-struct nick avatar content now)] + msg (struct message-struct nick content now)] (if (msg-transaction nick msg) (do (msg-db user-id 1 msg) |
