From d2fb9cacd54e094b2ee4969195f90c3dbbc11979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=84=9C?= Date: Mon, 8 Apr 2024 11:06:02 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EC=84=B8=EC=85=98=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Scheduler/SessionScheduler.cs | 61 +++++++++++++++++++++++++++- Server/Service/Login.cs | 22 ++-------- Server/System/Abstract.cs | 12 +----- Server/System/Redis.cs | 24 +++++++---- 4 files changed, 81 insertions(+), 38 deletions(-) diff --git a/Server/Scheduler/SessionScheduler.cs b/Server/Scheduler/SessionScheduler.cs index aa6f581..65ddf80 100644 --- a/Server/Scheduler/SessionScheduler.cs +++ b/Server/Scheduler/SessionScheduler.cs @@ -1,4 +1,6 @@ -using Server.System; +using Server.SQL; +using Server.System; +using System.Runtime.CompilerServices; namespace Server.Scheduler { @@ -12,12 +14,67 @@ namespace Server.Scheduler for (int n = users.Count - 1; n >= 0; n--) { - if ((now - (DateTime)Statics.redis.GetHash("end_login", "UserInfo", users[n])).TotalMinutes >= 10) + if ((now - DateTime.Parse(Statics.redis.GetHash("end_login", "UserInfo", users[n]))).TotalMinutes >= 10) { Statics.redis.RemoveList(n, users[n], "LoginUser"); Statics.redis.RemoveKey("UserSession", users[n]); } } } + + //신규 로그인 + public static void addSession(User user) + { + //기존 세션 확인 + //TODO 기존 중복세션에 대한 처리도 필요 + string loginUUID = Guid.NewGuid().ToString(); + Dictionary users = Statics.redis.GetAllHash("LoginUsers"); + + foreach(var item in users) + { + if(int.Parse(item.Value) == user.id) + { + Statics.redis.RemoveHash(item.Key); + Statics.redis.SetHash(loginUUID, user.id.ToString(), "LoginUsers"); + updateSession(loginUUID); + return; + } + } + + Statics.redis.SetHash(loginUUID, user.id.ToString(), "LoginUsers"); + Dictionary userInfo = new Dictionary(); + userInfo.Add("id", user.id.ToString()); + userInfo.Add("uuid", user.uuid); + userInfo.Add("mail", user.mail); + userInfo.Add("nickname ", user.nickname); + userInfo.Add("gold ", user.gold.ToString()); + userInfo.Add("free_cash", user.free_cash.ToString()); + userInfo.Add("pay_cash", user.pay_cash.ToString()); + userInfo.Add("end_login", DateTime.Now.ToString()); + Statics.redis.SetHash(userInfo, "UserInfo", user.id.ToString()); + } + + //세션 업데이트 + public static void updateSession(string UUID) + { + int id = int.Parse(Statics.redis.GetHash(UUID, "LoginUsers")); + Statics.redis.SetHash("end_login", DateTime.Now.ToString(), "UserInfo", id.ToString()); + } + + public static User GetUser(string UUID) + { + User user = new User(); + int id = int.Parse(Statics.redis.GetHash(UUID, "LoginUsers")); + Dictionary userHash= Statics.redis.GetAllHash("UserInfo", id.ToString()); + user.id = int.Parse(userHash["id"]); + user.uuid = userHash["uuid"]; + user.mail = userHash["mail"]; + user.nickname = userHash["nickname"]; + user.gold = int.Parse(userHash["gold"]); + user.free_cash = int.Parse(userHash["free_cash"]); + user.pay_cash = int.Parse(userHash["pay_cash"]); + Statics.redis.SetHash("end_login", DateTime.Now.ToString(), "UserInfo", id.ToString()); + return user; + } } } diff --git a/Server/Service/Login.cs b/Server/Service/Login.cs index 5dff4b9..f4d8ba1 100644 --- a/Server/Service/Login.cs +++ b/Server/Service/Login.cs @@ -2,8 +2,6 @@ using Newtonsoft.Json; using Server.SQL; using Server.Manager; -using Microsoft.AspNetCore.DataProtection.KeyManagement; -using System.Collections.Generic; using Server.SQL.Excel; using static Server.Scheduler.SessionScheduler; @@ -96,24 +94,12 @@ namespace Server.Service deckInfoList = new List { deckInfo }; #endregion } + + //세션 추가 + addSession(user); #endregion - #region 세션등록 - //TODO 기존 중복세션에 대한 처리도 필요 - //TODO 모든 세션 처리를 세션 스케줄러에서 처리가 가능하도록 수정할것 - string loginUUID = Guid.NewGuid().ToString(); - Statics.redis.SetList(loginUUID, "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", loginUUID); - #endregion + #region 상점 세팅 //리셋 상점 diff --git a/Server/System/Abstract.cs b/Server/System/Abstract.cs index 2ff8dc2..95268a6 100644 --- a/Server/System/Abstract.cs +++ b/Server/System/Abstract.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; +using Server.Scheduler; using Server.SQL; -using static Server.Scheduler.SessionScheduler; namespace Server.System { @@ -39,15 +39,7 @@ namespace Server.System { try { - Dictionary hash = Statics.redis.GetAllHash("UserInfo", uuid); - user.id = (int)hash["id"]; - user.uuid = (string)hash["uuid"]; - user.mail = (string)hash["mail"]; - user.nickname = (string)hash["nickname"]; - user.gold = (int)hash["gold"]; - user.free_cash = (int)hash["free_cash"]; - user.pay_cash = (int)hash["pay_cash"]; - Statics.redis.SetHash("end_login", DateTime.Now, "UserInfo", uuid); + user = SessionScheduler.GetUser(uuid); return true; } catch (Exception e) diff --git a/Server/System/Redis.cs b/Server/System/Redis.cs index 66ce44b..ed7f7c2 100644 --- a/Server/System/Redis.cs +++ b/Server/System/Redis.cs @@ -199,7 +199,7 @@ namespace Server.System return result; } - public void SetHash(string field, object value, params string[] keys) + public void SetHash(string field, string value, params string[] keys) { if (local) { @@ -209,9 +209,9 @@ namespace Server.System { Dictionary userHash = hashType[KeySet(keys)]; if (userHash.ContainsKey(field)) - userHash.Add(field, JsonConvert.SerializeObject(value)); + userHash.Add(field, value); else - userHash[field] = JsonConvert.SerializeObject(value); + userHash[field] = value; } } else @@ -220,20 +220,20 @@ namespace Server.System } } - public void SetHash(Dictionary hash, params string[] keys) + public void SetHash(Dictionary hash, params string[] keys) { foreach (var item in hash) SetHash(item.Key, item.Value, keys); } - public Dictionary GetAllHash(params string[] keys) + public Dictionary GetAllHash(params string[] keys) { - Dictionary hash = new Dictionary(); + Dictionary hash = new Dictionary(); if (local) { Dictionary hashs = new Dictionary(hashType[KeySet(keys)]); foreach (var entry in hashs) - hash.Add(entry.Key, JsonConvert.DeserializeObject(entry.Value)); + hash.Add(entry.Key, entry.Value); } else { @@ -244,7 +244,7 @@ namespace Server.System return hash; } - public object GetHash(string field ,params string[] keys) + public string GetHash(string field ,params string[] keys) { if (local) { @@ -255,6 +255,14 @@ namespace Server.System return db.HashGet(KeySet(keys), field); } + public void RemoveHash(string field, params string[] keys) + { + if (local) + hashType[KeySet(keys)].Remove(field); + else + db.HashDelete(KeySet(keys), field); + } + public void RemoveKey(params string[] keys) { if (local) From 855edfbf31cc8f8e5e247b141ca06473036a5356 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=84=9C?= Date: Tue, 9 Apr 2024 10:05:58 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=ED=95=84=EC=9A=94=EC=97=86=EB=8A=94=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Scheduler/SessionScheduler.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Server/Scheduler/SessionScheduler.cs b/Server/Scheduler/SessionScheduler.cs index 65ddf80..c4d692a 100644 --- a/Server/Scheduler/SessionScheduler.cs +++ b/Server/Scheduler/SessionScheduler.cs @@ -26,7 +26,6 @@ namespace Server.Scheduler public static void addSession(User user) { //기존 세션 확인 - //TODO 기존 중복세션에 대한 처리도 필요 string loginUUID = Guid.NewGuid().ToString(); Dictionary users = Statics.redis.GetAllHash("LoginUsers"); From 1bcb8343e332990e35e0597a16aa886e3d9fe2da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=84=9C?= Date: Tue, 9 Apr 2024 10:25:28 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=EC=8B=9C=EC=8A=A4=ED=85=9C=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Service/BuyShopItem.cs | 8 ++++---- Server/Service/NicknameChange.cs | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Server/Service/BuyShopItem.cs b/Server/Service/BuyShopItem.cs index 65776ec..dd35f9d 100644 --- a/Server/Service/BuyShopItem.cs +++ b/Server/Service/BuyShopItem.cs @@ -18,11 +18,11 @@ namespace Server.Service { Statics.userSQL.Update(req.user); - Dictionary saveUser = new Dictionary(); + Dictionary saveUser = new Dictionary(); saveUser.Add("nickname", req.user.nickname); - saveUser.Add("gold", req.user.gold); - saveUser.Add("free_cash", req.user.free_cash); - saveUser.Add("pay_cash", req.user.pay_cash); + saveUser.Add("gold", req.user.gold.ToString()); + saveUser.Add("free_cash", req.user.free_cash.ToString()); + saveUser.Add("pay_cash", req.user.pay_cash.ToString()); Statics.redis.SetHash(saveUser, "UserInfo", req.uuid); diff --git a/Server/Service/NicknameChange.cs b/Server/Service/NicknameChange.cs index e4542fb..12d3782 100644 --- a/Server/Service/NicknameChange.cs +++ b/Server/Service/NicknameChange.cs @@ -12,11 +12,11 @@ namespace Server.Service { Statics.userSQL.Update(req.user); - Dictionary saveUser = new Dictionary(); + Dictionary saveUser = new Dictionary(); saveUser.Add("nickname", req.user.nickname); - saveUser.Add("gold", req.user.gold); - saveUser.Add("free_cash", req.user.free_cash); - saveUser.Add("pay_cash", req.user.pay_cash); + saveUser.Add("gold", req.user.gold.ToString()); + saveUser.Add("free_cash", req.user.free_cash.ToString()); + saveUser.Add("pay_cash", req.user.pay_cash.ToString()); Statics.redis.SetHash(saveUser, "UserInfo", req.uuid); } @@ -30,8 +30,8 @@ namespace Server.Service //만약 시스템 설정과 같은 닉네임이 온다면 중복 처리 if (newNickname == defaultNick) - { - throw new RuntimeException("Duplicate nickname", Error.ErrorData); + { + throw new RuntimeException("Duplicate nickname", Error.ErrorData); } //닉네임 체크 @@ -94,4 +94,4 @@ namespace Server.Service public string nickname; public uint cash; } -} +} \ No newline at end of file From 54d9762a984cceeb917cb9e36bd491911ee32e4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EB=AF=BC=EC=84=9C?= Date: Tue, 9 Apr 2024 16:12:09 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=EB=A9=94=EB=AA=A8=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Server/Service/UseItem.cs | 2 ++ Server/System/Enums.cs | 7 +++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Server/Service/UseItem.cs b/Server/Service/UseItem.cs index d9c90ee..2a8a8f6 100644 --- a/Server/Service/UseItem.cs +++ b/Server/Service/UseItem.cs @@ -1,5 +1,6 @@ using Server.System; using Newtonsoft.Json; +using Server.SQL; namespace Server.Service { @@ -8,6 +9,7 @@ namespace Server.Service private UseItemReq req; public override string Process() { + User user = req.user; return makeResp(); } diff --git a/Server/System/Enums.cs b/Server/System/Enums.cs index afa924d..4953db3 100644 --- a/Server/System/Enums.cs +++ b/Server/System/Enums.cs @@ -7,17 +7,20 @@ //100~199 로그인이나 시스템과 연관된 프로토콜 Downlode = 100,//기획 데이터 다운로드 Login = 101,//로그인 유저정보 요청 + Synchronization = 102,//우편함 정보, 실시간 업데이트 등 일정시간마다 불러와야 하는 프로토콜 (TODO) //200~299 유저 장비 관련 혹은 유닛관련 시스템 관리 프로토콜 EquipChange = 200,//장비 변경 DeckChange = 201,//덱 유닛 변경 NicknameChange = 202,//닉네임 변경 + OpenMail = 210,//메일 오픈(TODO) + GetMail = 211,//메일 첨부 아이탬 획득(TODO) //300~399 상점 관련 프로토콜 BuyShopItem = 300,//상점 아이템 구매 BuyShopGacha = 301,//가챠 아이탬 사용(보류) - UseItem = 302,//소모품 사용(보류) - BuyItem = 303,//아이탬 판매(보류) + UseItem = 302,//소모품 사용(TODO) + BuyItem = 303,//아이탬 판매(TODO) //400~499 스토리 관련 프로토콜 UpdateStory = 400,//유저의 스토리 진행 상황 저장(작업 중)