From 4f6d70abc34cd8e5e10bc99763c239b83c8ca736 Mon Sep 17 00:00:00 2001 From: milimoe Date: Thu, 27 Mar 2025 21:02:18 +0800 Subject: [PATCH] =?UTF-8?q?PayloadModel=20=E6=B7=BB=E5=8A=A0=20event=20?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=EF=BC=8C=E6=B7=BB=E5=8A=A0=20Room=EF=BC=8CMa?= =?UTF-8?q?in=20=E7=9A=84=20API=20=E6=8E=A7=E5=88=B6=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/DataRequestController.cs | 62 +++- FunGame.Server/Services/DataRequestService.cs | 10 +- .../Controllers/DataRequestController.cs | 1 + .../Controllers/GamingRequestController.cs | 1 + FunGame.WebAPI/Controllers/MainController.cs | 73 ++++ FunGame.WebAPI/Controllers/RoomController.cs | 311 ++++++++++++++++++ FunGame.WebAPI/Controllers/UserController.cs | 72 ++-- FunGame.WebAPI/Models/PayloadModel.cs | 5 + 8 files changed, 485 insertions(+), 50 deletions(-) create mode 100644 FunGame.WebAPI/Controllers/MainController.cs create mode 100644 FunGame.WebAPI/Controllers/RoomController.cs diff --git a/FunGame.Server/Controllers/DataRequestController.cs b/FunGame.Server/Controllers/DataRequestController.cs index 996a4a3..6382cf1 100644 --- a/FunGame.Server/Controllers/DataRequestController.cs +++ b/FunGame.Server/Controllers/DataRequestController.cs @@ -125,6 +125,7 @@ namespace Milimoe.FunGame.Server.Controller break; case DataRequestType.Room_UpdateRoomMaster: + await UpdateRoomMaster(data, result); break; default: @@ -569,18 +570,6 @@ namespace Milimoe.FunGame.Server.Controller ServerHelper.WriteLine("客户端提供的参数不足。", InvokeMessageType.DataRequest, LogLevel.Warning); } - LoginEventArgs eventArgs = new(username, password, autokey); - FunGameSystem.ServerPluginLoader?.OnBeforeLoginEvent(this, eventArgs); - FunGameSystem.WebAPIPluginLoader?.OnBeforeLoginEvent(this, eventArgs); - if (eventArgs.Cancel) - { - msg = $"{DataRequestSet.GetTypeString(_lastRequest)} 请求已取消。{(eventArgs.EventMsg != "" ? $"原因:{eventArgs.EventMsg}" : "")}"; - ServerHelper.WriteLine(msg); - resultData.Add("msg", msg); - resultData.Add("user", user); - return; - } - // CheckLogin的情况 if (key != Guid.Empty) { @@ -606,8 +595,6 @@ namespace Milimoe.FunGame.Server.Controller } } - FunGameSystem.ServerPluginLoader?.OnAfterLoginEvent(this, eventArgs); - FunGameSystem.WebAPIPluginLoader?.OnAfterLoginEvent(this, eventArgs); resultData.Add("msg", msg); resultData.Add("user", user); } @@ -688,8 +675,8 @@ namespace Milimoe.FunGame.Server.Controller { // 发送验证码 string ServerName = Config.ServerName; - string Subject = $"[{ServerName}] FunGame 找回密码验证码"; - string Body = $"亲爱的 {username},
您正在找回[{ServerName}]账号的密码,您的验证码是 {forgetVerify} ,10分钟内有效,请及时输入!

{ServerName}
{DateTimeUtility.GetDateTimeToString(TimeType.LongDateOnly)}"; + string Subject = $"[{ServerName}] 找回密码验证码"; + string Body = $"亲爱的 {username},
您正在找回 [{ServerName}] 账号的密码,您的验证码是 {forgetVerify} ,10分钟内有效,请及时输入!

