diff --git a/package.json b/package.json index 703431e..59c8dfa 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "devDependencies": {}, "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "jsbuild": "uglifyjs src/js/main.js -o src/public/main.js" + "jsbuild": "uglifyjs src/js/main.js --compress --mangle -o src/public/main.js" }, "author": "Daniel Seripap", "license": "ISC" diff --git a/src/js/main.js b/src/js/main.js index 989f147..1729e9e 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -23,6 +23,7 @@ $(function() { var $inputMessage = $('.inputMessage'); // Input message input box var $key = $('#key'); var $genKey = $('#new_key'); + var $removeKey = $('#remove_key'); var $chatPage = $('.chat.page'); // The chatroom page @@ -260,6 +261,10 @@ $(function() { $key.val(key); }); + $removeKey.click(function() { + $key.val(''); + }); + // Socket events // Whenever the server emits 'login', log the login message diff --git a/src/public/main.js b/src/public/main.js index cab7ca1..3ff15a3 100644 --- a/src/public/main.js +++ b/src/public/main.js @@ -1 +1 @@ -var fs=window.RequestFileSystem||window.webkitRequestFileSystem;$(function(){var isActive=false;var newMessages=0;var FADE_TIME=150;var TYPING_TIMER_LENGTH=400;var COLORS=["#e21400","#91580f","#f8a700","#f78b00","#58dc00","#287b00","#a8f07a","#4ae8c4","#3b88eb","#3824aa","#a700ff","#d300e7"];window.favicon=new Favico({animation:"pop",type:"rectangle"});var $window=$(window);var $usernameInput=$(".usernameInput");var $messages=$(".messages");var $inputMessage=$(".inputMessage");var $key=$("#key");var $genKey=$("#new_key");var $chatPage=$(".chat.page");var key=CryptoJS.SHA3(Math.random().toString(36).substring(7)).toString();$key.val(key);var username;var connected=false;var typing=false;var lastTypingTime;var $currentInput=$usernameInput.focus();var clipboard=new Clipboard(".copyable");var roomId=window.location.pathname.length?window.location.pathname:null;if(!roomId)return;var socket=io(roomId);$("#roomIdKey").text(roomId.replace("/",""));function addParticipantsMessage(data){var message="";if(data.numUsers===1){message+="There's 1 participant"}else{message+="There are "+data.numUsers+" participants"}log(message)}function setUsername(){username=window.username;if(!fs){console.log("no fs")}else{fs(window.TEMPORARY,100,log.bind(log,"WARNING: Your browser is not in incognito mode!"),log.bind(log,"Your browser is in incognito mode."))}if(username){$chatPage.show();$currentInput=$inputMessage.focus();socket.emit("add user",username)}}function sendMessage(){var message=$inputMessage.val();message=cleanInput(message);if(message&&connected){$inputMessage.val("");addChatMessage({username:username,message:message});socket.emit("new message",encrypt(message))}}function encrypt(text){return CryptoJS.AES.encrypt(text,$key.val()).toString()}function decrypt(text){return CryptoJS.AES.decrypt(text,$key.val()).toString(CryptoJS.enc.Utf8)||text}function log(message,options){var html=options&&options.html===true||false;var $el;if(html){$el=$("
  • ").addClass("log").html(message)}else{$el=$("
  • ").addClass("log").text(message)}addMessageElement($el,options)}function addChatMessage(data,options){var $typingMessages=getTypingMessages(data);options=options||{};if($typingMessages.length!==0){options.fade=false;$typingMessages.remove()}var $usernameDiv=$('').text(data.username).css("color",getUsernameColor(data.username));var $messageBodyDiv=$('').text(data.message);var typingClass=data.typing?"typing":"";var $messageDiv=$('
  • ').data("username",data.username).addClass(typingClass).append($usernameDiv,$messageBodyDiv);addMessageElement($messageDiv,options)}function addChatTyping(data){data.typing=true;data.message="is typing";addChatMessage(data)}function removeChatTyping(data){getTypingMessages(data).fadeOut(function(){$(this).remove()})}function addMessageElement(el,options){var $el=$(el);if(!options){options={}}if(typeof options.fade==="undefined"){options.fade=true}if(typeof options.prepend==="undefined"){options.prepend=false}if(options.fade){$el.hide().fadeIn(FADE_TIME)}if(options.prepend){$messages.prepend($el)}else{$messages.append($el)}$messages[0].scrollTop=$messages[0].scrollHeight}function cleanInput(input){return $("
    ").text(input).text()}function updateTyping(){if(connected){if(!typing){typing=true;socket.emit("typing")}lastTypingTime=(new Date).getTime();setTimeout(function(){var typingTimer=(new Date).getTime();var timeDiff=typingTimer-lastTypingTime;if(timeDiff>=TYPING_TIMER_LENGTH&&typing){socket.emit("stop typing");typing=false}},TYPING_TIMER_LENGTH)}}function getTypingMessages(data){return $(".typing.message").filter(function(i){return $(this).data("username")===data.username})}function getUsernameColor(username){var hash=7;for(var i=0;iCopy link to share';log(message,{prepend:true,html:true});message="This chatroom is destroyed after all participants exit. Chat history is client side only and not persistent.";log(message);addParticipantsMessage(data)});socket.on("new message",function(data){if(!isActive){newMessages++;favicon.badge(newMessages)}data.message=decrypt(data.message);addChatMessage(data)});socket.on("user joined",function(data){log(data.username+" joined");addParticipantsMessage(data)});socket.on("user left",function(data){log(data.username+" left");addParticipantsMessage(data);removeChatTyping(data)});socket.on("typing",function(data){addChatTyping(data)});socket.on("stop typing",function(data){removeChatTyping(data)});socket.on("first",function(){$(".modal").modal("show")});setUsername();$("span.key-btn").click(function(){$("#key-modal").modal("show")});window.onfocus=function(){isActive=true;newMessages=0;favicon.reset()};window.onblur=function(){isActive=false};clipboard.on("success",function(e){console.log("success");$(e.trigger).tooltip({title:"Copied!",trigger:"manual",placement:"auto"});$(e.trigger).tooltip("show");setTimeout(function(){$(e.trigger).tooltip("hide")},2e3);e.clearSelection()});clipboard.on("error",function(e){console.log("error");$(e.trigger).tooltip({title:"Press ⌘C to copy",trigger:"manual",placement:"auto"});$(e.trigger).tooltip("show");setTimeout(function(){$(e.trigger).tooltip("hide")},2e3)})}); \ No newline at end of file +var fs=window.RequestFileSystem||window.webkitRequestFileSystem;$(function(){function e(e){var n="";n+=1===e.numUsers?"There's 1 participant":"There are "+e.numUsers+" participants",a(n)}function n(){R=window.username,fs?fs(window.TEMPORARY,100,a.bind(a,"WARNING: Your browser is not in incognito mode!"),a.bind(a,"Your browser is in incognito mode.")):console.log("no fs"),R&&(A.show(),D=C.focus(),U.emit("add user",R))}function t(){var e=C.val();e=l(e),e&&J&&(C.val(""),s({username:R,message:e}),U.emit("new message",o(e)))}function o(e){return CryptoJS.AES.encrypt(e,k.val()).toString()}function i(e){return CryptoJS.AES.decrypt(e,k.val()).toString(CryptoJS.enc.Utf8)||e}function a(e,n){var t,o=n&&n.html===!0||!1;t=o?$("
  • ").addClass("log").html(e):$("
  • ").addClass("log").text(e),u(t,n)}function s(e,n){var t=f(e);n=n||{},0!==t.length&&(n.fade=!1,t.remove());var o=$('').text(e.username).css("color",d(e.username)),i=$('').text(e.message),a=e.typing?"typing":"",s=$('
  • ').data("username",e.username).addClass(a).append(o,i);u(s,n)}function r(e){e.typing=!0,e.message="is typing",s(e)}function c(e){f(e).fadeOut(function(){$(this).remove()})}function u(e,n){var t=$(e);n||(n={}),"undefined"==typeof n.fade&&(n.fade=!0),"undefined"==typeof n.prepend&&(n.prepend=!1),n.fade&&t.hide().fadeIn(y),n.prepend?S.prepend(t):S.append(t),S[0].scrollTop=S[0].scrollHeight}function l(e){return $("
    ").text(e).text()}function p(){J&&(F||(F=!0,U.emit("typing")),I=(new Date).getTime(),setTimeout(function(){var e=(new Date).getTime(),n=e-I;n>=h&&F&&(U.emit("stop typing"),F=!1)},h))}function f(e){return $(".typing.message").filter(function(n){return $(this).data("username")===e.username})}function d(e){for(var n=7,t=0;tCopy link to share';a(t,{prepend:!0,html:!0}),t="This chatroom is destroyed after all participants exit. Chat history is client side only and not persistent.",a(t),e(n)}),U.on("new message",function(e){m||(g++,favicon.badge(g)),e.message=i(e.message),s(e)}),U.on("user joined",function(n){a(n.username+" joined"),e(n)}),U.on("user left",function(n){a(n.username+" left"),e(n),c(n)}),U.on("typing",function(e){r(e)}),U.on("stop typing",function(e){c(e)}),U.on("first",function(){$(".modal").modal("show")}),n(),$("span.key-btn").click(function(){$("#key-modal").modal("show")}),window.onfocus=function(){m=!0,g=0,favicon.reset()},window.onblur=function(){m=!1},E.on("success",function(e){$(e.trigger).tooltip({title:"Copied!",trigger:"manual",placement:"auto"}),$(e.trigger).tooltip("show"),setTimeout(function(){$(e.trigger).tooltip("hide")},2e3),e.clearSelection()}),E.on("error",function(e){$(e.trigger).tooltip({title:"Press ⌘C to copy",trigger:"manual",placement:"auto"}),$(e.trigger).tooltip("show"),setTimeout(function(){$(e.trigger).tooltip("hide")},2e3)})}}); \ No newline at end of file diff --git a/src/views/index.mustache b/src/views/index.mustache index eedc48d..b4d95b5 100644 --- a/src/views/index.mustache +++ b/src/views/index.mustache @@ -33,7 +33,11 @@