WebAPI项目结构调整

This commit is contained in:
milimoe 2025-03-11 01:38:20 +08:00
parent 29d661f8a0
commit 16ebe39d35
Signed by: milimoe
GPG Key ID: 05D280912DA6C69E
22 changed files with 437 additions and 261 deletions

View File

@ -3,7 +3,7 @@ using Milimoe.FunGame.Core.Interface.Base;
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.Server.Others; using Milimoe.FunGame.Server.Others;
using Milimoe.FunGame.Server.Utility; using Milimoe.FunGame.Server.Services;
namespace Milimoe.FunGame.Server.Controller namespace Milimoe.FunGame.Server.Controller
{ {

View File

@ -8,7 +8,7 @@ using Milimoe.FunGame.Core.Library.SQLScript.Common;
using Milimoe.FunGame.Core.Library.SQLScript.Entity; using Milimoe.FunGame.Core.Library.SQLScript.Entity;
using Milimoe.FunGame.Server.Model; using Milimoe.FunGame.Server.Model;
using Milimoe.FunGame.Server.Others; using Milimoe.FunGame.Server.Others;
using Milimoe.FunGame.Server.Utility; using Milimoe.FunGame.Server.Services;
namespace Milimoe.FunGame.Server.Controller namespace Milimoe.FunGame.Server.Controller
{ {
@ -415,7 +415,7 @@ namespace Milimoe.FunGame.Server.Controller
{ {
if (isMaster) if (isMaster)
{ {
string[] usernames = Config.RoomList.GetNotReadyUserList(roomid).Select(user => user.Username).ToArray(); string[] usernames = [.. Config.RoomList.GetNotReadyUserList(roomid).Select(user => user.Username)];
if (usernames.Length > 0) if (usernames.Length > 0)
{ {
if (_isReadyCheckCD[0] == false) if (_isReadyCheckCD[0] == false)
@ -443,7 +443,7 @@ namespace Milimoe.FunGame.Server.Controller
} }
else else
{ {
usernames = users.Select(user => user.Username).ToArray(); usernames = [.. users.Select(user => user.Username)];
Server.SendSystemMessage(ShowMessageType.None, "所有玩家均已准备游戏将在10秒后开始。", "", 0, usernames); Server.SendSystemMessage(ShowMessageType.None, "所有玩家均已准备游戏将在10秒后开始。", "", 0, usernames);
StartGame(roomid, users, usernames); StartGame(roomid, users, usernames);
result = true; result = true;
@ -526,74 +526,89 @@ 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);
}
resultData.Add("msg", msg);
resultData.Add("type", returnType);
resultData.Add("success", success);
}
if (SQLHelper != null) 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() == "") if (verifyCode.Trim() == "")
{ {
// 先检查账号是否重复 // 先检查账号是否重复
SQLHelper.ExecuteDataSet(UserQuery.Select_IsExistUsername(SQLHelper, username)); sqlHelper.ExecuteDataSet(UserQuery.Select_IsExistUsername(sqlHelper, username));
if (SQLHelper.Result == SQLResult.Success) if (sqlHelper.Result == SQLResult.Success)
{ {
ServerHelper.WriteLine(Server.GetClientName() + " 账号已被注册"); ServerHelper.WriteLine(clientName + " 账号已被注册");
msg = "此账号名已被使用!"; msg = "此账号名已被使用!";
returnType = RegInvokeType.DuplicateUserName; type = RegInvokeType.DuplicateUserName;
} }
else else
{ {
// 检查邮箱是否重复 // 检查邮箱是否重复
SQLHelper.ExecuteDataSet(UserQuery.Select_IsExistEmail(SQLHelper, email)); sqlHelper.ExecuteDataSet(UserQuery.Select_IsExistEmail(sqlHelper, email));
if (SQLHelper.Result == SQLResult.Success) if (sqlHelper.Result == SQLResult.Success)
{ {
ServerHelper.WriteLine(Server.GetClientName() + " 邮箱已被注册"); ServerHelper.WriteLine(clientName + " 邮箱已被注册");
msg = "此邮箱已被注册!"; msg = "此邮箱已被注册!";
returnType = RegInvokeType.DuplicateEmail; type = RegInvokeType.DuplicateEmail;
} }
else else
{ {
// 检查验证码是否发送过 // 检查验证码是否发送过
SQLHelper.ExecuteDataSet(RegVerifyCodes.Select_HasSentRegVerifyCode(SQLHelper, username, email)); 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) 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() ?? ""; string RegVerifyCode = sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode].ToString() ?? "";
ServerHelper.WriteLine(Server.GetClientName() + $" 十分钟内已向{email}发送过验证码:{RegVerifyCode}"); ServerHelper.WriteLine(clientName + $" 十分钟内已向{email}发送过验证码:{RegVerifyCode}");
returnType = RegInvokeType.InputVerifyCode; type = RegInvokeType.InputVerifyCode;
} }
else else
{ {
// 发送验证码,需要先删除之前过期的验证码 // 发送验证码,需要先删除之前过期的验证码
SQLHelper.NewTransaction(); sqlHelper.NewTransaction();
SQLHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(SQLHelper, username, email)); sqlHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(sqlHelper, username, email));
string regVerify = Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 6); string regVerify = Verification.CreateVerifyCode(VerifyCodeType.NumberVerifyCode, 6);
SQLHelper.Execute(RegVerifyCodes.Insert_RegVerifyCode(SQLHelper, username, email, regVerify)); sqlHelper.Execute(RegVerifyCodes.Insert_RegVerifyCode(sqlHelper, username, email, regVerify));
if (SQLHelper.Result == SQLResult.Success) if (sqlHelper.Result == SQLResult.Success)
{ {
SQLHelper.Commit(); sqlHelper.Commit();
if (MailSender != null) if (mailSender != null)
{ {
// 发送验证码 // 发送验证码
string ServerName = Config.ServerName; string ServerName = Config.ServerName;
string Subject = $"[{ServerName}] FunGame 注册验证码"; string Subject = $"[{ServerName}] FunGame 注册验证码";
string Body = $"亲爱的 {username} <br/> 感谢您注册[{ServerName}],您的验证码是 {regVerify} 10分钟内有效请及时输入<br/><br/>{ServerName}<br/>{DateTimeUtility.GetDateTimeToString(TimeType.LongDateOnly)}"; string Body = $"亲爱的 {username} <br/> 感谢您注册[{ServerName}],您的验证码是 {regVerify} 10分钟内有效请及时输入<br/><br/>{ServerName}<br/>{DateTimeUtility.GetDateTimeToString(TimeType.LongDateOnly)}";
string[] To = [email]; string[] To = [email];
if (MailSender.Send(MailSender.CreateMail(Subject, Body, System.Net.Mail.MailPriority.Normal, true, To)) == MailSendResult.Success) if (mailSender.Send(mailSender.CreateMail(Subject, Body, System.Net.Mail.MailPriority.Normal, true, To)) == MailSendResult.Success)
{ {
ServerHelper.WriteLine(Server.GetClientName() + $" 已向{email}发送验证码:{regVerify}"); ServerHelper.WriteLine(clientName + $" 已向{email}发送验证码:{regVerify}");
} }
else else
{ {
ServerHelper.WriteLine(Server.GetClientName() + " 无法发送验证码", InvokeMessageType.Error); ServerHelper.WriteLine(clientName + " 无法发送验证码", InvokeMessageType.Error);
ServerHelper.WriteLine(MailSender.ErrorMsg, InvokeMessageType.Error); ServerHelper.WriteLine(mailSender.ErrorMsg, InvokeMessageType.Error);
} }
} }
else // 不使用MailSender的情况 else // 不使用MailSender的情况
{ {
ServerHelper.WriteLine(Server.GetClientName() + $" 验证码为:{regVerify},请服务器管理员告知此用户"); ServerHelper.WriteLine(clientName + $" 验证码为:{regVerify},请服务器管理员告知此用户");
} }
returnType = RegInvokeType.InputVerifyCode; type = RegInvokeType.InputVerifyCode;
} }
else SQLHelper.Rollback(); else sqlHelper.Rollback();
} }
} }
} }
@ -601,53 +616,51 @@ namespace Milimoe.FunGame.Server.Controller
else else
{ {
// 先检查验证码 // 先检查验证码
SQLHelper.ExecuteDataSet(RegVerifyCodes.Select_RegVerifyCode(SQLHelper, username, email, verifycode)); sqlHelper.ExecuteDataSet(RegVerifyCodes.Select_RegVerifyCode(sqlHelper, username, email, verifyCode));
if (SQLHelper.Result == SQLResult.Success) if (sqlHelper.Result == SQLResult.Success)
{ {
if (!DateTime.TryParse(SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime].ToString(), out DateTime RegTime)) if (!DateTime.TryParse(sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegTime].ToString(), out DateTime RegTime))
{ {
RegTime = General.DefaultTime; RegTime = General.DefaultTime;
} }
// 检查验证码是否过期 // 检查验证码是否过期
if ((DateTime.Now - RegTime).TotalMinutes >= 10) if ((DateTime.Now - RegTime).TotalMinutes >= 10)
{ {
ServerHelper.WriteLine(Server.GetClientName() + " 验证码已过期"); ServerHelper.WriteLine(clientName + " 验证码已过期");
msg = "此验证码已过期,请重新注册。"; msg = "此验证码已过期,请重新注册。";
SQLHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(SQLHelper, username, email)); sqlHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(sqlHelper, username, email));
returnType = RegInvokeType.None; type = RegInvokeType.None;
} }
else else
{ {
// 注册 // 注册
if (verifycode.Equals(SQLHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode])) if (verifyCode.Equals(sqlHelper.DataSet.Tables[0].Rows[0][RegVerifyCodes.Column_RegVerifyCode]))
{ {
SQLHelper.NewTransaction(); sqlHelper.NewTransaction();
ServerHelper.WriteLine("[Reg] Username: " + username + " Email: " + email); ServerHelper.WriteLine("[Reg] Username: " + username + " Email: " + email);
SQLHelper.Execute(UserQuery.Insert_Register(SQLHelper, username, password, email, Server.Socket?.ClientIP ?? "")); sqlHelper.Execute(UserQuery.Insert_Register(sqlHelper, username, password, email, clientIP));
if (SQLHelper.Result == SQLResult.Success) if (sqlHelper.Result == SQLResult.Success)
{ {
success = true; success = true;
msg = "注册成功!请牢记您的账号与密码!"; msg = "注册成功!请牢记您的账号与密码!";
SQLHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(SQLHelper, username, email)); sqlHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(sqlHelper, username, email));
SQLHelper.Commit(); sqlHelper.Commit();
} }
else else
{ {
SQLHelper.Rollback(); sqlHelper.Rollback();
msg = "服务器无法处理您的注册,注册失败!"; msg = "服务器无法处理您的注册,注册失败!";
} }
} }
else msg = "验证码不正确,请重新输入!"; else msg = "验证码不正确,请重新输入!";
} }
} }
else if (SQLHelper.Result == SQLResult.NotFound) msg = "验证码不正确,请重新输入!"; else if (sqlHelper.Result == SQLResult.NotFound) msg = "验证码不正确,请重新输入!";
else msg = "服务器无法处理您的注册,注册失败!"; else msg = "服务器无法处理您的注册,注册失败!";
} }
} }
}
resultData.Add("msg", msg); return (msg, type, success);
resultData.Add("type", returnType);
resultData.Add("success", success);
} }
#endregion #endregion