{ServerName}
{DateTimeUtility.GetDateTimeToString(TimeType.LongDateOnly)}"; string[] To = [email]; if (MailSender.Send(MailSender.CreateMail(Subject, Body, System.Net.Mail.MailPriority.Normal, true, To)) == MailSendResult.Success) { @@ -771,6 +758,49 @@ namespace Milimoe.FunGame.Server.Controller resultData.Add("count", FunGameSystem.RoomList.GetUserCount(roomid)); } + /// + /// 更新房主 + /// + /// + /// + /// + private async Task UpdateRoomMaster(Dictionary requestData, Dictionary resultData) + { + bool result = false; + + if (requestData.Count >= 2) + { + ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); + string roomid = DataRequest.GetDictionaryJsonObject(requestData, "roomid") ?? "-1"; + User newMaster = DataRequest.GetDictionaryJsonObject(requestData, "newMaster") ?? Factory.GetUser(); + + if (roomid != "-1" && FunGameSystem.RoomList.IsExist(roomid) && newMaster.Id != 0) + { + Room room = FunGameSystem.RoomList[roomid]; + User oldMaster = room.RoomMaster; + room.RoomMaster = newMaster; + result = true; + + if (SQLHelper != null) + { + SQLHelper.Execute(RoomQuery.Update_UpdateRoomMaster(SQLHelper, roomid, newMaster.Id)); + if (SQLHelper.Result == SQLResult.Success) + { + await Server.UpdateRoomMaster(room, true); + ServerHelper.WriteLine($"[UpdateRoomMaster] RoomID: {roomid} 房主变更: {oldMaster.Username} -> {newMaster.Username}"); + } + } + } + } + else + { + ServerHelper.WriteLine("客户端提供的参数不足。", InvokeMessageType.DataRequest, LogLevel.Warning); + } + + // 返回结果 + resultData.Add("result", result); + } + /// /// 开始匹配 /// diff --git a/FunGame.Server/Services/DataRequestService.cs b/FunGame.Server/Services/DataRequestService.cs index b0a5890..94cd6bf 100644 --- a/FunGame.Server/Services/DataRequestService.cs +++ b/FunGame.Server/Services/DataRequestService.cs @@ -23,7 +23,7 @@ namespace Milimoe.FunGame.Server.Services FunGameSystem.WebAPIPluginLoader?.OnBeforeRegEvent(sender, eventArgs); if (eventArgs.Cancel) { - msg = $"{DataRequestSet.GetTypeString(DataRequestType.Reg_Reg)} 请求已取消。{(eventArgs.EventMsg != "" ? $"原因:{eventArgs.EventMsg}" : "")}"; + msg = GetPluginCancelString(DataRequestType.Reg_Reg, eventArgs); ServerHelper.WriteLine(msg, InvokeMessageType.DataRequest, LogLevel.Warning); return (eventArgs.EventMsg, RegInvokeType.None, false); } @@ -77,8 +77,8 @@ namespace Milimoe.FunGame.Server.Services { // 发送验证码 string ServerName = Config.ServerName; - string Subject = $"[{ServerName}] FunGame 注册验证码"; - string Body = $"亲爱的 {username},
感谢您注册[{ServerName}],您的验证码是 {regVerify} ,10分钟内有效,请及时输入!

{ServerName}
{DateTimeUtility.GetDateTimeToString(TimeType.LongDateOnly)}"; + string Subject = $"[{ServerName}] 注册验证码"; + string Body = $"亲爱的 {username},
感谢您注册 [{ServerName}],您的验证码是 {regVerify} ,10分钟内有效,请及时输入!

