//using Newtonsoft.Json; //using OtpNet; //using ServerCore; using ServerBase; //using StackExchange.Redis; //namespace ServerCommon //{ // public class LoginInfo // { // public string Name = string.Empty; // public string Guid = string.Empty; // public string Email = string.Empty; // public DateTime LoginTime; // public LanguageType Language = LanguageType.None; // public int State = 0; // public string CurrentServer = String.Empty; // public string PartyGuid = string.Empty; // public string InstanceRoomId = string.Empty; // public class MoveInfo // { // public string OneTimeKey = string.Empty; // public string DestServer = string.Empty; // } // public MoveInfo? Moving; // public bool ReadFrom(AccountAttr? attr, string curServer) // { // if (attr == null) // { // Log.getLogger().error("attr is null"); // return false; // } // Name = attr?.Id ?? string.Empty; // Guid = attr?.Aid ?? string.Empty; // Email = attr?.Email ?? string.Empty; // Language = attr?.Language ?? LanguageType.None; // LoginTime = attr?.LoginDate ?? DateTime.UtcNow; // CurrentServer = curServer; // return true; // } // } // /// // /// 유저 로그인 정보 // /// // public class LoginStorage : IInitializer // { // readonly int KEEP_LOGIN_TIME_OUT = (60 * 1000); // //readonly int KEEP_WAIT_QUEUE_TIME = (30 * 1000); // //ConnectionMultiplexer _connection = default!; // IDatabase _database = default!; // string _keyPrefix = string.Empty; // public LoginStorage(IDatabase redisDb, string keyPrefix) // { // Init(redisDb, keyPrefix); // } // public async Task onInit() // { // await Task.CompletedTask; // var result = new Result(); // return result; // } // public LoginStorage() // { // } // public void Init(IDatabase redisDB, string keyPrefix) // { // //var connection = await ConnectionMultiplexer.ConnectAsync(configuration); // //_database = _connection.GetDatabase(); // _database = redisDB; // _keyPrefix = keyPrefix; // if (!_keyPrefix.EndsWith(":")) // _keyPrefix += ":"; // _keyPrefix += "login:"; // } // string KeyWithPrefix(string key) => _keyPrefix + key; // /* // * 로그인 서버 로그인 // */ // public async Task<(ServerErrorCode, string)> Login(LoginInfo? login) // { // if (login == null) // { // Log.getLogger().error("login is null "); // return (ServerErrorCode.DbError, string.Empty); // } // string key = KeyWithPrefix(login.Name); // Log.getLogger().debug($"login Id:{login.Name} guid:{login.Guid} email:{login.Email} server:{login.CurrentServer} key:{key} loginTime:{login.LoginTime.ToString("s")}"); // var value = await _database.StringGetAsync(key, CommandFlags.PreferReplica); // if (value.HasValue) // { // login = JsonConvert.DeserializeObject(value.ToString()); // if (login == null) // { // // TODO: 로그 출력 수정 필요. // Log.getLogger().error($"login is null !!!, login Id:{login?.Name} guid:{login?.Guid} email:{login?.Email} server:{login?.CurrentServer} key:{key} loginTime:{login?.LoginTime.ToString("s")}"); // return (ServerErrorCode.DbError, string.Empty); // } // if (login.Moving != null) // { // Log.getLogger().error($"Moving Error Id:{login.Name} guid:{login.Guid} email:{login.Email} server:{login.CurrentServer} loginTime:{login.LoginTime.ToString("s")} value:{value}"); // return (ServerErrorCode.Moving, login.Moving.DestServer); // } // Log.getLogger().error($" DupLogin Id:{login.Name} guid:{login.Guid} email:{login.Email} server:{login.CurrentServer} loginTime:{login.LoginTime.ToString("s")} value:{value}"); // return (ServerErrorCode.DupLogin, login.CurrentServer); // } // login.LoginTime = DateTimeHelper.Current; // if (await _database.StringSetAsync(key, JsonConvert.SerializeObject(login), TimeSpan.FromMilliseconds(KEEP_LOGIN_TIME_OUT)) == false) // { // Log.getLogger().error($"Id:{login.Name} guid:{login.Guid} email:{login.Email} server:{login.CurrentServer} loginTime:{login.LoginTime.ToString("s")} value:{value}"); // return (ServerErrorCode.DbError, string.Empty); // } // Log.getLogger().info($"login Id:{login.Name} guid:{login.Guid} email:{login.Email} server:{login.CurrentServer} loginTime:{login.LoginTime.ToString("s")}"); // return (ServerErrorCode.Success, string.Empty); // } // public async Task Logout(string name) // { // Log.getLogger().info($"{name} Logout"); // string key = KeyWithPrefix(name); // await _database.KeyDeleteAsync(key); // } // public async Task KeepLogin(string name, LoginInfo login) // { // try // { // //Log.getLogger().info($"KeepLogin Key:{name}"); // string key = KeyWithPrefix(name); // var value = await _database.StringGetAsync(key, CommandFlags.PreferReplica); // if (value.HasValue == false) // { // if (login.Name == string.Empty) // { // Log.getLogger().error($"KeepLogin. value null Key:{key} id:{name}"); // return false; // } // value = JsonConvert.SerializeObject(login); // Log.getLogger().warn($"KeepLogin. new value Key:{key} new value : {value} {login.Name}"); // } // // 레디스에 저장된 로그인 해있는 서버와 KeepLogin을 실행한 서버를 비교 // // 다르면 중복 로그인으로 보고 로그아웃 처리한다 // //Log.getLogger().debug($"KeepLogin. Key:{key} id:{name}"); // return await _database.StringSetAsync(key, value, TimeSpan.FromMilliseconds(KEEP_LOGIN_TIME_OUT)); // } // catch (Exception e) // { // Log.getLogger().error($"KeepLogin Key:{name} {e}"); // return false; // } // } // public async Task GetLoginInfo(string name) // { // string key = KeyWithPrefix(name); // var value = await _database.StringGetAsync(key, CommandFlags.PreferReplica); // if (value.HasValue == false) // { // Log.getLogger().error($"{name} GetLoginInfo Key:{key} value.HasValue==false"); // return null; // } // Log.getLogger().info($"{name} GetLoginInfo Key:{key} Value:{value.ToString()}"); // return JsonConvert.DeserializeObject(value.ToString()); // } // public async Task ChangeState(string name, int state) // { // string key = KeyWithPrefix(name); // var value = await _database.StringGetAsync(key, CommandFlags.PreferReplica); // if (value.HasValue == false) // { // Log.getLogger().error($"{name} GetLoginInfo Key:{key} value.HasValue==false"); // return false; // } // LoginInfo? login = JsonConvert.DeserializeObject(value.ToString()); // if (login == null) // { // Log.getLogger().error($"{name} Json parsing errer Key:{key} value:{value.ToString()}"); // return false; // } // login.State = state; // if (await _database.StringSetAsync(key, JsonConvert.SerializeObject(login), TimeSpan.FromMilliseconds(KEEP_LOGIN_TIME_OUT)) == false) // { // Log.getLogger().error($"{name} StringSetAsync fail Key:{key} value:{value.ToString()}"); // return false; // } // return true; // } // public async Task ChangePartyGuid(string name, string partyGuid) // { // string key = KeyWithPrefix(name); // var value = await _database.StringGetAsync(key, CommandFlags.PreferReplica); // if (value.HasValue == false) // { // Log.getLogger().error($"{name} GetLoginInfo Key:{key} value.HasValue==false"); // return false; // } // LoginInfo? login = JsonConvert.DeserializeObject(value.ToString()); // if (login == null) // { // Log.getLogger().error($"{name} Json parsing errer Key:{key} value:{value.ToString()}"); // return false; // } // login.PartyGuid = partyGuid; // if (await _database.StringSetAsync(key, JsonConvert.SerializeObject(login), TimeSpan.FromMilliseconds(KEEP_LOGIN_TIME_OUT)) == false) // { // Log.getLogger().error($"{name} StringSetAsync fail Key:{key} value:{value.ToString()}"); // return false; // } // return true; // } // public async Task ChangeInstanceRoomId(string name, string instanceRoomId) // { // string key = KeyWithPrefix(name); // var value = await _database.StringGetAsync(key, CommandFlags.PreferReplica); // if (value.HasValue == false) // { // Log.getLogger().error($"{name} GetLoginInfo Key:{key} value.HasValue==false"); // return false; // } // LoginInfo? login = JsonConvert.DeserializeObject(value.ToString()); // if (login == null) // { // Log.getLogger().error($"{name} Json parsing errer Key:{key} value:{value.ToString()}"); // return false; // } // login.InstanceRoomId = instanceRoomId; // if (await _database.StringSetAsync(key, JsonConvert.SerializeObject(login), TimeSpan.FromMilliseconds(KEEP_LOGIN_TIME_OUT)) == false) // { // Log.getLogger().error($"{name} StringSetAsync fail Key:{key} value:{value.ToString()}"); // return false; // } // return true; // } // public async Task StartMoving(string name, string destServer) // { // string key = KeyWithPrefix(name); // var value = await _database.StringGetAsync(key, CommandFlags.PreferReplica); // if (value.HasValue == false) // { // Log.getLogger().error($"{name} Not found Key:{key}"); // return string.Empty; // } // LoginInfo? login = JsonConvert.DeserializeObject(value.ToString()); // if (login == null) // { // Log.getLogger().error($"{name} Json parsing errer Key:{key} value:{value.ToString()}"); // return string.Empty; // } // var otp = KeyGeneration.GenerateRandomKey(20); // var base32otp = Base32Encoding.ToString(otp); // login.Moving = new LoginInfo.MoveInfo(); // login.Moving.OneTimeKey = base32otp; // login.Moving.DestServer = destServer; // if (await _database.StringSetAsync(key, JsonConvert.SerializeObject(login), TimeSpan.FromMilliseconds(KEEP_LOGIN_TIME_OUT*5)) == false) // { // Log.getLogger().error($"{name} StringSetAsync fail Key:{key} value:{value.ToString()}"); // return string.Empty; // } // Log.getLogger().info($"{name} StartMoving To {destServer}"); // return base32otp; // } // public async Task EndMoving(string name, DateTime loginTime) // { // string key = KeyWithPrefix(name); // var value = await _database.StringGetAsync(key, CommandFlags.PreferReplica); // if (value.HasValue == false) // { // Log.getLogger().error($"{name} Not found key:{key}"); // return false; // } // LoginInfo? loginInfo = JsonConvert.DeserializeObject(value.ToString()); // if (loginInfo == null || loginInfo.Moving == null) // { // Log.getLogger().error($"{name} Json parsing error key:{key}, LoginInfo:{value.ToString()}"); // return false; // } // string departureServer = loginInfo.CurrentServer; // loginInfo.LoginTime = loginTime; // loginInfo.CurrentServer = loginInfo.Moving.DestServer; // loginInfo.Moving = null; // if (await _database.StringSetAsync(key, JsonConvert.SerializeObject(loginInfo), TimeSpan.FromMilliseconds(KEEP_LOGIN_TIME_OUT)) == false) // { // Log.getLogger().error($"{name} StringSetAsynct fail key:{key} value:{value.ToString()}"); // return false; // } // Log.getLogger().info($"{name} EndMoving From {departureServer}"); // return true; // } // } //}