Add UpdateRoomMaster, GetPlayerCount (#6)

This commit is contained in:
milimoe 2023-04-16 13:00:42 +08:00 committed by GitHub
parent 70cda7bd43
commit 8b435390bd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 84 additions and 16 deletions

View File

@ -34,11 +34,13 @@ namespace Milimoe.FunGame.Desktop.Controller
GeneralEventArgs EventArgs = new(); GeneralEventArgs EventArgs = new();
if (Main.OnBeforeLogoutEvent(EventArgs) == EventResult.Fail) return result; 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") 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(); result = await MainModel.LogOut();
@ -83,7 +85,7 @@ namespace Milimoe.FunGame.Desktop.Controller
return result; return result;
} }
public async Task<bool> QuitRoom(Room room) public async Task<bool> QuitRoom(Room room, bool isMaster)
{ {
bool result = false; bool result = false;
string roomid = room.Roomid; string roomid = room.Roomid;
@ -93,7 +95,7 @@ namespace Milimoe.FunGame.Desktop.Controller
RoomEventArgs EventArgs = new(room); RoomEventArgs EventArgs = new(room);
if (Main.OnBeforeQuitRoomEvent(EventArgs) == EventResult.Fail) return result; if (Main.OnBeforeQuitRoomEvent(EventArgs) == EventResult.Fail) return result;
result = await MainModel.QuitRoom(roomid); result = await MainModel.QuitRoom(roomid, isMaster);
if (result) Main.OnSucceedQuitRoomEvent(EventArgs); if (result) Main.OnSucceedQuitRoomEvent(EventArgs);
else Main.OnFailedQuitRoomEvent(EventArgs); else Main.OnFailedQuitRoomEvent(EventArgs);
@ -130,6 +132,11 @@ namespace Milimoe.FunGame.Desktop.Controller
return result; return result;
} }
public async Task<int> GetRoomPlayerCount(string roomid)
{
return await MainModel.GetRoomPlayerCount(roomid);
}
public bool Chat(string msg) public bool Chat(string msg)
{ {
bool result = false; bool result = false;

View File

@ -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 string LoginUserName { get; set; } = ""; // 已登录用户名
public static Room InRoom { get; set; } = General.HallInstance; // 所处的房间 public static Room InRoom { get; set; } = General.HallInstance; // 所处的房间
} }

View File

