using BrewMonster.Network; using BrewMonster.Scripts.Pet; using BrewMonster.UI; using CSNetwork; using CSNetwork.Protocols; using CSNetwork.GPDataType; using ModelRenderer.Scripts.GameData; using System; using System.Collections.Generic; using System.IO; using TMPro; using UnityEngine; using UnityEngine.UI; namespace BrewMonster { public class CDlgFriendList : AUIDialog { private enum FriendTab { Friend = 0, Blacklist = 1, Archrival = 2 } [Header("Buttons")] [SerializeField] private Button m_helpBtn; [SerializeField] private Button m_friendBtn; [SerializeField] private Button m_blacklistBtn; [SerializeField] private Button m_archrivalBtn; [SerializeField] private Button m_addBtn; [SerializeField] private Button m_deleteBtn; [SerializeField] private Button m_fuctionBtn; [SerializeField] private Button m_confirmBtn; [SerializeField] private Button m_cancelBtn; [SerializeField] private Button m_closeBtn; [Header("Buttons ContextMenu")] [SerializeField] private Button m_associate; [SerializeField] private Button m_addSubgrounp; [SerializeField] private Button m_autoReply; [SerializeField] private Button m_notifiOnl; [SerializeField] private Button m_close; [Header("Container")] [SerializeField] private Transform m_friendContainer; [SerializeField] private GameObject m_friendDetailPrefabs; [Header("GameObject")] [SerializeField] private GameObject m_contextMenu; [SerializeField] private GameObject m_inputName; [SerializeField] private Sprite m_normalBtn; [SerializeField] private Sprite m_grayBtn; private CSNetwork.GameSession _session; private FriendTab _currentTab = FriendTab.Friend; private int _selectedFriendId; private string _selectedFriendName; private Image _selectedRowImage; private Color _selectedRowOriginalColor; private TMP_InputField _addNameInput; private static readonly Color SelectedRowColor = new Color32(255, 255, 255, 60); public void OnInitDialog() { if (!IsShow()) { Show(true); } _session = UnityGameSession.Instance?.GameSession; if (_session != null) { _session.FriendListReceived -= OnFriendListReceived; _session.FriendListReceived += OnFriendListReceived; _session.FriendStatusChanged -= OnFriendStatusChanged; _session.FriendStatusChanged += OnFriendStatusChanged; _session.Friend_GetList(); } UpdateButtonTabUI(_currentTab); RefreshListFromHost(); if (m_helpBtn != null) { m_helpBtn.onClick.RemoveAllListeners(); m_helpBtn.onClick.AddListener(() => { // TODO: Show help content }); } if (m_friendBtn != null) { m_friendBtn.onClick.RemoveAllListeners(); m_friendBtn.onClick.AddListener(() => { _currentTab = FriendTab.Friend; UpdateButtonTabUI(_currentTab); RefreshListFromHost(); }); } if (m_blacklistBtn != null) { m_blacklistBtn.onClick.RemoveAllListeners(); m_blacklistBtn.onClick.AddListener(() => { _currentTab = FriendTab.Blacklist; UpdateButtonTabUI(_currentTab); RefreshListFromHost(); }); } if (m_archrivalBtn != null) { m_archrivalBtn.onClick.RemoveAllListeners(); m_archrivalBtn.onClick.AddListener(() => { _currentTab = FriendTab.Archrival; UpdateButtonTabUI(_currentTab); RefreshListFromHost(); }); } if (m_addBtn != null) { m_addBtn.onClick.RemoveAllListeners(); m_addBtn.onClick.AddListener(() => { EnsureAddNameInput(); if (m_inputName != null) m_inputName.SetActive(true); }); } if (m_deleteBtn != null) { m_deleteBtn.onClick.RemoveAllListeners(); m_deleteBtn.onClick.AddListener(() => CECUIManager.Instance.ShowMessageBoxYesAndNo( title: "Del Friend Requets", message: $"Bạn có chắc muốn xóa {_selectedFriendName} ra khỏi danh sách hảo hữu", dlg: null, onClickedYes:() => OnDeleteFriendClicked(true), onClickedNo: () => OnDeleteFriendClicked(false))); } if (m_fuctionBtn != null) { m_fuctionBtn.onClick.RemoveAllListeners(); m_fuctionBtn.onClick.AddListener(() => { m_contextMenu.SetActive(true); }); } if (m_confirmBtn != null) { m_confirmBtn.onClick.RemoveAllListeners(); m_confirmBtn.onClick.AddListener(() => { if (_session == null) return; EnsureAddNameInput(); var n = _addNameInput != null ? _addNameInput.text : string.Empty; n = (n ?? string.Empty).Trim(); if (n.Length <= 0) return; _session.Friend_Add(0, n); if (m_inputName != null) m_inputName.SetActive(false); }); } if (m_cancelBtn != null) { m_cancelBtn.onClick.RemoveAllListeners(); m_cancelBtn.onClick.AddListener(() => { _addNameInput.text = string.Empty; m_inputName.SetActive(false); }); } if (m_closeBtn != null) { m_closeBtn.onClick.RemoveAllListeners(); m_closeBtn.onClick.AddListener(() => { m_contextMenu.SetActive(false); CloseDialogue(); }); } if (m_associate != null) { m_associate.onClick.RemoveAllListeners(); m_associate.onClick.AddListener(() => { m_inputName.SetActive(true); m_contextMenu.SetActive(false); }); } if (m_addSubgrounp != null) { m_addSubgrounp.onClick.RemoveAllListeners(); m_addSubgrounp.onClick.AddListener(() => { // TODO: Add subgroup for friend }); } if (m_autoReply != null) { m_autoReply.onClick.RemoveAllListeners(); m_autoReply.onClick.AddListener(() => { // TODO: Set auto-reply message for friend requests }); } if (m_notifiOnl != null) { m_notifiOnl.onClick.RemoveAllListeners(); m_notifiOnl.onClick.AddListener(() => { // TODO: Toggle online notifications for this friend }); } if (m_close != null) { m_close.onClick.RemoveAllListeners(); m_close.onClick.AddListener(() => { m_contextMenu.SetActive(false); }); } } public override void OnDisable() { base.OnDisable(); if (_session != null) { _session.FriendListReceived -= OnFriendListReceived; _session.FriendStatusChanged -= OnFriendStatusChanged; } } private void OnFriendListReceived(getfriends_re _) { RefreshListFromHost(); } private void OnFriendStatusChanged(int _, byte __) { RefreshListFromHost(); } private void RefreshListFromHost() { if (m_friendContainer == null || m_friendDetailPrefabs == null) return; ClearSelection(); for (int i = m_friendContainer.childCount - 1; i >= 0; i--) { var child = m_friendContainer.GetChild(i); if (child != null) Destroy(child.gameObject); } if (_currentTab != FriendTab.Friend) return; var host = GetHostPlayer(); var man = host?.GetFriendMan(); if (man == null || !man.CheckInit()) return; int groupNum = man.GetGroupNum(); for (int gi = 0; gi < groupNum; gi++) { var g = man.GetGroupByIndex(gi); if (g == null) continue; foreach (var f in g.Friends) { var go = Instantiate(m_friendDetailPrefabs, m_friendContainer); var nameTxt = go.transform.Find("text_name")?.GetComponent(); var stateTxt = go.transform.Find("text_state")?.GetComponent(); string displayName = string.IsNullOrEmpty(f.Name) ? f.Id.ToString() : f.Name; if (nameTxt != null) nameTxt.text = string.IsNullOrEmpty(f.Name) ? f.Id.ToString() : f.Name; if (stateTxt != null) { bool online = f.IsGameOnline(); Debug.Log($"[Friend] id={f.Id}, name={f.Name}, status={f.Status}, isGame={f.IsGameOnline()}, isGT={f.IsGTOnline()}"); stateTxt.text = online ? "Online" : "Offline"; } WireRowSelection(go, f.Id, displayName); } } } private void WireRowSelection(GameObject rowGo, int friendId, string displayName) { if (rowGo == null) return; var btn = rowGo.GetComponent