PayloadModel 添加 event 属性,添加 Room,Main 的 API 控制器

This commit is contained in:
milimoe 2025-03-27 21:02:18 +08:00
parent 47d29ced5e
commit 4f6d70abc3
Signed by: milimoe
GPG Key ID: 05D280912DA6C69E
8 changed files with 485 additions and 50 deletions

View File

@ -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} <br/> 您正在找回[{ServerName}]账号的密码,您的验证码是 {forgetVerify} 10分钟内有效请及时输入<br/><br/>{ServerName}<br/>{DateTimeUtility.GetDateTimeToString(TimeType.LongDateOnly)}";
string Subject = $"[{ServerName}] 找回密码验证码";
string Body = $"亲爱的 {username} <br/> 您正在找回 [{ServerName}] 账号的密码,您的验证码是 {forgetVerify} 10分钟内有效请及时输入<br/><br/>{ServerName}<br/>{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));
}
/// <summary>
/// 更新房主
/// </summary>
/// <param name="requestData"></param>
/// <param name="resultData"></param>
/// <returns></returns>
private async Task UpdateRoomMaster(Dictionary<string, object> requestData, Dictionary<string, object> resultData)
{
bool result = false;
if (requestData.Count >= 2)
{
ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest);
string roomid = DataRequest.GetDictionaryJsonObject<string>(requestData, "roomid") ?? "-1";
User newMaster = DataRequest.GetDictionaryJsonObject<User>(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);
}
/// <summary>
/// 开始匹配
/// </summary>

View File

@ -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} <br/> 感谢您注册[{ServerName}],您的验证码是 {regVerify} 10分钟内有效请及时输入<br/><br/>{ServerName}<br/>{DateTimeUtility.GetDateTimeToString(TimeType.LongDateOnly)}";
string Subject = $"[{ServerName}] 注册验证码";
string Body = $"亲爱的 {username} <br/> 感谢您注册 [{ServerName}],您的验证码是 {regVerify} 10分钟内有效请及时输入<br/><br/>{ServerName}<br/>{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}" : "")}";
}
}

View File

@ -19,6 +19,7 @@ namespace Milimoe.FunGame.WebAPI.Controllers
{
PayloadModel<DataRequestType> response = new()
{
Event = "data_request",
RequestType = payload.RequestType
};

View File

@ -19,6 +19,7 @@ namespace Milimoe.FunGame.WebAPI.Controllers
{
PayloadModel<GamingType> response = new()
{
Event = "gaming_request",
RequestType = payload.RequestType
};
if (model.RequestID == Guid.Empty)

View File

@ -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<MainController> logger) : ControllerBase
{
private readonly ILogger<MainController> _logger = logger;
/// <summary>
/// 获取公告
/// </summary>
[HttpGet("notice")]
public async Task<IActionResult> GetNotice()
{
PayloadModel<DataRequestType> response = new()
{
Event = "main_getnotice",
RequestType = DataRequestType.Main_GetNotice
};
try
{
Dictionary<string, object> 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);
}
/// <summary>
/// 发送聊天消息
/// </summary>
[HttpPost("chat")]
public async Task<IActionResult> Chat([FromBody] Dictionary<string, object> data)
{
PayloadModel<DataRequestType> response = new()
{
Event = "main_chat",
RequestType = DataRequestType.Main_Chat
};
try
{
Dictionary<string, object> 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);
}
}
}

View File

