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; } = "";
+
///
/// 请求类型
///