@Hassan 뒤끝 채팅 관련 질문이있습니다. - yoon0020님의 글 #4
여기 게시글에 답변해주신걸 기준으로 다시 짜고 있습니다.
비동기쪽은 잘 모르겠어서 기존에 하던 동기방식으로 하면서 코드를 수정했는데
public void OnLeaveChannelCompleted(LeaveChannelEventArgs args)
{
Debug.Log(string.Format("OnLeaveChannel {0}", args.ErrInfo));
if (args.ErrInfo == ErrorInfo.Success)
{
if (!args.Session.IsRemote) // 본인이 직접 퇴장한 경우
{
Debug.Log("채널에서 퇴장했습니다");
}
else // 다른 유저가 퇴장한 경우
{
Debug.Log(args.Session.NickName + "님이 퇴장했습니다");
}
}
else
{
if (!args.Session.IsRemote)
{
// 에러가 발생했을 경우
Debug.Log("퇴장 도중 에러가 발생했습니다 : " + args.ErrInfo.Reason);
if (args.ErrInfo.Detail == ErrorCode.DisconnectFromLocal || args.ErrInfo.Detail == ErrorCode.Success)
{
Debug.Log("성공적으로 채널 접속을 종료했습니다.");
}
else
{
//재접속 로직
this.Invoke(delegate { CheckChatStatus(); }, 7f);
}
}
}
}
void CheckChatStatus()
{
var data = Backend.Chat.GetChatStatus();
if (data.IsSuccess())
{
if (data.GetReturnValuetoJSON()["chatServerStatus"]["chatServer"].ToString().Equals("y"))
LoadChannelList();
}
else Message.instance.On("채팅 서버 접속 실패\n인터넷 연결 상태를 확인해보세요.", CheckChatStatus);
}
void LoadChannelList()
{
var data = Backend.Chat.GetGroupChannelList(groupName);
if (data.IsSuccess())
{
JsonData rows = data.GetReturnValuetoJSON()["rows"];
for (int i = 0; i < rows.Count; i++)
channelDataList.Add(rows[i]);
for (int i = 0; i < rows.Count; i++)
if ((int)rows[i]["joinedUserCount"] < 200)
if (OnJoinChannel(rows[i]))
{
currentChannelIndex = i;
return;
}
Message.instance.On("채팅 채널 접속 실패\n모든 채널에 자리가 없습니다.");
}
else Message.instance.On("채팅 채널 접속 실패\n인터넷 연결 상태를 확인해보세요.");
}
bool OnJoinChannel(JsonData data)
{
ErrorInfo info;
ChannelType channelType = ChannelType.Public;
string groupName = data["groupName"].ToString();
string inDate = data["inDate"].ToString();
string serverAddress = data["serverAddress"].ToString();
ushort serverPort = (ushort)data["serverPort"];
string alias = data["alias"].ToString();
int joinedUserCount = (int)data["joinedUserCount"];
int maxUserCount = (int)data["maxUserCount"];
channelInfo = new ChannelInfo(channelType, groupName, inDate, joinedUserCount, maxUserCount, serverAddress, serverPort, alias);
bool isJoin = Backend.Chat.JoinChannel(channelType, serverAddress, serverPort, groupName, inDate, out info);
Debug.Log("isJoin : " + isJoin + ", Error Info : " + info);
tryJoinCount++;
if (info.Category != ErrorCode.Success)
{
Backend.Chat.ResetConnect(); // 해당 함수 요청시 OnLeaveChannel에 이벤트 발생(에러로 인해 재접속 시도)
Debug.Log(info);
}
return isJoin;
}
이대로면 문제없이 재접속 로직이 된걸까요?