From e017313b585b62ff57f2dec180663bbd7235dac7 Mon Sep 17 00:00:00 2001 From: Vortrex <3858226+VortrexFTW@users.noreply.github.com> Date: Mon, 27 Jun 2022 09:35:58 -0500 Subject: [PATCH] Add optional chatbox timestamps --- scripts/client/chatbox.js | 60 +++++++++++++++++++++++++------------ scripts/client/netevents.js | 3 +- scripts/server/account.js | 17 +++++++++++ scripts/server/bitflag.js | 43 +++++++++++++------------- scripts/server/netevents.js | 6 ++++ 5 files changed, 88 insertions(+), 41 deletions(-) diff --git a/scripts/client/chatbox.js b/scripts/client/chatbox.js index bc71ebf7..7ab5c95f 100644 --- a/scripts/client/chatbox.js +++ b/scripts/client/chatbox.js @@ -9,6 +9,7 @@ // =========================================================================== +let chatBoxTimeStampsEnabled = false; let chatBoxHistory = []; let bottomMessageIndex = 0; let maxChatBoxHistory = 500; @@ -56,12 +57,21 @@ function receiveChatBoxMessageFromServer(messageString, colour) { let colouredString = replaceColoursInMessage(messageString); + let date = new Date(); + let timeStampText = `${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}`; + logToConsole(LOG_DEBUG, `[VRR.ChatBox]: Changed colours in string: ${colouredString}`); - addToChatBoxHistory(colouredString, colour); + addToChatBoxHistory(colouredString, colour, timeStampText); //if(bottomMessageIndex >= chatBoxHistory.length-1) { - message(colouredString, colour); - bottomMessageIndex = chatBoxHistory.length-1; + + let outputText = colouredString; + if (chatBoxTimeStampsEnabled) { + outputText = `{TIMESTAMPCOLOUR}[${timeStampText}]{MAINCOLOUR} ${colouredString}`; + } + + message(outputText, colour); + bottomMessageIndex = chatBoxHistory.length - 1; //} chatLastUse = getCurrentUnixTimestamp(); @@ -75,8 +85,15 @@ function setChatScrollLines(amount) { // =========================================================================== +function setChatBoxTimeStampsState(state) { + chatBoxTimeStampsEnabled = state; + updateChatBox(); +} + +// =========================================================================== + function setChatAutoHideDelay(delay) { - chatAutoHideDelay = delay*1000; + chatAutoHideDelay = delay * 1000; } // =========================================================================== @@ -88,8 +105,8 @@ function addToChatBoxHistory(messageString, colour) { // =========================================================================== function chatBoxScrollUp() { - if(bottomMessageIndex > maxChatBoxLines) { - bottomMessageIndex = bottomMessageIndex-scrollAmount; + if (bottomMessageIndex > maxChatBoxLines) { + bottomMessageIndex = bottomMessageIndex - scrollAmount; updateChatBox(); } } @@ -97,8 +114,8 @@ function chatBoxScrollUp() { // =========================================================================== function chatBoxScrollDown() { - if(bottomMessageIndex < chatBoxHistory.length-1) { - bottomMessageIndex = bottomMessageIndex+scrollAmount; + if (bottomMessageIndex < chatBoxHistory.length - 1) { + bottomMessageIndex = bottomMessageIndex + scrollAmount; updateChatBox(); } } @@ -106,7 +123,7 @@ function chatBoxScrollDown() { // =========================================================================== function clearChatBox() { - for(let i = 0 ; i <= maxChatBoxLines ; i++) { + for (let i = 0; i <= maxChatBoxLines; i++) { message("", COLOUR_WHITE); } } @@ -115,9 +132,14 @@ function clearChatBox() { function updateChatBox() { clearChatBox(); - for(let i = bottomMessageIndex-maxChatBoxLines ; i <= bottomMessageIndex ; i++) { - if(typeof chatBoxHistory[i] != "undefined") { - message(chatBoxHistory[i][0], chatBoxHistory[i][1]); + for (let i = bottomMessageIndex - maxChatBoxLines; i <= bottomMessageIndex; i++) { + if (typeof chatBoxHistory[i] != "undefined") { + let outputText = chatBoxHistory[i][0]; + if (chatBoxTimeStampsEnabled) { + outputText = `{TIMESTAMPCOLOUR}[${timeStampText}]{MAINCOLOUR} ${chatBoxHistory[i][0]}`; + } + + message(outputText, chatBoxHistory[i][1]); } else { message("", COLOUR_WHITE); } @@ -129,18 +151,18 @@ function updateChatBox() { function processMouseWheelForChatBox(mouseId, deltaCoordinates, flipped) { // There isn't a way to detect whether chat input is active, but mouse cursor is forced shown when typing so ¯\_(ツ)_/¯ - if(!gui.cursorEnabled) { + if (!gui.cursorEnabled) { return false; } - if(!flipped) { - if(deltaCoordinates.y > 0) { + if (!flipped) { + if (deltaCoordinates.y > 0) { chatBoxScrollUp(); } else { chatBoxScrollDown(); } } else { - if(deltaCoordinates.y > 0) { + if (deltaCoordinates.y > 0) { chatBoxScrollDown(); } else { chatBoxScrollUp(); @@ -154,16 +176,16 @@ function checkChatAutoHide() { return false; // Make sure chat input isn't active - if(gui.cursorEnabled) { + if (gui.cursorEnabled) { return false; } // Don't process auto-hide if it's disabled - if(chatAutoHideDelay == 0) { + if (chatAutoHideDelay == 0) { return false; } - if(getCurrentUnixTimestamp()-chatLastUse >= chatAutoHideDelay) { + if (getCurrentUnixTimestamp() - chatLastUse >= chatAutoHideDelay) { setChatWindowEnabled(false); } } diff --git a/scripts/client/netevents.js b/scripts/client/netevents.js index 09a274af..e09697dc 100644 --- a/scripts/client/netevents.js +++ b/scripts/client/netevents.js @@ -18,10 +18,11 @@ function initServerScript() { function addAllNetworkHandlers() { logToConsole(LOG_DEBUG, "[VRR.Server]: Adding network handlers ..."); - // Chat history + // Chat Box addNetworkEventHandler("m", receiveChatBoxMessageFromServer); // Not prefixed with VRR to make it as small as possible addNetworkEventHandler("vrr.chatScrollLines", setChatScrollLines); addNetworkEventHandler("vrr.chatAutoHideDelay", setChatAutoHideDelay); + addNetworkEventHandler("vrr.chatTimeStamps", setChatBoxTimeStampsState); // Messaging (like textdraws and stuff) addNetworkEventHandler("vrr.smallGameMessage", showSmallGameMessage); diff --git a/scripts/server/account.js b/scripts/server/account.js index 486b9155..856c9722 100644 --- a/scripts/server/account.js +++ b/scripts/server/account.js @@ -387,6 +387,23 @@ function toggleAccountTwoFactorAuthCommand(command, params, client) { // =========================================================================== +function toggleChatBoxTimeStampsCommand(command, params, client) { + let flagValue = getAccountSettingsFlagValue("ChatBoxTimestamps"); + + if (hasBitFlag(getPlayerData(client).accountData.settings, flagValue)) { + getPlayerData(client).accountData.settings = removeBitFlag(getPlayerData(client).accountData.settings, flagValue); + messagePlayerSuccess(client, getLocaleString(client, "ChatBoxTimestampsToggle", `{softRed}${toUpperCase(getLocaleString(client, "Off"))}`)); + sendPlayerChatBoxTimeStampsState(client, false); + } else { + getPlayerData(client).accountData.settings = addBitFlag(getPlayerData(client).accountData.settings, flagValue); + messagePlayerSuccess(client, getLocaleString(client, "ChatBoxTimestampsToggle", `{softGreen}${toUpperCase(getLocaleString(client, "On"))}`)); + sendPlayerChatBoxTimeStampsState(client, false); + } + return true; +} + +// =========================================================================== + function registerCommand(command, params, client) { if (isPlayerRegistered(client)) { messagePlayerError(client, getLocaleString(client, "AccountNameAlreadyRegistered")); diff --git a/scripts/server/bitflag.js b/scripts/server/bitflag.js index 01085c73..c4839fa5 100644 --- a/scripts/server/bitflag.js +++ b/scripts/server/bitflag.js @@ -117,6 +117,7 @@ let serverBitFlagKeys = { "NoKeyBinds", "NoRandomTips", "NoActionTips", + "ChatBoxTimestamps", ], // Not going to be used. Use trigger, condition, and response stuff in trigger.js @@ -243,25 +244,25 @@ function initBitFlagScript() { // =========================================================================== function doesPlayerHaveStaffPermission(client, requiredFlags) { - if(isConsole(client)) { + if (isConsole(client)) { return true; } - if(requiredFlags == getStaffFlagValue("None")) { + if (requiredFlags == getStaffFlagValue("None")) { return true; } let staffFlags = 0; - if(getPlayerData(client)) { + if (getPlayerData(client)) { staffFlags = getPlayerData(client).accountData.flags.admin; } // -1 is automatic override (having -1 for staff flags is basically god mode admin level) - if(staffFlags == getStaffFlagValue("All")) { + if (staffFlags == getStaffFlagValue("All")) { return true; } - if(hasBitFlag(staffFlags, requiredFlags)) { + if (hasBitFlag(staffFlags, requiredFlags)) { return true; } @@ -271,15 +272,15 @@ function doesPlayerHaveStaffPermission(client, requiredFlags) { // =========================================================================== function doesPlayerHaveClanPermission(client, requiredFlags) { - if(isConsole(client)) { + if (isConsole(client)) { return true; } - if(requiredFlags == getClanFlagValue("None")) { + if (requiredFlags == getClanFlagValue("None")) { return true; } - if(doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageClans"))) { + if (doesPlayerHaveStaffPermission(client, getStaffFlagValue("ManageClans"))) { return true; } @@ -287,11 +288,11 @@ function doesPlayerHaveClanPermission(client, requiredFlags) { clanFlags = getPlayerCurrentSubAccount(client).clanFlags | getClanRankFlags(getPlayerCurrentSubAccount(client).clanRank); // -1 is automatic override (having -1 for staff flags is basically god mode admin level) - if(clanFlags == getClanFlagValue("All")) { + if (clanFlags == getClanFlagValue("All")) { return true; } - if(hasBitFlag(clanFlags, requiredFlags)) { + if (hasBitFlag(clanFlags, requiredFlags)) { return true; } @@ -301,11 +302,11 @@ function doesPlayerHaveClanPermission(client, requiredFlags) { // =========================================================================== function getStaffFlagValue(flagName) { - if(flagName == "All") { + if (flagName == "All") { return -1; } - if(typeof serverBitFlags.staffFlags[flagName] == "undefined") { + if (typeof serverBitFlags.staffFlags[flagName] == "undefined") { return false; } @@ -315,11 +316,11 @@ function getStaffFlagValue(flagName) { // =========================================================================== function getClanFlagValue(flagName) { - if(flagName == "All") { + if (flagName == "All") { return -1; } - if(typeof getServerBitFlags().clanFlags[flagName] == "undefined") { + if (typeof getServerBitFlags().clanFlags[flagName] == "undefined") { return false; } @@ -329,11 +330,11 @@ function getClanFlagValue(flagName) { // =========================================================================== function getAccountSettingsFlagValue(flagName) { - if(flagName == "All") { + if (flagName == "All") { return -1; } - if(typeof serverBitFlags.accountSettingsFlags[flagName] == "undefined") { + if (typeof serverBitFlags.accountSettingsFlags[flagName] == "undefined") { return false; } @@ -343,11 +344,11 @@ function getAccountSettingsFlagValue(flagName) { // =========================================================================== function getModerationFlagValue(flagName) { - if(flagName == "All") { + if (flagName == "All") { return -1; } - if(typeof serverBitFlags.moderationFlags[flagName] == "undefined") { + if (typeof serverBitFlags.moderationFlags[flagName] == "undefined") { return false; } @@ -357,7 +358,7 @@ function getModerationFlagValue(flagName) { // =========================================================================== function givePlayerStaffFlag(client, flagName) { - if(!getStaffFlagValue(flagName)) { + if (!getStaffFlagValue(flagName)) { return false; } @@ -369,7 +370,7 @@ function givePlayerStaffFlag(client, flagName) { function takePlayerStaffFlag(client, flagName) { let flagValue = getStaffFlagValue(flagName); - if(!flagValue) { + if (!flagValue) { return false; } @@ -380,7 +381,7 @@ function takePlayerStaffFlag(client, flagName) { // =========================================================================== function takePlayerStaffFlag(client, flagName) { - if(!getStaffFlagValue(flagName)) { + if (!getStaffFlagValue(flagName)) { return false; } diff --git a/scripts/server/netevents.js b/scripts/server/netevents.js index 9e1a1107..b8d18296 100644 --- a/scripts/server/netevents.js +++ b/scripts/server/netevents.js @@ -1237,4 +1237,10 @@ function clearLocalPickupsForPlayer(client) { sendNetworkEventToPlayer(client, "vrr.clearPickups"); } +// ========================================================================== + +function sendPlayerChatBoxTimeStampsState(client, state) { + sendNetworkEventToPlayer(client, "vrr.chatTimeStamps", state); +} + // ========================================================================== \ No newline at end of file