Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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
            });
        }
Esempio n. 4
0
        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,
            });
        }