From 086eabf6b934bfadd4493d468ec315da80ea9d9c Mon Sep 17 00:00:00 2001
From: Marvin Borner
Date: Wed, 2 May 2018 19:47:30 +0200
Subject: Several improvements in chat.js
---
main/app/sprinkles/core/asset-bundles.json | 1 +
.../sprinkles/core/assets/SiteAssets/js/chat.js | 171 ++++++++++++++++++
.../sprinkles/core/templates/pages/index.html.twig | 14 +-
.../core/templates/pages/partials/chat.js.twig | 196 ---------------------
4 files changed, 185 insertions(+), 197 deletions(-)
create mode 100644 main/app/sprinkles/core/assets/SiteAssets/js/chat.js
delete mode 100644 main/app/sprinkles/core/templates/pages/partials/chat.js.twig
(limited to 'main/app/sprinkles')
diff --git a/main/app/sprinkles/core/asset-bundles.json b/main/app/sprinkles/core/asset-bundles.json
index 0d714e8..fd75027 100644
--- a/main/app/sprinkles/core/asset-bundles.json
+++ b/main/app/sprinkles/core/asset-bundles.json
@@ -51,6 +51,7 @@
"SiteAssets/js/encryption.js",
"SiteAssets/js/swiper.js",
"SiteAssets/js/console.image.js",
+ "SiteAssets/js/chat.js",
"SiteAssets/js/main.js"
],
"options": {
diff --git a/main/app/sprinkles/core/assets/SiteAssets/js/chat.js b/main/app/sprinkles/core/assets/SiteAssets/js/chat.js
new file mode 100644
index 0000000..82cae93
--- /dev/null
+++ b/main/app/sprinkles/core/assets/SiteAssets/js/chat.js
@@ -0,0 +1,171 @@
+ /******
+ GENERAL
+ ******/
+function InitializeChatServer() {
+ var ChatTextInput = $("#ChatTextInput");
+ var SubscribeTextInput = $("#SubscribeTextInput");
+ var ChatMessages = $("#ChatMessages");
+ var TypingIndicatorAnimationElement = "
";
+
+ var ChatSocket = new WebSocket('wss://marvinborner.ddnss.de:1337');
+ ChatSocket.onerror = function () {
+ setTimeout(function () {
+ console.log("[WEBSOCKET LOGGER] Connection failed. Trying again...");
+ InitializeChatServer();
+ }, 5000);
+ };
+ ChatSocket.onopen = function () {
+ // CONNECTION SUCCESSFUL!
+ console.log("[WEBSOCKET LOGGER] Chat connection established!");
+ // GOT MESSAGE
+ ChatSocket.onmessage = function (e) {
+ console.log("[WEBSOCKET LOGGER] Received a message from server!");
+ // DECLARATIONS
+ var TypingIndicatorMessage = $(".TypingIndicatorMessage").parent();
+ var LastMessage = $(".MessageWrapper.Normal:last .ChatMessage");
+ var MessageObject = JSON.parse(e.data);
+ var Message = MessageObject.Message;
+ var Username = MessageObject.Username;
+ var GroupName = MessageObject.GroupName;
+ var State = MessageObject.State;
+ var ServerMessage = MessageObject.ServerMessage;
+ var WasHimself = MessageObject.WasHimself;
+ var ServerMessageType = MessageObject.ServerMessageType;
+
+ if (ServerMessage === false) { // NO SERVER MESSAGE -> SENT BY USER
+ if (WasHimself === true) { // -> MESSAGE WAS FROM HIMSELF
+ if (!LastMessage.hasClass("MessageSent")) { // CHECK IF PREVIOUS MESSAGE WAS FROM HIMSELF TOO -> IF NOT, CREATE NEW 'ALONE' MESSAGE
+ ChatMessages.append("");
+ } else if (LastMessage.hasClass("MessageSent")) { // IF PREVIOUS MESSAGE WAS FROM HIMSELF TOO -> CREATE WITH CORRESPONDING CLASSES FOR DESIGN
+ ChatMessages.append("");
+ if (LastMessage.hasClass("AloneMessage")) {
+ LastMessage.removeClass("AloneMessage");
+ LastMessage.addClass("TopMessage");
+ } else if (LastMessage.hasClass("BottomMessage")) {
+ LastMessage.removeClass("BottomMessage");
+ LastMessage.addClass("MiddleMessage");
+ }
+ }
+ } else if (WasHimself === false) { // -> MESSAGE WAS FROM OTHER USER
+ if (!LastMessage.hasClass("MessageReceived")) { // CHECK IF PREVIOUS MESSAGE WAS FROM OTHER USER TOO -> IF NOT, CREATE NEW 'ALONE' MESSAGE
+ ChatMessages.append("");
+ } else if (LastMessage.hasClass("MessageReceived")) { // IF PREVIOUS MESSAGE WAS FROM OTHER USER TOO -> CREATE WITH CORRESPONDING CLASSES FOR DESIGN
+ ChatMessages.append("");
+ if (LastMessage.hasClass("AloneMessage")) {
+ LastMessage.removeClass("AloneMessage");
+ LastMessage.addClass("TopMessage");
+ } else if (LastMessage.hasClass("BottomMessage")) {
+ LastMessage.removeClass("BottomMessage");
+ LastMessage.addClass("MiddleMessage");
+ }
+ }
+ }
+ // CONVERT LINKS TO LINKS
+ $('.MessageReceived').linkify({
+ target: "_blank"
+ });
+ } else if (ServerMessage === true) { // SERVER MESSAGE
+ if (ServerMessageType === "GroupJoin") { // TYPE: USER JOINED A GROUP
+ if (WasHimself === true) { // HIMSELF JOINED A GROUP -> NOTIFY
+ ChatMessages.empty(); // -> EMPTY MESSAGES ON NEW GROUP JOIN
+ ChatMessages.append("
");
+ ReplaceServerMessage("YouGroupJoin"); // FOR TRANSLATION
+ } else if (WasHimself === false) { // OTHER USER JOINED A GROUP -> NOTIFY
+ ChatMessages.append("
");
+ ReplaceServerMessage("UserGroupJoin"); // FOR TRANSLATION
+ }
+ } else if (ServerMessageType === "UserDisconnect") { // TYPE: USER DISCONNECTED -> NOTIFY
+ ChatMessages.append("
");
+ ReplaceServerMessage("UserDisconnect"); // FOR TRANSLATION
+ } else if (ServerMessageType === "TypingState") { // SOMEBODY'S TYPING STATE CHANGED!
+ if (State === true) { // IF 'SOMEBODY' STARTED TYPING
+ if (WasHimself === true) { // IDENTIFY 'SOMEBODY' -> WAS HIMSELF -> NOT THAT IMPORTANT (USER KNOWS WHEN HE STARTS TYPING?)
+ // NOTHING
+ } else if (WasHimself === false) { // IDENTIFY 'SOMEBODY' -> WAS OTHER USER -> SHOW TYPING ANIMATION ON RECEIVER'S SIDE
+ ChatMessages.append("" + TypingIndicatorAnimationElement + "
");
+ console.log("[SERVER REPORT] " + Username + " STARTED TYPING");
+ }
+ } else if (State === false) { // IF 'SOMEBODY' STOPPED TYPING
+ if (WasHimself === true) { // IDENTIFY 'SOMEBODY' -> WAS HIMSELF -> NOT THAT IMPORTANT (USER KNOWS WHEN HE STOPS TYPING?)
+ // NOTHING
+ } else if (WasHimself === false) { // IDENTIFY 'SOMEBODY' -> WAS OTHER USER -> REMOVE TYPING ANIMATION
+ //TypingIndicatorMessage.fadeOut("fast");
+ TypingIndicatorMessage.remove();
+ console.log("[SERVER REPORT] " + Username + " STOPPED TYPING");
+ }
+ }
+ }
+ }
+ // SCROLL TO BOTTOM ON NEW MESSAGE OF ANY KIND
+ ChatMessages.animate({scrollTop: document.querySelector("#ChatMessages").scrollHeight}, "slow");
+ };
+
+
+ // TYPING RECOGNITION
+ var typingTimer;
+ var isTyping = false;
+
+ ChatTextInput.keydown(function () {
+ sendStartTyping();
+ clearTimeout(typingTimer);
+ });
+
+ ChatTextInput.keyup(function () {
+ clearTimeout(typingTimer);
+ typingTimer = setTimeout(function () {
+ sendStopTyping()
+ }, 2500)
+ });
+
+ function sendStartTyping() {
+ if (isTyping === false) {
+ sendTypingState(true);
+ isTyping = true;
+ }
+ }
+
+ function sendStopTyping() {
+ if (isTyping === true) {
+ sendTypingState(false);
+ isTyping = false;
+ }
+ }
+
+ function sendTypingState(state) { // SEND STATE TO CHAT SERVER
+ ChatSocket.send(JSON.stringify({ClientMessageType: "TypingState", State: state}));
+ }
+
+ $(window).unload(function () {
+ sendStopTyping(); // USER STOPS TYPING ON PAGE CLOSE ETC
+ });
+
+ // SUBSCRIBE TO CHAT
+ SubscribeTextInput.keyup(function (e) {
+ if (e.keyCode === 13 && SubscribeTextInput.val().length > 0) {
+ subscribe(SubscribeTextInput.val());
+ }
+ });
+
+ function subscribe(channel) {
+ ChatSocket.send(JSON.stringify({ClientMessageType: "Subscribe", Channel: channel}));
+ SubscribeTextInput.hide();
+ ChatTextInput.show();
+ }
+
+ // SEND MESSAGE FROM INPUT FIELD
+ ChatTextInput.keyup(function (e) {
+ if (e.keyCode === 13 && ChatTextInput.val().length > 0) {
+ ChatSocket.send(JSON.stringify({ClientMessageType: "Message", Message: ChatTextInput.val()}));
+ ChatTextInput.val("");
+ ChatTextInput.val("");
+
+ // USER USUALLY STOPS TYPING ON SENDING -> CHANGE STATE TO FALSE
+ sendTypingState(false);
+ isTyping = false;
+ clearTimeout(typingTimer);
+ }
+ });
+ };
+}
+
+InitializeChatServer();
\ No newline at end of file
diff --git a/main/app/sprinkles/core/templates/pages/index.html.twig b/main/app/sprinkles/core/templates/pages/index.html.twig
index 3ef8240..c395765 100644
--- a/main/app/sprinkles/core/templates/pages/index.html.twig
+++ b/main/app/sprinkles/core/templates/pages/index.html.twig
@@ -150,6 +150,18 @@
{% endblock %}
diff --git a/main/app/sprinkles/core/templates/pages/partials/chat.js.twig b/main/app/sprinkles/core/templates/pages/partials/chat.js.twig
deleted file mode 100644
index d32ed5d..0000000
--- a/main/app/sprinkles/core/templates/pages/partials/chat.js.twig
+++ /dev/null
@@ -1,196 +0,0 @@
-{% autoescape 'js' %}
-
-/************
- GENERATE KEYS
- ************
- if (localStorage.getItem('KeysGenerated') === null || localStorage.getItem('KeysGenerated') !== "true") {
- // GENERATE -- LATER ON LOGIN!
- var EncryptionPhrase = "PASSWORD 123"; // THE USERS PASSWORD -- needs to generate on login!
- var RSABitLength = 1024;
- var PrivateKeyString = cryptico.generateRSAKey(EncryptionPhrase, RSABitLength);
- var PublicKeyString = cryptico.publicKeyString(PrivateKeyString);
- // SAVE TO DATABASE
- $.ajax({
- type: "POST",
- url: "assets/php/SavePublicKey.php",
- data: {
- UserID: "1", // TEMPORARY
- PublicKeyString: PublicKeyString
- },
- async: true,
- error: function () {
- console.error("Error while saving public key to database!");
- },
- success: function () {
- localStorage.setItem('KeysGenerated', "true");
- }
- });
-}
-
-
- /******
- GENERAL
- ******/
-function InitializeChatServer() {
- var ChatTextInput = $("#ChatTextInput");
- var SubscribeTextInput = $("#SubscribeTextInput");
- var ChatMessages = $("#ChatMessages");
- var TypingIndicatorAnimationElement = "";
-
- var ChatSocket = new WebSocket('wss://marvinborner.ddnss.de:1337');
- ChatSocket.onerror = function () {
- setTimeout(function () {
- console.log("[WEBSOCKET LOGGER] Connection failed. Trying again...");
- InitializeChatServer();
- }, 5000);
- };
- ChatSocket.onopen = function () {
- console.log("[WEBSOCKET LOGGER] Chat connection established!");
-
- // GOT MESSAGE
- ChatSocket.onmessage = function (e) {
- var TypingIndicatorMessage = $(".TypingIndicatorMessage").parent();
- var LastMessage = $(".MessageWrapper.Normal:last .ChatMessage");
- var MessageObject = JSON.parse(e.data);
- if (MessageObject.ServerMessage === false) { // NO SERVER MESSAGE -> SENT BY USER
- if (MessageObject.WasHimself === true) { // -> MESSAGE WAS FROM HIMSELF
- if (!LastMessage.hasClass("MessageSent")) { // CHECK IF PREVIOUS MESSAGE WAS FROM HIMSELF TOO -> IF NOT, CREATE NEW 'ALONE' MESSAGE
- ChatMessages.append("" + MessageObject.Message + "
");
- } else if (LastMessage.hasClass("MessageSent")) { // IF PREVIOUS MESSAGE WAS FROM HIMSELF TOO -> CREATE WITH CORRESPONDING CLASSES FOR DESIGN
- ChatMessages.append("" + MessageObject.Message + "
");
- if (LastMessage.hasClass("AloneMessage")) {
- LastMessage.removeClass("AloneMessage");
- LastMessage.addClass("TopMessage");
- } else if (LastMessage.hasClass("BottomMessage")) {
- LastMessage.removeClass("BottomMessage");
- LastMessage.addClass("MiddleMessage");
- }
- }
- // CONVERT LINKS TO LINKS
- $('.MessageSent').linkify({
- target: "_blank"
- });
- } else if (MessageObject.WasHimself === false) { // -> MESSAGE WAS FROM OTHER USER
- if (!LastMessage.hasClass("MessageReceived")) { // CHECK IF PREVIOUS MESSAGE WAS FROM OTHER USER TOO -> IF NOT, CREATE NEW 'ALONE' MESSAGE
- ChatMessages.append("" + MessageObject.Message + "
");
- } else if (LastMessage.hasClass("MessageReceived")) { // IF PREVIOUS MESSAGE WAS FROM OTHER USER TOO -> CREATE WITH CORRESPONDING CLASSES FOR DESIGN
- ChatMessages.append("" + MessageObject.Message + "
");
- if (LastMessage.hasClass("AloneMessage")) {
- LastMessage.removeClass("AloneMessage");
- LastMessage.addClass("TopMessage");
- } else if (LastMessage.hasClass("BottomMessage")) {
- LastMessage.removeClass("BottomMessage");
- LastMessage.addClass("MiddleMessage");
- }
- }
- // CONVERT LINKS TO LINKS
- $('.MessageReceived').linkify({
- target: "_blank"
- });
- }
- } else if (MessageObject.ServerMessage === true) { // SERVER MESSAGE
- if (MessageObject.ServerMessageType === "GroupJoin") { // TYPE: USER JOINED A GROUP
- if (MessageObject.WasHimself === true) { // HIMSELF JOINED A GROUP -> NOTIFY
- ChatMessages.empty();
- var Message = "{{ translate("CHAT_MESSAGES.YOU_GROUP_JOIN", {group: "ConvertTranslatedMessageWithGroupName"}) }}".replace("ConvertTranslatedMessageWithGroupName", '"' + MessageObject.GroupName + '"');
- } else if (MessageObject.WasHimself === false) { // OTHER USER JOINED A GROUP -> NOTIFY
- var Message = "{{ translate("CHAT_MESSAGES.USER_GROUP_JOIN", {user: "ConvertTranslatedMessageWithUsername"}) }}".replace("ConvertTranslatedMessageWithUsername", MessageObject.Username);
- }
- ChatMessages.append("
");
- } else if (MessageObject.ServerMessageType === "UserDisconnect") { // TYPE: USER DISCONNECTED -> NOTIFY
- var TranslatedDisconnectMessage = "{{ translate("CHAT_MESSAGES.USER_DISCONNECT", {user: "ConvertTranslatedMessageWithUsername"}) }}".replace("ConvertTranslatedMessageWithUsername", MessageObject.Username);
- ChatMessages.append("
" + TranslatedDisconnectMessage + ".
");
- } else if (MessageObject.ServerMessageType === "TypingState") { // SOMEBODY'S TYPING STATE CHANGED!
- if (MessageObject.State === true) { // IF 'SOMEBODY' STARTED TYPING
- if (MessageObject.WasHimself === true) { // IDENTIFY 'SOMEBODY' -> WAS HIMSELF -> NOT THAT IMPORTANT (USER KNOWS WHEN HE STARTS TYPING?)
- // NOTHING
- } else if (MessageObject.WasHimself === false) { // IDENTIFY 'SOMEBODY' -> WAS OTHER USER -> SHOW TYPING ANIMATION ON RECEIVER'S SIDE
- ChatMessages.append("" + TypingIndicatorAnimationElement + "
");
- console.log("[SERVER REPORT] " + MessageObject.Username + " STARTED TYPING");
- }
- } else if (MessageObject.State === false) { // IF 'SOMEBODY' STOPPED TYPING
- if (MessageObject.WasHimself === true) { // IDENTIFY 'SOMEBODY' -> WAS HIMSELF -> NOT THAT IMPORTANT (USER KNOWS WHEN HE STOPS TYPING?)
- // NOTHING
- } else if (MessageObject.WasHimself === false) { // IDENTIFY 'SOMEBODY' -> WAS OTHER USER -> REMOVE TYPING ANIMATION
- //TypingIndicatorMessage.fadeOut("fast");
- TypingIndicatorMessage.remove();
- console.log("[SERVER REPORT] " + MessageObject.Username + " STOPPED TYPING");
- }
- }
- }
- }
- // SCROLL TO BOTTOM ON NEW MESSAGE OF ANY KIND
- ChatMessages.animate({scrollTop: document.querySelector("#ChatMessages").scrollHeight}, "slow");
- };
-
-
- // TYPING RECOGNITION
- var typingTimer;
- var isTyping = false;
-
- ChatTextInput.keydown(function () {
- sendStartTyping();
- clearTimeout(typingTimer);
- });
-
- ChatTextInput.keyup(function () {
- clearTimeout(typingTimer);
- typingTimer = setTimeout(function () {
- sendStopTyping()
- }, 2500)
- })
-
- function sendStartTyping() {
- if (isTyping === false) {
- sendTypingState(true);
- isTyping = true;
- }
- }
-
- function sendStopTyping() {
- if (isTyping === true) {
- sendTypingState(false);
- isTyping = false;
- }
- }
-
- function sendTypingState(state) { // SEND STATE TO CHAT SERVER
- ChatSocket.send(JSON.stringify({ClientMessageType: "TypingState", State: state}));
- }
-
- $(window).unload(function () {
- sendStopTyping(); // USER STOPS TYPING ON PAGE CLOSE ETC
- })
-
- // SUBSCRIBE TO CHAT
- SubscribeTextInput.keyup(function (e) {
- if (e.keyCode === 13 && SubscribeTextInput.val().length > 0) {
- subscribe(SubscribeTextInput.val());
- }
- });
-
- function subscribe(channel) {
- ChatSocket.send(JSON.stringify({ClientMessageType: "Subscribe", Channel: channel}));
- SubscribeTextInput.hide();
- ChatTextInput.show();
- }
-
- // SEND MESSAGE FROM INPUT FIELD
- ChatTextInput.keyup(function (e) {
- if (e.keyCode === 13 && ChatTextInput.val().length > 0) {
- ChatSocket.send(JSON.stringify({ClientMessageType: "Message", Message: ChatTextInput.val()}));
- ChatTextInput.val("");
- ChatTextInput.val("");
-
- // USER USUALLY STOPS TYPING ON SENDING -> CHANGE STATE TO FALSE
- sendTypingState(false);
- isTyping = false;
- clearTimeout(typingTimer);
- }
- });
- };
-}
-
-InitializeChatServer();
-
-{% endautoescape %}
\ No newline at end of file
--
cgit v1.2.3