mirror of
https://github.com/project-redbud/FunGame-Server.git
synced 2025-12-05 16:16:34 +00:00
添加各种请求的控制器
This commit is contained in:
parent
16ebe39d35
commit
b7b0ac1f37
@ -526,143 +526,13 @@ namespace Milimoe.FunGame.Server.Controller
|
|||||||
string password = DataRequest.GetDictionaryJsonObject<string>(requestData, "password") ?? "";
|
string password = DataRequest.GetDictionaryJsonObject<string>(requestData, "password") ?? "";
|
||||||
string email = DataRequest.GetDictionaryJsonObject<string>(requestData, "email") ?? "";
|
string email = DataRequest.GetDictionaryJsonObject<string>(requestData, "email") ?? "";
|
||||||
string verifycode = DataRequest.GetDictionaryJsonObject<string>(requestData, "verifycode") ?? "";
|
string verifycode = DataRequest.GetDictionaryJsonObject<string>(requestData, "verifycode") ?? "";
|
||||||
(msg, returnType, success) = Reg(username, password, email, verifycode, Server.Socket?.ClientIP ?? "", SQLHelper, MailSender);
|
(msg, returnType, success) = DataRequestService.Reg(username, password, email, verifycode, Server.Socket?.ClientIP ?? "", SQLHelper, MailSender);
|
||||||
}
|
}
|
||||||
resultData.Add("msg", msg);
|
resultData.Add("msg", msg);
|
||||||
resultData.Add("type", returnType);
|
resultData.Add("type", returnType);
|
||||||
resultData.Add("success", success);
|
resultData.Add("success", success);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static (string Msg, RegInvokeType RegInvokeType, bool Success) Reg(string username, string password, string email, string verifyCode, string clientIP = "", SQLHelper? sqlHelper = null, MailSender? mailSender = null)
|
|
||||||
{
|
|
||||||
string msg = "";
|
|
||||||
RegInvokeType type = RegInvokeType.None;
|
|
||||||
bool success = false;
|
|
||||||
string clientName = ServerHelper.MakeClientName(clientIP);
|
|
||||||
|
|
||||||
sqlHelper ??= Factory.OpenFactory.GetSQLHelper();
|
|
||||||
mailSender ??= Factory.OpenFactory.GetMailSender();
|
|
||||||
if (sqlHelper != null)
|
|
||||||
{
|
|
||||||
// 如果没发验证码,就生成验证码
|
|
||||||
if (verifyCode.Trim() == "")
|
|
||||||
{
|
|
||||||
// 先检查账号是否重复
|
|
||||||
sqlHelper.ExecuteDataSet(UserQuery.Select_IsExistUsername(sqlHelper, username));
|
|
||||||
if (sqlHelper.Result == SQLResult.Success)
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine(clientName + " 账号已被注册");
|
|
||||||
msg = "此账号名已被使用!";
|
|
||||||
type = RegInvokeType.DuplicateUserName;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// 检查邮箱是否重复
|
|
||||||
sqlHelper.ExecuteDataSet(UserQuery.Select_IsExistEmail(sqlHelper, email));
|
|
||||||
if (sqlHelper.Result == SQLResult.Success)
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine(clientName + " 邮箱已被注册");
|
|
||||||
msg = "此邮箱已被注册!";
|
|
||||||
type = RegInvokeType.DuplicateEmail;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// 检查验证码是否发送过
|
|
||||||
sqlHelper.ExecuteDataSet(RegVerifyCodes.Select_HasSentRegVerifyCode(sqlHelper, username, email));
|
|
||||||
if (sqlHelper.Result == SQLResult.Success && DateTime.TryParse(sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime].ToString(), out DateTime RegTime) && (DateTime.Now - RegTime).TotalMinutes < 10)
|
|
||||||
{
|
|
||||||
string RegVerifyCode = sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode].ToString() ?? "";
|
|
||||||
ServerHelper.WriteLine(clientName + $" 十分钟内已向{email}发送过验证码:{RegVerifyCode}");
|
|
||||||
type = RegInvokeType.InputVerifyCode;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// 发送验证码,需要先删除之前过期的验证码
|
|
||||||
sqlHelper.NewTransaction();
|
|
||||||
sqlHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(sqlHelper, username, email));
|
|
||||||
string regVerify = Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 6);
|
|
||||||
sqlHelper.Execute(RegVerifyCodes.Insert_RegVerifyCode(sqlHelper, username, email, regVerify));
|
|
||||||
if (sqlHelper.Result == SQLResult.Success)
|
|
||||||
{
|
|
||||||
sqlHelper.Commit();
|
|
||||||
if (mailSender != null)
|
|
||||||
{
|
|
||||||
// 发送验证码
|
|
||||||
string ServerName = Config.ServerName;
|
|
||||||
string Subject = $"[{ServerName}] FunGame 注册验证码";
|
|
||||||
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)
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine(clientName + $" 已向{email}发送验证码:{regVerify}");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine(clientName + " 无法发送验证码", InvokeMessageType.Error);
|
|
||||||
ServerHelper.WriteLine(mailSender.ErrorMsg, InvokeMessageType.Error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else // 不使用MailSender的情况
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine(clientName + $" 验证码为:{regVerify},请服务器管理员告知此用户");
|
|
||||||
}
|
|
||||||
type = RegInvokeType.InputVerifyCode;
|
|
||||||
}
|
|
||||||
else sqlHelper.Rollback();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// 先检查验证码
|
|
||||||
sqlHelper.ExecuteDataSet(RegVerifyCodes.Select_RegVerifyCode(sqlHelper, username, email, verifyCode));
|
|
||||||
if (sqlHelper.Result == SQLResult.Success)
|
|
||||||
{
|
|
||||||
if (!DateTime.TryParse(sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime].ToString(), out DateTime RegTime))
|
|
||||||
{
|
|
||||||
RegTime = General.DefaultTime;
|
|
||||||
}
|
|
||||||
// 检查验证码是否过期
|
|
||||||
if ((DateTime.Now - RegTime).TotalMinutes >= 10)
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine(clientName + " 验证码已过期");
|
|
||||||
msg = "此验证码已过期,请重新注册。";
|
|
||||||
sqlHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(sqlHelper, username, email));
|
|
||||||
type = RegInvokeType.None;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// 注册
|
|
||||||
if (verifyCode.Equals(sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode]))
|
|
||||||
{
|
|
||||||
sqlHelper.NewTransaction();
|
|
||||||
ServerHelper.WriteLine("[Reg] Username: " + username + " Email: " + email);
|
|
||||||
sqlHelper.Execute(UserQuery.Insert_Register(sqlHelper, username, password, email, clientIP));
|
|
||||||
if (sqlHelper.Result == SQLResult.Success)
|
|
||||||
{
|
|
||||||
success = true;
|
|
||||||
msg = "注册成功!请牢记您的账号与密码!";
|
|
||||||
sqlHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(sqlHelper, username, email));
|
|
||||||
sqlHelper.Commit();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sqlHelper.Rollback();
|
|
||||||
msg = "服务器无法处理您的注册,注册失败!";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else msg = "验证码不正确,请重新输入!";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (sqlHelper.Result == SQLResult.NotFound) msg = "验证码不正确,请重新输入!";
|
|
||||||
else msg = "服务器无法处理您的注册,注册失败!";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (msg, type, success);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Login
|
#region Login
|
||||||
|
|||||||
142
FunGame.Server/Services/DataRequestService.cs
Normal file
142
FunGame.Server/Services/DataRequestService.cs
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
using Milimoe.FunGame.Core.Api.Transmittal;
|
||||||
|
using Milimoe.FunGame.Core.Api.Utility;
|
||||||
|
using Milimoe.FunGame.Core.Library.Constant;
|
||||||
|
using Milimoe.FunGame.Core.Library.SQLScript.Common;
|
||||||
|
using Milimoe.FunGame.Core.Library.SQLScript.Entity;
|
||||||
|
using Milimoe.FunGame.Server.Others;
|
||||||
|
|
||||||
|
namespace Milimoe.FunGame.Server.Services
|
||||||
|
{
|
||||||
|
public class DataRequestService
|
||||||
|
{
|
||||||
|
public static (string Msg, RegInvokeType RegInvokeType, bool Success) Reg(string username, string password, string email, string verifyCode, string clientIP = "", SQLHelper? sqlHelper = null, MailSender? mailSender = null)
|
||||||
|
{
|
||||||
|
string msg = "";
|
||||||
|
RegInvokeType type = RegInvokeType.None;
|
||||||
|
bool success = false;
|
||||||
|
string clientName = ServerHelper.MakeClientName(clientIP);
|
||||||
|
|
||||||
|
sqlHelper ??= Factory.OpenFactory.GetSQLHelper();
|
||||||
|
mailSender ??= Factory.OpenFactory.GetMailSender();
|
||||||
|
if (sqlHelper != null)
|
||||||
|
{
|
||||||
|
// 如果没发验证码,就生成验证码
|
||||||
|
if (verifyCode.Trim() == "")
|
||||||
|
{
|
||||||
|
// 先检查账号是否重复
|
||||||
|
sqlHelper.ExecuteDataSet(UserQuery.Select_IsExistUsername(sqlHelper, username));
|
||||||
|
if (sqlHelper.Result == SQLResult.Success)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine(clientName + " 账号已被注册");
|
||||||
|
msg = "此账号名已被使用!";
|
||||||
|
type = RegInvokeType.DuplicateUserName;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 检查邮箱是否重复
|
||||||
|
sqlHelper.ExecuteDataSet(UserQuery.Select_IsExistEmail(sqlHelper, email));
|
||||||
|
if (sqlHelper.Result == SQLResult.Success)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine(clientName + " 邮箱已被注册");
|
||||||
|
msg = "此邮箱已被注册!";
|
||||||
|
type = RegInvokeType.DuplicateEmail;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 检查验证码是否发送过
|
||||||
|
sqlHelper.ExecuteDataSet(RegVerifyCodes.Select_HasSentRegVerifyCode(sqlHelper, username, email));
|
||||||
|
if (sqlHelper.Result == SQLResult.Success && DateTime.TryParse(sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime].ToString(), out DateTime RegTime) && (DateTime.Now - RegTime).TotalMinutes < 10)
|
||||||
|
{
|
||||||
|
string RegVerifyCode = sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode].ToString() ?? "";
|
||||||
|
ServerHelper.WriteLine(clientName + $" 十分钟内已向{email}发送过验证码:{RegVerifyCode}");
|
||||||
|
type = RegInvokeType.InputVerifyCode;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 发送验证码,需要先删除之前过期的验证码
|
||||||
|
sqlHelper.NewTransaction();
|
||||||
|
sqlHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(sqlHelper, username, email));
|
||||||
|
string regVerify = Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 6);
|
||||||
|
sqlHelper.Execute(RegVerifyCodes.Insert_RegVerifyCode(sqlHelper, username, email, regVerify));
|
||||||
|
if (sqlHelper.Result == SQLResult.Success)
|
||||||
|
{
|
||||||
|
sqlHelper.Commit();
|
||||||
|
if (mailSender != null)
|
||||||
|
{
|
||||||
|
// 发送验证码
|
||||||
|
string ServerName = Config.ServerName;
|
||||||
|
string Subject = $"[{ServerName}] FunGame 注册验证码";
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine(clientName + $" 已向{email}发送验证码:{regVerify}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine(clientName + " 无法发送验证码", InvokeMessageType.Error);
|
||||||
|
ServerHelper.WriteLine(mailSender.ErrorMsg, InvokeMessageType.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else // 不使用MailSender的情况
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine(clientName + $" 验证码为:{regVerify},请服务器管理员告知此用户");
|
||||||
|
}
|
||||||
|
type = RegInvokeType.InputVerifyCode;
|
||||||
|
}
|
||||||
|
else sqlHelper.Rollback();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 先检查验证码
|
||||||
|
sqlHelper.ExecuteDataSet(RegVerifyCodes.Select_RegVerifyCode(sqlHelper, username, email, verifyCode));
|
||||||
|
if (sqlHelper.Result == SQLResult.Success)
|
||||||
|
{
|
||||||
|
if (!DateTime.TryParse(sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime].ToString(), out DateTime RegTime))
|
||||||
|
{
|
||||||
|
RegTime = General.DefaultTime;
|
||||||
|
}
|
||||||
|
// 检查验证码是否过期
|
||||||
|
if ((DateTime.Now - RegTime).TotalMinutes >= 10)
|
||||||
|
{
|
||||||
|
ServerHelper.WriteLine(clientName + " 验证码已过期");
|
||||||
|
msg = "此验证码已过期,请重新注册。";
|
||||||
|
sqlHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(sqlHelper, username, email));
|
||||||
|
type = RegInvokeType.None;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// 注册
|
||||||
|
if (verifyCode.Equals(sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode]))
|
||||||
|
{
|
||||||
|
sqlHelper.NewTransaction();
|
||||||
|
ServerHelper.WriteLine("[Reg] Username: " + username + " Email: " + email);
|
||||||
|
sqlHelper.Execute(UserQuery.Insert_Register(sqlHelper, username, password, email, clientIP));
|
||||||
|
if (sqlHelper.Result == SQLResult.Success)
|
||||||
|
{
|
||||||
|
success = true;
|
||||||
|
msg = "注册成功!请牢记您的账号与密码!";
|
||||||
|
sqlHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(sqlHelper, username, email));
|
||||||
|
sqlHelper.Commit();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sqlHelper.Rollback();
|
||||||
|
msg = "服务器无法处理您的注册,注册失败!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else msg = "验证码不正确,请重新输入!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (sqlHelper.Result == SQLResult.NotFound) msg = "验证码不正确,请重新输入!";
|
||||||
|
else msg = "服务器无法处理您的注册,注册失败!";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (msg, type, success);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
10
FunGame.WebAPI/Architecture/HttpUserContext.cs
Normal file
10
FunGame.WebAPI/Architecture/HttpUserContext.cs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
using System.Security.Claims;
|
||||||
|
using Milimoe.FunGame.WebAPI.Interfaces;
|
||||||
|
|
||||||
|
namespace Milimoe.FunGame.WebAPI.Architecture
|
||||||
|
{
|
||||||
|
public class HttpUserContext(IHttpContextAccessor httpContextAccessor) : IUserContext
|
||||||
|
{
|
||||||
|
public string Username => httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.NameIdentifier) ?? "";
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -3,7 +3,6 @@ using Microsoft.AspNetCore.Authorization;
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Milimoe.FunGame.Core.Library.Common.Network;
|
using Milimoe.FunGame.Core.Library.Common.Network;
|
||||||
using Milimoe.FunGame.Core.Library.Constant;
|
using Milimoe.FunGame.Core.Library.Constant;
|
||||||
using Milimoe.FunGame.WebAPI.Architecture;
|
|
||||||
using Milimoe.FunGame.WebAPI.Models;
|
using Milimoe.FunGame.WebAPI.Models;
|
||||||
|
|
||||||
namespace Milimoe.FunGame.WebAPI.Controllers
|
namespace Milimoe.FunGame.WebAPI.Controllers
|
||||||
@ -11,64 +10,54 @@ namespace Milimoe.FunGame.WebAPI.Controllers
|
|||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("[controller]")]
|
[Route("[controller]")]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
public class AdapterController(ILogger<AdapterController> logger) : ControllerBase
|
public class AdapterController(RESTfulAPIModel model, ILogger<AdapterController> logger) : ControllerBase
|
||||||
{
|
{
|
||||||
public static ConcurrentDictionary<Guid, SocketObject> ResultDatas { get; } = [];
|
public static ConcurrentDictionary<Guid, SocketObject> ResultDatas { get; } = [];
|
||||||
|
|
||||||
private readonly ILogger<AdapterController> _logger = logger;
|
private readonly ILogger<AdapterController> _logger = logger;
|
||||||
|
|
||||||
[HttpPost("{username}")]
|
[HttpPost]
|
||||||
public async Task<IActionResult> Post(string username, [FromBody] SocketObject obj)
|
public async Task<IActionResult> Post([FromBody] SocketObject obj)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
RESTfulAPIListener? apiListener = RESTfulAPIListener.Instance;
|
|
||||||
if (apiListener != null && apiListener.UserList.ContainsKey(username))
|
|
||||||
{
|
|
||||||
RESTfulAPIModel model = (RESTfulAPIModel)apiListener.UserList[username];
|
|
||||||
if (model.RequestID == Guid.Empty)
|
if (model.RequestID == Guid.Empty)
|
||||||
{
|
{
|
||||||
Guid uid = Guid.NewGuid();
|
Guid uid = Guid.NewGuid();
|
||||||
model.RequestID = uid;
|
model.RequestID = uid;
|
||||||
|
|
||||||
int timeoutMilliseconds = 60 * 1000;
|
using CancellationTokenSource cts = model.SetRequestTimeout(uid);
|
||||||
CancellationTokenSource cts = new(timeoutMilliseconds);
|
|
||||||
cts.Token.Register(() =>
|
|
||||||
{
|
|
||||||
if (model.RequestID == uid)
|
|
||||||
{
|
|
||||||
model.RequestID = Guid.Empty;
|
|
||||||
_logger.LogWarning("请求 {uid} 超时,已释放 RequestID。", uid);
|
|
||||||
}
|
|
||||||
cts.Dispose();
|
|
||||||
});
|
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
await model.SocketMessageHandler(model.Socket, obj);
|
await model.SocketMessageHandler(model.Socket, obj);
|
||||||
|
}
|
||||||
cts.Cancel();
|
catch (TimeoutException)
|
||||||
cts.Dispose();
|
|
||||||
model.RequestID = Guid.Empty;
|
|
||||||
|
|
||||||
if (ResultDatas.TryGetValue(uid, out SocketObject response))
|
|
||||||
{
|
{
|
||||||
return Ok(response);
|
_logger.LogWarning("请求超时。");
|
||||||
}
|
return StatusCode(408);
|
||||||
else
|
|
||||||
{
|
|
||||||
return BadRequest("没有任何数据返回。");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return Ok(new SocketObject(SocketMessageType.System, model.Token, "请求未执行完毕,请等待!"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return BadRequest("没有任何数据返回。");
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
_logger.LogError("Error: {e}", e);
|
_logger.LogError("Error: {e}", e);
|
||||||
return StatusCode(500, "服务器内部错误。");
|
return StatusCode(500);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
model.RequestID = Guid.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ResultDatas.TryRemove(uid, out SocketObject response))
|
||||||
|
{
|
||||||
|
return Ok(response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return BadRequest(new SocketObject(SocketMessageType.System, model.Token, "请求未执行完毕,请等待!"));
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
_logger.LogError("Error: {e}", e);
|
||||||
|
return StatusCode(500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,9 +1,6 @@
|
|||||||
using System.Collections.Concurrent;
|
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Milimoe.FunGame.Core.Library.Common.Network;
|
|
||||||
using Milimoe.FunGame.Core.Library.Constant;
|
using Milimoe.FunGame.Core.Library.Constant;
|
||||||
using Milimoe.FunGame.WebAPI.Architecture;
|
|
||||||
using Milimoe.FunGame.WebAPI.Models;
|
using Milimoe.FunGame.WebAPI.Models;
|
||||||
|
|
||||||
namespace Milimoe.FunGame.WebAPI.Controllers
|
namespace Milimoe.FunGame.WebAPI.Controllers
|
||||||
@ -11,37 +8,60 @@ namespace Milimoe.FunGame.WebAPI.Controllers
|
|||||||
[ApiController]
|
[ApiController]
|
||||||
[Route("[controller]")]
|
[Route("[controller]")]
|
||||||
[Authorize]
|
[Authorize]
|
||||||
public class DataRequestController(ILogger<DataRequestController> logger) : ControllerBase
|
public class DataRequestController(RESTfulAPIModel model, ILogger<DataRequestController> logger) : ControllerBase
|
||||||
{
|
{
|
||||||
public static ConcurrentDictionary<Guid, SocketObject> ResultDatas { get; } = [];
|
|
||||||
|
|
||||||
private readonly ILogger<DataRequestController> _logger = logger;
|
private readonly ILogger<DataRequestController> _logger = logger;
|
||||||
|
|
||||||
[HttpPost("{username}")]
|
[HttpPost]
|
||||||
public async Task<IActionResult> Post(string username, [FromBody] PayloadModel<DataRequestType> payload)
|
public async Task<IActionResult> Post([FromBody] PayloadModel<DataRequestType> payload)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
RESTfulAPIListener? apiListener = RESTfulAPIListener.Instance;
|
PayloadModel<DataRequestType> response = new()
|
||||||
if (apiListener != null && apiListener.UserList.ContainsKey(username))
|
|
||||||
{
|
{
|
||||||
RESTfulAPIModel model = (RESTfulAPIModel)apiListener.UserList[username];
|
RequestType = payload.RequestType
|
||||||
|
};
|
||||||
if (model.RequestID == Guid.Empty)
|
if (model.RequestID == Guid.Empty)
|
||||||
{
|
{
|
||||||
await Task.CompletedTask;
|
Guid uid = Guid.NewGuid();
|
||||||
return Ok(payload);
|
model.RequestID = uid;
|
||||||
}
|
|
||||||
else
|
using CancellationTokenSource cts = model.SetRequestTimeout(uid);
|
||||||
|
Dictionary<string, object> result = [];
|
||||||
|
try
|
||||||
{
|
{
|
||||||
return Ok(new SocketObject(SocketMessageType.System, model.Token, "请求未执行完毕,请等待!"));
|
result = await model.DataRequestController.GetResultData(payload.RequestType, payload.Data);
|
||||||
}
|
}
|
||||||
}
|
catch (TimeoutException)
|
||||||
return BadRequest("没有任何数据返回。");
|
{
|
||||||
|
_logger.LogWarning("请求超时。");
|
||||||
|
return StatusCode(408);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
_logger.LogError("Error: {e}", e);
|
_logger.LogError("Error: {e}", e);
|
||||||
return StatusCode(500, "服务器内部错误。");
|
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 (Exception e)
|
||||||
|
{
|
||||||
|
_logger.LogError("Error: {e}", e);
|
||||||
|
return StatusCode(500);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
77
FunGame.WebAPI/Controllers/GamingRequestController.cs
Normal file
77
FunGame.WebAPI/Controllers/GamingRequestController.cs
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
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()
|
||||||
|
{
|
||||||
|
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 (Exception e)
|
||||||
|
{
|
||||||
|
_logger.LogError("Error: {e}", e);
|
||||||
|
return StatusCode(500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -3,7 +3,6 @@ using Microsoft.AspNetCore.Mvc;
|
|||||||
using Milimoe.FunGame.Core.Api.Utility;
|
using Milimoe.FunGame.Core.Api.Utility;
|
||||||
using Milimoe.FunGame.Core.Library.Constant;
|
using Milimoe.FunGame.Core.Library.Constant;
|
||||||
using Milimoe.FunGame.Core.Library.SQLScript.Entity;
|
using Milimoe.FunGame.Core.Library.SQLScript.Entity;
|
||||||
using Milimoe.FunGame.Server.Controller;
|
|
||||||
using Milimoe.FunGame.Server.Others;
|
using Milimoe.FunGame.Server.Others;
|
||||||
using Milimoe.FunGame.Server.Services;
|
using Milimoe.FunGame.Server.Services;
|
||||||
using Milimoe.FunGame.WebAPI.Architecture;
|
using Milimoe.FunGame.WebAPI.Architecture;
|
||||||
@ -31,7 +30,7 @@ namespace Milimoe.FunGame.WebAPI.Controllers
|
|||||||
string email = dto.Email;
|
string email = dto.Email;
|
||||||
string verifycode = dto.VerifyCode;
|
string verifycode = dto.VerifyCode;
|
||||||
|
|
||||||
(string msg, RegInvokeType type, bool success) = DataRequestController<RESTfulAPI>.Reg(username, password, email, verifycode, clientIP);
|
(string msg, RegInvokeType type, bool success) = DataRequestService.Reg(username, password, email, verifycode, clientIP);
|
||||||
|
|
||||||
return Ok(new PayloadModel<DataRequestType>()
|
return Ok(new PayloadModel<DataRequestType>()
|
||||||
{
|
{
|
||||||
|
|||||||
7
FunGame.WebAPI/Interfaces/IUserContext.cs
Normal file
7
FunGame.WebAPI/Interfaces/IUserContext.cs
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
namespace Milimoe.FunGame.WebAPI.Interfaces
|
||||||
|
{
|
||||||
|
public interface IUserContext
|
||||||
|
{
|
||||||
|
public string Username { get; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -10,7 +10,7 @@
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 状态码
|
/// 状态码
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int StatusCode { get; set; } = 0;
|
public int StatusCode { get; set; } = 200;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 处理结果
|
/// 处理结果
|
||||||
|
|||||||
@ -83,5 +83,20 @@ namespace Milimoe.FunGame.WebAPI.Models
|
|||||||
|
|
||||||
return await Send(type, msg);
|
return await Send(type, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public CancellationTokenSource SetRequestTimeout(Guid uid, int timeout = 60000)
|
||||||
|
{
|
||||||
|
CancellationTokenSource cts = new(timeout);
|
||||||
|
cts.Token.Register(() =>
|
||||||
|
{
|
||||||
|
if (RequestID == uid)
|
||||||
|
{
|
||||||
|
RequestID = Guid.Empty;
|
||||||
|
ServerHelper.WriteLine($"请求 {uid} 超时,已释放 RequestID。", InvokeMessageType.DataRequest);
|
||||||
|
}
|
||||||
|
cts.Dispose();
|
||||||
|
});
|
||||||
|
return cts;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,6 +10,7 @@ using Microsoft.AspNetCore.Diagnostics;
|
|||||||
using Microsoft.AspNetCore.Mvc.ApplicationParts;
|
using Microsoft.AspNetCore.Mvc.ApplicationParts;
|
||||||
using Microsoft.Extensions.Logging.Console;
|
using Microsoft.Extensions.Logging.Console;
|
||||||
using Microsoft.IdentityModel.Tokens;
|
using Microsoft.IdentityModel.Tokens;
|
||||||
|
using Milimoe.FunGame;
|
||||||
using Milimoe.FunGame.Core.Api.Utility;
|
using Milimoe.FunGame.Core.Api.Utility;
|
||||||
using Milimoe.FunGame.Core.Library.Common.Addon;
|
using Milimoe.FunGame.Core.Library.Common.Addon;
|
||||||
using Milimoe.FunGame.Core.Library.Common.Network;
|
using Milimoe.FunGame.Core.Library.Common.Network;
|
||||||
@ -19,6 +20,8 @@ using Milimoe.FunGame.Server.Model;
|
|||||||
using Milimoe.FunGame.Server.Others;
|
using Milimoe.FunGame.Server.Others;
|
||||||
using Milimoe.FunGame.Server.Services;
|
using Milimoe.FunGame.Server.Services;
|
||||||
using Milimoe.FunGame.WebAPI.Architecture;
|
using Milimoe.FunGame.WebAPI.Architecture;
|
||||||
|
using Milimoe.FunGame.WebAPI.Interfaces;
|
||||||
|
using Milimoe.FunGame.WebAPI.Models;
|
||||||
using Milimoe.FunGame.WebAPI.Services;
|
using Milimoe.FunGame.WebAPI.Services;
|
||||||
using Scalar.AspNetCore;
|
using Scalar.AspNetCore;
|
||||||
|
|
||||||
@ -151,6 +154,26 @@ try
|
|||||||
options.FormatterName = "CustomFormatter";
|
options.FormatterName = "CustomFormatter";
|
||||||
});
|
});
|
||||||
builder.Services.AddSingleton<ConsoleFormatter, CustomConsoleFormatter>();
|
builder.Services.AddSingleton<ConsoleFormatter, CustomConsoleFormatter>();
|
||||||
|
// 其他依赖注入
|
||||||
|
builder.Services.AddHttpContextAccessor();
|
||||||
|
builder.Services.AddScoped<IUserContext, HttpUserContext>();
|
||||||
|
builder.Services.AddSingleton(listener);
|
||||||
|
builder.Services.AddSingleton(apiListener);
|
||||||
|
builder.Services.AddScoped(provider =>
|
||||||
|
{
|
||||||
|
// 从上下文中获取用户名
|
||||||
|
IUserContext userContext = provider.GetRequiredService<IUserContext>();
|
||||||
|
string username = userContext.Username;
|
||||||
|
|
||||||
|
if (apiListener.UserList.ContainsKey(username))
|
||||||
|
{
|
||||||
|
RESTfulAPIModel apiModel = (RESTfulAPIModel)apiListener.UserList[username];
|
||||||
|
return apiModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new NoUserLogonException();
|
||||||
|
});
|
||||||
|
|
||||||
builder.Services.AddHttpClient();
|
builder.Services.AddHttpClient();
|
||||||
|
|
||||||
WebApplication app = builder.Build();
|
WebApplication app = builder.Build();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user