summaryrefslogtreecommitdiff
path: root/static/js/src/messages.js
diff options
context:
space:
mode:
Diffstat (limited to 'static/js/src/messages.js')
-rw-r--r--static/js/src/messages.js265
1 files changed, 265 insertions, 0 deletions
diff --git a/static/js/src/messages.js b/static/js/src/messages.js
new file mode 100644
index 0000000..be54b6b
--- /dev/null
+++ b/static/js/src/messages.js
@@ -0,0 +1,265 @@
+
+// Messages
+
+
+function buildMsgContent(content, recips) {
+ if (content.substr(0,6) == "<safe>")
+ return content.substr(6,content.length - 13);
+ else return linkify(escapeHtml(content), recips);
+}
+
+
+function invalidImageDomain(content) {
+ var words = content.toLowerCase().split(' ');
+ for (var i = 0; i < words.length; i++) {
+ var w = words[i];
+ if (PicRegex.test(w)) {
+ for (var j = 0; j < InvalidDomains.length; j++) {
+ var d = InvalidDomains[j];
+ if (w.indexOf(d) != -1) {
+ return d;
+ }
+ }
+ }
+ }
+}
+
+function clearMessages(){
+ track('UI', 'ClearScreen');
+ $('.dump').remove();
+}
+
+function submitMessage() {
+ var content = $.trim($('#msgInput').val());
+
+ if (content == "/clear") {
+ clearMessages()
+ $('#msgInput').val('');
+ return;
+ }
+
+ var invalidDomain = invalidImageDomain(content);
+ if (invalidDomain) {
+ $('#msgInput').blur(); // Remove focus to prevent FF alert loop
+ alert("Sorry, cannot accept images from " + invalidDomain + ". Maybe host the image elsewhere?");
+ return;
+ }
+
+ $('#msgInput').val('');
+ if (content == '') { return; }
+ if (content.length > 2468) {
+ alert("POST TOO LONG DUDE!");
+ return;
+ }
+ PendingMessages[content] = true;
+
+ var msg = { 'nick': Nick, 'content': content };
+ var div = addNewMessage(msg, true);
+
+ var onSuccess = function(json) {
+ if (typeof pageTracker !== 'undefined') {
+ pageTracker._trackEvent('Message', 'Submit',
+ typeof Room !== 'undefined' ? Room : 'UnknownRoom');
+ }
+ div.attr('id', 'message-' + json.msgid)
+ .removeClass('loading').addClass('loaded');
+ div.find('.content').html(buildMsgContent(content, json.recips));
+ };
+ var onError = function(resp, textStatus, errorThrown) {
+ div.remove();
+ handleMsgError(resp);
+ };
+
+ $.ajax({
+ type: 'POST',
+ timeout: 15000,
+ url: '/msg',
+ data: { 'room': Room, 'content': content },
+ cache: false,
+ dataType: 'json',
+ success: onSuccess,
+ error: onError
+ });
+}
+
+function ifEnter(fn) {
+ return function(e) {
+ if (e.keyCode == 13) { fn(); }
+ };
+}
+
+
+
+// todo:
+// isLoading doesn't get passed the right thing by $.map in addMessages
+function buildMessageDiv(msg, opts) {
+ var opts = opts || {};
+ var nick = escapeHtml(msg.nick);
+ removeOldMessages();
+
+ var builtContent = buildMsgContent(msg.content, msg.recips);
+ var msgId = ('msg_id' in msg) ? 'id="message-' + msg.msg_id + '"' : '';
+ var loadingClass = opts.isLoading ? ' loading' : '';
+ var containsImageClass = LastMsgContainsImage ? ' contains-image' : '';
+ var displayStyle = ((ImgsEnabled && LastMsgContainsImage) || (TextEnabled && !LastMsgContainsImage)) ? '' : ' style="display: none"';
+ if (displayStyle === '' && MUTES[nick])
+ displayStyle = ' style="display: none"';
+
+ return '<div class="msgDiv dump ' + loadingClass + containsImageClass + " nick_" + nick + '" ' + msgId + displayStyle + '>'
+ + '<span class="nick"><b><a href="' + RootDomain + nick + ' ">' + nick + '</a></b>'
+ + ' <img src="'+Imgs.chatThumbDot+'" class="chat-thumb" onclick="Tag.favorite(this)"> '
+ + '</span>'
+ + '<span class="content">' + builtContent + '</span>'
+ + '</div>';
+}
+
+function addNewMessages(msgs) {
+ var msgStr = $.map(msgs, buildMessageDiv).join('');
+ $('#messageList').append(msgStr);
+ Drag.bindImages();
+}
+
+function addNewMessage(msg, isLoading) {
+ var msgStr = buildMessageDiv(msg, { isLoading: true });
+ var div = $(msgStr).appendTo('#messageList');
+ Drag.bindImages();
+ return div;
+}
+
+function setUserList(users) {
+ $("#userList").html($.map(users, buildUserDiv).join(''));
+}
+
+function flattenUserJson(users) {
+ var s = "";
+ $.map(users.sort(), function(user) {
+ s += user.nick + user.avatar;
+ });
+ return s;
+}
+
+function updateUI(msgs, users, favs) {
+ if (window['growlize'] && msgs && msgs.length > 0) {
+ $.map(msgs, buildGrowlDataAndPopDatShit)
+ } else if (msgs && msgs.length > 0) {
+ addNewMessages(msgs);
+ }
+ if (users !== null) {
+ var flattened = flattenUserJson(users);
+ if (!('userlist' in cache) || flattened != cache.userlist) {
+ $("#userList").html($.map(users.sort(sortUsersByAlpha), buildUserDiv).join(''));
+ }
+ cache.userlist = flattened
+ }
+ updateFavs(favs);
+}
+
+function sortUsersByAlpha(a, b){
+ var nickA = a.nick.toLowerCase()
+ var nickB = b.nick.toLowerCase()
+ if (nickA > nickB) return 1
+ else if (nickA < nickB) return -1
+ return 0
+}
+
+function isDuplicateMessage(m) {
+ if (m.nick == Nick && m.content in PendingMessages) {
+ delete PendingMessages[m.content];
+ return true;
+ } else {
+ return false;
+ }
+}
+
+function refresh() {
+ var onSuccess = function(json) {
+ try {
+ Timestamp = json.timestamp;
+ $.map(json.messages, function(msg){ MessageContentCache[msg.msg_id.toString()] = msg.content })
+
+ var messages = $.grep(
+ json.messages,
+ function(m) { return !isDuplicateMessage(m) });
+ updateUI(messages, json.users, json.favs);
+ if (!Away.HasFocus)
+ Away.UnseenMsgCounter += messages.length;
+ } catch(e) {
+ if (IsAdmin && window.console) {
+ console.log(e);
+ }
+ }
+ setTimeout(refresh, 1500);
+ };
+ var onError = function(resp, textStatus, errorThrown) {
+ var msg = $.trim(resp.responseText);
+ if (msg == "UNKNOWN_ROOM")
+ location.href = "http://dump.fm";
+ if (IsAdmin && window.console) {
+ console.error(resp, textStatus, errorThrown);
+ }
+ setTimeout(refresh, 4000);
+ };
+
+ $.ajax({
+ type: 'GET',
+ timeout: 5000,
+ url: '/refresh',
+ data: { 'room': Room, 'since': Timestamp },
+ cache: false,
+ dataType: 'json',
+ success: onSuccess,
+ error: onError
+ });
+}
+
+function sendClicked(){
+ track('UI', 'SendButtonActuallyClicked');
+ submitMessage();
+}
+
+
+
+
+function setupUpload(elementId, roomKey) {
+ var onSubmit = function(file, ext) {
+ if (!(ext && /^(jpg|png|jpeg|gif|bmp|svg)$/i.test(ext))) {
+ alert('SORRY, NOT AN IMAGE DUDE... ');
+ return false;
+ }
+ };
+ var onComplete = function(file, response) {
+ var r = $.trim(response);
+ if (r.match(/FILE_TOO_BIG/)) {
+ var maxSize = r.split(" ")[1] / 1024;
+ alert("Sorry. Your file is just too darn big. "
+ + maxSize + "KB or less please.");
+ return;
+ } else if (r.match(/FILE_NOT_IMAGE/)) {
+ alert("What did you upload? Doesn't seem like an image. Sorry.");
+ return;
+ } else if (r.match(/INVALID_RESOLUTION/)) {
+ var maxWidth = r.split(" ")[1];
+ var maxHeight = r.split(" ")[2];
+ alert("Sorry, the maximum image resolution is "
+ + maxWidth + "x" + maxHeight);
+ return;
+ } else if (r != "OK") {
+ alert(r);
+ return;
+ }
+
+ if (typeof pageTracker !== 'undefined') {
+ var r = typeof Room !== 'undefined' ? Room : 'UnknownRoom';
+ pageTracker._trackEvent('Message', 'Upload', r);
+ }
+ }
+ new AjaxUpload(elementId, {
+ action: '/upload/message',
+ autoSubmit: true,
+ name: 'image',
+ data: { room: roomKey },
+ onSubmit: onSubmit,
+ onComplete: onComplete
+ });
+}
+