FunGame-Server/FunGame.WebAPI/Controllers/GamingRequestController.cs
milimoe 8aec496fcb
服务器补全 API 实现 (#48)
* PayloadModel 添加 event 属性,添加 Room,Main 的 API 控制器

* 实现 SQLHelper 的自增 ID、异步版本功能

* 填充一些请求控制器的方法

* 添加报价的核心操作

* 涉及库存的物品获取应该使用 Guid 而不是 ItemId

* 添加 InventoryController

* 添加更新房间设置和用户房间的状态管理

* 优化 API Token 秘钥管理;修复服务器统一报错信息 BUG

* 优雅的关闭服务器;补全了所有数据请求实现;API Token 加密方式修改;添加了服务器初始化时创建管理员账号的必要步骤

* 完善 Web API 控制器

---------

Co-authored-by: yeziuku <yezi@wrss.org>
2025-04-21 01:08:31 +08:00

84 lines
2.9 KiB
C#

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 GamingRequestController(RESTfulAPIModel model, ILogger<GamingRequestController> logger) : ControllerBase
{
private readonly ILogger<GamingRequestController> _logger = logger;
[HttpPost]
public async Task<IActionResult> Post([FromBody] PayloadModel<GamingType> payload)
{
try
{
PayloadModel<GamingType> response = new()
{
Event = "gaming_request",
RequestType = payload.RequestType
};
if (model.RequestID == Guid.Empty)
{
if (model.NowGamingServer is null)
{
response.StatusCode = 400;
response.Message = "没有正在运行的游戏服务器!";
return BadRequest(response);
}
else
{
Guid uid = Guid.NewGuid();
model.RequestID = uid;
using CancellationTokenSource cts = model.SetRequestTimeout(uid);
Dictionary<string, object> result = [];
try
{
result = await model.NowGamingServer.GamingMessageHandler(model, payload.RequestType, payload.Data);
}
catch (TimeoutException)
{
_logger.LogWarning("请求超时。");
return StatusCode(408);
}
catch (Exception e)
{
_logger.LogError("Error: {e}", e);
return StatusCode(500);
}
finally
{
model.RequestID = Guid.Empty;
}
response.StatusCode = 200;
response.Data = result;
return Ok(response);
}
}
else
{
response.StatusCode = 400;
response.Message = "请求未执行完毕,请等待!";
return BadRequest(response);
}
}
catch (TimeoutException)
{
_logger.LogWarning("请求超时。");
return StatusCode(408);
}
catch (Exception e)
{
_logger.LogError("Error: {e}", e);
return StatusCode(500);
}
}
}
}