@ -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<RoomController> logger) : ControllerBase
{
private readonly ILogger<RoomController> _logger = logger;
/// <summary>
/// 创建房间
/// </summary>
[HttpPost("create")]
public async Task<IActionResult> CreateRoom([FromBody] Dictionary<string, object> data)
{
string msg = "服务器暂时无法处理此请求。";
PayloadModel<DataRequestType> response = new()
{
Event = "room_create",
RequestType = DataRequestType.Main_CreateRoom
};
try
{
Dictionary<string, object> 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);
}
/// <summary>
/// 获取/更新房间列表
/// </summary>
[HttpGet("list")]
public async Task<IActionResult> GetRoomList()
{
PayloadModel<DataRequestType> response = new()
{
Event = "room_list",
RequestType = DataRequestType.Main_UpdateRoom
};
try
{
Dictionary<string, object> 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);
}
/// <summary>
/// 进入房间
/// </summary>
[HttpPost("join")]
public async Task<IActionResult> IntoRoom([FromBody] Dictionary<string, object> data)
{
PayloadModel<DataRequestType> response = new()
{
Event = "room_join",
RequestType = DataRequestType.Main_IntoRoom
};
try
{
Dictionary<string, object> 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);
}
/// <summary>
/// 退出房间
/// </summary>
[HttpPost("quit")]
public async Task<IActionResult> QuitRoom([FromBody] Dictionary<string, object> data)
{
PayloadModel<DataRequestType> response = new()
{
Event = "room_quit",
RequestType = DataRequestType.Main_QuitRoom
};
try
{
Dictionary<string, object> 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);
}
/// <summary>
/// 匹配房间
/// </summary>
[HttpPost("match")]
public async Task<IActionResult> MatchRoom([FromBody] Dictionary<string, object> data)
{
PayloadModel<DataRequestType> response = new()
{
Event = "room_match",
RequestType = DataRequestType.Main_MatchRoom
};
try
{
Dictionary<string, object> 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);
}
/// <summary>
/// 设置准备状态
/// </summary>
[HttpPost("ready")]
public async Task<IActionResult> SetReady([FromBody] Dictionary<string, object> data)
{
PayloadModel<DataRequestType> response = new()
{
Event = "room_ready",
RequestType = DataRequestType.Main_Ready
};
try
{
Dictionary<string, object> 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);
}
/// <summary>
/// 取消准备状态
/// </summary>
[HttpPost("cancelready")]
public async Task<IActionResult> CancelReady([FromBody] Dictionary<string, object> data)
{
PayloadModel<DataRequestType> response = new()
{
Event = "room_cancelready",
RequestType = DataRequestType.Main_CancelReady
};
try
{
Dictionary<string, object> 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);
}
/// <summary>
/// 开始游戏
/// </summary>
[HttpPost("start")]
public async Task<IActionResult> StartGame([FromBody] Dictionary<string, object> data)
{
PayloadModel<DataRequestType> response = new()
{
Event = "room_start",
RequestType = DataRequestType.Main_StartGame
};
try
{
Dictionary<string, object> 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);
}
/// <summary>
/// 获取房间内玩家数量
/// </summary>
[HttpPost("playercount")]
public async Task<IActionResult> GetRoomPlayerCount([FromBody] Dictionary<string, object> data)
{
PayloadModel<DataRequestType> response = new()
{
Event = "room_playercount",
RequestType = DataRequestType.Room_GetRoomPlayerCount
};
try
{
Dictionary<string, object> 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);
}
/// <summary>
/// 更新房主
/// </summary>
[HttpPost("updatemaster")]
public async Task<IActionResult> UpdateRoomMaster([FromBody] Dictionary<string, object> data)
{
PayloadModel<DataRequestType> response = new()
{
Event = "room_updatemaster",
RequestType = DataRequestType.Room_UpdateRoomMaster
};
try
{
Dictionary<string, object> 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);
}
}
}

View File

@ -28,6 +28,13 @@ namespace Milimoe.FunGame.WebAPI.Controllers
[Authorize(AuthenticationSchemes = "APIBearer")]
public IActionResult Register([FromBody] RegDTO dto)
{
string msg = "服务器暂时无法处理注册请求。";
PayloadModel<DataRequestType> 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<DataRequestType>()
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<IActionResult> Login([FromBody] LoginDTO dto)
{
string msg = "服务器暂时无法处理登录请求。";
Config.ConnectingPlayerCount++;
PayloadModel<DataRequestType> response = new()
{
Event = "user_login",
RequestType = DataRequestType.Login_Login
};
try
{
PayloadModel<DataRequestType> 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<IActionResult> LogOut()
{
string msg = "退出登录失败!服务器可能暂时无法处理此请求。";
PayloadModel<DataRequestType> response = new()
{
Event = "user_logout",
RequestType = DataRequestType.RunTime_Logout
};
try
{
PayloadModel<DataRequestType> 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<RESTfulAPIModel?> CheckConnection(string username, string clientIP)

View File

@ -2,6 +2,11 @@
{
public class PayloadModel<T> where T : struct, Enum
{
/// <summary>
/// 业务事件
/// </summary>
public string Event { get; set; } = "";
/// <summary>
/// 请求类型
/// </summary>