{ServerName}
{DateTimeUtility.GetDateTimeToString(TimeType.LongDateOnly)}"; string[] To = [email]; if (mailSender.Send(mailSender.CreateMail(Subject, Body, System.Net.Mail.MailPriority.Normal, true, To)) == MailSendResult.Success) { @@ -169,7 +169,7 @@ namespace Milimoe.FunGame.Server.Services FunGameSystem.WebAPIPluginLoader?.OnBeforeLoginEvent(sender, eventArgs); if (eventArgs.Cancel) { - msg = $"{DataRequestSet.GetTypeString(DataRequestType.Login_Login)} 请求已取消。{(eventArgs.EventMsg != "" ? $"原因:{eventArgs.EventMsg}" : "")}"; + msg = GetPluginCancelString(DataRequestType.Login_Login, eventArgs); ServerHelper.WriteLine(msg, InvokeMessageType.DataRequest, LogLevel.Warning); return (success, dsUser, eventArgs.EventMsg, key); } @@ -214,5 +214,7 @@ namespace Milimoe.FunGame.Server.Services ServerHelper.WriteLine(msg, InvokeMessageType.Core); return (success, dsUser, msg, key); } + + private static string GetPluginCancelString(DataRequestType type, GeneralEventArgs e) => $"{DataRequestSet.GetTypeString(type)} 请求已取消。{(e.EventMsg != "" ? $"原因:{e.EventMsg}" : "")}"; } } diff --git a/FunGame.WebAPI/Controllers/DataRequestController.cs b/FunGame.WebAPI/Controllers/DataRequestController.cs index 4da774d..d8ddfcf 100644 --- a/FunGame.WebAPI/Controllers/DataRequestController.cs +++ b/FunGame.WebAPI/Controllers/DataRequestController.cs @@ -19,6 +19,7 @@ namespace Milimoe.FunGame.WebAPI.Controllers { PayloadModel response = new() { + Event = "data_request", RequestType = payload.RequestType }; diff --git a/FunGame.WebAPI/Controllers/GamingRequestController.cs b/FunGame.WebAPI/Controllers/GamingRequestController.cs index 28e6247..2fb71c9 100644 --- a/FunGame.WebAPI/Controllers/GamingRequestController.cs +++ b/FunGame.WebAPI/Controllers/GamingRequestController.cs @@ -19,6 +19,7 @@ namespace Milimoe.FunGame.WebAPI.Controllers { PayloadModel response = new() { + Event = "gaming_request", RequestType = payload.RequestType }; if (model.RequestID == Guid.Empty) diff --git a/FunGame.WebAPI/Controllers/MainController.cs b/FunGame.WebAPI/Controllers/MainController.cs new file mode 100644 index 0000000..b5bf73a --- /dev/null +++ b/FunGame.WebAPI/Controllers/MainController.cs @@ -0,0 +1,73 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Milimoe.FunGame.Core.Library.Constant; +using Milimoe.FunGame.WebAPI.Models; + +namespace Milimoe.FunGame.WebAPI.Controllers +{ + [ApiController] + [Route("[controller]")] + [Authorize] + public class MainController(RESTfulAPIModel model, ILogger logger) : ControllerBase + { + private readonly ILogger _logger = logger; + + /// + /// ȡ + /// + [HttpGet("notice")] + public async Task GetNotice() + { + PayloadModel response = new() + { + Event = "main_getnotice", + RequestType = DataRequestType.Main_GetNotice + }; + + try + { + Dictionary result = await model.DataRequestController.GetResultData(DataRequestType.Main_GetNotice, []); + response.StatusCode = 200; + response.Data = result; + return Ok(response); + } + catch (Exception e) + { + _logger.LogError("Error: {e}", e); + } + + response.StatusCode = 500; + response.Message = "ʱ޷"; + return StatusCode(500, response); + } + + /// + /// Ϣ + /// + [HttpPost("chat")] + public async Task Chat([FromBody] Dictionary data) + { + PayloadModel response = new() + { + Event = "main_chat", + RequestType = DataRequestType.Main_Chat + }; + + try + { + Dictionary result = await model.DataRequestController.GetResultData(DataRequestType.Main_Chat, data); + response.StatusCode = 200; + response.Data = result; + return Ok(response); + } + catch (Exception e) + { + _logger.LogError("Error: {e}", e); + } + + response.StatusCode = 500; + response.Message = "ʱ޷"; + return StatusCode(500, response); + } + } +} diff --git a/FunGame.WebAPI/Controllers/RoomController.cs b/FunGame.WebAPI/Controllers/RoomController.cs new file mode 100644 index 0000000..ec07bf2 --- /dev/null +++ b/FunGame.WebAPI/Controllers/RoomController.cs @@ -0,0 +1,311 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Milimoe.FunGame.Core.Entity; +using Milimoe.FunGame.Core.Library.Constant; +using Milimoe.FunGame.WebAPI.Models; + +namespace Milimoe.FunGame.WebAPI.Controllers +{ + [ApiController] + [Route("[controller]")] + [Authorize] + public class RoomController(RESTfulAPIModel model, ILogger logger) : ControllerBase + { + private readonly ILogger _logger = logger; + + /// + /// + /// + [HttpPost("create")] + public async Task CreateRoom([FromBody] Dictionary data) + { + string msg = "ʱ޷"; + PayloadModel response = new() + { + Event = "room_create", + RequestType = DataRequestType.Main_CreateRoom + }; + + try + { + Dictionary result = await model.DataRequestController.GetResultData(DataRequestType.Main_CreateRoom, data); + if (result.TryGetValue("room", out object? value) && value is Room room && room.Roomid != "-1") + { + response.StatusCode = 200; + response.Data = result; + return Ok(response); + } + msg = "ʧܣ"; + } + catch (Exception e) + { + _logger.LogError("Error: {e}", e); + } + + response.StatusCode = 500; + response.Message = msg; + return StatusCode(500, response); + } + + /// + /// ȡ/·б + /// + [HttpGet("list")] + public async Task GetRoomList() + { + PayloadModel response = new() + { + Event = "room_list", + RequestType = DataRequestType.Main_UpdateRoom + }; + + try + { + Dictionary result = await model.DataRequestController.GetResultData(DataRequestType.Main_UpdateRoom, []); + response.StatusCode = 200; + response.Data = result; + return Ok(response); + } + catch (Exception e) + { + _logger.LogError("Error: {e}", e); + } + + response.StatusCode = 500; + response.Message = "ʱ޷"; + return StatusCode(500, response); + } + + /// + /// 뷿 + /// + [HttpPost("join")] + public async Task IntoRoom([FromBody] Dictionary data) + { + PayloadModel response = new() + { + Event = "room_join", + RequestType = DataRequestType.Main_IntoRoom + }; + + try + { + Dictionary result = await model.DataRequestController.GetResultData(DataRequestType.Main_IntoRoom, data); + response.StatusCode = 200; + response.Data = result; + return Ok(response); + } + catch (Exception e) + { + _logger.LogError("Error: {e}", e); + } + + response.StatusCode = 500; + response.Message = "ʱ޷"; + return StatusCode(500, response); + } + + /// + /// ˳ + /// + [HttpPost("quit")] + public async Task QuitRoom([FromBody] Dictionary data) + { + PayloadModel response = new() + { + Event = "room_quit", + RequestType = DataRequestType.Main_QuitRoom + }; + + try + { + Dictionary result = await model.DataRequestController.GetResultData(DataRequestType.Main_QuitRoom, data); + response.StatusCode = 200; + response.Data = result; + return Ok(response); + } + catch (Exception e) + { + _logger.LogError("Error: {e}", e); + } + + response.StatusCode = 500; + response.Message = "ʱ޷"; + return StatusCode(500, response); + } + + /// + /// ƥ䷿ + /// + [HttpPost("match")] + public async Task MatchRoom([FromBody] Dictionary data) + { + PayloadModel response = new() + { + Event = "room_match", + RequestType = DataRequestType.Main_MatchRoom + }; + + try + { + Dictionary result = await model.DataRequestController.GetResultData(DataRequestType.Main_MatchRoom, data); + response.StatusCode = 200; + response.Data = result; + return Ok(response); + } + catch (Exception e) + { + _logger.LogError("Error: {e}", e); + } + + response.StatusCode = 500; + response.Message = "ʱ޷"; + return StatusCode(500, response); + } + + /// + /// ׼״̬ + /// + [HttpPost("ready")] + public async Task SetReady([FromBody] Dictionary data) + { + PayloadModel response = new() + { + Event = "room_ready", + RequestType = DataRequestType.Main_Ready + }; + + try + { + Dictionary result = await model.DataRequestController.GetResultData(DataRequestType.Main_Ready, data); + response.StatusCode = 200; + response.Data = result; + return Ok(response); + } + catch (Exception e) + { + _logger.LogError("Error: {e}", e); + } + + response.StatusCode = 500; + response.Message = "ʱ޷"; + return StatusCode(500, response); + } + + /// + /// ȡ׼״̬ + /// + [HttpPost("cancelready")] + public async Task CancelReady([FromBody] Dictionary data) + { + PayloadModel response = new() + { + Event = "room_cancelready", + RequestType = DataRequestType.Main_CancelReady + }; + + try + { + Dictionary result = await model.DataRequestController.GetResultData(DataRequestType.Main_CancelReady, data); + response.StatusCode = 200; + response.Data = result; + return Ok(response); + } + catch (Exception e) + { + _logger.LogError("Error: {e}", e); + } + + response.StatusCode = 500; + response.Message = "ʱ޷"; + return StatusCode(500, response); + } + + /// + /// ʼϷ + /// + [HttpPost("start")] + public async Task StartGame([FromBody] Dictionary data) + { + PayloadModel response = new() + { + Event = "room_start", + RequestType = DataRequestType.Main_StartGame + }; + + try + { + Dictionary result = await model.DataRequestController.GetResultData(DataRequestType.Main_StartGame, data); + response.StatusCode = 200; + response.Data = result; + return Ok(response); + } + catch (Exception e) + { + _logger.LogError("Error: {e}", e); + } + + response.StatusCode = 500; + response.Message = "ʱ޷"; + return StatusCode(500, response); + } + + /// + /// ȡ + /// + [HttpPost("playercount")] + public async Task GetRoomPlayerCount([FromBody] Dictionary data) + { + PayloadModel response = new() + { + Event = "room_playercount", + RequestType = DataRequestType.Room_GetRoomPlayerCount + }; + + try + { + Dictionary result = await model.DataRequestController.GetResultData(DataRequestType.Room_GetRoomPlayerCount, data); + response.StatusCode = 200; + response.Data = result; + return Ok(response); + } + catch (Exception e) + { + _logger.LogError("Error: {e}", e); + } + + response.StatusCode = 500; + response.Message = "ʱ޷"; + return StatusCode(500, response); + } + + /// + /// · + /// + [HttpPost("updatemaster")] + public async Task UpdateRoomMaster([FromBody] Dictionary data) + { + PayloadModel response = new() + { + Event = "room_updatemaster", + RequestType = DataRequestType.Room_UpdateRoomMaster + }; + + try + { + Dictionary result = await model.DataRequestController.GetResultData(DataRequestType.Room_UpdateRoomMaster, data); + response.StatusCode = 200; + response.Data = result; + return Ok(response); + } + catch (Exception e) + { + _logger.LogError("Error: {e}", e); + } + + response.StatusCode = 500; + response.Message = "ʱ޷"; + return StatusCode(500, response); + } + } +} diff --git a/FunGame.WebAPI/Controllers/UserController.cs b/FunGame.WebAPI/Controllers/UserController.cs index f5cdf20..626688d 100644 --- a/FunGame.WebAPI/Controllers/UserController.cs +++ b/FunGame.WebAPI/Controllers/UserController.cs @@ -28,6 +28,13 @@ namespace Milimoe.FunGame.WebAPI.Controllers [Authorize(AuthenticationSchemes = "APIBearer")] public IActionResult Register([FromBody] RegDTO dto) { + string msg = "服务器暂时无法处理注册请求。"; + PayloadModel response = new() + { + Event = "user_register", + RequestType = DataRequestType.Reg_Reg + }; + try { string clientIP = HttpContext.Connection.RemoteIpAddress?.ToString() + ":" + HttpContext.Connection.RemotePort; @@ -37,39 +44,40 @@ namespace Milimoe.FunGame.WebAPI.Controllers string email = dto.Email; string verifycode = dto.VerifyCode; - (string msg, RegInvokeType type, bool success) = DataRequestService.Reg(apiListener, username, password, email, verifycode, clientIP); + (msg, RegInvokeType type, bool success) = DataRequestService.Reg(apiListener, username, password, email, verifycode, clientIP); - return Ok(new PayloadModel() + response.StatusCode = 200; + response.Message = msg; + response.Data = new() { - RequestType = DataRequestType.Reg_Reg, - StatusCode = 200, - Message = msg, - Data = new() - { - { "success", success }, - { "type", type } - } - }); + { "success", success }, + { "type", type } + }; + return Ok(response); } catch (Exception e) { logger.LogError("Error: {e}", e); } - return BadRequest("服务器暂时无法处理注册请求。"); + + response.StatusCode = 500; + response.Message = msg; + return StatusCode(500, response); } [HttpPost("login")] public async Task Login([FromBody] LoginDTO dto) { + string msg = "服务器暂时无法处理登录请求。"; Config.ConnectingPlayerCount++; + PayloadModel response = new() + { + Event = "user_login", + RequestType = DataRequestType.Login_Login + }; + try { - PayloadModel response = new() - { - RequestType = DataRequestType.Login_Login - }; - string msg = "服务器暂时无法处理登录请求。"; - string clientIP = HttpContext.Connection.RemoteIpAddress?.ToString() + ":" + HttpContext.Connection.RemotePort; ServerHelper.WriteLine(ServerHelper.MakeClientName(clientIP) + " 通过 RESTful API 连接至服务器,正在登录 . . .", InvokeMessageType.Core); string username = dto.Username; @@ -109,21 +117,26 @@ namespace Milimoe.FunGame.WebAPI.Controllers Config.ConnectingPlayerCount--; logger.LogError("Error: {e}", e); } - return BadRequest(); + + response.StatusCode = 500; + response.Message = msg; + return StatusCode(500, response); } [HttpPost("logout")] [Authorize] public async Task LogOut() { + string msg = "退出登录失败!服务器可能暂时无法处理此请求。"; + PayloadModel response = new() + { + Event = "user_logout", + RequestType = DataRequestType.RunTime_Logout + }; + try { - PayloadModel response = new() - { - RequestType = DataRequestType.RunTime_Logout - }; string username = User.FindFirstValue(ClaimTypes.NameIdentifier) ?? ""; - if (apiListener.UserList.ContainsKey(username)) { RESTfulAPIModel model = (RESTfulAPIModel)apiListener.UserList[username]; @@ -134,16 +147,15 @@ namespace Milimoe.FunGame.WebAPI.Controllers response.StatusCode = 200; return Ok(response); } - - response.Message = "退出登录失败!"; - response.StatusCode = 400; - return BadRequest(response); } catch (Exception e) { logger.LogError("Error: {e}", e); } - return BadRequest(); + + response.StatusCode = 500; + response.Message = msg; + return StatusCode(500, response); } [HttpPost("refresh")] @@ -163,7 +175,7 @@ namespace Milimoe.FunGame.WebAPI.Controllers { logger.LogError("Error: {e}", e); } - return BadRequest(); + return StatusCode(500); } private async Task CheckConnection(string username, string clientIP) diff --git a/FunGame.WebAPI/Models/PayloadModel.cs b/FunGame.WebAPI/Models/PayloadModel.cs index ab9a777..711c61e 100644 --- a/FunGame.WebAPI/Models/PayloadModel.cs +++ b/FunGame.WebAPI/Models/PayloadModel.cs @@ -2,6 +2,11 @@ { public class PayloadModel where T : struct, Enum { + /// + /// 业务事件 + /// + public string Event { get; set; } = ""; + /// /// 请求类型 ///