diff --git a/FunGame.Server/Controllers/ConnectController.cs b/FunGame.Server/Controllers/ConnectController.cs index 949a870..195f4f2 100644 --- a/FunGame.Server/Controllers/ConnectController.cs +++ b/FunGame.Server/Controllers/ConnectController.cs @@ -3,7 +3,7 @@ using Milimoe.FunGame.Core.Interface.Base; using Milimoe.FunGame.Core.Library.Common.Network; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Server.Others; -using Milimoe.FunGame.Server.Utility; +using Milimoe.FunGame.Server.Services; namespace Milimoe.FunGame.Server.Controller { diff --git a/FunGame.Server/Controllers/DataRequestController.cs b/FunGame.Server/Controllers/DataRequestController.cs index bf09d88..78a96c4 100644 --- a/FunGame.Server/Controllers/DataRequestController.cs +++ b/FunGame.Server/Controllers/DataRequestController.cs @@ -8,7 +8,7 @@ using Milimoe.FunGame.Core.Library.SQLScript.Common; using Milimoe.FunGame.Core.Library.SQLScript.Entity; using Milimoe.FunGame.Server.Model; using Milimoe.FunGame.Server.Others; -using Milimoe.FunGame.Server.Utility; +using Milimoe.FunGame.Server.Services; namespace Milimoe.FunGame.Server.Controller { @@ -415,7 +415,7 @@ namespace Milimoe.FunGame.Server.Controller { 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 (_isReadyCheckCD[0] == false) @@ -443,7 +443,7 @@ namespace Milimoe.FunGame.Server.Controller } else { - usernames = users.Select(user => user.Username).ToArray(); + usernames = [.. users.Select(user => user.Username)]; Server.SendSystemMessage(ShowMessageType.None, "所有玩家均已准备,游戏将在10秒后开始。", "", 0, usernames); StartGame(roomid, users, usernames); result = true; @@ -526,130 +526,143 @@ namespace Milimoe.FunGame.Server.Controller string password = DataRequest.GetDictionaryJsonObject(requestData, "password") ?? ""; string email = DataRequest.GetDictionaryJsonObject(requestData, "email") ?? ""; string verifycode = DataRequest.GetDictionaryJsonObject(requestData, "verifycode") ?? ""; - - if (SQLHelper != null) - { - // 如果没发验证码,就生成验证码 - if (verifycode.Trim() == "") - { - // 先检查账号是否重复 - SQLHelper.ExecuteDataSet(UserQuery.Select_IsExistUsername(SQLHelper, username)); - if (SQLHelper.Result == SQLResult.Success) - { - ServerHelper.WriteLine(Server.GetClientName() + " 账号已被注册"); - msg = "此账号名已被使用!"; - returnType = RegInvokeType.DuplicateUserName; - } - else - { - // 检查邮箱是否重复 - SQLHelper.ExecuteDataSet(UserQuery.Select_IsExistEmail(SQLHelper, email)); - if (SQLHelper.Result == SQLResult.Success) - { - ServerHelper.WriteLine(Server.GetClientName() + " 邮箱已被注册"); - msg = "此邮箱已被注册!"; - returnType = 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(Server.GetClientName() + $" 十分钟内已向{email}发送过验证码:{RegVerifyCode}"); - returnType = 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},
感谢您注册[{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) - { - ServerHelper.WriteLine(Server.GetClientName() + $" 已向{email}发送验证码:{regVerify}"); - } - else - { - ServerHelper.WriteLine(Server.GetClientName() + " 无法发送验证码", InvokeMessageType.Error); - ServerHelper.WriteLine(MailSender.ErrorMsg, InvokeMessageType.Error); - } - } - else // 不使用MailSender的情况 - { - ServerHelper.WriteLine(Server.GetClientName() + $" 验证码为:{regVerify},请服务器管理员告知此用户"); - } - returnType = 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(Server.GetClientName() + " 验证码已过期"); - msg = "此验证码已过期,请重新注册。"; - SQLHelper.Execute(RegVerifyCodes.Delete_RegVerifyCode(SQLHelper, username, email)); - returnType = 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, Server.Socket?.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 = "服务器无法处理您的注册,注册失败!"; - } - } + (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); } + 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},
感谢您注册[{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) + { + 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 #region Login diff --git a/FunGame.Server/Main.cs b/FunGame.Server/Main.cs index 60b47cb..996c473 100644 --- a/FunGame.Server/Main.cs +++ b/FunGame.Server/Main.cs @@ -5,7 +5,7 @@ using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Server.Controller; using Milimoe.FunGame.Server.Model; using Milimoe.FunGame.Server.Others; -using Milimoe.FunGame.Server.Utility; +using Milimoe.FunGame.Server.Services; Console.Title = Config.ServerName; Console.WriteLine(FunGameInfo.GetInfo(Config.FunGameType)); diff --git a/FunGame.Server/Utilities/ConnectProperties.cs b/FunGame.Server/Models/ConnectProperties.cs similarity index 96% rename from FunGame.Server/Utilities/ConnectProperties.cs rename to FunGame.Server/Models/ConnectProperties.cs index 840d274..b4df997 100644 --- a/FunGame.Server/Utilities/ConnectProperties.cs +++ b/FunGame.Server/Models/ConnectProperties.cs @@ -1,6 +1,7 @@ using Milimoe.FunGame.Core.Api.Utility; +using Milimoe.FunGame.Server.Services; -namespace Milimoe.FunGame.Server.Utility +namespace Milimoe.FunGame.Server.Models { public class ConnectProperties { diff --git a/FunGame.Server/Models/ConsoleModel.cs b/FunGame.Server/Models/ConsoleModel.cs index 16e7e02..7385874 100644 --- a/FunGame.Server/Models/ConsoleModel.cs +++ b/FunGame.Server/Models/ConsoleModel.cs @@ -1,7 +1,7 @@ using Milimoe.FunGame.Core.Interface.Base; using Milimoe.FunGame.Core.Library.Common.Addon; using Milimoe.FunGame.Server.Others; -using Milimoe.FunGame.Server.Utility; +using Milimoe.FunGame.Server.Services; namespace Milimoe.FunGame.Server.Model { diff --git a/FunGame.Server/Models/ServerModel.cs b/FunGame.Server/Models/ServerModel.cs index b900bd3..a370363 100644 --- a/FunGame.Server/Models/ServerModel.cs +++ b/FunGame.Server/Models/ServerModel.cs @@ -10,7 +10,7 @@ using Milimoe.FunGame.Core.Library.SQLScript.Common; using Milimoe.FunGame.Core.Library.SQLScript.Entity; using Milimoe.FunGame.Server.Controller; using Milimoe.FunGame.Server.Others; -using Milimoe.FunGame.Server.Utility; +using Milimoe.FunGame.Server.Services; namespace Milimoe.FunGame.Server.Model { diff --git a/FunGame.Server/Others/FunGameSystem.cs b/FunGame.Server/Services/FunGameSystem.cs similarity index 97% rename from FunGame.Server/Others/FunGameSystem.cs rename to FunGame.Server/Services/FunGameSystem.cs index dcfc93d..2fa68f8 100644 --- a/FunGame.Server/Others/FunGameSystem.cs +++ b/FunGame.Server/Services/FunGameSystem.cs @@ -4,10 +4,10 @@ using Milimoe.FunGame.Core.Library.Common.Addon; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.SQLScript.Common; using Milimoe.FunGame.Core.Library.SQLScript.Entity; -using Milimoe.FunGame.Server.Utility; -using Milimoe.FunGame.Server.Utility.DataUtility; +using Milimoe.FunGame.Server.DataUtility; +using Milimoe.FunGame.Server.Others; -namespace Milimoe.FunGame.Server.Others +namespace Milimoe.FunGame.Server.Services { public class FunGameSystem { @@ -30,7 +30,7 @@ namespace Milimoe.FunGame.Server.Others string useSQLite = INIHelper.ReadINI("SQLite", "UseSQLite").Trim(); // 根据配置文件选择适当的 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) { Config.SQLMode = sqlHelper.Mode; diff --git a/FunGame.Server/Utilities/General.cs b/FunGame.Server/Services/General.cs similarity index 99% rename from FunGame.Server/Utilities/General.cs rename to FunGame.Server/Services/General.cs index 0449540..81f7a55 100644 --- a/FunGame.Server/Utilities/General.cs +++ b/FunGame.Server/Services/General.cs @@ -5,7 +5,7 @@ using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Server.Others; -namespace Milimoe.FunGame.Server.Utility +namespace Milimoe.FunGame.Server.Services { public class ServerHelper { diff --git a/FunGame.Server/Utilities/MySQL/MySQLHelper.cs b/FunGame.Server/Services/MySQL/MySQLHelper.cs similarity index 98% rename from FunGame.Server/Utilities/MySQL/MySQLHelper.cs rename to FunGame.Server/Services/MySQL/MySQLHelper.cs index 74c79a6..fec89eb 100644 --- a/FunGame.Server/Utilities/MySQL/MySQLHelper.cs +++ b/FunGame.Server/Services/MySQL/MySQLHelper.cs @@ -2,9 +2,11 @@ using System.Data; using Milimoe.FunGame.Core.Api.Transmittal; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Model; +using Milimoe.FunGame.Server.Models; +using Milimoe.FunGame.Server.Services; using MySql.Data.MySqlClient; -namespace Milimoe.FunGame.Server.Utility.DataUtility +namespace Milimoe.FunGame.Server.DataUtility { public class MySQLHelper : SQLHelper { diff --git a/FunGame.Server/Utilities/SQLite/SQLiteHelper.cs b/FunGame.Server/Services/SQLite/SQLiteHelper.cs similarity index 98% rename from FunGame.Server/Utilities/SQLite/SQLiteHelper.cs rename to FunGame.Server/Services/SQLite/SQLiteHelper.cs index 62382b1..4f60718 100644 --- a/FunGame.Server/Utilities/SQLite/SQLiteHelper.cs +++ b/FunGame.Server/Services/SQLite/SQLiteHelper.cs @@ -3,8 +3,10 @@ using Microsoft.Data.Sqlite; using Milimoe.FunGame.Core.Api.Transmittal; using Milimoe.FunGame.Core.Library.Constant; 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 { diff --git a/FunGame.Server/Utilities/TFA.cs b/FunGame.Server/Services/TFA.cs similarity index 83% rename from FunGame.Server/Utilities/TFA.cs rename to FunGame.Server/Services/TFA.cs index dae71f3..85cf614 100644 --- a/FunGame.Server/Utilities/TFA.cs +++ b/FunGame.Server/Services/TFA.cs @@ -1,6 +1,6 @@ using Milimoe.FunGame.Core.Api.Utility; -namespace Milimoe.FunGame.Server.Utility +namespace Milimoe.FunGame.Server.Services { public class TFA : TwoFactorAuthenticator { diff --git a/FunGame.WebAPI/Architecture/RESTfulAPI.cs b/FunGame.WebAPI/Architecture/RESTfulAPI.cs index 1a919e5..352a1b1 100644 --- a/FunGame.WebAPI/Architecture/RESTfulAPI.cs +++ b/FunGame.WebAPI/Architecture/RESTfulAPI.cs @@ -31,7 +31,7 @@ namespace Milimoe.FunGame.WebAPI.Architecture public async Task ReceiveAsync() { - await Task.Delay(100); + await Task.CompletedTask; return []; } @@ -42,7 +42,7 @@ namespace Milimoe.FunGame.WebAPI.Architecture public async Task SendAsync(SocketMessageType type, params object[] objs) { - await Task.Delay(100); + await Task.CompletedTask; return SocketResult.Success; } } diff --git a/FunGame.WebAPI/Controllers/AdapterController.cs b/FunGame.WebAPI/Controllers/AdapterController.cs new file mode 100644 index 0000000..eaf118a --- /dev/null +++ b/FunGame.WebAPI/Controllers/AdapterController.cs @@ -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 logger) : ControllerBase + { + public static ConcurrentDictionary ResultDatas { get; } = []; + + private readonly ILogger _logger = logger; + + [HttpPost("{username}")] + public async Task 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, "ڲ"); + } + } + } +} diff --git a/FunGame.WebAPI/Controllers/DataRequestController.cs b/FunGame.WebAPI/Controllers/DataRequestController.cs new file mode 100644 index 0000000..6e8fb6b --- /dev/null +++ b/FunGame.WebAPI/Controllers/DataRequestController.cs @@ -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 logger) : ControllerBase + { + public static ConcurrentDictionary ResultDatas { get; } = []; + + private readonly ILogger _logger = logger; + + [HttpPost("{username}")] + public async Task Post(string username, [FromBody] PayloadModel 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, "ڲ"); + } + } + } +} diff --git a/FunGame.WebAPI/Controllers/PostDataController.cs b/FunGame.WebAPI/Controllers/PostDataController.cs deleted file mode 100644 index 0ce61a4..0000000 --- a/FunGame.WebAPI/Controllers/PostDataController.cs +++ /dev/null @@ -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 logger) : ControllerBase - { - public static Dictionary ResultDatas { get; } = []; - - private readonly ILogger _logger = logger; - - [HttpPost("{username}", Name = "username")] - public async Task 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, "ڲ"); - } - } - } -} diff --git a/FunGame.WebAPI/Controllers/UserController.cs b/FunGame.WebAPI/Controllers/UserController.cs index a8dffaf..51602c7 100644 --- a/FunGame.WebAPI/Controllers/UserController.cs +++ b/FunGame.WebAPI/Controllers/UserController.cs @@ -1,9 +1,11 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Milimoe.FunGame.Core.Api.Utility; +using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.SQLScript.Entity; +using Milimoe.FunGame.Server.Controller; using Milimoe.FunGame.Server.Others; -using Milimoe.FunGame.Server.Utility; +using Milimoe.FunGame.Server.Services; using Milimoe.FunGame.WebAPI.Architecture; using Milimoe.FunGame.WebAPI.Models; using Milimoe.FunGame.WebAPI.Services; @@ -12,63 +14,115 @@ namespace Milimoe.FunGame.WebAPI.Controllers { [ApiController] [Route("[controller]")] - public class UserController(JWTService jwtTokenService) : ControllerBase + public class UserController(JWTService jwtTokenService, ILogger logger) : ControllerBase { - [HttpPost("login")] - public async Task Login([FromBody] LoginModel loginModel) - { - string msg = "用户名或密码不正确。"; - string clientip = HttpContext.Connection.RemoteIpAddress?.ToString() + ":" + HttpContext.Connection.RemotePort; - ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 通过 RESTful API 连接至服务器,正在登录 . . .", Core.Library.Constant.InvokeMessageType.Core); - string username = loginModel.Username; - string password = loginModel.Password; - RESTfulAPIListener? apiListener = RESTfulAPIListener.Instance; - if (apiListener != null) - { - // 移除旧模型 - if (apiListener.UserList.ContainsKey(username)) - { - await apiListener.UserList[username].Send(Core.Library.Constant.SocketMessageType.Disconnect); - } - // 创建新模型 - if (!apiListener.UserList.ContainsKey(username)) - { - Config.ConnectingPlayerCount++; - RESTfulAPIModel model = new(apiListener, clientip); - model.SetClientName(clientip); - // 创建User对象 - if (model.SQLHelper != null) - { - model.SQLHelper.ExecuteDataSet(UserQuery.Select_Users_LoginQuery(model.SQLHelper, username, password)); - Core.Entity.User user = Factory.GetUser(model.SQLHelper?.DataSet ?? new()); - if (user.Id != 0) - { - model.User = user; - // 检查有没有重复登录的情况 - await model.ForceLogOutDuplicateLogonUser(); - // 添加至玩家列表 - model.AddUser(); - model.GetUsersCount(); - string token = jwtTokenService.GenerateToken(username); - Config.ConnectingPlayerCount--; - return Ok(new { BearerToken = token, OpenToken = model.Token }); - } - } - else msg = "服务器暂时无法处理登录请求。"; - await model.Send(Core.Library.Constant.SocketMessageType.Disconnect); - } - } + private readonly ILogger _logger = logger; - Config.ConnectingPlayerCount--; - ServerHelper.WriteLine(msg, Core.Library.Constant.InvokeMessageType.Core); - return Unauthorized(msg); + [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.Reg(username, password, email, verifycode, clientIP); + + return Ok(new PayloadModel() + { + 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")] + public async Task Login([FromBody] LoginDTO dto) + { + try + { + string msg = "用户名或密码不正确。"; + 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; + RESTfulAPIListener? apiListener = RESTfulAPIListener.Instance; + if (apiListener != null) + { + // 移除旧模型 + if (apiListener.UserList.ContainsKey(username)) + { + await apiListener.UserList[username].Send(SocketMessageType.Disconnect); + } + // 创建新模型 + if (!apiListener.UserList.ContainsKey(username)) + { + Config.ConnectingPlayerCount++; + RESTfulAPIModel model = new(apiListener, clientIP); + model.SetClientName(clientIP); + // 创建User对象 + if (model.SQLHelper != null) + { + model.SQLHelper.ExecuteDataSet(UserQuery.Select_Users_LoginQuery(model.SQLHelper, username, password)); + Core.Entity.User user = Factory.GetUser(model.SQLHelper?.DataSet ?? new()); + if (user.Id != 0) + { + model.User = user; + // 检查有没有重复登录的情况 + await model.ForceLogOutDuplicateLogonUser(); + // 添加至玩家列表 + model.AddUser(); + model.GetUsersCount(); + string token = jwtTokenService.GenerateToken(username); + Config.ConnectingPlayerCount--; + return Ok(new { BearerToken = token, OpenToken = model.Token }); + } + } + else msg = "服务器暂时无法处理登录请求。"; + await model.Send(SocketMessageType.Disconnect); + } + } + + Config.ConnectingPlayerCount--; + ServerHelper.WriteLine(msg, InvokeMessageType.Core); + return Unauthorized(msg); + } + catch (Exception e) + { + _logger.LogError("Error: {e}", e); + } + return BadRequest("服务器暂时无法处理登录请求。"); } [HttpPost("refresh")] [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(); } } } diff --git a/FunGame.WebAPI/FunGame.WebAPI.csproj b/FunGame.WebAPI/FunGame.WebAPI.csproj index f3088b1..e86a67e 100644 --- a/FunGame.WebAPI/FunGame.WebAPI.csproj +++ b/FunGame.WebAPI/FunGame.WebAPI.csproj @@ -24,10 +24,10 @@ - - - - + + + + diff --git a/FunGame.WebAPI/Models/DTOs.cs b/FunGame.WebAPI/Models/DTOs.cs new file mode 100644 index 0000000..40573ca --- /dev/null +++ b/FunGame.WebAPI/Models/DTOs.cs @@ -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; } = ""; + } +} diff --git a/FunGame.WebAPI/Models/LoginModel.cs b/FunGame.WebAPI/Models/LoginModel.cs deleted file mode 100644 index 0c7db3f..0000000 --- a/FunGame.WebAPI/Models/LoginModel.cs +++ /dev/null @@ -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; - } -} diff --git a/FunGame.WebAPI/Models/PayloadModel.cs b/FunGame.WebAPI/Models/PayloadModel.cs new file mode 100644 index 0000000..eddc113 --- /dev/null +++ b/FunGame.WebAPI/Models/PayloadModel.cs @@ -0,0 +1,30 @@ +namespace Milimoe.FunGame.WebAPI.Models +{ + public class PayloadModel where T : struct, Enum + { + /// + /// 请求类型 + /// + public T RequestType { get; set; } = default; + + /// + /// 状态码 + /// + public int StatusCode { get; set; } = 0; + + /// + /// 处理结果 + /// + public string Message { get; set; } = ""; + + /// + /// 响应时间 + /// + public DateTime Timestamp { get; set; } = DateTime.Now; + + /// + /// 业务数据 + /// + public Dictionary Data { get; set; } = []; + } +} diff --git a/FunGame.WebAPI/Models/RESTfulAPIModel.cs b/FunGame.WebAPI/Models/RESTfulAPIModel.cs index 851e77b..a9b5cd0 100644 --- a/FunGame.WebAPI/Models/RESTfulAPIModel.cs +++ b/FunGame.WebAPI/Models/RESTfulAPIModel.cs @@ -2,7 +2,7 @@ using Milimoe.FunGame.Core.Library.Common.Network; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Server.Model; -using Milimoe.FunGame.Server.Utility; +using Milimoe.FunGame.Server.Services; using Milimoe.FunGame.WebAPI.Architecture; using Milimoe.FunGame.WebAPI.Controllers; @@ -10,7 +10,7 @@ namespace Milimoe.FunGame.WebAPI.Models { public class RESTfulAPIModel(ISocketListener server, string clientip) : ServerModel(server, new RESTfulAPI(Guid.NewGuid(), clientip, clientip), false) { - public Guid LastRequestID { get; set; } = Guid.Empty; + public Guid RequestID { get; set; } = Guid.Empty; public List ToBeSent { get; set; } = []; public override async Task Send(SocketMessageType type, params object[] objs) @@ -24,9 +24,9 @@ namespace Milimoe.FunGame.WebAPI.Models if (type != SocketMessageType.HeartBeat) { 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 { diff --git a/FunGame.WebAPI/Program.cs b/FunGame.WebAPI/Program.cs index 4c5334d..e213db1 100644 --- a/FunGame.WebAPI/Program.cs +++ b/FunGame.WebAPI/Program.cs @@ -17,7 +17,7 @@ using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Server.Controller; using Milimoe.FunGame.Server.Model; using Milimoe.FunGame.Server.Others; -using Milimoe.FunGame.Server.Utility; +using Milimoe.FunGame.Server.Services; using Milimoe.FunGame.WebAPI.Architecture; using Milimoe.FunGame.WebAPI.Services; using Scalar.AspNetCore;