Exemplo n.º 1
0
        //#####################################################################################
        // 수신된 메세지 처리

        private NetMessage WhenReqLogin(ServerVisitor client, NetMessageStream msg)
        {
            string userName = msg.ReadData <string>();


            LoginResults loginResult = LoginResults.Success;


            // 로그인을 받을 수 있는 상태이면
            if (this.CanLogin)
            {
                string password    = msg.ReadData <string>();
                string versionText = Utility.Version.Zero.ToString();
                if (!msg.EndOfStream)
                {
                    versionText = msg.ReadData <string>();
                }
                Utility.Version clientVersion = new Utility.Version(versionText);


                // 클라이언트 버전이 서버버전과 같은지 확인
                if (Application.ProductVersion == clientVersion)
                {
                    // 회원여부 확인 및 비밀번호 얻기
                    bool   isMember     = m_accountList.ContainsKey(userName);
                    string realPassword = "";

                    if (isMember)
                    {
                        realPassword = m_accountList[userName].Password;
                    }


                    // 회원이 아니면 실패
                    if (isMember == false)
                    {
                        loginResult = LoginResults.Fail_NotUser;
                    }
                    // 비밀번호가 틀리면 실패
                    else if (password != realPassword)
                    {
                        loginResult = LoginResults.Fail_WrongPassword;
                    }
                    // 이미 접속된 유저와 이름이 중복되면 실패
                    else if (m_loginUserList.Any((user) => user.Value.Name == userName))
                    {
                        loginResult = LoginResults.Fail_AlreadyLogin;
                    }


                    // 로그인 성공시
                    if (loginResult == LoginResults.Success)
                    {
                        // 접속자 목록에 추가
                        m_loginUserList.Add(client.ID, new GamePlayer()
                        {
                            Name = userName
                        });


                        // 로그인 사실을 모두에게 알림
                        NetMessageStream loginNotice = new NetMessageStream();
                        loginNotice.WriteData(userName);

                        this.NoticeDelegate(loginNotice.CreateMessage((int)MessageTypes.Ntf_UserLogin));
                    }
                }
                else
                {
                    // 클라이언트의 버전과 서버의 버전이 다르므로 접속불가
                    loginResult = LoginResults.Fail_DifferentVersion;
                }
            }
            else
            {
                // 로그인을 받을 수 없음
                loginResult = LoginResults.Fail_ServerNotReady;
            }


            // 로그
            Utility.Logger.GetInstance().Log(string.Format("\"{0}\"님이 로그인을 시도했습니다. 결과 : {1}",
                                                           userName, loginResult.ToString()));


            // 로그인 결과 전송
            NetMessageStream writer = new NetMessageStream();

            writer.WriteData((int)loginResult);

            return(writer.CreateMessage((int)MessageTypes.Rsp_Login));
        }