using Server.System; using Newtonsoft.Json; using Server.SQL; using System.Text.RegularExpressions; namespace Server.Service { public class NicknameChange : AbstractService { private NicknameChangeReq req; private void SaveSQL() { Statics.userSQL.Update(req.user); Dictionary saveUser = new Dictionary(); saveUser.Add("nickname", req.user.nickname); 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); } public override string Process() { User user = req.user; string newNickname = req.newNickname; string regular = @"^[가-힣a-zA-Z0-9\s]*$"; string defaultNick = Statics.dynamicDataSQL.SelectName("defaultNick").value; int buy; //만약 시스템 설정과 같은 닉네임이 온다면 중복 처리 if (newNickname == defaultNick) { throw new RuntimeException("Duplicate nickname", Error.ErrorData); } //닉네임 체크 if (!Regex.IsMatch(newNickname, regular) || (newNickname.Length < 2 || newNickname.Length > 16) || user.nickname == newNickname) { //해당 데이터가 들어온다면 유저 정보와 같이 로그를 남기게 만들것 throw new RuntimeException("Nickname not allowed", Error.ErrorData); } //가격 체크 if (user.nickname == defaultNick) buy = 0; else buy = int.Parse(Statics.dynamicDataSQL.SelectName("nicknameCash").value); //현재 충분한 제화가 있는지 확인 if (!user.buyCash(buy)) { throw new RuntimeException("Cache shortage", Error.NoGold); } //닉네임 중복 검사 user.nickname = newNickname; return makeResp(user); } public override Protocol ProtocolValue() => Protocol.NicknameChange; public override Req Requst(string json) { req = JsonConvert.DeserializeObject(json); return req; } private string makeResp(User user) { SaveSQL(); NicknameChangeResp resp = new NicknameChangeResp(); resp.nickname = user.nickname; resp.cash = (uint)(user.free_cash + user.pay_cash); return resp.ToJson(); } } public class NicknameChangeReq : Req { public string newNickname; public override bool IsReceivedAllField() { if (uuid == "") return false; return true; } } public class NicknameChangeResp : Resp { public string nickname; public uint cash; } }