public static async Task <(Models.Member, Models.User, bool, bool)> GetMemberUser(string player_id) { Models.Member last_member = null; Models.User last_user = null; bool hasMember = false; bool hasUser = false; last_member = await MemberQuery.GetMember(player_id); if (last_member != default(Models.Member)) { hasMember = true; last_user = await UserQuery.GetUser(last_member.member_no, last_member.user_no); if (last_user != default(Models.User)) { hasUser = true; } } return(last_member, last_user, hasMember, hasUser); }
public static async Task <(Session, ErrorCode, string)> LoginSession(string endpoint, string player_id, string device_uid, bool check_device_uid, Models.Member member) { var db = Cache.Instance.GetDatabase(); bool hasMember = false; bool hasUser = false; Models.User user = null; if (player_id == "") { // 게스트 계정 발급, prefix 'G' player_id = $"G{Guid.NewGuid().ToString("N")}"; } else { Models.Member last_member = null; Models.User last_user = null; // 캐시 확인 var ret = await db.StringGetAsync($"player_id:{player_id}"); if (ret.HasValue == false) { // 디비 확인 (last_member, last_user, hasMember, hasUser) = await GetMemberUser(player_id); } else { string session_id = ret; var timeout = await IsDuplicateTimeout(session_id); // 세션이 만료되지 않았다면 가져와서 사용 var last_session = await GetSession(session_id, false); if (last_session != null) { // SystemInfo.deviceUniqueIdentifier 비교 if (check_device_uid && string.IsNullOrEmpty(last_session.device_uid) == false && // 이전 로그인이 어드민 무시 last_session.device_uid != device_uid) { Log.Information($"LoginSession diff last : {last_session.device_uid}, new : {device_uid}, timeout : {timeout}"); if (timeout) { // 이전 세션을 클리어 await ClearSession(session_id); //캐싱된 데이터를 사용하지 않고 로그인 처리 (last_member, last_user, hasMember, hasUser) = await GetMemberUser(player_id); } else { return(null, ErrorCode.DuplicateLogin, player_id); } } else { await last_session.Touch(); return(last_session, ErrorCode.Success, player_id); } } else { (last_member, last_user, hasMember, hasUser) = await GetMemberUser(player_id); } } if (hasMember) { member = last_member; } if (hasUser) { user = last_user; } } if (hasMember == false) { member.user_no = 0; member.player_id = player_id; member = await MemberQuery.AddMember(member); } if (hasUser == false) { user = new Models.User() { user_no = member.member_no, character_no = 0, #if USE_TEMP_SET_NICKNAME user_name = Guid.NewGuid().ToString("N"), // todo 임시코드 #endif map_id = defaultUserMapId, }; #if USE_TEMP_SET_NICKNAME // todo : 임시 닉네임 설정 // 유저로부터 입력 받도록 수정이 필요 (var ret, var user_name) = await GetCandidateName(); if (ret == true) { user.user_name = user_name; } #endif user = await UserQuery.AddUser(member.member_no, user); } if (member.user_no != user.user_no) { // member 와 user 연결 // member테이블에 데이터는 있는데 user테이블에 데이터가 없는 경우 await MemberQuery.UpdateMember(member.member_no, user.user_no); } int character_rank_level = defaultMinRank; if (user.character_no != 0) { var charac = await CharacterCache.Instance.GetEntity(member.member_no, user.character_no, true, false, false); if (charac != null && charac != default(Models.Character)) { var rankData = ACDC.RankData.GetRank(charac.battle_score); if (rankData != null) { character_rank_level = rankData.Rank; } } } var session = new Session() { remote_endpoint = endpoint, user_no = user.user_no, user_name = member.user_name, player_id = player_id, member_no = member.member_no, character_no = user.character_no, rank = character_rank_level, device_uid = device_uid, map_id = user.map_id }; bool result = await TryInsertSession(session); if (result == false) { Log.Error($"CreateSession 1 try count over player_id:{player_id}"); return(null, ErrorCode.TryCountOver, player_id); } await db.StringSetAsync($"player_id:{player_id}", session.session_id.ToString(), session_expire); return(session, ErrorCode.Success, player_id); }
public override async Task ChangeUserName(ChangeUserNameRequest request, IServerStreamWriter <ChangeUserNameReply> responseStream, ServerCallContext context) { var session = await context.GetSession(); if (session == null) { await responseStream.WriteAsync(new ChangeUserNameReply() { Code = ErrorCode.LostSession }); return; } //유저 아이디 영문과 숫자 조합만 허용 //if (Regex.IsMatch(request.UserName, @"^[a-zA-Z0-9]+$") == false) if (Regex.IsMatch(request.UserName, @"^[a-zA-Z0-9가-힣]*$") == false) { Log.Error($"ChangeUserName error {request.UserName}"); await responseStream.WriteAsync(new ChangeUserNameReply() { Code = ErrorCode.WrongLetters }); return; } if (request.UserName.Length < 2 || request.UserName.Length > 10) { Log.Error($"ChangeUserName error {request.UserName}"); await responseStream.WriteAsync(new ChangeUserNameReply() { Code = ErrorCode.WrongLetters }); return; } if (request.UserName.IsLetterOrDigit() == false) { Log.Error($"ChangeUserName error {request.UserName}"); await responseStream.WriteAsync(new ChangeUserNameReply() { Code = ErrorCode.WrongLetters }); return; } if (await BannedWordFilter.Check(request.UserName) == false) { Log.Error($"ChangeUserName error {request.UserName}"); await responseStream.WriteAsync(new ChangeUserNameReply() { Code = ErrorCode.WrongLetters }); return; } // 유저 디비 업데이트 var ret = await MemberQuery.UpdateMember(session.member_no, request.UserName); if (ret != ErrorCode.Success) { await responseStream.WriteAsync(new ChangeUserNameReply() { Code = ret }); return; } // 세션 캐시 업데이트 await Session.UpdateSessionLock(session.session_id, delegate(Session s) { s.user_name = request.UserName; }); await responseStream.WriteAsync(new ChangeUserNameReply() { Code = ErrorCode.Success }); }
public override async Task GetUserInfo(GetUserInfoRequest request, IServerStreamWriter <GetUserInfoReply> responseStream, ServerCallContext context) { var session = await context.GetSession(); if (session == null) { await responseStream.WriteAsync(new GetUserInfoReply() { Code = ErrorCode.LostSession }); return; } UserInfo userInfo = new UserInfo(); await userInfo.Load(session); Dictionary <string, object> properties = new Dictionary <string, object>(); properties.Add("Name", userInfo.UserName); await Ranking.PutProperty(session.player_id, string.Empty, properties); //await Ranking.ProcessRankingReward(session); var member = await MemberQuery.GetMember(session.player_id); // todo : member.last_play_time 체크로 지급 여부 판단 var currentTime = DateTime.UtcNow; var mails = await MailQuery.GetSystemMail(member.last_play_time); foreach (var mail in mails) { if (mail.recipient != string.Empty) { // 받는 사람 목록이 있는 경우 해당 player_id 가 맞는지 비교 string[] words = mail.recipient.Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries); if (words.Contains(member.player_id) == false) { continue; } } var m = new Mail(); switch (member.language_code) { case "ko": m.title = mail.title_ko; m.body = mail.body_ko; break; default: m.title = mail.title_en; m.body = mail.body_en; break; } m.mail_state = MailState.Send; if (mail.item_id != 0 && mail.item_count > 0) { m.has_item = true; } m.item_id = mail.item_id; m.item_count = mail.item_count; m.sender = mail.sender; m.send_time = currentTime; m.expiry_time = currentTime.AddDays(mail.expiry_days); m.user_no = member.user_no; await MailQuery.SendMail(member.member_no, m); } // member.last_play_time 현재 시간으로 기록 await MemberQuery.UpdateMemberLastPlayTime(session.member_no, currentTime); await responseStream.WriteAsync(new GetUserInfoReply() { Code = ErrorCode.Success, User = userInfo, }); }