using NLog; using Server.SQL; using Server.System; using StackExchange.Redis; namespace Server.Scheduler { public class SessionScheduler : System.Scheduler { public override void Process() { List users = Statics.redis.GetList("LoginUser"); DateTime now = DateTime.Now; for (int n = users.Count - 1; n >= 0; n--) { if ((now - (DateTime)Statics.redis.GetHash("end_login", "UserInfo", users[n])).TotalMinutes >= 10) { Statics.redis.RemoveList(n, users[n], "LoginUser"); Statics.redis.RemoveKey("UserSession", users[n]); } } } private static readonly NLog.ILogger logger = LogManager.GetCurrentClassLogger(); //신규 로그인 public static string addSession(User user) { //기존 세션 확인 string loginUUID = Guid.NewGuid().ToString(); Dictionary users = Statics.redis.GetAllHash("LoginUsers"); logger.Info($"New User : {user.nickname}, session : {loginUUID}"); foreach (var item in users) { if((RedisValue)item.Value == (RedisValue)user.id) { Statics.redis.RemoveHash(item.Key, "LoginUsers"); Statics.redis.SetHash(loginUUID, user.id, "LoginUsers"); updateSession(loginUUID); return loginUUID; } } Statics.redis.SetHash(loginUUID, user.id, "LoginUsers"); Dictionary userInfo = new Dictionary(); userInfo.Add("id", user.id); userInfo.Add("uuid", user.uuid); userInfo.Add("mail", user.mail); userInfo.Add("nickname", user.nickname); userInfo.Add("gold", user.gold); userInfo.Add("free_cash", user.free_cash); userInfo.Add("pay_cash", user.pay_cash); userInfo.Add("end_login", DateTime.Now); Statics.redis.SetHash(userInfo, "UserInfo", user.id); return loginUUID; } //세션 업데이트 public static void updateSession(string UUID) { ((RedisValue)Statics.redis.GetHash(UUID, "LoginUsers")).TryParse(out int id); Statics.redis.SetHash("end_login", DateTime.Now.ToString(), "UserInfo", id.ToString()); } public static User GetUser(string UUID) { User user = new User(); ((RedisValue)Statics.redis.GetHash(UUID, "LoginUsers")).TryParse(out int id); Dictionary userHash= Statics.redis.GetAllHash("UserInfo", id.ToString()); ((RedisValue)userHash["id"]).TryParse(out int user_id); user.id = user_id; user.uuid = userHash["uuid"].ToString().Trim('"'); user.mail = userHash["mail"].ToString().Trim('"'); user.nickname = userHash["nickname"].ToString().Trim('"'); ((RedisValue)userHash["gold"]).TryParse(out int user_gold); user.gold = user_gold; ((RedisValue)userHash["free_cash"]).TryParse(out int user_free_cash); user.free_cash = user_free_cash; ((RedisValue)userHash["pay_cash"]).TryParse(out int user_pay_cash); user.pay_cash = user_pay_cash; Statics.redis.SetHash("end_login", DateTime.Now.ToString(), "UserInfo", id.ToString()); return user; } } }