From 002fdf0b42ae7a93477d2848a70c5981aecb2ea3 Mon Sep 17 00:00:00 2001 From: Armored Dragon Date: Fri, 17 May 2024 15:59:23 -0500 Subject: [PATCH] Initial Commit. Floof Chat moved to script archive. Fixed local message distance check. Signed-off-by: Armored Dragon --- .../chat/FloofChat.html | 0 .../chat/FloofChat.js | 0 .../chat/FloofChat.qml | 0 .../chat/chat.png | Bin .../chat/css/FloofChat.css | 0 .../chat/css/materialize.css | 0 .../chat/js/materialize.min.js | 0 .../chat/resources/bubblepop.wav | Bin .../armored-chat/armored_chat.js | 200 +++++++++ .../armored-chat/armored_chat.qml | 403 ++++++++++++++++++ .../armored-chat/img/icon_black.png | Bin 0 -> 400 bytes .../armored-chat/img/icon_white.png | Bin 0 -> 778 bytes .../armored-chat/img/ui/send.svg | 42 ++ .../armored-chat/img/ui/send_black.png | Bin 0 -> 1950 bytes .../armored-chat/img/ui/send_white.png | Bin 0 -> 1956 bytes .../armored-chat/img/ui/settings_black.png | Bin 0 -> 1561 bytes .../armored-chat/img/ui/settings_white.png | Bin 0 -> 1568 bytes .../armored-chat/img/ui/social_black.png | Bin 0 -> 3485 bytes .../armored-chat/img/ui/social_white.png | Bin 0 -> 3491 bytes .../armored-chat/img/ui/world_black.png | Bin 0 -> 4066 bytes .../armored-chat/img/ui/world_white.png | Bin 0 -> 3960 bytes scripts/defaultScripts.js | 4 +- 22 files changed, 647 insertions(+), 2 deletions(-) rename {scripts/communityScripts => script-archive}/chat/FloofChat.html (100%) rename {scripts/communityScripts => script-archive}/chat/FloofChat.js (100%) rename {scripts/communityScripts => script-archive}/chat/FloofChat.qml (100%) rename {scripts/communityScripts => script-archive}/chat/chat.png (100%) rename {scripts/communityScripts => script-archive}/chat/css/FloofChat.css (100%) rename {scripts/communityScripts => script-archive}/chat/css/materialize.css (100%) rename {scripts/communityScripts => script-archive}/chat/js/materialize.min.js (100%) rename {scripts/communityScripts => script-archive}/chat/resources/bubblepop.wav (100%) create mode 100644 scripts/communityScripts/armored-chat/armored_chat.js create mode 100644 scripts/communityScripts/armored-chat/armored_chat.qml create mode 100644 scripts/communityScripts/armored-chat/img/icon_black.png create mode 100644 scripts/communityScripts/armored-chat/img/icon_white.png create mode 100644 scripts/communityScripts/armored-chat/img/ui/send.svg create mode 100644 scripts/communityScripts/armored-chat/img/ui/send_black.png create mode 100644 scripts/communityScripts/armored-chat/img/ui/send_white.png create mode 100644 scripts/communityScripts/armored-chat/img/ui/settings_black.png create mode 100644 scripts/communityScripts/armored-chat/img/ui/settings_white.png create mode 100644 scripts/communityScripts/armored-chat/img/ui/social_black.png create mode 100644 scripts/communityScripts/armored-chat/img/ui/social_white.png create mode 100644 scripts/communityScripts/armored-chat/img/ui/world_black.png create mode 100644 scripts/communityScripts/armored-chat/img/ui/world_white.png diff --git a/scripts/communityScripts/chat/FloofChat.html b/script-archive/chat/FloofChat.html similarity index 100% rename from scripts/communityScripts/chat/FloofChat.html rename to script-archive/chat/FloofChat.html diff --git a/scripts/communityScripts/chat/FloofChat.js b/script-archive/chat/FloofChat.js similarity index 100% rename from scripts/communityScripts/chat/FloofChat.js rename to script-archive/chat/FloofChat.js diff --git a/scripts/communityScripts/chat/FloofChat.qml b/script-archive/chat/FloofChat.qml similarity index 100% rename from scripts/communityScripts/chat/FloofChat.qml rename to script-archive/chat/FloofChat.qml diff --git a/scripts/communityScripts/chat/chat.png b/script-archive/chat/chat.png similarity index 100% rename from scripts/communityScripts/chat/chat.png rename to script-archive/chat/chat.png diff --git a/scripts/communityScripts/chat/css/FloofChat.css b/script-archive/chat/css/FloofChat.css similarity index 100% rename from scripts/communityScripts/chat/css/FloofChat.css rename to script-archive/chat/css/FloofChat.css diff --git a/scripts/communityScripts/chat/css/materialize.css b/script-archive/chat/css/materialize.css similarity index 100% rename from scripts/communityScripts/chat/css/materialize.css rename to script-archive/chat/css/materialize.css diff --git a/scripts/communityScripts/chat/js/materialize.min.js b/script-archive/chat/js/materialize.min.js similarity index 100% rename from scripts/communityScripts/chat/js/materialize.min.js rename to script-archive/chat/js/materialize.min.js diff --git a/scripts/communityScripts/chat/resources/bubblepop.wav b/script-archive/chat/resources/bubblepop.wav similarity index 100% rename from scripts/communityScripts/chat/resources/bubblepop.wav rename to script-archive/chat/resources/bubblepop.wav diff --git a/scripts/communityScripts/armored-chat/armored_chat.js b/scripts/communityScripts/armored-chat/armored_chat.js new file mode 100644 index 0000000000..40c4510409 --- /dev/null +++ b/scripts/communityScripts/armored-chat/armored_chat.js @@ -0,0 +1,200 @@ +// +// armored_chat.js +// +// Created by Armored Dragon, 2024. +// Copyright 2024 Overte e.V. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html + +(() => { + "use strict"; + + var app_is_visible = false; + var settings = { + compact_chat: false, + external_window: false, + }; + + // Global vars + var tablet; + var chat_overlay_window; + var app_button; + const channels = ["domain", "local"]; + var message_history = Settings.getValue("ArmoredChat-Messages", []); + var max_local_distance = 20; // Maximum range for the local chat + var pal_data = AvatarManager.getPalData().data; + + Messages.subscribe("chat"); + Messages.messageReceived.connect(receivedMessage); + AvatarManager.avatarAddedEvent.connect((session_id) => { + _avatarAction("connected", session_id); + }); + AvatarManager.avatarRemovedEvent.connect((session_id) => { + _avatarAction("left", session_id); + }); + + startup(); + + function startup() { + tablet = Tablet.getTablet("com.highfidelity.interface.tablet.system"); + + app_button = tablet.addButton({ + icon: Script.resolvePath("./img/icon_white.png"), + activeIcon: Script.resolvePath("./img/icon_black.png"), + text: "CHAT", + isActive: app_is_visible, + }); + + // When script ends, remove itself from tablet + Script.scriptEnding.connect(function () { + console.log("Shutting Down"); + tablet.removeButton(app_button); + chat_overlay_window.close(); + }); + + // Overlay button toggle + app_button.clicked.connect(toggleMainChatWindow); + + _openWindow(); + } + function toggleMainChatWindow() { + app_is_visible = !app_is_visible; + console.log(`App is now ${app_is_visible ? "visible" : "hidden"}`); + app_button.editProperties({ isActive: app_is_visible }); + chat_overlay_window.visible = app_is_visible; + + // External window was closed; the window does not exist anymore + if (chat_overlay_window.title == "" && app_is_visible) { + _openWindow(); + } + } + function _openWindow() { + chat_overlay_window = new Desktop.createWindow( + Script.resolvePath("./armored_chat.qml"), + { + title: "Chat", + size: { x: 550, y: 400 }, + additionalFlags: Desktop.ALWAYS_ON_TOP, + visible: app_is_visible, + presentationMode: Desktop.PresentationMode.VIRTUAL, + } + ); + + chat_overlay_window.closed.connect(toggleMainChatWindow); + chat_overlay_window.fromQml.connect(fromQML); + } + function receivedMessage(channel, message) { + // Is the message a chat message? + channel = channel.toLowerCase(); + if (channel !== "chat") return; + console.log(`Received message:\n${message}`); + var message = JSON.parse(message); + + message.channel = message.channel.toLowerCase(); // Make sure the "local", "domain", etc. is formatted consistently + + if (!channels.includes(message.channel)) return; // Check the channel + if ( + message.channel == "local" && + Vec3.distance(MyAvatar.position, message.position) > + max_local_distance + ) + return; // If message is local, and if player is too far away from location, don't do anything + + // Update qml view of to new message + _emitEvent({ type: "show_message", ...message }); + + Messages.sendLocalMessage( + "Floof-Notif", + JSON.stringify({ + sender: message.displayName, + text: message.message, + }) + ); + + // Save message to history + let saved_message = message; + delete saved_message.position; + saved_message.timeString = new Date().toLocaleTimeString(undefined, { + hour12: false, + }); + saved_message.dateString = new Date().toLocaleDateString(undefined, { + month: "long", + day: "numeric", + }); + message_history.push(saved_message); + if (message_history.length > settings.max_history) + message_history.shift(); + Settings.setValue("ArmoredChat-Messages", message_history); + } + + function fromQML(event) { + console.log(`New web event:\n${JSON.stringify(event)}`); + + switch (event.type) { + case "send_message": + _sendMessage(event.message, event.channel); + break; + case "initialized": + // https://github.com/overte-org/overte/issues/824 + chat_overlay_window.visible = app_is_visible; // The "visible" field in the Desktop.createWindow does not seem to work. Force set it to the initial state (false) + _loadSettings(); + break; + } + } + function _sendMessage(message, channel) { + Messages.sendMessage( + "chat", + JSON.stringify({ + position: MyAvatar.position, + message: message, + displayName: MyAvatar.sessionDisplayName, + channel: channel, + action: "send_chat_message", + }) + ); + } + function _avatarAction(type, session_id) { + Script.setTimeout(() => { + if (type == "connected") { + pal_data = AvatarManager.getPalData().data; + } + + // Get the display name of the user + let display_name = ""; + display_name = + AvatarManager.getPalData([session_id])?.data[0] + ?.sessionDisplayName || null; + if (display_name == null) { + for (let i = 0; i < pal_data.length; i++) { + if (pal_data[i].sessionUUID == session_id) { + display_name = pal_data[i].sessionDisplayName; + } + } + } + + // Format the packet + let message = {}; + message.message = `${display_name} ${type}`; + + _emitEvent({ type: "avatar_connected", ...message }); + }, 1500); + } + + function _loadSettings() { + message_history.forEach((message) => { + delete message.action; + _emitEvent({ type: "show_message", ...message }); + }); + } + function _saveSettings() {} + + /** + * Emit a packet to the HTML front end. Easy communication! + * @param {Object} packet - The Object packet to emit to the HTML + * @param {("setting_update"|"show_message")} packet.type - The type of packet it is + */ + function _emitEvent(packet = { type: "" }) { + chat_overlay_window.sendToQml(packet); + } +})(); diff --git a/scripts/communityScripts/armored-chat/armored_chat.qml b/scripts/communityScripts/armored-chat/armored_chat.qml new file mode 100644 index 0000000000..29f43a4616 --- /dev/null +++ b/scripts/communityScripts/armored-chat/armored_chat.qml @@ -0,0 +1,403 @@ +import QtQuick 2.7 +import QtQuick.Controls 2.0 +import QtQuick.Layouts 1.3 + +Rectangle { + color: Qt.rgba(0.1,0.1,0.1,1) + signal sendToScript(var message); + + property string pageVal: "local" + property string last_message_user: "" + property date last_message_time: new Date() + + // TODO: Find a better way to do this + // When the window is created on the script side, the window starts open. + // Once the QML window is created wait, then send the initialized signal. + // This signal is mostly used to close the "Desktop overlay window" script side + // https://github.com/overte-org/overte/issues/824 + Timer { + interval: 100 + running: true + onTriggered: { + toScript({type: "initialized"}) + } + } + // Component.onCompleted: { + // toScript({type: "initialized"}) + // } + + Column { + anchors.fill: parent + spacing: 0 + + // Navigation Bar + Rectangle { + id: navigation_bar + width: parent.width + height: 40 + color:Qt.rgba(0,0,0,1) + + Item { + height: parent.height + width: parent.width + anchors.fill: parent + + Rectangle { + width: pageVal === "local" ? 100 : 60 + height: parent.height + color: pageVal === "local" ? "#505186" : "white" + id: local_page + + Image { + source: "./img/ui/" + (pageVal === "local" ? "social_white.png" : "social_black.png") + sourceSize.width: 40 + sourceSize.height: 40 + anchors.centerIn: parent + } + + Behavior on width { + NumberAnimation { + duration: 50 + // easing.type: Easeing.InOutQuad + } + } + + MouseArea { + anchors.fill: parent + onClicked: { + pageVal = "local"; + } + } + } + Rectangle { + width: pageVal === "domain" ? 100 : 60 + height: parent.height + color: pageVal === "domain" ? "#505186" : "white" + anchors.left: local_page.right + anchors.leftMargin: 5 + id: domain_page + + Image { + source: "./img/ui/" + (pageVal === "domain" ? "world_white.png" : "world_black.png") + sourceSize.width: 30 + sourceSize.height: 30 + anchors.centerIn: parent + } + + Behavior on width { + NumberAnimation { + duration: 50 + } + } + + MouseArea { + anchors.fill: parent + onClicked: { + // addMessage("usertest", "Clicked", "Now", "domain", "notification"); + pageVal = "domain" + } + } + } + + Rectangle { + width: pageVal === "settings" ? 100 : 60 + height: parent.height + color: pageVal === "settings" ? "#505186" : "white" + anchors.right: parent.right + id: settings_page + + Image { + source: "./img/ui/" + (pageVal === "settings" ? "settings_white.png" : "settings_black.png") + sourceSize.width: 30 + sourceSize.height: 30 + anchors.centerIn: parent + } + + Behavior on width { + NumberAnimation { + duration: 50 + } + } + + MouseArea { + anchors.fill: parent + onClicked: { + pageVal = "settings" + } + } + } + } + + } + + // Pages + Item { + width: parent.width + height: parent.height - 40 + anchors.top: navigation_bar.bottom + + + // Chat Message History + ListView { + width: parent.width + height: parent.height - 40 + clip: true + interactive: true + spacing: 5 + id: listview + + delegate: Loader { + width: parent.width + property int delegateIndex: index + property string delegateText: model.text + property string delegateUsername: model.username + property string delegateDate: model.date + + sourceComponent: { + if (model.type === "chat") { + return template_chat_message; + } else if (model.type === "notification") { + return template_notification; + } + } + } + + model: getChannel(pageVal) + + } + + ListModel { + id: local + } + + ListModel { + id: domain + } + + // Chat Entry + Rectangle { + width: parent.width + height: 40 + color: Qt.rgba(0.9,0.9,0.9,1) + anchors.bottom: parent.bottom + visible: ["local", "domain"].includes(pageVal) ? true : false + + Row { + width: parent.width + height: parent.height + + + TextField { + width: parent.width - 60 + height: parent.height + placeholderText: pageVal.charAt(0).toUpperCase() + pageVal.slice(1) + " chat message..." + + onAccepted: { + toScript({type: "send_message", message: text, channel: pageVal}); + text = "" + } + } + + Button { + width: 60 + height:parent.height + + Image { + source: "./img/ui/send_black.png" + sourceSize.width: 30 + sourceSize.height: 30 + anchors.centerIn: parent + } + + onClicked: { + toScript({type: "send_message", message: parent.children[0].text, channel: pageVal}); + parent.children[0].text = "" + } + Keys.onPressed: { + if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { + toScript({type: "send_message", message: parent.children[0].text, channel: pageVal}); + parent.children[0].text = "" + } + } + } + } + } + } + + } + + Component { + id: template_chat_message + + Rectangle{ + property int index: delegateIndex + property string texttest: delegateText + property string username: delegateUsername + property string date: delegateDate + + width: parent.width + height: Math.max(65, children[1].height + 30) + color: index % 2 === 0 ? "transparent" : Qt.rgba(0.15,0.15,0.15,1) + + Item { + width: parent.width + height: 22 + + Text{ + text: username + color: "lightgray" + } + + Text{ + anchors.right: parent.right + text: date + color: "lightgray" + } + } + + TextEdit{ + anchors.top: parent.children[0].bottom + text: texttest + color:"white" + font.pointSize: 12 + readOnly: true + selectByMouse: true + selectByKeyboard: true + width: parent.width * 0.8 + height: contentHeight // Adjust height to fit content + wrapMode: Text.Wrap + } + } + } + + Component { + id: template_notification + + // width: (Math.min(parent.width * 0.8, Math.max(contentWidth, parent.width))) - parent.children[0].width + + Rectangle{ + property int index: delegateIndex + property string texttest: delegateText + property string username: delegateUsername + property string date: delegateDate + color: "#171717" + width: parent.width + height: 40 + + Item { + width: 10 + height: parent.height + + Rectangle { + height: parent.height + width: 5 + color: "#505186" + } + } + + + Item { + width: parent.width - parent.children[0].width - 5 + height: parent.height + anchors.left: parent.children[0].right + + TextEdit{ + text: texttest + color:"white" + font.pointSize: 12 + readOnly: true + width: parent.width + selectByMouse: true + selectByKeyboard: true + height: parent.height + wrapMode: Text.Wrap + verticalAlignment: Text.AlignVCenter + font.italic: true + } + + Text { + text: date + color:"white" + font.pointSize: 12 + anchors.right: parent.children[0].right + height: parent.height + wrapMode: Text.Wrap + horizontalAlignment: Text.AlignRight + verticalAlignment: Text.AlignVCenter + font.italic: true + } + } + + } + + } + + + + property var channels: { + "local": local, + "domain": domain, + } + + function scrollToBottom() { + listview.positionViewAtIndex(listview.count - 1, ListView.End); + listview.positionViewAtEnd(); + listview.contentY = listview.contentY + 50; + } + + + function addMessage(username, message, date, channel, type){ + channel = getChannel(channel) + + if (type === "notification"){ + channel.append({ text: message, date: date, type: "notification" }); + last_message_user = ""; + scrollToBottom(); + last_message_time = new Date(); + return; + } + + var current_time = new Date(); + var elapsed_time = current_time - last_message_time; + var elapsed_minutes = elapsed_time / (1000 * 60); + + var last_item_index = channel.count - 1; + var last_item = channel.get(last_item_index); + + if (last_message_user === username && elapsed_minutes < 1 && last_item){ + last_item.text = last_item.text += "\n" + message; + scrollToBottom() + last_message_time = new Date(); + return; + } + + last_message_user = username; + last_message_time = new Date(); + channel.append({ text: message, username: username, date: date, type: type }); + scrollToBottom(); + } + + function getChannel(id) { + return channels[id]; + } + + // Messages from script + function fromScript(message) { + let time = new Date().toLocaleTimeString(undefined, { hour12: false }); + let date = new Date().toLocaleDateString(undefined, { month: "long", day: "numeric", }); + + switch (message.type){ + case "show_message": + addMessage(message.displayName, message.message, `[ ${time} - ${date} ]`, message.channel, "chat"); + break; + case "avatar_connected": + addMessage("SYSTEM", message.message, `[ ${time} - ${date} ]`, "domain", "notification"); + break; + } + } + + // Send message to script + function toScript(packet){ + sendToScript(packet) + } +} diff --git a/scripts/communityScripts/armored-chat/img/icon_black.png b/scripts/communityScripts/armored-chat/img/icon_black.png new file mode 100644 index 0000000000000000000000000000000000000000..410dc40b5933b126b7a996926e9c2a98a6471316 GIT binary patch literal 400 zcmV;B0dM|^P)EX>4Tx04R}tkv&MmKpe$iTcs)$5j#k6$WWc^qD35Q6^c+H)C#RSm|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jfc5qU3krMxx6k5c1aNLh~_a1le0DrT}RI?`msG4PD zQb{3~UloF{2w)ifh#)R8Q=b#XG(5-GJ$!t6^ClDu?Zdk+{#50?g z&Uv3W%*v8Nd`>)R&;^Mfxh}i>#<}FMpJ#@RY-XM~Oe~bTSngt0HdNv`aa2(?%J=77 zRyc2QR;zW^z9)ZSsGzMZbDicGQdqkM+H?_h|#K%Vj@HPNe_R-@r&e=$yEU( z#{z0lAvu2VKlt6PS)877lR`K2d-P^xs+Wq|isK9c(_I@@V00006VoOIv00000008+zyMF)x010qNS#tmY z4c7nw4c7reD4Tcy000McNliru=mQZ69uX+!UB>_b0S8G$K~!ko?U*|b!Y~j-XCb1Y zf(lN=O}GLj2xxK#L`g-(o%mE7fM#eA3K5?Gvb-zJbe5ZW$;{d^AW71LNERfQBoFkX z1IY!+q6xr)el@TAwI={a00XB1Ihon;69Dgv^%Uo9x z%6yr-XpCx%3Lry?Np=A20E{yG-GBWDNVWlN9GC}yb)&{tWF%J(UZwXW=S`p2t14^j znfp?_`3lnztqyJe1wb70PXJ<>uK~m}Ujc||{su6EBuQa(1+-JEwmsQ(G5`Po07*qo IM6N<$f=@n5P5=M^ literal 0 HcmV?d00001 diff --git a/scripts/communityScripts/armored-chat/img/ui/send.svg b/scripts/communityScripts/armored-chat/img/ui/send.svg new file mode 100644 index 0000000000..82c70a6daf --- /dev/null +++ b/scripts/communityScripts/armored-chat/img/ui/send.svg @@ -0,0 +1,42 @@ + + + + + + diff --git a/scripts/communityScripts/armored-chat/img/ui/send_black.png b/scripts/communityScripts/armored-chat/img/ui/send_black.png new file mode 100644 index 0000000000000000000000000000000000000000..bc9ece7a1186440aefa69560047589a94f5a2efe GIT binary patch literal 1950 zcmV;P2VwY$P)F0KBn)fs&lHl0AB;+ zfT<$#FBQ?y1vt?9>n*@!V3>&foY{;jQX?tXvmclPi~v3qk@nxOC)8#w4~!F$=EkQ~krrvlO|let9hfE}J5n6Cq7KrQ>)8s-1YQ%7RR-f%)PR*- zk6$y71Kt&peTK0r+F>m>$y#7MFhNBA3>34}gp}*q1-t_c6_I6uW0#67zle-i)nkFXfhOP*v__-oi zay_cr4Y&iBW#4WTW!5MnFvCT<7p zCxh`#DYRUVs`do#2VMfMHV9G3Lcb{FCTU$WH{tfQdl-cH5qD^j`{ualrvH{fyZ%c<_io$>;aUF*UY7q>q)Gcn{XvUX_p28e2;66n-ID=uGDgq zsOqJ-EzbVHDFz{Yq2F*3S!pnS2P(PkP}LKGhkzG=s|-Q}TQk=xcOEbm_)J7rTTLcU zBuaw@0(W7v&AAR&n?1>5&0J5f&?aCm& zHE0@*U@f?x>}KHOnCq4jr9p#$n~lPxR_JHZ<+lzedOk2G*2_==w9_iFPeo))!1!haXs3a;Lcg)K{JUk{e7z4?M%!cj za}n8=;e1jdKs${u^cyK6-yZG{Wi7Wodx7P&J;vu1x#K?3PSXTjVHD=Dg?@RH+n$}c zk{ACNpDQA}vz=1sY1d9;RT{JbcRRso5!np+m)o8lzyjJH;|ue2#8wLd+G+fnc|=!( z!7bUJ^#oGDBGEb|7TtDfvJLo(w$I?DB2qZPfhsmTJeKn&cQde%w$Io?%Jd}8jhlcA zjlvu@p~_nBCSVb5GMB{AjTd0|s-~q-Xt^7KFL3|c<`IcZIB4H_FmRJmm`-hCSj$Zw zD$EB~#v;?Bs+Zs{U+V{)W)Pz8?Z>p`9wal?tAzq3NDUtxG%7bKGy1dL0EKms;*nox z<*uXc^YW9jyj&_kf@E@7U#r|vz$<0CbW>G(0T1I20Io9%V_IfYtK1c35gRB$3Q{1K z^*T2f1gc*SUfNn}xrr)@XR%9=GAl|irQ84sQZCv_N+UPXpgkD4)+kJ_8o{EM8z4b~ zoVIXADK}7pl>6rEsN@DpkP35cLKJcXBuIt4@T9PE10_g>zN)Bjaua>DR(DT9B$td8 zLT;c0DZ1+cb1gSerX6PcP;MGJ0Z6FAM=W} z+(H(X#e$XGt-ws&w%{tG7!^k$ZMjQvO;6K8H$7E!Bn`RI6_&+9BXWIV*{E1=LoYh@ z$jxQbQ$G3O82|tP literal 0 HcmV?d00001 diff --git a/scripts/communityScripts/armored-chat/img/ui/send_white.png b/scripts/communityScripts/armored-chat/img/ui/send_white.png new file mode 100644 index 0000000000000000000000000000000000000000..2730d2f84c769991885250798ac5e453a5c47d19 GIT binary patch literal 1956 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 LNkvXXu0mjfD_g-8 literal 0 HcmV?d00001 diff --git a/scripts/communityScripts/armored-chat/img/ui/settings_white.png b/scripts/communityScripts/armored-chat/img/ui/settings_white.png new file mode 100644 index 0000000000000000000000000000000000000000..12a35ad58c9149f9c3d07155798130e30fd971fa GIT binary patch literal 1568 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 Bh}!@F literal 0 HcmV?d00001 diff --git a/scripts/communityScripts/armored-chat/img/ui/social_white.png b/scripts/communityScripts/armored-chat/img/ui/social_white.png new file mode 100644 index 0000000000000000000000000000000000000000..7677bd54696ae317fcf03436102f46fa69fc4e4b GIT binary patch literal 3491 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 H literal 0 HcmV?d00001 diff --git a/scripts/communityScripts/armored-chat/img/ui/world_black.png b/scripts/communityScripts/armored-chat/img/ui/world_black.png new file mode 100644 index 0000000000000000000000000000000000000000..c983e5df28df328c581ae424242aa3308d13de35 GIT binary patch literal 4066 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 Uao=#1VE_OC07*qoM6N<$g5Qv^mjD0& literal 0 HcmV?d00001 diff --git a/scripts/communityScripts/armored-chat/img/ui/world_white.png b/scripts/communityScripts/armored-chat/img/ui/world_white.png new file mode 100644 index 0000000000000000000000000000000000000000..1f152b47b2ceb6144197886a1ed20a14fafff56b GIT binary patch literal 3960 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 SF%fA10000