using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Common.Network; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Exception; using Milimoe.FunGame.Core.Model; using Milimoe.FunGame.Desktop.Library.Component; using Milimoe.FunGame.Desktop.UI; using RunTime = Milimoe.FunGame.Desktop.Library.RunTime; namespace Milimoe.FunGame.Desktop.Model { public class MainModel : SocketHandlerModel { private readonly Main Main; private readonly Session Usercfg = RunTime.Session; public MainModel(Main main) : base(RunTime.Socket) { Main = main; } #region 公开方法 public async Task LogOut() { try { // 需要当时登录给的Key发回去,确定是账号本人在操作才允许登出 if (Usercfg.LoginKey != Guid.Empty) { SetWorking(); if (RunTime.Socket?.Send(SocketMessageType.RunTime_Logout, Usercfg.LoginKey) == SocketResult.Success) { string msg = ""; Guid key = Guid.Empty; (msg, key) = await Task.Factory.StartNew(SocketHandler_LogOut); if (key == Usercfg.LoginKey) { Usercfg.LoginKey = Guid.Empty; Main.UpdateUI(MainInvokeType.LogOut, msg ?? ""); return true; } } } throw new CanNotLogOutException(); } catch (Exception e) { ShowMessage.ErrorMessage("无法登出您的账号,请联系服务器管理员。", "登出失败", 5); Main.GetMessage(e.GetErrorInfo()); } return false; } public async Task IntoRoom(Room room) { try { SetWorking(); if (RunTime.Socket?.Send(SocketMessageType.Main_IntoRoom, room.Roomid) == SocketResult.Success) { string roomid = await Task.Factory.StartNew(SocketHandler_IntoRoom); if (roomid.Trim() != "" && roomid == "-1") { Main.GetMessage($"已连接至公共聊天室。"); } else { Usercfg.InRoom = room; } return true; } throw new CanNotIntoRoomException(); } catch (Exception e) { Main.GetMessage(e.GetErrorInfo()); return false; } } public async Task UpdateRoom() { try { SetWorking(); if (RunTime.Socket?.Send(SocketMessageType.Main_UpdateRoom) == SocketResult.Success) { List list = await Task.Factory.StartNew(SocketHandler_UpdateRoom); Main.UpdateUI(MainInvokeType.UpdateRoom, list); return true; } throw new GetRoomListException(); } catch (Exception e) { Main.GetMessage(e.GetErrorInfo()); return false; } } public async Task GetRoomPlayerCount(string roomid) { try { SetWorking(); if (RunTime.Socket?.Send(SocketMessageType.Room_GetRoomPlayerCount, roomid) == SocketResult.Success) { return await Task.Factory.StartNew(SocketHandler_GetRoomPlayerCount); } return 0; } catch (Exception e) { Main.GetMessage(e.GetErrorInfo()); return 0; } } public async Task QuitRoom(string roomid, bool isMaster) { bool result = false; try { SetWorking(); if (RunTime.Socket?.Send(SocketMessageType.Main_QuitRoom, roomid, isMaster) == SocketResult.Success) { result = await Task.Factory.StartNew(SocketHandler_QuitRoom); if (result) { Usercfg.InRoom = General.HallInstance; return result; } } throw new QuitRoomException(); } catch (Exception e) { Main.GetMessage(e.GetErrorInfo()); return result; } } public async Task CreateRoom(string RoomType, string Password = "") { try { SetWorking(); if (RunTime.Socket?.Send(SocketMessageType.Main_CreateRoom, RoomType, Usercfg.LoginUser.Id, Password) == SocketResult.Success) { string roomid = await Task.Factory.StartNew(SocketHandler_CreateRoom); if (roomid.Trim() != "") { return roomid; } } throw new CreateRoomException(); } catch (Exception e) { Main.GetMessage(e.GetErrorInfo()); return ""; } } public bool Chat(string msg) { try { if (RunTime.Socket?.Send(SocketMessageType.Main_Chat, msg) == SocketResult.Success) { return true; } throw new CanNotSendTalkException(); } catch (Exception e) { Main.GetMessage(e.GetErrorInfo()); return false; } } public override void SocketHandler(SocketObject SocketObject) { try { // 定义接收的通信类型 SocketMessageType[] SocketMessageTypes = new SocketMessageType[] { SocketMessageType.Main_GetNotice, SocketMessageType.RunTime_Logout, SocketMessageType.Main_IntoRoom, SocketMessageType.Main_QuitRoom, SocketMessageType.Main_Chat, SocketMessageType.Main_UpdateRoom, SocketMessageType.Main_CreateRoom }; if (SocketObject.SocketType == SocketMessageType.RunTime_HeartBeat) { // 心跳包单独处理 if ((RunTime.Socket?.Connected ?? false) && Usercfg.LoginUser.Id != 0) Main.UpdateUI(MainInvokeType.SetGreenAndPing); } else if (SocketObject.SocketType == SocketMessageType.RunTime_ForceLogout) { // 服务器强制下线登录 Guid key = Guid.Empty; string? msg = ""; if (SocketObject.Length > 0) key = SocketObject.GetParam(0); if (SocketObject.Length > 1) msg = SocketObject.GetParam(1); msg ??= ""; if (key == Usercfg.LoginKey) { Usercfg.LoginKey = Guid.Empty; Main.UpdateUI(MainInvokeType.LogOut, msg ?? ""); } } else if (SocketObject.SocketType == SocketMessageType.Main_Chat) { // 收到房间聊天信息 string? user = "", msg = ""; if (SocketObject.Length > 0) user = SocketObject.GetParam(0); if (SocketObject.Length > 1) msg = SocketObject.GetParam(1); if (user != Usercfg.LoginUserName) { Main.GetMessage(msg, TimeType.None); } } else if (SocketObject.SocketType == SocketMessageType.Room_UpdateRoomMaster) { // 收到房间更换房主的信息 User user = General.UnknownUserInstance; Room room = General.HallInstance; if (SocketObject.Length > 0) user = SocketObject.GetParam(0) ?? General.UnknownUserInstance; if (SocketObject.Length > 1) room = SocketObject.GetParam(1) ?? General.HallInstance; if (room.Roomid != "-1" && room.Roomid == Usercfg.InRoom.Roomid) Main.UpdateUI(MainInvokeType.UpdateRoomMaster, room); } else if (SocketMessageTypes.Contains(SocketObject.SocketType)) { Work = SocketObject; Working = false; } } catch (Exception e) { RunTime.Controller?.Error(e); } } #endregion #region SocketHandler private (string, Guid) SocketHandler_LogOut() { string? msg = ""; Guid key = Guid.Empty; try { WaitForWorkDone(); // 返回一个Key,如果这个Key是空的,登出失败 if (Work.Length > 0) key = Work.GetParam(0); if (Work.Length > 1) msg = Work.GetParam(1); } catch (Exception e) { Main.GetMessage(e.GetErrorInfo()); } msg ??= ""; return (msg, key); } private string SocketHandler_IntoRoom() { string? roomid = ""; try { WaitForWorkDone(); if (Work.Length > 0) roomid = Work.GetParam(0); } catch (Exception e) { Main.GetMessage(e.GetErrorInfo()); } roomid ??= ""; return roomid; } private string SocketHandler_CreateRoom() { string? roomid = ""; try { WaitForWorkDone(); if (Work.Length > 0) roomid = Work.GetParam(0); } catch (Exception e) { Main.GetMessage(e.GetErrorInfo()); } roomid ??= ""; return roomid; } private bool SocketHandler_QuitRoom() { bool result = false; try { WaitForWorkDone(); if (Work.Length > 0) result = Work.GetParam(0); } catch (Exception e) { Main.GetMessage(e.GetErrorInfo()); } return result; } private int SocketHandler_GetRoomPlayerCount() { int count = 0; try { WaitForWorkDone(); if (Work.Length > 0) count = Work.GetParam(0); } catch (Exception e) { Main.GetMessage(e.GetErrorInfo()); } return count; } private List SocketHandler_UpdateRoom() { List list = new(); try { WaitForWorkDone(); if (Work.Length > 0) list = Work.GetParam>(0) ?? new(); } catch (Exception e) { Main.GetMessage(e.GetErrorInfo()); } return list; } #endregion } }