using System.Data; 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 SocketObject Work; private static bool Working = false; private static bool Success = false; public LoginModel() : base(RunTime.Socket) { } public override void SocketHandler(SocketObject SocketObject) { try { Work = SocketObject; Success = true; 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); if (Socket.Send(SocketMessageType.Login, username, password, autokey) == SocketResult.Success) { SetWorking(); await Task.Factory.StartNew(async() => { while (true) { if (!Working) break; } if (Success) { await CheckLoginAsync(Work); } }); } } } catch (Exception e) { RunTime.WritelnSystemInfo(e.GetErrorInfo()); } return false; } public static bool CheckLogin(params object[]? objs) { try { Socket? Socket = RunTime.Socket; if (Socket != null && objs != null) { Guid key = Guid.Empty; if (objs.Length > 0) key = (Guid)objs[0]; if (Socket.Send(SocketMessageType.CheckLogin, key) == SocketResult.Success) { return true; } } } catch (Exception e) { RunTime.WritelnSystemInfo(e.GetErrorInfo()); } return false; } private static async Task CheckLoginAsync(SocketObject SocketObject) { Guid key = Guid.Empty; string? msg = ""; // 返回一个Key,再发回去给服务器就行了 if (SocketObject.Length > 0) key = SocketObject.GetParam(0); if (SocketObject.Length > 1) msg = SocketObject.GetParam(1); // 如果返回了msg,说明验证错误。 if (msg != null && msg.Trim() != "") { ShowMessage.ErrorMessage(msg, "登录失败"); return false; } else { if (key != Guid.Empty) { Config.Guid_LoginKey = key; Socket Socket = RunTime.Socket!; if (Socket.Send(SocketMessageType.CheckLogin, key) == SocketResult.Success) { SetWorking(); await Task.Factory.StartNew(() => { while (true) { if (!Working) break; } if (Success) { SocketHandler_CheckLogin(Work); } }); return true; } } else { ShowMessage.ErrorMessage("登录失败!!", "登录失败", 5); return false; } } return true; } private static bool SocketHandler_CheckLogin(SocketObject SocketObject) { // 返回构造User对象的DataTable object[] objs = SocketObject.Parameters; if (objs != null && objs.Length > 0) { DataSet? DataSet = SocketObject.GetParam(0); // 创建User对象并返回到Main RunTime.Main?.UpdateUI(MainInvokeType.SetUser, new object[] { Factory.GetInstance(DataSet) }); return true; } ShowMessage.ErrorMessage("登录失败!!", "登录失败", 5); return false; } private static void SetWorking() { Working = true; Success = false; Work = default; } } }