using System.Data; using System.Windows.Forms; 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.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.Login || SocketObject.SocketType == SocketMessageType.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.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.CheckLogin, CheckLoginKey) == SocketResult.Success) { DataSet ds = await Task.Factory.StartNew(GetLoginUserAsync); if (ds != null) { // 创建User对象并返回到Main RunTime.Main?.UpdateUI(MainInvokeType.SetUser, new object[] { Factory.GetInstance(ds) }); 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) { Config.Guid_LoginKey = key; } } catch (Exception e) { RunTime.WritelnSystemInfo(e.GetErrorInfo()); } msg ??= ""; return (key, msg); } private static DataSet GetLoginUserAsync() { DataSet? ds = new(); try { WaitForWorkDone(); // 返回构造User对象的DataSet if (Work.Length > 0) ds = Work.GetParam(0); } catch (Exception e) { RunTime.WritelnSystemInfo(e.GetErrorInfo()); } ds ??= new(); return ds; } private static new void SetWorking() { Working = true; Work = default; } private static new void WaitForWorkDone() { while (true) { if (!Working) break; } } } }