using System.Collections; using System.Numerics; using System.Threading.Tasks; using MikeSchweitzer.WebSocket; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using TMPro; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.Networking; using UnityEngine.SceneManagement; using UnityEngine.UI; public class ChatroomMenu : MonoBehaviour { [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; [SerializeField] private Button downButton; [SerializeField] private ProfileMenu profilePrefab; [SerializeField] private GameObject optionsPanel; [SerializeField] private Button optionsPanelExitButton; [SerializeField] private Button optionsPanelDeleteButton; [SerializeField] private Button optionsPanelEditButton; [SerializeField] private Button optionsPanelReportButton; [SerializeField] private Button optionsPanelCopyButton; private ChatroomMessage selectedMessageForOptions; [SerializeField] private GameObject editMessagePanelSample; private GameObject editMessagePanelCurrent; [SerializeField] private GameObject reportMessagePanel; [SerializeField] private Button reportMessagePanelExitButton; [SerializeField] private Button reportMessagePanelSubmitButton; [SerializeField] private TMP_InputField reportMessagePanelReportReason; void Awake() { messageInputField.onSelect.AddListener((_) => messageInputField.caretPosition = messageInputField.text.Length); reportMessagePanelReportReason.onSelect.AddListener((_) => reportMessagePanelReportReason.caretPosition = reportMessagePanelReportReason.text.Length); 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