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();
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<bool> QuitRoom(Room room)
public async Task<bool> 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<int> GetRoomPlayerCount(string roomid)
{
return await MainModel.GetRoomPlayerCount(roomid);
}
public bool Chat(string msg)
{
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 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;
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<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))
{
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<int>(0);
}
catch (Exception e)
{
Main.GetMessage(e.GetErrorInfo());
}
return count;
}
private List<Room> SocketHandler_UpdateRoom()
{
List<Room> list = new();

View File

@ -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;

View File

@ -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
/// </summary>
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 + " ]");