@ -100,13 +100,31 @@ namespace Milimoe.FunGame.Desktop.Model
} }
} }
public async Task<bool> QuitRoom(string roomid) public async Task<int> 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<bool> QuitRoom(string roomid, bool isMaster)
{ {
bool result = false; bool result = false;
try try
{ {
SetWorking(); 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); result = await Task.Factory.StartNew(SocketHandler_QuitRoom);
if (result) if (result)
@ -129,7 +147,7 @@ namespace Milimoe.FunGame.Desktop.Model
try try
{ {
SetWorking(); 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); string roomid = await Task.Factory.StartNew(SocketHandler_CreateRoom);
if (roomid.Trim() != "") if (roomid.Trim() != "")
@ -173,7 +191,7 @@ namespace Milimoe.FunGame.Desktop.Model
if (SocketObject.SocketType == SocketMessageType.HeartBeat) 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); Main.UpdateUI(MainInvokeType.SetGreenAndPing);
} }
else if (SocketObject.SocketType == SocketMessageType.ForceLogout) else if (SocketObject.SocketType == SocketMessageType.ForceLogout)
@ -201,6 +219,15 @@ namespace Milimoe.FunGame.Desktop.Model
Main.GetMessage(msg, TimeType.None); Main.GetMessage(msg, TimeType.None);
} }
} }
else if (SocketObject.SocketType == SocketMessageType.UpdateRoomMaster)
{
// 收到房间更换房主的信息
DataSet? user = null, room = null;
if (SocketObject.Length > 0) user = SocketObject.GetParam<DataSet>(0);
if (SocketObject.Length > 1) room = SocketObject.GetParam<DataSet>(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)) else if (SocketMessageTypes.Contains(SocketObject.SocketType))
{ {
Work = SocketObject; Work = SocketObject;
@ -283,6 +310,21 @@ namespace Milimoe.FunGame.Desktop.Model
return result; return result;
} }
private int SocketHandler_GetRoomPlayerCount()
{
int count = 0;
try
{
WaitForWorkDone();
if (Work.Length > 0) count = Work.GetParam<int>(0);
}
catch (Exception e)
{
Main.GetMessage(e.GetErrorInfo());
}
return count;
}
private List<Room> SocketHandler_UpdateRoom() private List<Room> SocketHandler_UpdateRoom()
{ {
List<Room> list = new(); List<Room> list = new();

View File

@ -235,7 +235,7 @@ namespace Milimoe.FunGame.Desktop.Model
break; break;
case SocketMessageType.HeartBeat: case SocketMessageType.HeartBeat:
if (Socket.Connected && Usercfg.LoginUser != null) if (Socket.Connected && Usercfg.LoginUser.Id != 0)
Main.UpdateUI(MainInvokeType.SetGreenAndPing); Main.UpdateUI(MainInvokeType.SetGreenAndPing);
break; break;

View File

@ -149,6 +149,7 @@ namespace Milimoe.FunGame.Desktop.UI
break; break;
case MainInvokeType.Disconnected: case MainInvokeType.Disconnected:
Rooms.Clear();
RoomList.Items.Clear(); RoomList.Items.Clear();
Config.FunGame_isRetrying = false; Config.FunGame_isRetrying = false;
Config.FunGame_isConnected = false; Config.FunGame_isConnected = false;
@ -160,6 +161,7 @@ namespace Milimoe.FunGame.Desktop.UI
break; break;
case MainInvokeType.Disconnect: case MainInvokeType.Disconnect:
Rooms.Clear();
RoomList.Items.Clear(); RoomList.Items.Clear();
Config.FunGame_isAutoRetry = false; Config.FunGame_isAutoRetry = false;
Config.FunGame_isRetrying = false; Config.FunGame_isRetrying = false;
@ -215,6 +217,21 @@ namespace Milimoe.FunGame.Desktop.UI
} }
break; 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: default:
break; break;
} }
@ -625,7 +642,7 @@ namespace Milimoe.FunGame.Desktop.UI
if (objs != null && objs.Length > 0) if (objs != null && objs.Length > 0)
{ {
Usercfg.LoginUser = (User)objs[0]; Usercfg.LoginUser = (User)objs[0];
if (Usercfg.LoginUser is null) if (Usercfg.LoginUser.Id == 0)
{ {
throw new NoUserLogonException(); throw new NoUserLogonException();
} }
@ -645,9 +662,10 @@ namespace Milimoe.FunGame.Desktop.UI
/// </summary> /// </summary>
private void LogoutAccount() private void LogoutAccount()
{ {
InMain(); Usercfg.InRoom = General.HallInstance;
Usercfg.LoginUser = null; Usercfg.LoginUser = General.UnknownUserInstance;
Usercfg.LoginUserName = ""; Usercfg.LoginUserName = "";
InMain();
NowAccount.Text = "请登录账号"; NowAccount.Text = "请登录账号";
Logout.Visible = false; Logout.Visible = false;
Login.Visible = true; Login.Visible = true;
@ -692,7 +710,7 @@ namespace Milimoe.FunGame.Desktop.UI
msg = DateTimeUtility.GetNowShortTime() + " [ " + Usercfg.LoginUserName + " ] 说: " + text; msg = DateTimeUtility.GetNowShortTime() + " [ " + Usercfg.LoginUserName + " ] 说: " + text;
} }
WritelnGameInfo(msg); WritelnGameInfo(msg);
if (Usercfg.LoginUser != null && !await SwitchTalkMessage(text)) if (Usercfg.LoginUser.Id != 0 && !await SwitchTalkMessage(text))
{ {
MainController?.Chat(" [ " + Usercfg.LoginUserName + " ] 说: " + text); MainController?.Chat(" [ " + Usercfg.LoginUserName + " ] 说: " + text);
} }
@ -959,7 +977,8 @@ namespace Milimoe.FunGame.Desktop.UI
if (MainController != null) if (MainController != null)
{ {
string roomid = Usercfg.InRoom.Roomid; 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(DateTimeUtility.GetNowShortTime() + " 离开房间");
WritelnGameInfo("[ " + Usercfg.LoginUserName + " ] 已离开房间 -> [ " + roomid + " ]"); WritelnGameInfo("[ " + Usercfg.LoginUserName + " ] 已离开房间 -> [ " + roomid + " ]");