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
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.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<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.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<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
|
|
}
|