using ChatFilter; using DG.Tweening; using IVDataFormat; using IVServerFormat; using System.Collections.Generic; using System.Text.RegularExpressions; using TMPro; using Unity.VisualScripting; using UnityEngine; using UnityEngine.UI; public class ChatMgr : MonoBehaviour { #region Const private static ChatMgr curMgr = null; private const int I_CHECK_LOG = 400; private const int I_MAX_LOG = 100; private const int I_MAX_BLOCK = 50; public enum eChatChannel { None = 0, Stage = 1 } public enum eChatType { Message = 0, Toast = 1, //Notice = 2, Function = 3 } public class cChatMessage { public eChatType type; public string channel; public string sender; public string senderName; public string msg; public int id; public int lv; public int cnt; public SystemLanguage lang; } private const int EXC_Inspect = 0; private const int EXC_Notice = 1; private const int EXC_ChatNotice = 2; private const string CloudId = "9rimafb4ip"; private const string ProjectId = "ff3cfea9-5e37-454d-8d07-419fe163ee4b"; private const string APIkey = "80ecac34d9845969d02bc5f38855a992beddd53f4b092095"; #if VER_DEV private const string ChannelStageId = "e2b3d242-efaf-41ff-b1ed-d18b63eac63f"; private const string ChannelStageUnique = "dev_stage"; #elif VER_TEST private const string ChannelStageId = "25f7cb02-0198-48bd-83cb-c176dd8bd838"; private const string ChannelStageUnique = "test_stage"; #else private const string ChannelStageId = "a6abd2de-933f-481d-b3af-3238fdc1a1ea"; private const string ChannelStageUnique = "live_stage"; #endif #endregion Const #region UI [Header("UI")] [SerializeField] private TextMeshProUGUI txtMainMsg; [SerializeField] private Canvas canvasUI, miniChatCanvas; private TextMeshProUGUI txtChatNotice; private TMP_InputField inputChat; private ButtonIV btnChatSend; [SerializeField] private EScrController escrChat; private GameObject goChatUser; private TextMeshProUGUI txtUserName; private ButtonIV btnUserBlock; private GameObject goChatSettings; [SerializeField] private EScrController escrBlock; private Toggle tglSettingLangEn, tglSettingLangKo, tglSettingLangJa; private GameObject goBlockEmpty; #endregion UI #region Variables private int iLoading = 1; private bool bReLocalize = true; private bool bReLocalizeChat, bReLocalizeBlock = false; private bool bInitNeedUI = true; private bool bReloadNeed = false; // 채팅 연결 상태. private static bool bConnect = false; private static bool bConnecting = false; private static bool bConnectInvoking = false; private static bool bConnectingStage = false; private bool bFirstConnectStage = true; private bool bLoadLog = true; private eChatChannel selectedStageChannel = eChatChannel.None; private static List subscribeChannels = new List(); // 채팅 공지. private DG.Tweening.Sequence seqChatNotice = null; private int iChatNotice = -1; // 채팅 이력. private EnhancedUI.SmallList chatDatas; private int iChatCount = 0; private int iFirstIndex = 0; private int iLastIndex = -1; private string[] userIds; private string[] userNames; private string[] userMessages; private int[] userIcons; private int[] userTitles; private int[] userRanks; private string selectedUserId = null; private bool bInitBlock = false; private bool bUpdateBlock = true; private List blockIdList; private List blockNameList; private EnhancedUI.SmallList blockIndexList; // 언어별 표시. private bool bShowEn; private bool bShowKo; private bool bShowJa; private GameObject goPopupLang; Toggle[] tglLangs; TextMeshProUGUI popupTItle; TextMeshProUGUI blockTitle; TextMeshProUGUI[] yesnoText; TextMeshProUGUI[] tabSub; TextMeshProUGUI checkTxt; #endregion Variables #region Base public static void SLocalize(bool bmain) { if (curMgr != null) curMgr.Localize(bmain); } // 번역. private void Localize(bool bmain) { if (!bmain) { bReLocalize = false; txtChatNotice = canvasUI.transform.Find("txtNotice").GetComponent(); inputChat = canvasUI.transform.Find("inputChat").GetComponent(); btnChatSend = canvasUI.transform.Find("btnSend").GetComponent(); goChatUser = canvasUI.transform.Find("goChatUser").gameObject; txtUserName = goChatUser.transform.Find("txtUserName").GetComponent(); goChatUser.transform.Find("txtBlockConfirm").GetComponent().text = LocalizationText.GetText("chat_block_confirm"); goChatUser.transform.Find("btnUserBlock").Find("txt").GetComponent().text = LocalizationText.GetText("chat_block"); goChatUser.transform.Find("btnUserCancel").Find("txt").GetComponent().text = LocalizationText.GetText("all_close"); goChatUser.transform.Find("Guide").GetComponent().text = LocalizationText.GetText("all_guide"); btnUserBlock = goChatUser.transform.Find("btnUserBlock").GetComponent(); goChatSettings = canvasUI.transform.Find("goChatSettings").gameObject; goBlockEmpty = goChatSettings.transform.Find("txtSettingBlockEmpty").gameObject; goBlockEmpty.GetComponent().text = LocalizationText.GetText("chat_block_empty"); goChatSettings.transform.Find("txtNotice").GetComponent().text = FormatString.StringFormat(LocalizationText.GetText("chat_blocklimit"), I_MAX_BLOCK.ToString()); tglSettingLangEn = canvasUI.transform.Find("tglEn").GetComponent(); tglSettingLangKo = canvasUI.transform.Find("tglKo").GetComponent(); tglSettingLangJa = canvasUI.transform.Find("tglJa").GetComponent(); tglSettingLangEn.transform.Find("txt").GetComponent().text = LocalizationText.GetText("setting_langen"); tglSettingLangKo.transform.Find("txt").GetComponent().text = LocalizationText.GetText("setting_langko"); tglSettingLangJa.transform.Find("txt").GetComponent().text = LocalizationText.GetText("setting_langja"); goPopupLang = canvasUI.transform.Find("goPopupLang").gameObject; tglLangs = goPopupLang.transform.Find("wrapper").GetComponentsInChildren(true); tglLangs[0].transform.Find("txt").GetComponent().text = LocalizationText.GetText("setting_langko"); tglLangs[1].transform.Find("txt").GetComponent().text = LocalizationText.GetText("setting_langen"); tglLangs[2].transform.Find("txt").GetComponent().text = LocalizationText.GetText("setting_langja"); checkTxt=goPopupLang.transform.Find("txt (1)").GetComponent(); checkTxt.text = LocalizationText.GetText("chat_check_look"); yesnoText = new TextMeshProUGUI[2]; yesnoText[0] = goPopupLang.transform.Find("btnYes").transform.Find("txt").GetComponent(); yesnoText[1] = goPopupLang.transform.Find("btnNo").transform.Find("txt").GetComponent(); yesnoText[0].text = LocalizationText.GetText("setname_changebtn"); yesnoText[1].text = LocalizationText.GetText("all_cancel"); popupTItle = goPopupLang.transform.Find("txtT").GetComponent(); popupTItle.text = LocalizationText.GetText("set_text_lang"); blockTitle = canvasUI.transform.Find("goChatSettings").transform.Find("txtT").GetComponent(); blockTitle.text = LocalizationText.GetText("chat_blocklist"); tabSub = new TextMeshProUGUI[2]; tabSub[0] = canvasUI.transform.Find("tabSub").transform.Find("txt").GetComponent(); tabSub[1] = canvasUI.transform.Find("tabSub (1)").transform.Find("txt").GetComponent(); tabSub[0].text = LocalizationText.GetText("all_all"); tabSub[1].text = LocalizationText.GetText("guild_title"); } } // 설정에서 언어 변경 시 처리. public static void SReLocalize() { curMgr.Localize(true); curMgr.bReLocalize = true; curMgr.bReLocalizeChat = true; curMgr.bReLocalizeBlock = true; if (curMgr.iLastIndex >= 0) curMgr.AppendChatSmall(FormatString.GetChatMessageSmall(curMgr.userTitles[curMgr.iLastIndex], curMgr.userNames[curMgr.iLastIndex], curMgr.userMessages[curMgr.iLastIndex])); } // 백버튼 처리. public static bool SCloseMenu() { return curMgr.CloseMenu(); } private bool CloseMenu() { // 게임 시작 후 열린적 없음. if (bInitNeedUI) return false; // 채팅 설정. if (goChatSettings.activeSelf) { CloseSettings(); return true; } // 유저 팝업. if (goChatUser.activeSelf) { BtnUserClose(); return true; } if (canvasUI.enabled) { CloseChat(); return true; } return false; } private void Awake() { curMgr = this; } void Start() { iLoading--; } public static void SInitializeChat() => curMgr?.InitializeChat(); private void InitializeChat() { SystemLanguage lang = SingleMgr.GetSavedLanguage(); string datapath = FormatString.StringFormat(Global.ES3_Server, DataHandler.PlayData.server.ToString()); bShowEn = ES3.Load(((int)SystemLanguage.English).ToString(), datapath, lang == SystemLanguage.English); bShowKo = ES3.Load(((int)SystemLanguage.Korean).ToString(), datapath, lang == SystemLanguage.Korean); bShowJa = ES3.Load(((int)SystemLanguage.Japanese).ToString(), datapath, lang == SystemLanguage.Japanese); subShowEn = bShowEn; subShowKo = bShowKo; subShowJa = bShowJa; userIds = new string[I_MAX_LOG]; userNames = new string[I_MAX_LOG]; userMessages = new string[I_MAX_LOG]; userIcons = new int[I_MAX_LOG]; userTitles = new int[I_MAX_LOG]; userRanks = new int[I_MAX_LOG]; ResetChatMessages(); // TODO : init chat sdk // 저장된 차단 유저 목록. blockIdList = new List(); blockNameList = new List(); blockIndexList = new EnhancedUI.SmallList(); string strblock = ES3.Load(Global.ES3_ChatBlock, FormatString.StringFormat(Global.ES3_Server, DataHandler.PlayData.server.ToString()), ""); if (!string.IsNullOrEmpty(strblock)) { BlockUsers blockusers = JsonUtility.FromJson(strblock); if (blockusers != null && blockusers.items != null) { BlockUser[] users = blockusers.items; for (int i = 0; i < users.Length; i++) { blockIndexList.Add(i); blockIdList.Add(users[i].UserId); blockNameList.Add(users[i].PlayerName); } } } selectedStageChannel = GetBaseChannel(); ConnectChat(); } public static void SFinalizeChat() { if (curMgr != null) curMgr.FinalizeChat(); } private void FinalizeChat() { //TODO : finalize chat sdk } #endregion Base #region UI // 채팅창 열기. public void OpenChat() { if (!DataHandler.IsClearStage(DataHandler.Const.chatOpenStage)) { GameUIMgr.SOpenToast(FormatString.TextOpenStageClear(DataHandler.Const.chatOpenStage)); return; } GameUIMgr.SAllOffDownMenu(); if (iLoading > 0) return; iLoading++; miniChatCanvas.enabled = false; if (bReLocalize) Localize(false); if (bInitNeedUI) { bInitNeedUI = false; chatDatas = new EnhancedUI.SmallList(); for (int i = 0; i < iChatCount; i++) chatDatas.Add(i); escrChat.LoadDatas(chatDatas); escrChat.scroller.SetScrollPositionImmediately(escrChat.scroller.ScrollSize); inputChat.characterLimit = 50; inputChat.onValueChanged.AddListener( (word) => inputChat.text = Regex.Replace(word, @"[^0-9a-zA-Zㄱ-ㅣ가-힣\s\D]", "") ); seqChatNotice = DOTween.Sequence() .SetAutoKill(false) .SetUpdate(false) .SetLoops(-1) .AppendCallback(() => { int ilen = DataHandler.GetChatNotices().Length; if (ilen > 0) { iChatNotice++; if (iChatNotice >= ilen) iChatNotice = 0; txtChatNotice.text = DataHandler.GetChatNotices()[iChatNotice].GetMsg(); } else { txtChatNotice.text = ""; } }) .Append(txtChatNotice.DOFade(1f, 0.5f).SetEase(Ease.Linear)) .AppendInterval(4f) .Append(txtChatNotice.DOFade(0f, 0.5f).SetEase(Ease.Linear)) .Pause(); } else { if (bReloadNeed) { escrChat.scroller.ReloadData(escrChat.scroller.ScrollPosition / escrChat.scroller.ScrollSize); } else { escrChat.scroller.RefreshActiveCellViews(); } } btnChatSend.interactable = DataHandler.IsClearStage(DataHandler.Const.chatOpenStage); if (DataHandler.GetChatNotices().Length > 1) seqChatNotice.Restart(); ConnectChannelSelected(); canvasUI.enabled = true; SoundMgr.Instance.PlaySfx(SoundName.BtnPress); if (bReLocalizeChat) { bReLocalizeChat = false; escrChat.scroller.RefreshActiveCellViews(); } iLoading--; } // 채팅창 닫기. public void CloseChat() { if (iLoading > 0) return; iLoading++; canvasUI.enabled = false; miniChatCanvas.enabled = true; inputChat.text = null; if (DataHandler.GetChatNotices().Length > 1) seqChatNotice.Pause(); SoundMgr.Instance.PlaySfx(SoundName.BtnPress); iLoading--; } #endregion UI #region Notice Refresh // 공지사항 갱신. private void RefreshNotice() { SvConnectManager.Instance.RequestSvGet(true, 0, UrlApi.GetUrl(UrlApi.ChatNotice), typeof(dChatNoticeDatas), ANoticeSucc, ANoticeFail, false); } // 공지사항 통신 성공. private void ANoticeSucc(object result) { dChatNoticeDatas data = (dChatNoticeDatas)result; DataHandler.SetNewChatNotices(data.sysNoticeChat); if (bInitNeedUI) return; int ilen = DataHandler.GetChatNotices().Length; if (ilen > 1) { if (canvasUI.enabled) seqChatNotice.Restart(); } else if (ilen > 0) { txtChatNotice.text = DataHandler.GetChatNotices()[0].GetMsg(); seqChatNotice.Pause(); txtChatNotice.color = Global.CLR_White; } else { txtChatNotice.text = ""; seqChatNotice.Pause(); } } // 공지사항 통신 실패. private void ANoticeFail(SvError error) { } #endregion Notice Refresh #region Chat UI // 채팅 보내기 버튼 클릭. public void BtnChatSend() { if (!DataHandler.IsClearStage(DataHandler.Const.chatOpenStage)) { GameUIMgr.SOpenToast(FormatString.TextOpenStageClear(DataHandler.Const.chatOpenStage)); return; } if (string.IsNullOrEmpty(inputChat.text)) return; if (!IsConnectedSelected()) { GameUIMgr.SOpenPopup1Button(LocalizationText.GetText("error_checknetwork")); return; } SoundMgr.Instance.PlaySfx(SoundName.BtnPress); string strtext = BanWordFilter.FilterSpChar(BanWordFilter.Filter(inputChat.text)); SendMainChatMessage(strtext); inputChat.text = null; } // 채팅 텍스트 입력 종료. public void ChatSubmit() { if (!DataHandler.IsClearStage(DataHandler.Const.chatOpenStage)) { GameUIMgr.SOpenToast(FormatString.TextOpenStageClear(DataHandler.Const.chatOpenStage)); return; } if (string.IsNullOrEmpty(inputChat.text)) return; //if ((inputChat.touchScreenKeyboard != null && inputChat.touchScreenKeyboard.status != TouchScreenKeyboard.Status.Done) && // !Input.GetKeyDown(KeyCode.Return) && !Input.GetKeyDown(KeyCode.KeypadEnter) && !Input.GetButtonDown("Submit")) // return; if (!Input.GetKeyDown(KeyCode.Return) && !Input.GetKeyDown(KeyCode.KeypadEnter) && !Input.GetButtonDown("Submit")) return; if (!IsConnectedSelected()) { GameUIMgr.SOpenPopup1Button(LocalizationText.GetText("error_checknetwork")); return; } string strtext = BanWordFilter.FilterSpChar(BanWordFilter.Filter(inputChat.text)); SendMainChatMessage(strtext); inputChat.text = null; } // 전체 채팅 메시지 지우기. public void ResetChatMessages() { txtMainMsg.text = ""; if (!bInitNeedUI) { iChatCount = 0; chatDatas.Clear(); escrChat.scroller.ReloadData(); iFirstIndex = 0; iLastIndex = -1; } } private void ReloadChatMessages() { bLoadLog = true; iChatCount = 0; chatDatas.Clear(); iFirstIndex = 0; iLastIndex = -1; OnMessagesReceivedStage(new List()); } // 작은 채팅 메시지 표시. public void AppendChatSmall(string strtext) { txtMainMsg.text = strtext; } // 전체 채팅 메시지 표시. public void AppendChat(string struserid, string strusername, cChatMessage chatmsg, bool breload) { int index = iLastIndex + 1; if (index >= I_MAX_LOG) index = 0; iLastIndex = index; userIds[index] = struserid; userNames[index] = strusername; userMessages[index] = chatmsg.msg; userIcons[index] = chatmsg.lv; userTitles[index] = chatmsg.id; userRanks[index] = chatmsg.cnt; if (bInitNeedUI) { if (iChatCount < I_MAX_LOG) { iChatCount++; } else { iFirstIndex++; if (iFirstIndex >= I_MAX_LOG) iFirstIndex = 0; } return; } if (iChatCount < I_MAX_LOG) { chatDatas.Add(iChatCount); iChatCount++; if (breload) { if (canvasUI.enabled) escrChat.scroller.ReloadData(escrChat.scroller.ScrollPosition / escrChat.scroller.ScrollSize); else bReloadNeed = true; } } else { iFirstIndex++; if (iFirstIndex >= I_MAX_LOG) iFirstIndex = 0; if (breload) { if (canvasUI.enabled) escrChat.scroller.RefreshActiveCellViews(); } } } #endregion Chat UI #region User UI // 유저 팝업 열기. public static void SSelectChat(int index) { if (index < 0 || index >= I_MAX_LOG || curMgr == null) return; curMgr.SelectChat(index); } private void SelectChat(int index) { if (iLoading > 0 || userIcons[index] <= 0 || userIds[index].Equals(DataHandler.PlayData.userCode)) return; iLoading++; selectedUserId = userIds[index]; txtUserName.text = "["+userNames[index]+"]"; //txtUserMsg.text = userMessages[index]; btnUserBlock.interactable = !blockIdList.Contains(selectedUserId); goChatUser.SetActive(true); iLoading--; } // 유저 팝업 닫기. public void BtnUserClose() { if (iLoading > 0) return; iLoading++; selectedUserId = null; goChatUser.SetActive(false); SoundMgr.Instance.PlaySfx(SoundName.BtnPress); iLoading--; } // 차단하기. public void BtnUserBlock() { if (string.IsNullOrEmpty(selectedUserId)) return; if (iLoading > 0) return; if (blockIdList.Count >= I_MAX_BLOCK) { GameUIMgr.SOpenPopup1Button(FormatString.StringFormat(LocalizationText.GetText("chat_blocklimit"), I_MAX_BLOCK.ToString())); SoundMgr.Instance.PlaySfx(SoundName.BtnPress); return; } iLoading++; btnUserBlock.interactable = false; if (!blockIdList.Contains(selectedUserId)) { blockIndexList.Add(blockIndexList.Count); blockIdList.Add(selectedUserId); blockNameList.Add(txtUserName.text); BlockUser[] saveusers = new BlockUser[blockIdList.Count]; for (int i = 0; i < saveusers.Length; i++) { saveusers[i] = new BlockUser(blockIdList[i], blockNameList[i]); } ES3.Save(Global.ES3_ChatBlock, JsonUtility.ToJson(new BlockUsers(saveusers)), FormatString.StringFormat(Global.ES3_Server, DataHandler.PlayData.server.ToString())); bUpdateBlock = true; GameUIMgr.SOpenToast(LocalizationText.GetText("chat_blocked")); selectedUserId = null; goChatUser.SetActive(false); ReloadChatMessages(); } SoundMgr.Instance.PlaySfx(SoundName.BtnPress); iLoading--; } #endregion User UI #region Settings UI // 설정 팝업 열기. public void OpenSettings() { if (iLoading > 0) return; iLoading++; goChatSettings.SetActive(true); if (!bInitBlock) { bInitBlock = true; bUpdateBlock = false; escrBlock.LoadDatas(blockIndexList); goBlockEmpty.SetActive(blockIdList.Count == 0); } else if (bUpdateBlock) { bUpdateBlock = false; escrBlock.scroller.ReloadData(); goBlockEmpty.SetActive(blockIdList.Count == 0); } if (bReLocalizeBlock) { bReLocalizeBlock = false; escrBlock.Localize(); } SoundMgr.Instance.PlaySfx(SoundName.BtnPress); iLoading--; } // 설정 팝업 닫기. public void CloseSettings() { if (iLoading > 0) return; iLoading++; goChatSettings.SetActive(false); SoundMgr.Instance.PlaySfx(SoundName.BtnPress); iLoading--; } public void OpenLangSetting() { tglLangs[0].isOn = bShowKo; tglLangs[1].isOn = bShowEn; tglLangs[2].isOn = bShowJa; goPopupLang.SetActive(true); SoundMgr.Instance.PlaySfx(SoundName.BtnPress); } public void CloseLangSetting() { goPopupLang.SetActive(false); CancelLang(); } #region TglLang // 영어 토글. public void TglEn(bool bvalue) { // 현재 언어일 경우 해제 불가. if (bvalue && SingleMgr.GetSavedLanguage() == SystemLanguage.English) { tglSettingLangEn.SetIsOnWithoutNotify(true); bShowEn = true; return; } bShowEn = bvalue; ES3.Save(((int)SystemLanguage.English).ToString(), bShowEn, FormatString.StringFormat(Global.ES3_Server, DataHandler.PlayData.server.ToString())); } // 한국어 토글. public void TglKo(bool bvalue) { // 현재 언어일 경우 해제 불가. if (bvalue && SingleMgr.GetSavedLanguage() == SystemLanguage.Korean) { tglSettingLangKo.SetIsOnWithoutNotify(true); bShowKo = true; return; } bShowKo = bvalue; ES3.Save(((int)SystemLanguage.Korean).ToString(), bShowKo, FormatString.StringFormat(Global.ES3_Server, DataHandler.PlayData.server.ToString())); } // 일본어 토글. public void TglJa(bool bvalue) { // 현재 언어일 경우 해제 불가. if (bvalue && SingleMgr.GetSavedLanguage() == SystemLanguage.Japanese) { tglSettingLangJa.SetIsOnWithoutNotify(true); bShowJa = true; return; } bShowJa = bvalue; ES3.Save(((int)SystemLanguage.Japanese).ToString(), bShowJa, FormatString.StringFormat(Global.ES3_Server, DataHandler.PlayData.server.ToString())); } #endregion bool subShowEn = true; bool subShowKo = true; bool subShowJa = true; #region TglLang2 // 영어 토글. public void TglEn2(bool bvalue) { // 현재 언어일 경우 해제 불가. if (bvalue && SingleMgr.GetSavedLanguage() == SystemLanguage.English) { tglSettingLangEn.SetIsOnWithoutNotify(true); bShowEn = true; subShowEn = true; return; } subShowEn = bvalue; SoundMgr.Instance.PlaySfx(SoundName.BtnPress); //ES3.Save(((int)SystemLanguage.English).ToString(), bShowEn, FormatString.StringFormat(Global.ES3_Server, DataHandler.PlayData.server.ToString())); } // 한국어 토글. public void TglKo2(bool bvalue) { // 현재 언어일 경우 해제 불가. if (bvalue && SingleMgr.GetSavedLanguage() == SystemLanguage.Korean) { tglSettingLangKo.SetIsOnWithoutNotify(true); bShowKo = true; subShowKo = true; return; } subShowKo = bvalue; SoundMgr.Instance.PlaySfx(SoundName.BtnPress); //ES3.Save(((int)SystemLanguage.Korean).ToString(), bShowKo, FormatString.StringFormat(Global.ES3_Server, DataHandler.PlayData.server.ToString())); } // 일본어 토글. public void TglJa2(bool bvalue) { // 현재 언어일 경우 해제 불가. if (bvalue && SingleMgr.GetSavedLanguage() == SystemLanguage.Japanese) { tglSettingLangJa.SetIsOnWithoutNotify(true); bShowJa = true; subShowJa = true; return; } subShowJa = bvalue; SoundMgr.Instance.PlaySfx(SoundName.BtnPress); //ES3.Save(((int)SystemLanguage.Japanese).ToString(), bShowJa, FormatString.StringFormat(Global.ES3_Server, DataHandler.PlayData.server.ToString())); } public void ConfirmLang() { bShowEn = subShowEn; bShowKo = subShowKo; bShowJa = subShowJa; ES3.Save(((int)SystemLanguage.English).ToString(), bShowEn, FormatString.StringFormat(Global.ES3_Server, DataHandler.PlayData.server.ToString())); ES3.Save(((int)SystemLanguage.English).ToString(), bShowKo, FormatString.StringFormat(Global.ES3_Server, DataHandler.PlayData.server.ToString())); ES3.Save(((int)SystemLanguage.English).ToString(), bShowJa, FormatString.StringFormat(Global.ES3_Server, DataHandler.PlayData.server.ToString())); goPopupLang.SetActive(false); SoundMgr.Instance.PlaySfx(SoundName.BtnPress); } public void CancelLang() { subShowEn = bShowEn; subShowKo = bShowKo; subShowJa = bShowJa; goPopupLang.SetActive(false); SoundMgr.Instance.PlaySfx(SoundName.BtnPress); } #endregion // 차단 유저 수. public static int SGetBlockUserCount() { if (curMgr == null) return 0; return curMgr.blockIdList.Count; } // 차단 유저 이름. public static string SGetBlockUserName(int index) { if (curMgr == null || index < 0 || index >= curMgr.blockNameList.Count) return null; return curMgr.blockNameList[index]; } public static void SUnblockUser(int index) { if (curMgr != null) curMgr.UnblockUser(index); } // 유저 차단 해제. private void UnblockUser(int index) { if (index < 0 || index >= blockIdList.Count) return; blockIdList.RemoveAt(index); blockNameList.RemoveAt(index); blockIndexList.RemoveEnd(); BlockUser[] saveusers = new BlockUser[blockIdList.Count]; for (int i = 0; i < saveusers.Length; i++) { saveusers[i] = new BlockUser(blockIdList[i], blockNameList[i]); } ES3.Save(Global.ES3_ChatBlock, JsonUtility.ToJson(new BlockUsers(saveusers)), FormatString.StringFormat(Global.ES3_Server, DataHandler.PlayData.server.ToString())); GameUIMgr.SOpenToast(LocalizationText.GetText("chat_unblocked")); bUpdateBlock = false; escrBlock.scroller.ReloadData(); goBlockEmpty.SetActive(blockIdList.Count == 0); ReloadChatMessages(); } #endregion Settings UI #region Get Chat public static int SGetChatIndex(int itemid) { return curMgr.GetChatIndex(itemid); } private int GetChatIndex(int itemid) { if (bInitNeedUI) return -1; int index = itemid + iFirstIndex; if (index >= I_MAX_LOG) index -= I_MAX_LOG; return index; } public static string SGetChatId(int index) { return curMgr.userIds[index]; } public static string SGetChatName(int index) { return curMgr.userNames[index]; } public static string SGetChatMsg(int index) { return curMgr.userMessages[index]; } public static int SGetChatIcon(int index) { return curMgr.userIcons[index]; } public static int SGetChatTitle(int index) { return curMgr.userTitles[index]; } public static int SGetChatRank(int index) { return curMgr.userRanks[index]; } #endregion Get Chat #region Chat Connect public static void SConnectChat() { if (curMgr != null && !bConnect) curMgr.ConnectChat(); } // 게임챗 연결. private void ConnectChat() { if (bConnecting) return; bConnecting = true; bConnectInvoking = false; OnSettedNickname(); OnConnectedGameChat(); } public static void SDisconnectChat() { curMgr?.DisconnectChat(); } // 게임챗 연결 해제. private void DisconnectChat() { //TODO : disconnect chat sdk } // 게임챗 닉네임 변경. public static void SUpdateNickname() { //TODO : update nickname } #endregion Chat Connect #region Channel Connect // 기본 연결 채널. private eChatChannel GetBaseChannel() { return eChatChannel.Stage; } // 현재 연결 채널. public eChatChannel GetSelectedChannel() { return selectedStageChannel; } // 게임챗 연결 상태. public bool IsConnected(eChatChannel channel) { if (!bConnect) return false; switch (channel) { case eChatChannel.Stage: return subscribeChannels.Contains(ChannelStageId); } return true; } // 게임챗 선택된 채널 연결 상태. public bool IsConnectedSelected() => IsConnected(selectedStageChannel); // 선택된 채널 연결. public void ConnectChannel(eChatChannel channel) { switch (channel) { case eChatChannel.Stage: ConnectChannelStage(); break; } } // 선택된 채널 연결. public void ConnectChannelSelected() => ConnectChannel(selectedStageChannel); // 현재 채널 연결 해제. public void DisconnectChannelCur() { switch (selectedStageChannel) { case eChatChannel.Stage: DisconnectChannelStage(); break; } } // 스테이지 채널 연결. private void ConnectChannelStage() { Logger.Log("ChatManager - ConnectChannelStage"); if (bConnectingStage || IsConnected(eChatChannel.Stage)) return; bConnectingStage = true; CancelInvoke(nameof(ConnectChannelStage)); if (!bConnect) { ConnectChat(); Invoke(nameof(ConnectChannelStage), 1f); return; } if (bFirstConnectStage) { bFirstConnectStage = false; bLoadLog = true; //TODO : get chat log OnMessagesReceivedStage(new List()); } selectedStageChannel = eChatChannel.Stage; //TODO : connect channel OnSettedNickname(); OnSubscribed(ChannelStageId); bConnectingStage = false; } // 스테이지 채널 연결 해제. private void DisconnectChannelStage() { Logger.Log("ChatManager - DisconnectChannelStage"); //TODO : discribe channel OnUnsubscribed(ChannelStageId); } #endregion Channel Connect #region Send Chat private void SendMainChatMessage(string strmsg) { // TODO : send chat message } // 채팅 전송. private void SendChatMessage(eChatChannel channel, string strmsg) { // TODO : send chat message } #endregion Send Chat #region GameChat Delegate void OnConnectedGameChat() { subscribeChannels.Clear(); } void OnErrorReceived(string message) { Logger.LogWarning("ChatManager - OnErrorReceived : " + message); if (bConnecting && !bConnectInvoking) { bConnectInvoking = true; Invoke(nameof(ConnectChat), 1f); } } void OnSettedNickname() { } void OnDisconnectedGameChat() { bConnect = false; subscribeChannels.Clear(); } // GameChat - 채널 구독 완료. void OnSubscribed(string channel_id) { Logger.Log("ChatManager - Subscribe channel : " + channel_id); if (!subscribeChannels.Contains(channel_id)) subscribeChannels.Add(channel_id); } // GameChat - 채널 구독 해제. void OnUnsubscribed(string channel_id) { Logger.Log("ChatManager - Unsubscribe channel : " + channel_id); subscribeChannels.Remove(channel_id); } // GameChat - 연결 완료. void OnConnected(string message) { Logger.Log("ChatManager - OnConnected : " + message); bConnect = true; bConnecting = false; ConnectChannelSelected(); } // GameChat - 연결 끊김. void OnDisconnected(string message) { Logger.Log("ChatManager - OnDisconnected : " + message); bConnect = false; bConnecting = false; } // GameChat - 메시지 수신. void OnMessageReceived(string messageJson) { cChatMessage chatmsg = JsonUtility.FromJson(messageJson); if (!subscribeChannels.Contains(chatmsg.channel)) return; if (chatmsg != null) { // 유저 채팅. if (chatmsg.type == eChatType.Message) { // 이력 로딩 중. if (bLoadLog) return; // 체크 안 한 언어 표시 안 함. if (!bShowEn && chatmsg.lang == SystemLanguage.English) return; if (!bShowKo && chatmsg.lang == SystemLanguage.Korean) return; if (!bShowJa && chatmsg.lang == SystemLanguage.Japanese) return; // 차단된 유저 메세지 표시 안 함. if (blockIdList.Contains(chatmsg.sender)) return; if (chatmsg.channel == ChannelStageId) { AppendChatSmall(FormatString.GetChatMessageSmall(chatmsg.id, chatmsg.senderName, chatmsg.msg)); AppendChat(chatmsg.sender, chatmsg.senderName, chatmsg, true); } return; } // 기능. if (chatmsg.type == eChatType.Function) { switch (chatmsg.id) { case EXC_Inspect: SingleMgr.OpenPopup1Button(LocalizationText.GetText("msg_inspect"), SingleMgr.GameFinish); SvConnectManager.Instance.StopConnection(); return; case EXC_Notice: NoticeMgr.SRefreshNotice(); return; case EXC_ChatNotice: RefreshNotice(); return; } } } } // GameChat - 메시지 수신. void OnMessagesReceivedStage(List messageJsons) { List idlist = new List(); List namelist = new List(); List msglist = new List(); for (int i = 0; i < messageJsons.Count; i++) { try { string targetJson = messageJsons[i]; cChatMessage chatmsg = JsonUtility.FromJson(targetJson); if (chatmsg != null) { if (chatmsg.type != eChatType.Message) continue; // 체크 안 한 언어 표시 안 함. if (!bShowEn && chatmsg.lang == SystemLanguage.English) continue; if (!bShowKo && chatmsg.lang == SystemLanguage.Korean) continue; if (!bShowJa && chatmsg.lang == SystemLanguage.Japanese) continue; // 차단된 유저 메세지 표시 안 함. if (blockIdList.Contains(chatmsg.sender)) continue; idlist.Add(chatmsg.sender); namelist.Add(chatmsg.senderName); msglist.Add(chatmsg); if (idlist.Count >= I_MAX_LOG) break; } } catch { } } for (int i = idlist.Count - 1; i > 0; i--) { AppendChat(idlist[i], namelist[i], msglist[i], false); } AppendChatSmall(FormatString.GetChatMessageSmall(msglist[0].id, namelist[0], msglist[0].msg)); AppendChat(idlist[0], namelist[0], msglist[0], true); bLoadLog = false; } #endregion GameChat Delegate }