From 8b435390bdc3b08c159c3d843eff64dde3629bbb Mon Sep 17 00:00:00 2001 From: milimoe <110188673+milimoe@users.noreply.github.com> Date: Sun, 16 Apr 2023 13:00:42 +0800 Subject: [PATCH] Add UpdateRoomMaster, GetPlayerCount (#6) --- FunGame.Desktop/Controller/MainController.cs | 15 ++++-- FunGame.Desktop/Library/Config/Usercfg.cs | 2 +- FunGame.Desktop/Model/MainModel.cs | 50 ++++++++++++++++++-- FunGame.Desktop/Model/RunTimeModel.cs | 2 +- FunGame.Desktop/UI/Main/Main.cs | 31 +++++++++--- 5 files changed, 84 insertions(+), 16 deletions(-) diff --git a/FunGame.Desktop/Controller/MainController.cs b/FunGame.Desktop/Controller/MainController.cs index 9b7435c..b20f32d 100644 --- a/FunGame.Desktop/Controller/MainController.cs +++ b/FunGame.Desktop/Controller/MainController.cs @@ -34,11 +34,13 @@ namespace Milimoe.FunGame.Desktop.Controller GeneralEventArgs EventArgs = new(); if (Main.OnBeforeLogoutEvent(EventArgs) == EventResult.Fail) return result; - if (Usercfg.LoginUser is null) return result; + if (Usercfg.LoginUser.Id == 0) return result; if (Usercfg.InRoom.Roomid != "-1") { - await MainModel.QuitRoom(Usercfg.InRoom.Roomid); + string roomid = Usercfg.InRoom.Roomid; + bool isMaster = Usercfg.InRoom.RoomMaster?.Id == Usercfg.LoginUser?.Id; + await MainModel.QuitRoom(roomid, isMaster); } result = await MainModel.LogOut(); @@ -83,7 +85,7 @@ namespace Milimoe.FunGame.Desktop.Controller return result; } - public async Task QuitRoom(Room room) + public async Task QuitRoom(Room room, bool isMaster) { bool result = false; string roomid = room.Roomid; @@ -93,7 +95,7 @@ namespace Milimoe.FunGame.Desktop.Controller RoomEventArgs EventArgs = new(room); if (Main.OnBeforeQuitRoomEvent(EventArgs) == EventResult.Fail) return result; - result = await MainModel.QuitRoom(roomid); + result = await MainModel.QuitRoom(roomid, isMaster); if (result) Main.OnSucceedQuitRoomEvent(EventArgs); else Main.OnFailedQuitRoomEvent(EventArgs); @@ -130,6 +132,11 @@ namespace Milimoe.FunGame.Desktop.Controller return result; } + public async Task GetRoomPlayerCount(string roomid) + { + return await MainModel.GetRoomPlayerCount(roomid); + } + public bool Chat(string msg) { bool result = false; diff --git a/FunGame.Desktop/Library/Config/Usercfg.cs b/FunGame.Desktop/Library/Config/Usercfg.cs index 21932b8..ad09bf7 100644 --- a/FunGame.Desktop/Library/Config/Usercfg.cs +++ b/FunGame.Desktop/Library/Config/Usercfg.cs @@ -8,7 +8,7 @@ namespace Milimoe.FunGame.Desktop.Library /** * 玩家设定内容 */ - public static User? LoginUser { get; set; } = null; // 已登录的用户 + public static User LoginUser { get; set; } = General.UnknownUserInstance; // 已登录的用户 public static string LoginUserName { get; set; } = ""; // 已登录用户名 public static Room InRoom { get; set; } = General.HallInstance; // 所处的房间 } diff --git a/FunGame.Desktop/Model/MainModel.cs b/FunGame.Desktop/Model/MainModel.cs index faad65f..08b0794 100644 --- a/FunGame.Desktop/Model/MainModel.cs +++ b/FunGame.Desktop/Model/MainModel.cs @@ -100,13 +100,31 @@ namespace Milimoe.FunGame.Desktop.Model } } - public async Task QuitRoom(string roomid) + public async Task GetRoomPlayerCount(string roomid) + { + try + { + SetWorking(); + if (RunTime.Socket?.Send(SocketMessageType.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.QuitRoom, roomid) == SocketResult.Success) + if (RunTime.Socket?.Send(SocketMessageType.QuitRoom, roomid, isMaster) == SocketResult.Success) { result = await Task.Factory.StartNew(SocketHandler_QuitRoom); if (result) @@ -129,7 +147,7 @@ namespace Milimoe.FunGame.Desktop.Model try { SetWorking(); - if (RunTime.Socket?.Send(SocketMessageType.CreateRoom, RoomType, Usercfg.LoginUser?.Id ?? 0, Password) == SocketResult.Success) + if (RunTime.Socket?.Send(SocketMessageType.CreateRoom, RoomType, Usercfg.LoginUser.Id, Password) == SocketResult.Success) { string roomid = await Task.Factory.StartNew(SocketHandler_CreateRoom); if (roomid.Trim() != "") @@ -173,7 +191,7 @@ namespace Milimoe.FunGame.Desktop.Model if (SocketObject.SocketType == SocketMessageType.HeartBeat) { // 心跳包单独处理 - if ((RunTime.Socket?.Connected ?? false) && Usercfg.LoginUser != null) + if ((RunTime.Socket?.Connected ?? false) && Usercfg.LoginUser.Id != 0) Main.UpdateUI(MainInvokeType.SetGreenAndPing); } else if (SocketObject.SocketType == SocketMessageType.ForceLogout) @@ -201,6 +219,15 @@ namespace Milimoe.FunGame.Desktop.Model Main.GetMessage(msg, TimeType.None); } } + else if (SocketObject.SocketType == SocketMessageType.UpdateRoomMaster) + { + // 收到房间更换房主的信息 + DataSet? user = null, room = null; + if (SocketObject.Length > 0) user = SocketObject.GetParam(0); + if (SocketObject.Length > 1) room = SocketObject.GetParam(1); + Room r = Core.Api.Utility.Factory.GetRoom(room, user); + if (r.Roomid != "-1" && r.Roomid == Usercfg.InRoom.Roomid) Main.UpdateUI(MainInvokeType.UpdateRoomMaster, r); + } else if (SocketMessageTypes.Contains(SocketObject.SocketType)) { Work = SocketObject; @@ -283,6 +310,21 @@ namespace Milimoe.FunGame.Desktop.Model 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(); diff --git a/FunGame.Desktop/Model/RunTimeModel.cs b/FunGame.Desktop/Model/RunTimeModel.cs index ed061a4..fffdb5c 100644 --- a/FunGame.Desktop/Model/RunTimeModel.cs +++ b/FunGame.Desktop/Model/RunTimeModel.cs @@ -235,7 +235,7 @@ namespace Milimoe.FunGame.Desktop.Model break; case SocketMessageType.HeartBeat: - if (Socket.Connected && Usercfg.LoginUser != null) + if (Socket.Connected && Usercfg.LoginUser.Id != 0) Main.UpdateUI(MainInvokeType.SetGreenAndPing); break; diff --git a/FunGame.Desktop/UI/Main/Main.cs b/FunGame.Desktop/UI/Main/Main.cs index 75bc15c..857b676 100644 --- a/FunGame.Desktop/UI/Main/Main.cs +++ b/FunGame.Desktop/UI/Main/Main.cs @@ -149,6 +149,7 @@ namespace Milimoe.FunGame.Desktop.UI break; case MainInvokeType.Disconnected: + Rooms.Clear(); RoomList.Items.Clear(); Config.FunGame_isRetrying = false; Config.FunGame_isConnected = false; @@ -160,6 +161,7 @@ namespace Milimoe.FunGame.Desktop.UI break; case MainInvokeType.Disconnect: + Rooms.Clear(); RoomList.Items.Clear(); Config.FunGame_isAutoRetry = false; Config.FunGame_isRetrying = false; @@ -214,7 +216,22 @@ namespace Milimoe.FunGame.Desktop.UI } } break; - + + case MainInvokeType.UpdateRoomMaster: + if (objs != null && objs.Length > 0) + { + Room r = (Room)objs[0]; + Usercfg.InRoom = r; + Rooms.RemoveRoom(r.Roomid); + Rooms.AddRoom(r); + if (r.RoomMaster != null) + { + string msg = $"房间 [ {r.Roomid} ] 的房主已变更为" + (r.RoomMaster.Username != Usercfg.LoginUserName ? $" [ {r.RoomMaster.Username} ]" : "您") + "。"; + GetMessage(msg, TimeType.TimeOnly); + } + } + break; + default: break; } @@ -625,7 +642,7 @@ namespace Milimoe.FunGame.Desktop.UI if (objs != null && objs.Length > 0) { Usercfg.LoginUser = (User)objs[0]; - if (Usercfg.LoginUser is null) + if (Usercfg.LoginUser.Id == 0) { throw new NoUserLogonException(); } @@ -645,9 +662,10 @@ namespace Milimoe.FunGame.Desktop.UI /// private void LogoutAccount() { - InMain(); - Usercfg.LoginUser = null; + Usercfg.InRoom = General.HallInstance; + Usercfg.LoginUser = General.UnknownUserInstance; Usercfg.LoginUserName = ""; + InMain(); NowAccount.Text = "请登录账号"; Logout.Visible = false; Login.Visible = true; @@ -692,7 +710,7 @@ namespace Milimoe.FunGame.Desktop.UI msg = DateTimeUtility.GetNowShortTime() + " [ " + Usercfg.LoginUserName + " ] 说: " + text; } WritelnGameInfo(msg); - if (Usercfg.LoginUser != null && !await SwitchTalkMessage(text)) + if (Usercfg.LoginUser.Id != 0 && !await SwitchTalkMessage(text)) { MainController?.Chat(" [ " + Usercfg.LoginUserName + " ] 说: " + text); } @@ -959,7 +977,8 @@ namespace Milimoe.FunGame.Desktop.UI if (MainController != null) { string roomid = Usercfg.InRoom.Roomid; - if (await MainController.QuitRoom(Usercfg.InRoom)) + bool isMaster = Usercfg.InRoom.RoomMaster?.Id == Usercfg.LoginUser.Id; + if (await MainController.QuitRoom(Usercfg.InRoom, isMaster)) { WritelnGameInfo(DateTimeUtility.GetNowShortTime() + " 离开房间"); WritelnGameInfo("[ " + Usercfg.LoginUserName + " ] 已离开房间 -> [ " + roomid + " ]");