From 704efb06cd424de7411f198bc4c6ce6b99a9dcbe Mon Sep 17 00:00:00 2001 From: sostler Date: Fri, 18 Dec 2009 21:56:51 -0500 Subject: Checkin before leaving --- db/0-create.psql | 4 +- src/site.clj | 48 +++++--- static/home.js | 2 +- static/index.html | 354 +++++++++++++++++++++++++++--------------------------- static/pichat.js | 10 +- template/chat.st | 4 +- 6 files changed, 217 insertions(+), 205 deletions(-) diff --git a/db/0-create.psql b/db/0-create.psql index 35278c7..5bd8622 100755 --- a/db/0-create.psql +++ b/db/0-create.psql @@ -4,6 +4,7 @@ CREATE TABLE users ( hash text NOT NULL, email text NOT NULL, created_on timestamp NOT NULL DEFAULT now(), + avatar text, contact text, bio text ); @@ -19,7 +20,8 @@ CREATE TABLE messages ( user_id integer NOT NULL REFERENCES users, room_id integer NOT NULL REFERENCES rooms, content text NOT NULL, - created_on timestamp NOT NULL DEFAULT now() + created_on timestamp NOT NULL DEFAULT now(), + is_image bool ); CREATE TABLE user_session ( diff --git a/src/site.clj b/src/site.clj index cc7dfd3..7fdd5ed 100644 --- 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) diff --git a/static/home.js b/static/home.js index 5857368..8416703 100755 --- a/static/home.js +++ b/static/home.js @@ -15,7 +15,7 @@ function login() { var hash = hex_sha1(nick + '$' + password + '$dumpfm'); var onSuccess = function(json) { - location.href = "u/" + nick; + location.href = "/chat"; }; var onError = function(resp, textStatus, errorThrown) { diff --git a/static/index.html b/static/index.html index fb5224e..0ccb121 100644 --- a/static/index.html +++ b/static/index.html @@ -1,196 +1,193 @@ - + + - + - - - - - - -
-
- -
+ --> + + + + +
+
+


- -
-

+
+

+
-
-
-


+


 

@@ -210,18 +207,19 @@ body {

 

 

- + - - + +
- \ No newline at end of file + + diff --git a/static/pichat.js b/static/pichat.js index 826bcba..d489bba 100755 --- a/static/pichat.js +++ b/static/pichat.js @@ -15,7 +15,8 @@ function escapeHtml(txt) { } function buildUserDiv(user) { - return '
' + escapeHtml(user) + '
'; + var nick = escapeHtml(user); + return '
' + nick + '
'; } // http://stackoverflow.com/questions/37684/replace-url-with-html-links-javascript @@ -29,6 +30,7 @@ var URLRegex = /((http\:\/\/|https\:\/\/|ftp\:\/\/)|(www\.))+(\w+:{0,1}\w*@)?(\S var PicRegex = /\.(jpg|jpeg|png|gif|bmp)$/i; function buildMsgContent(content) { + content = $.trim(content); var match = URLRegex.exec(content) if (match && PicRegex.test(match[0])) { return '' @@ -39,7 +41,8 @@ function buildMsgContent(content) { } function buildMessageDiv(msg) { - return '
' + escapeHtml(msg.nick) + ': ' + var nick = escapeHtml(msg.nick); + return '
' + nick + ': ' + buildMsgContent(msg.content) + '
'; } @@ -150,6 +153,7 @@ function initProfile() { }); var onSubmit = function(original_element, edit, old) { + edit = $.trim(edit); if (edit == old) { return old }; // MAJOR TODO: Prevent entering script tags if (original_element == 'avatar' && edit.indexOf("<") != -1) { @@ -161,7 +165,7 @@ function initProfile() { url: "/update-profile", data: { 'attr': original_element, 'val': edit } }); - if (original_element == 'avatar') { + if (original_element == 'avatar') { var s = ''; $('#avatarPic').replaceWith(s); } diff --git a/template/chat.st b/template/chat.st index 3a8f79f..3a4cbfd 100755 --- a/template/chat.st +++ b/template/chat.st @@ -28,14 +28,14 @@
$users: { u | -
$u$
+
$u$
}$
$messages: { m | -
$m.nick$: +
$m.nick$: $m.content$
}$
-- cgit v1.2.3-70-g09d2