You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1269 lines
39 KiB

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<string> subscribeChannels = new List<string>();
// 채팅 공지.
private DG.Tweening.Sequence seqChatNotice = null;
private int iChatNotice = -1;
// 채팅 이력.
private EnhancedUI.SmallList<int> 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<string> blockIdList;
private List<string> blockNameList;
private EnhancedUI.SmallList<int> 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<TextMeshProUGUI>();
inputChat = canvasUI.transform.Find("inputChat").GetComponent<TMP_InputField>();
btnChatSend = canvasUI.transform.Find("btnSend").GetComponent<ButtonIV>();
goChatUser = canvasUI.transform.Find("goChatUser").gameObject;
txtUserName = goChatUser.transform.Find("txtUserName").GetComponent<TextMeshProUGUI>();
goChatUser.transform.Find("txtBlockConfirm").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("chat_block_confirm");
goChatUser.transform.Find("btnUserBlock").Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("chat_block");
goChatUser.transform.Find("btnUserCancel").Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("all_close");
goChatUser.transform.Find("Guide").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("all_guide");
btnUserBlock = goChatUser.transform.Find("btnUserBlock").GetComponent<ButtonIV>();
goChatSettings = canvasUI.transform.Find("goChatSettings").gameObject;
goBlockEmpty = goChatSettings.transform.Find("txtSettingBlockEmpty").gameObject;
goBlockEmpty.GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("chat_block_empty");
goChatSettings.transform.Find("txtNotice").GetComponent<TextMeshProUGUI>().text = FormatString.StringFormat(LocalizationText.GetText("chat_blocklimit"), I_MAX_BLOCK.ToString());
tglSettingLangEn = canvasUI.transform.Find("tglEn").GetComponent<Toggle>();
tglSettingLangKo = canvasUI.transform.Find("tglKo").GetComponent<Toggle>();
tglSettingLangJa = canvasUI.transform.Find("tglJa").GetComponent<Toggle>();
tglSettingLangEn.transform.Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("setting_langen");
tglSettingLangKo.transform.Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("setting_langko");
tglSettingLangJa.transform.Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("setting_langja");
goPopupLang = canvasUI.transform.Find("goPopupLang").gameObject;
tglLangs = goPopupLang.transform.Find("wrapper").GetComponentsInChildren<Toggle>(true);
tglLangs[0].transform.Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("setting_langko");
tglLangs[1].transform.Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("setting_langen");
tglLangs[2].transform.Find("txt").GetComponent<TextMeshProUGUI>().text = LocalizationText.GetText("setting_langja");
checkTxt=goPopupLang.transform.Find("txt (1)").GetComponent<TextMeshProUGUI>();
checkTxt.text = LocalizationText.GetText("chat_check_look");
yesnoText = new TextMeshProUGUI[2];
yesnoText[0] = goPopupLang.transform.Find("btnYes").transform.Find("txt").GetComponent<TextMeshProUGUI>();
yesnoText[1] = goPopupLang.transform.Find("btnNo").transform.Find("txt").GetComponent<TextMeshProUGUI>();
yesnoText[0].text = LocalizationText.GetText("setname_changebtn");
yesnoText[1].text = LocalizationText.GetText("all_cancel");
popupTItle = goPopupLang.transform.Find("txtT").GetComponent<TextMeshProUGUI>();
popupTItle.text = LocalizationText.GetText("set_text_lang");
blockTitle = canvasUI.transform.Find("goChatSettings").transform.Find("txtT").GetComponent<TextMeshProUGUI>();
blockTitle.text = LocalizationText.GetText("chat_blocklist");
tabSub = new TextMeshProUGUI[2];
tabSub[0] = canvasUI.transform.Find("tabSub").transform.Find("txt").GetComponent<TextMeshProUGUI>();
tabSub[1] = canvasUI.transform.Find("tabSub (1)").transform.Find("txt").GetComponent<TextMeshProUGUI>();
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<bool>(((int)SystemLanguage.English).ToString(), datapath, lang == SystemLanguage.English);
bShowKo = ES3.Load<bool>(((int)SystemLanguage.Korean).ToString(), datapath, lang == SystemLanguage.Korean);
bShowJa = ES3.Load<bool>(((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<string>();
blockNameList = new List<string>();
blockIndexList = new EnhancedUI.SmallList<int>();
string strblock = ES3.Load(Global.ES3_ChatBlock, FormatString.StringFormat(Global.ES3_Server, DataHandler.PlayData.server.ToString()), "");
if (!string.IsNullOrEmpty(strblock))
{
BlockUsers blockusers = JsonUtility.FromJson<BlockUsers>(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<int>();
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.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.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.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<string>());
}
// 작은 채팅 메시지 표시.
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.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.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.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.PlaySfx(SoundName.BtnPress);
iLoading--;
}
// 설정 팝업 닫기.
public void CloseSettings()
{
if (iLoading > 0)
return;
iLoading++;
goChatSettings.SetActive(false);
SoundMgr.PlaySfx(SoundName.BtnPress);
iLoading--;
}
public void OpenLangSetting()
{
tglLangs[0].isOn = bShowKo;
tglLangs[1].isOn = bShowEn;
tglLangs[2].isOn = bShowJa;
goPopupLang.SetActive(true);
SoundMgr.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.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.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.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.PlaySfx(SoundName.BtnPress);
}
public void CancelLang()
{
subShowEn = bShowEn;
subShowKo = bShowKo;
subShowJa = bShowJa;
goPopupLang.SetActive(false);
SoundMgr.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<string>());
}
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<cChatMessage>(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<string> messageJsons)
{
List<string> idlist = new List<string>();
List<string> namelist = new List<string>();
List<cChatMessage> msglist = new List<cChatMessage>();
for (int i = 0; i < messageJsons.Count; i++)
{
try
{
string targetJson = messageJsons[i];
cChatMessage chatmsg = JsonUtility.FromJson<cChatMessage>(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
}