View File

@ -5,7 +5,7 @@ using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Server.Controller; using Milimoe.FunGame.Server.Controller;
using Milimoe.FunGame.Server.Model; using Milimoe.FunGame.Server.Model;
using Milimoe.FunGame.Server.Others; using Milimoe.FunGame.Server.Others;
using Milimoe.FunGame.Server.Utility; using Milimoe.FunGame.Server.Services;
Console.Title = Config.ServerName; Console.Title = Config.ServerName;
Console.WriteLine(FunGameInfo.GetInfo(Config.FunGameType)); Console.WriteLine(FunGameInfo.GetInfo(Config.FunGameType));

View File

@ -1,6 +1,7 @@
using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Server.Services;
namespace Milimoe.FunGame.Server.Utility namespace Milimoe.FunGame.Server.Models
{ {
public class ConnectProperties public class ConnectProperties
{ {

View File

@ -1,7 +1,7 @@
using Milimoe.FunGame.Core.Interface.Base; using Milimoe.FunGame.Core.Interface.Base;
using Milimoe.FunGame.Core.Library.Common.Addon; using Milimoe.FunGame.Core.Library.Common.Addon;
using Milimoe.FunGame.Server.Others; using Milimoe.FunGame.Server.Others;
using Milimoe.FunGame.Server.Utility; using Milimoe.FunGame.Server.Services;
namespace Milimoe.FunGame.Server.Model namespace Milimoe.FunGame.Server.Model
{ {

View File

@ -10,7 +10,7 @@ using Milimoe.FunGame.Core.Library.SQLScript.Common;
using Milimoe.FunGame.Core.Library.SQLScript.Entity; using Milimoe.FunGame.Core.Library.SQLScript.Entity;
using Milimoe.FunGame.Server.Controller; using Milimoe.FunGame.Server.Controller;
using Milimoe.FunGame.Server.Others; using Milimoe.FunGame.Server.Others;
using Milimoe.FunGame.Server.Utility; using Milimoe.FunGame.Server.Services;
namespace Milimoe.FunGame.Server.Model namespace Milimoe.FunGame.Server.Model
{ {

View File

@ -4,10 +4,10 @@ using Milimoe.FunGame.Core.Library.Common.Addon;
using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Library.SQLScript.Common; using Milimoe.FunGame.Core.Library.SQLScript.Common;
using Milimoe.FunGame.Core.Library.SQLScript.Entity; using Milimoe.FunGame.Core.Library.SQLScript.Entity;
using Milimoe.FunGame.Server.Utility; using Milimoe.FunGame.Server.DataUtility;
using Milimoe.FunGame.Server.Utility.DataUtility; using Milimoe.FunGame.Server.Others;
namespace Milimoe.FunGame.Server.Others namespace Milimoe.FunGame.Server.Services
{ {
public class FunGameSystem public class FunGameSystem
{ {
@ -30,7 +30,7 @@ namespace Milimoe.FunGame.Server.Others
string useSQLite = INIHelper.ReadINI("SQLite", "UseSQLite").Trim(); string useSQLite = INIHelper.ReadINI("SQLite", "UseSQLite").Trim();
// 根据配置文件选择适当的 SQLHelper 实例 // 根据配置文件选择适当的 SQLHelper 实例
SQLHelper? sqlHelper = useMySQL == "true" ? new MySQLHelper() : (useSQLite == "true" ? new SQLiteHelper() : null); SQLHelper? sqlHelper = useMySQL == "true" ? new MySQLHelper() : useSQLite == "true" ? new SQLiteHelper() : null;
if (sqlHelper != null) if (sqlHelper != null)
{ {
Config.SQLMode = sqlHelper.Mode; Config.SQLMode = sqlHelper.Mode;

View File

@ -5,7 +5,7 @@ using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Server.Others; using Milimoe.FunGame.Server.Others;
namespace Milimoe.FunGame.Server.Utility namespace Milimoe.FunGame.Server.Services
{ {
public class ServerHelper public class ServerHelper
{ {

View File

@ -2,9 +2,11 @@ using System.Data;
using Milimoe.FunGame.Core.Api.Transmittal; using Milimoe.FunGame.Core.Api.Transmittal;
using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Model; using Milimoe.FunGame.Core.Model;
using Milimoe.FunGame.Server.Models;
using Milimoe.FunGame.Server.Services;
using MySql.Data.MySqlClient; using MySql.Data.MySqlClient;
namespace Milimoe.FunGame.Server.Utility.DataUtility namespace Milimoe.FunGame.Server.DataUtility
{ {
public class MySQLHelper : SQLHelper public class MySQLHelper : SQLHelper
{ {

View File

@ -3,8 +3,10 @@ using Microsoft.Data.Sqlite;
using Milimoe.FunGame.Core.Api.Transmittal; using Milimoe.FunGame.Core.Api.Transmittal;
using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Model; using Milimoe.FunGame.Core.Model;
using Milimoe.FunGame.Server.Models;
using Milimoe.FunGame.Server.Services;
namespace Milimoe.FunGame.Server.Utility.DataUtility namespace Milimoe.FunGame.Server.DataUtility
{ {
public class SQLiteHelper : SQLHelper public class SQLiteHelper : SQLHelper
{ {

View File

@ -1,6 +1,6 @@
using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Api.Utility;
namespace Milimoe.FunGame.Server.Utility namespace Milimoe.FunGame.Server.Services
{ {
public class TFA : TwoFactorAuthenticator public class TFA : TwoFactorAuthenticator
{ {

View File

@ -31,7 +31,7 @@ namespace Milimoe.FunGame.WebAPI.Architecture
public async Task<SocketObject[]> ReceiveAsync() public async Task<SocketObject[]> ReceiveAsync()
{ {
await Task.Delay(100); await Task.CompletedTask;
return []; return [];
} }
@ -42,7 +42,7 @@ namespace Milimoe.FunGame.WebAPI.Architecture
public async Task<SocketResult> SendAsync(SocketMessageType type, params object[] objs) public async Task<SocketResult> SendAsync(SocketMessageType type, params object[] objs)
{ {
await Task.Delay(100); await Task.CompletedTask;
return SocketResult.Success; return SocketResult.Success;
} }
} }

View File

@ -0,0 +1,75 @@
using System.Collections.Concurrent;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Milimoe.FunGame.Core.Library.Common.Network;
using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.WebAPI.Architecture;
using Milimoe.FunGame.WebAPI.Models;
namespace Milimoe.FunGame.WebAPI.Controllers
{
[ApiController]
[Route("[controller]")]
[Authorize]
public class AdapterController(ILogger<AdapterController> logger) : ControllerBase
{
public static ConcurrentDictionary<Guid, SocketObject> ResultDatas { get; } = [];
private readonly ILogger<AdapterController> _logger = logger;
[HttpPost("{username}")]
public async Task<IActionResult> Post(string username, [FromBody] SocketObject obj)
{
try
{
RESTfulAPIListener? apiListener = RESTfulAPIListener.Instance;
if (apiListener != null && apiListener.UserList.ContainsKey(username))
{
RESTfulAPIModel model = (RESTfulAPIModel)apiListener.UserList[username];
if (model.RequestID == Guid.Empty)
{
Guid uid = Guid.NewGuid();
model.RequestID = uid;
int timeoutMilliseconds = 60 * 1000;
CancellationTokenSource cts = new(timeoutMilliseconds);
cts.Token.Register(() =>
{
if (model.RequestID == uid)
{
model.RequestID = Guid.Empty;
_logger.LogWarning("请求 {uid} 超时,已释放 RequestID。", uid);
}
cts.Dispose();
});
await model.SocketMessageHandler(model.Socket, obj);
cts.Cancel();
cts.Dispose();
model.RequestID = Guid.Empty;
if (ResultDatas.TryGetValue(uid, out SocketObject response))
{
return Ok(response);
}
else
{
return BadRequest("没有任何数据返回。");
}
}
else
{
return Ok(new SocketObject(SocketMessageType.System, model.Token, "请求未执行完毕,请等待!"));
}
}
return BadRequest("没有任何数据返回。");
}
catch (Exception e)
{
_logger.LogError("Error: {e}", e);
return StatusCode(500, "服务器内部错误。");
}
}
}
}

View File

@ -0,0 +1,48 @@
using System.Collections.Concurrent;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Milimoe.FunGame.Core.Library.Common.Network;
using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.WebAPI.Architecture;
using Milimoe.FunGame.WebAPI.Models;
namespace Milimoe.FunGame.WebAPI.Controllers
{
[ApiController]
[Route("[controller]")]
[Authorize]
public class DataRequestController(ILogger<DataRequestController> logger) : ControllerBase
{
public static ConcurrentDictionary<Guid, SocketObject> ResultDatas { get; } = [];
private readonly ILogger<DataRequestController> _logger = logger;
[HttpPost("{username}")]
public async Task<IActionResult> Post(string username, [FromBody] PayloadModel<DataRequestType> payload)
{
try
{
RESTfulAPIListener? apiListener = RESTfulAPIListener.Instance;
if (apiListener != null && apiListener.UserList.ContainsKey(username))
{
RESTfulAPIModel model = (RESTfulAPIModel)apiListener.UserList[username];
if (model.RequestID == Guid.Empty)
{
await Task.CompletedTask;
return Ok(payload);
}
else
{
return Ok(new SocketObject(SocketMessageType.System, model.Token, "请求未执行完毕,请等待!"));
}
}
return BadRequest("没有任何数据返回。");
}
catch (Exception e)
{
_logger.LogError("Error: {e}", e);
return StatusCode(500, "服务器内部错误。");
}
}
}
}

View File

@ -1,57 +0,0 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Milimoe.FunGame.Core.Library.Common.Network;
using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.WebAPI.Architecture;
using Milimoe.FunGame.WebAPI.Models;
namespace Milimoe.FunGame.WebAPI.Controllers
{
[ApiController]
[Route("[controller]")]
[Authorize]
public class PostDataController(ILogger<PostDataController> logger) : ControllerBase
{
public static Dictionary<Guid, SocketObject> ResultDatas { get; } = [];
private readonly ILogger<PostDataController> _logger = logger;
[HttpPost("{username}", Name = "username")]
public async Task<IActionResult> Post(string username, [FromBody] SocketObject obj)
{
try
{
RESTfulAPIListener? apiListener = RESTfulAPIListener.Instance;
if (apiListener != null && apiListener.UserList.ContainsKey(username))
{
RESTfulAPIModel model = (RESTfulAPIModel)apiListener.UserList[username];
if (model.LastRequestID == Guid.Empty)
{
Guid uid = Guid.NewGuid();
model.LastRequestID = uid;
await model.SocketMessageHandler(model.Socket, obj);
model.LastRequestID = Guid.Empty;
if (ResultDatas.TryGetValue(uid, out SocketObject list))
{
return Ok(list);
}
else
{
return BadRequest("没有任何数据返回");
}
}
else
{
Ok(new SocketObject(SocketMessageType.System, model.Token, "请求未执行完毕,请等待!"));
}
}
return BadRequest("没有任何数据返回");
}
catch (Exception e)
{
_logger.LogError(e, "服务器内部错误");
return StatusCode(500, "服务器内部错误");
}
}
}
}

View File

@ -1,9 +1,11 @@
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc; 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.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.Utility; using Milimoe.FunGame.Server.Services;
using Milimoe.FunGame.WebAPI.Architecture; using Milimoe.FunGame.WebAPI.Architecture;
using Milimoe.FunGame.WebAPI.Models; using Milimoe.FunGame.WebAPI.Models;
using Milimoe.FunGame.WebAPI.Services; using Milimoe.FunGame.WebAPI.Services;
@ -12,30 +14,68 @@ namespace Milimoe.FunGame.WebAPI.Controllers
{ {
[ApiController] [ApiController]
[Route("[controller]")] [Route("[controller]")]
public class UserController(JWTService jwtTokenService) : ControllerBase public class UserController(JWTService jwtTokenService, ILogger<AdapterController> logger) : ControllerBase
{ {
private readonly ILogger<AdapterController> _logger = logger;
[HttpPost("reg")]
public IActionResult Reg([FromBody] RegDTO dto)
{
try
{
string clientIP = HttpContext.Connection.RemoteIpAddress?.ToString() + ":" + HttpContext.Connection.RemotePort;
ServerHelper.WriteLine(ServerHelper.MakeClientName(clientIP) + " 通过 RESTful API 注册账号 . . .", InvokeMessageType.Core);
string username = dto.Username;
string password = dto.Password;
string email = dto.Email;
string verifycode = dto.VerifyCode;
(string msg, RegInvokeType type, bool success) = DataRequestController<RESTfulAPI>.Reg(username, password, email, verifycode, clientIP);
return Ok(new PayloadModel<DataRequestType>()
{
RequestType = DataRequestType.Reg_Reg,
StatusCode = 200,
Message = msg,
Data = new()
{
{ "success", success },
{ "type", type }
}
});
}
catch (Exception e)
{
_logger.LogError("Error: {e}", e);
}
return BadRequest("服务器暂时无法处理注册请求。");
}
[HttpPost("login")] [HttpPost("login")]
public async Task<IActionResult> Login([FromBody] LoginModel loginModel) public async Task<IActionResult> Login([FromBody] LoginDTO dto)
{
try
{ {
string msg = "用户名或密码不正确。"; string msg = "用户名或密码不正确。";
string clientip = HttpContext.Connection.RemoteIpAddress?.ToString() + ":" + HttpContext.Connection.RemotePort; string clientIP = HttpContext.Connection.RemoteIpAddress?.ToString() + ":" + HttpContext.Connection.RemotePort;
ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 通过 RESTful API 连接至服务器,正在登录 . . .", Core.Library.Constant.InvokeMessageType.Core); ServerHelper.WriteLine(ServerHelper.MakeClientName(clientIP) + " 通过 RESTful API 连接至服务器,正在登录 . . .", InvokeMessageType.Core);
string username = loginModel.Username; string username = dto.Username;
string password = loginModel.Password; string password = dto.Password;
RESTfulAPIListener? apiListener = RESTfulAPIListener.Instance; RESTfulAPIListener? apiListener = RESTfulAPIListener.Instance;
if (apiListener != null) if (apiListener != null)
{ {
// 移除旧模型 // 移除旧模型
if (apiListener.UserList.ContainsKey(username)) if (apiListener.UserList.ContainsKey(username))
{ {
await apiListener.UserList[username].Send(Core.Library.Constant.SocketMessageType.Disconnect); await apiListener.UserList[username].Send(SocketMessageType.Disconnect);
} }
// 创建新模型 // 创建新模型
if (!apiListener.UserList.ContainsKey(username)) if (!apiListener.UserList.ContainsKey(username))
{ {
Config.ConnectingPlayerCount++; Config.ConnectingPlayerCount++;
RESTfulAPIModel model = new(apiListener, clientip); RESTfulAPIModel model = new(apiListener, clientIP);
model.SetClientName(clientip); model.SetClientName(clientIP);
// 创建User对象 // 创建User对象
if (model.SQLHelper != null) if (model.SQLHelper != null)
{ {
@ -55,20 +95,34 @@ namespace Milimoe.FunGame.WebAPI.Controllers
} }
} }
else msg = "服务器暂时无法处理登录请求。"; else msg = "服务器暂时无法处理登录请求。";
await model.Send(Core.Library.Constant.SocketMessageType.Disconnect); await model.Send(SocketMessageType.Disconnect);
} }
} }
Config.ConnectingPlayerCount--; Config.ConnectingPlayerCount--;
ServerHelper.WriteLine(msg, Core.Library.Constant.InvokeMessageType.Core); ServerHelper.WriteLine(msg, InvokeMessageType.Core);
return Unauthorized(msg); return Unauthorized(msg);
} }
catch (Exception e)
{
_logger.LogError("Error: {e}", e);
}
return BadRequest("服务器暂时无法处理登录请求。");
}
[HttpPost("refresh")] [HttpPost("refresh")]
[Authorize] [Authorize]
public IActionResult Refresh([FromBody] LoginModel request) public IActionResult Refresh([FromBody] LoginDTO dto)
{ {
return Ok(jwtTokenService.GenerateToken(request.Username)); try
{
return Ok(jwtTokenService.GenerateToken(dto.Username));
}
catch (Exception e)
{
_logger.LogError("Error: {e}", e);
}
return BadRequest();
} }
} }
} }

View File

@ -24,10 +24,10 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.0" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.2" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.1" /> <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.2" />
<PackageReference Include="Scalar.AspNetCore" Version="2.0.1" /> <PackageReference Include="Scalar.AspNetCore" Version="2.0.26" />
<PackageReference Include="System.Text.Json" Version="9.0.0" /> <PackageReference Include="System.Text.Json" Version="9.0.2" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -0,0 +1,16 @@
namespace Milimoe.FunGame.WebAPI.Models
{
public class LoginDTO
{
public string Username { get; set; } = "";
public string Password { get; set; } = "";
}
public class RegDTO
{
public string Username { get; set; } = "";
public string Password { get; set; } = "";
public string Email { get; set; } = "";
public string VerifyCode { get; set; } = "";
}
}

View File

@ -1,8 +0,0 @@
namespace Milimoe.FunGame.WebAPI.Models
{
public class LoginModel(string username, string password)
{
public string Username { get; set; } = username;
public string Password { get; set; } = password;
}
}

View File

@ -0,0 +1,30 @@
namespace Milimoe.FunGame.WebAPI.Models
{
public class PayloadModel<T> where T : struct, Enum
{
/// <summary>
/// 请求类型
/// </summary>
public T RequestType { get; set; } = default;
/// <summary>
/// 状态码
/// </summary>
public int StatusCode { get; set; } = 0;
/// <summary>
/// 处理结果
/// </summary>
public string Message { get; set; } = "";
/// <summary>
/// 响应时间
/// </summary>
public DateTime Timestamp { get; set; } = DateTime.Now;
/// <summary>
/// 业务数据
/// </summary>
public Dictionary<string, object> Data { get; set; } = [];
}
}

View File

@ -2,7 +2,7 @@
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.Server.Model; using Milimoe.FunGame.Server.Model;
using Milimoe.FunGame.Server.Utility; using Milimoe.FunGame.Server.Services;
using Milimoe.FunGame.WebAPI.Architecture; using Milimoe.FunGame.WebAPI.Architecture;
using Milimoe.FunGame.WebAPI.Controllers; using Milimoe.FunGame.WebAPI.Controllers;
@ -10,7 +10,7 @@ namespace Milimoe.FunGame.WebAPI.Models
{ {
public class RESTfulAPIModel(ISocketListener<RESTfulAPI> server, string clientip) : ServerModel<RESTfulAPI>(server, new RESTfulAPI(Guid.NewGuid(), clientip, clientip), false) public class RESTfulAPIModel(ISocketListener<RESTfulAPI> server, string clientip) : ServerModel<RESTfulAPI>(server, new RESTfulAPI(Guid.NewGuid(), clientip, clientip), false)
{ {
public Guid LastRequestID { get; set; } = Guid.Empty; public Guid RequestID { get; set; } = Guid.Empty;
public List<SocketObject> ToBeSent { get; set; } = []; public List<SocketObject> ToBeSent { get; set; } = [];
public override async Task<bool> Send(SocketMessageType type, params object[] objs) public override async Task<bool> Send(SocketMessageType type, params object[] objs)
@ -24,9 +24,9 @@ namespace Milimoe.FunGame.WebAPI.Models
if (type != SocketMessageType.HeartBeat) if (type != SocketMessageType.HeartBeat)
{ {
SocketObject obj = new(type, Token, objs); SocketObject obj = new(type, Token, objs);
if (LastRequestID != Guid.Empty) if (RequestID != Guid.Empty)
{ {
return PostDataController.ResultDatas.TryAdd(LastRequestID, obj); return AdapterController.ResultDatas.TryAdd(RequestID, obj);
} }
else else
{ {

View File

@ -17,7 +17,7 @@ using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Server.Controller; using Milimoe.FunGame.Server.Controller;
using Milimoe.FunGame.Server.Model; using Milimoe.FunGame.Server.Model;
using Milimoe.FunGame.Server.Others; using Milimoe.FunGame.Server.Others;
using Milimoe.FunGame.Server.Utility; using Milimoe.FunGame.Server.Services;
using Milimoe.FunGame.WebAPI.Architecture; using Milimoe.FunGame.WebAPI.Architecture;
using Milimoe.FunGame.WebAPI.Services; using Milimoe.FunGame.WebAPI.Services;
using Scalar.AspNetCore; using Scalar.AspNetCore;