From 10a614f190a65559cd3d4ce441a671b097849a01 Mon Sep 17 00:00:00 2001 From: Lncvrt Date: Sun, 25 Jan 2026 16:58:48 -0700 Subject: [PATCH] Finish chatroom --- Assets/Scenes/ChatroomMenu.unity | 274 ++++---- Assets/Scripts/ChatroomMenu.cs | 591 +++++++----------- Assets/Scripts/Other/Endpoints.cs | 1 + Assets/Scripts/Types/ChatroomMessage.cs | 6 +- Assets/Scripts/WSMessages/DeleteMessage.cs | 11 + .../Scripts/WSMessages/DeleteMessage.cs.meta | 2 + Assets/Scripts/WSMessages/EditMessage.cs | 11 + Assets/Scripts/WSMessages/EditMessage.cs.meta | 2 + Assets/Scripts/WSMessages/UploadMessage.cs | 11 + .../Scripts/WSMessages/UploadMessage.cs.meta | 2 + 10 files changed, 397 insertions(+), 514 deletions(-) create mode 100644 Assets/Scripts/WSMessages/DeleteMessage.cs create mode 100644 Assets/Scripts/WSMessages/DeleteMessage.cs.meta create mode 100644 Assets/Scripts/WSMessages/EditMessage.cs create mode 100644 Assets/Scripts/WSMessages/EditMessage.cs.meta create mode 100644 Assets/Scripts/WSMessages/UploadMessage.cs create mode 100644 Assets/Scripts/WSMessages/UploadMessage.cs.meta diff --git a/Assets/Scenes/ChatroomMenu.unity b/Assets/Scenes/ChatroomMenu.unity index 526aedf..0b379c9 100644 --- a/Assets/Scenes/ChatroomMenu.unity +++ b/Assets/Scenes/ChatroomMenu.unity @@ -966,7 +966,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 0} + m_Sprite: {fileID: 21300000, guid: 517f61beffc1245a0a3f7907c7c93eb0, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -1920,47 +1920,6 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!21 &225059705 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: UI/RoundedCorners/RoundedCorners - m_Shader: {fileID: 4800000, guid: 0bd2ec5d73751e34a814274a454bec41, type: 3} - m_Parent: {fileID: 0} - m_ModifiedSerializedProperties: 0 - m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_LockedProperties: - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _ColorMask: 15 - - _Stencil: 0 - - _StencilComp: 8 - - _StencilOp: 0 - - _StencilReadMask: 255 - - _StencilWriteMask: 255 - - _UseUIAlphaClip: 0 - m_Colors: - - _OuterUV: {r: 0, g: 0, b: 1, a: 1} - - _WidthHeightRadius: {r: 1180, g: 75, b: 20, a: 0} - m_BuildTextureStacks: [] - m_AllowLocking: 1 --- !u!1 &231554130 GameObject: m_ObjectHideFlags: 0 @@ -2410,6 +2369,47 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 247980821} m_CullTransparentMesh: 1 +--- !u!21 &249407231 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: UI/RoundedCorners/RoundedCorners + m_Shader: {fileID: 4800000, guid: 0bd2ec5d73751e34a814274a454bec41, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _ColorMask: 15 + - _Stencil: 0 + - _StencilComp: 8 + - _StencilOp: 0 + - _StencilReadMask: 255 + - _StencilWriteMask: 255 + - _UseUIAlphaClip: 0 + m_Colors: + - _OuterUV: {r: 0, g: 0, b: 1, a: 1} + - _WidthHeightRadius: {r: 1180, g: 75, b: 20, a: 0} + m_BuildTextureStacks: [] + m_AllowLocking: 1 --- !u!1 &258129472 GameObject: m_ObjectHideFlags: 0 @@ -4882,47 +4882,6 @@ MonoBehaviour: invert: 0 addMore: {r: 0, g: 0, b: 0, a: 0} reverseAdd: 0 ---- !u!21 &560411584 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: UI/RoundedCorners/RoundedCorners - m_Shader: {fileID: 4800000, guid: 0bd2ec5d73751e34a814274a454bec41, type: 3} - m_Parent: {fileID: 0} - m_ModifiedSerializedProperties: 0 - m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_LockedProperties: - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _ColorMask: 15 - - _Stencil: 0 - - _StencilComp: 8 - - _StencilOp: 0 - - _StencilReadMask: 255 - - _StencilWriteMask: 255 - - _UseUIAlphaClip: 0 - m_Colors: - - _OuterUV: {r: 0, g: 0, b: 1, a: 1} - - _WidthHeightRadius: {r: 1180, g: 75, b: 20, a: 0} - m_BuildTextureStacks: [] - m_AllowLocking: 1 --- !u!1 &591098545 GameObject: m_ObjectHideFlags: 0 @@ -6178,7 +6137,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!224 &726248163 RectTransform: m_ObjectHideFlags: 0 @@ -6193,10 +6152,10 @@ RectTransform: m_Children: [] m_Father: {fileID: 1301936380} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 1100, y: 160} + m_SizeDelta: {x: -80, y: -570} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &726248164 MonoBehaviour: @@ -6250,7 +6209,7 @@ MonoBehaviour: m_fontWeight: 400 m_enableAutoSizing: 1 m_fontSizeMin: 1 - m_fontSizeMax: 128 + m_fontSizeMax: 64 m_fontStyle: 0 m_HorizontalAlignment: 2 m_VerticalAlignment: 512 @@ -6867,7 +6826,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image - m_Material: {fileID: 225059705} + m_Material: {fileID: 249407231} m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} @@ -7104,7 +7063,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 6534417478244952628, guid: dbf71fe5f2caad1409da64bdbb781eb5, type: 3} + m_Sprite: {fileID: 21300000, guid: 517f61beffc1245a0a3f7907c7c93eb0, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -7122,6 +7081,88 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 928270038} m_CullTransparentMesh: 1 +--- !u!21 &931340537 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: UI/RoundedCorners/RoundedCorners + m_Shader: {fileID: 4800000, guid: 0bd2ec5d73751e34a814274a454bec41, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _ColorMask: 15 + - _Stencil: 0 + - _StencilComp: 8 + - _StencilOp: 0 + - _StencilReadMask: 255 + - _StencilWriteMask: 255 + - _UseUIAlphaClip: 0 + m_Colors: + - _OuterUV: {r: 0, g: 0, b: 1, a: 1} + - _WidthHeightRadius: {r: 1180, g: 75, b: 20, a: 0} + m_BuildTextureStacks: [] + m_AllowLocking: 1 +--- !u!21 &943778468 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: UI/RoundedCorners/RoundedCorners + m_Shader: {fileID: 4800000, guid: 0bd2ec5d73751e34a814274a454bec41, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _ColorMask: 15 + - _Stencil: 0 + - _StencilComp: 8 + - _StencilOp: 0 + - _StencilReadMask: 255 + - _StencilWriteMask: 255 + - _UseUIAlphaClip: 0 + m_Colors: + - _OuterUV: {r: 0, g: 0, b: 1, a: 1} + - _WidthHeightRadius: {r: 1180, g: 75, b: 20, a: 0} + m_BuildTextureStacks: [] + m_AllowLocking: 1 --- !u!1 &971230925 GameObject: m_ObjectHideFlags: 0 @@ -7187,7 +7228,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image - m_Material: {fileID: 1209760313} + m_Material: {fileID: 931340537} m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} @@ -7974,7 +8015,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image - m_Material: {fileID: 560411584} + m_Material: {fileID: 943778468} m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} m_RaycastTarget: 1 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} @@ -8014,47 +8055,6 @@ MonoBehaviour: m_EditorClassIdentifier: Nobi.UiRoundedCorners::Nobi.UiRoundedCorners.ImageWithRoundedCorners radius: 10 image: {fileID: 1208331055} ---- !u!21 &1209760313 -Material: - serializedVersion: 8 - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_Name: UI/RoundedCorners/RoundedCorners - m_Shader: {fileID: 4800000, guid: 0bd2ec5d73751e34a814274a454bec41, type: 3} - m_Parent: {fileID: 0} - m_ModifiedSerializedProperties: 0 - m_ValidKeywords: [] - m_InvalidKeywords: [] - m_LightmapFlags: 4 - m_EnableInstancingVariants: 0 - m_DoubleSidedGI: 0 - m_CustomRenderQueue: -1 - stringTagMap: {} - disabledShaderPasses: [] - m_LockedProperties: - m_SavedProperties: - serializedVersion: 3 - m_TexEnvs: - - _MainTex: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - m_Ints: [] - m_Floats: - - _ColorMask: 15 - - _Stencil: 0 - - _StencilComp: 8 - - _StencilOp: 0 - - _StencilReadMask: 255 - - _StencilWriteMask: 255 - - _UseUIAlphaClip: 0 - m_Colors: - - _OuterUV: {r: 0, g: 0, b: 1, a: 1} - - _WidthHeightRadius: {r: 1180, g: 75, b: 20, a: 0} - m_BuildTextureStacks: [] - m_AllowLocking: 1 --- !u!1 &1301936379 GameObject: m_ObjectHideFlags: 0 @@ -9749,7 +9749,7 @@ MonoBehaviour: m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] - m_Sprite: {fileID: 6534417478244952628, guid: dbf71fe5f2caad1409da64bdbb781eb5, type: 3} + m_Sprite: {fileID: 21300000, guid: 517f61beffc1245a0a3f7907c7c93eb0, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -10295,7 +10295,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &1748769838 RectTransform: m_ObjectHideFlags: 0 @@ -11148,7 +11148,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &1940562851 RectTransform: m_ObjectHideFlags: 0 @@ -11767,7 +11767,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &2042548466 RectTransform: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/ChatroomMenu.cs b/Assets/Scripts/ChatroomMenu.cs index a3eb1d3..77ce0c2 100644 --- a/Assets/Scripts/ChatroomMenu.cs +++ b/Assets/Scripts/ChatroomMenu.cs @@ -1,10 +1,10 @@ using System; using System.Collections; -using System.Collections.Generic; -using System.Linq; using System.Numerics; using System.Text; using System.Threading.Tasks; +using MikeSchweitzer.WebSocket; +using Newtonsoft.Json; using Newtonsoft.Json.Linq; using TMPro; using UnityEngine; @@ -15,18 +15,12 @@ using UnityEngine.UI; public class ChatroomMenu : MonoBehaviour { - private readonly static WaitForSeconds _waitForSeconds2 = new(2f); - private readonly static WaitForSeconds _waitForSeconds3 = new(3f); [SerializeField] private TMP_Text statusText; [SerializeField] private Button backButton; [SerializeField] private Button sendButton; [SerializeField] private TMP_InputField messageInputField; [SerializeField] private GameObject content; [SerializeField] private GameObject sampleObject; - private string statusMessage; - private Coroutine statusRoutine; - private Coroutine refreshLoopRoutine; - private bool shouldScrollToBottom = true; [SerializeField] private Button downButton; [SerializeField] private ProfileMenu profilePrefab; @@ -45,7 +39,146 @@ public class ChatroomMenu : MonoBehaviour [SerializeField] private Button reportMessagePanelExitButton; [SerializeField] private Button reportMessagePanelSubmitButton; [SerializeField] private TMP_InputField reportMessagePanelReportReason; - [SerializeField] private Dictionary customIcons; + + void Awake() + { + WebsocketHandler.Instance._Connection.StateChanged += OnStateChanged; + WebsocketHandler.Instance._Connection.MessageReceived += OnMessageReceived; + if (WebsocketHandler.Instance._Connection.State == WebSocketState.Connected) + { + statusText.text = "Loading messages"; + RequestInfoMessage msg = new() + { + kind = "chatroom_messages" + }; + WebsocketHandler.Instance._Connection.AddOutgoingMessage(JsonUtility.ToJson(msg)); + } + } + + private void OnStateChanged(WebSocketConnection connection, WebSocketState oldState, WebSocketState newState) + { + if (newState == WebSocketState.Connected) + { + statusText.text = "Loading messages"; + RequestInfoMessage msg = new() + { + kind = "chatroom_messages" + }; + WebsocketHandler.Instance._Connection.AddOutgoingMessage(JsonUtility.ToJson(msg)); + } + } + + private void OnMessageReceived(WebSocketConnection connection, WebSocketMessage message) + { + if (message.String != null && connection.State == WebSocketState.Connected) + { + JToken data = JToken.Parse(message.String); + if (data["for"] != null) + { + if (data["for"].ToString() == "info_request:chatroom_messages") + { + var userId = BazookaManager.Instance.GetAccountID(); + foreach (Transform item in content.transform) + { + if (!item.gameObject.activeSelf) continue; + Destroy(item.gameObject); + break; + } + foreach (var chatMessage in data["data"].ToObject()) + { + InsertMessage(chatMessage, userId); + } + statusText.text = ""; + StartCoroutine(ScrollToBottom()); + CustomIconLoader.Init(FindObjectsByType(FindObjectsSortMode.None)); + } + else if (data["for"].ToString() == "upload:chatroom_message") + { + var userId = BazookaManager.Instance.GetAccountID(); + var chatMessage = data["data"].ToObject(); + Destroy(content.transform.GetChild(1).gameObject); + InsertMessage(chatMessage, userId); + CustomIconLoader.Init(FindObjectsByType(FindObjectsSortMode.None)); + } + else if (data["for"].ToString() == "delete:chatroom_message") + { + Destroy(content.transform.Find("ChatroomRow_" + data["data"]["id"].ToString() ?? "").gameObject); + if (data["data"]["fillerMessage"].ToString() != null) + { + var userId = BazookaManager.Instance.GetAccountID(); + var chatMessage = data["data"]["fillerMessage"].ToObject(); + var row = InsertMessage(chatMessage, userId); + row.transform.SetSiblingIndex(1); + CustomIconLoader.Init(FindObjectsByType(FindObjectsSortMode.None)); + } + } + else if (data["for"].ToString() == "edit:chatroom_message") + { + if (data["data"]["newContent"].ToString() != null) + { + content.transform.Find("ChatroomRow_" + data["data"]["id"].ToString()).transform.GetChild(3).GetComponent().text = data["data"]["newContent"].ToString(); + } + } + } + } + } + + GameObject InsertMessage(ChatroomMessage message, BigInteger? localUserId) + { + var obj = content.transform.Find("ChatroomRow_" + message.ID); + + var rowInfo = Instantiate(sampleObject, content.transform); + rowInfo.transform.SetSiblingIndex(content.transform.childCount - 1); + var bgImg = rowInfo.transform.GetChild(0).GetComponent(); + var usernameText = rowInfo.transform.GetChild(1).GetComponent(); + var playerIcon = rowInfo.transform.GetChild(2).GetComponent(); + var playerIconButton = rowInfo.transform.GetChild(2).GetComponent