using Milimoe.FunGame.Core.Api.Transmittal;
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Common.Architecture;
using Milimoe.FunGame.Core.Library.Common.Network;
using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Library.Exception;
using Milimoe.FunGame.Core.Library.SQLScript.Common;
using Milimoe.FunGame.Core.Library.SQLScript.Entity;
using Milimoe.FunGame.Desktop.Library;
using Milimoe.FunGame.Desktop.Library.Component;
namespace Milimoe.FunGame.Desktop.Model
{
///
/// 请不要越过Controller直接调用Model中的方法。
///
public class LoginModel : BaseModel
{
private static new SocketObject Work;
private static new bool Working = false;
public LoginModel() : base(RunTime.Socket)
{
}
public override void SocketHandler(SocketObject SocketObject)
{
try
{
if (SocketObject.SocketType == SocketMessageType.RunTime_Login || SocketObject.SocketType == SocketMessageType.RunTime_CheckLogin)
{
Work = SocketObject;
Working = false;
}
}
catch (Exception e)
{
RunTime.WritelnSystemInfo(e.GetErrorInfo());
}
}
public static async Task LoginAccountAsync(params object[]? objs)
{
try
{
Socket? Socket = RunTime.Socket;
if (Socket != null && objs != null)
{
string username = "";
string password = "";
string autokey = "";
if (objs.Length > 0) username = (string)objs[0];
if (objs.Length > 1) password = (string)objs[1];
if (objs.Length > 2) autokey = (string)objs[2];
password = password.Encrypt(username);
SetWorking();
if (Socket.Send(SocketMessageType.RunTime_Login, username, password, autokey) == SocketResult.Success)
{
string ErrorMsg = "";
Guid CheckLoginKey = Guid.Empty;
(CheckLoginKey, ErrorMsg) = await Task.Factory.StartNew(GetCheckLoginKeyAsync);
if (ErrorMsg != null && ErrorMsg.Trim() != "")
{
ShowMessage.ErrorMessage(ErrorMsg, "登录失败");
return false;
}
SetWorking();
if (Socket.Send(SocketMessageType.RunTime_CheckLogin, CheckLoginKey) == SocketResult.Success)
{
User user = await Task.Factory.StartNew(GetLoginUserAsync);
// 创建User对象并返回到Main
RunTime.Main?.UpdateUI(MainInvokeType.SetUser, user);
return true;
}
}
}
}
catch (Exception e)
{
RunTime.WritelnSystemInfo(e.GetErrorInfo());
}
return false;
}
public static (Guid, string) GetCheckLoginKeyAsync()
{
Guid key = Guid.Empty;
string? msg = "";
try
{
WaitForWorkDone();
// 返回一个确认登录的Key
if (Work.Length > 0) key = Work.GetParam(0);
if (Work.Length > 1) msg = Work.GetParam(1);
if (key != Guid.Empty)
{
RunTime.Session.LoginKey = key;
}
}
catch (Exception e)
{
RunTime.WritelnSystemInfo(e.GetErrorInfo());
}
msg ??= "";
return (key, msg);
}
public static string ForgetPassword_CheckVerifyCode(string username, string email, string verifycode)
{
string msg = "无法找回您的密码,请稍后再试。";
try
{
DataRequest request = RunTime.NewDataRequest(DataRequestType.Login_GetFindPasswordVerifyCode);
request.AddRequestData(ForgetVerifyCodes.Column_Username, username);
request.AddRequestData(ForgetVerifyCodes.Column_Email, email);
if (verifycode.Trim() == "")
{
// 未发送verifycode,说明需要系统生成一个验证码
request.AddRequestData(ForgetVerifyCodes.Column_ForgetVerifyCode, "");
request.SendRequest();
if (request.Result == RequestResult.Success)
{
msg = request.GetResult("msg") ?? msg;
}
else RunTime.WritelnSystemInfo(request.Error);
}
else
{
// 发送verifycode,需要验证
request.AddRequestData(ForgetVerifyCodes.Column_ForgetVerifyCode, verifycode);
request.SendRequest();
if (request.Result == RequestResult.Success)
{
msg = request.GetResult("msg") ?? msg;
}
else RunTime.WritelnSystemInfo(request.Error);
}
}
catch (Exception e)
{
RunTime.WritelnSystemInfo(e.GetErrorInfo());
}
return msg;
}
public static string ForgetPassword_UpdatePassword(string username, string password)
{
string msg = "无法更新您的密码,请稍后再试。";
try
{
DataRequest request = RunTime.NewDataRequest(DataRequestType.Login_UpdatePassword);
request.AddRequestData(UserQuery.Column_Username, username);
request.AddRequestData(UserQuery.Column_Password, password.Encrypt(username));
request.SendRequest();
if (request.Result == RequestResult.Success)
{
msg = request.GetResult("msg") ?? msg;
}
else RunTime.WritelnSystemInfo(request.Error);
}
catch (Exception e)
{
RunTime.WritelnSystemInfo(e.GetErrorInfo());
}
return msg;
}
private static User GetLoginUserAsync()
{
User user = General.UnknownUserInstance;
try
{
WaitForWorkDone();
// 返回构造User对象的DataSet
if (Work.Length > 0) user = Work.GetParam(0) ?? General.UnknownUserInstance;
}
catch (Exception e)
{
RunTime.WritelnSystemInfo(e.GetErrorInfo());
}
return user;
}
private static new void SetWorking()
{
Working = true;
Work = default;
}
private static new void WaitForWorkDone()
{
while (true)
{
if (!Working) break;
}
}
}
}