// 세션을 정리합니다.
        public static void FreeUser(Session session, Session.EncodingScheme encoding)
        {
            // 유저를 정리하기 위한 Context 를 읽어옵니다.
            string id;
            string opponent_id;

            session.GetFromContext("id", out id);
            session.GetFromContext("opponent", out opponent_id);

            // Session Context 를 초기화 합니다.
            session.Context = new JObject();

            // 로그아웃하고 세션을 종료합니다.
            if (id != string.Empty)
            {
                AccountManager.LogoutCallback logout_cb = (string param_account_id,
                                                           Session param_session,
                                                           bool param_result) => {
                    Log.InfoIf(param_result, "Logged out(local) by session close: id={0}", param_account_id);
                };
                AccountManager.SetLoggedOutAsync(id, logout_cb);
            }

            // 대전 상대가 있는 경우, 상대가 승리한 것으로 처리하고 로비서버로 보냅니다.
            if (opponent_id == string.Empty)
            {
                return;
            }
            Session opponent_session = AccountManager.FindLocalSession(opponent_id);

            if (opponent_session == null)
            {
                return;
            }

            Event.EventFunction update = () => {
                User user          = User.FetchById(id);
                User opponent_user = User.FetchById(opponent_id);

                Event.AssertNoRollback();

                // 편의상 아래 함수에서 ORM 데이터 업데이트 처리도 합니다.
                Leaderboard.OnWin(opponent_user);
                Leaderboard.OnLose(user);

                if (encoding == Session.EncodingScheme.kJsonEncoding)
                {
                    opponent_session.SendMessage("result", Utility.MakeResponse("win"));
                }
                else
                {
                    Log.Assert(encoding == Session.EncodingScheme.kProtobufEncoding);
                    FunMessage        funmsg = new FunMessage();
                    GameResultMessage msg    = new GameResultMessage();
                    msg.result = "win";
                    funmsg.AppendExtension_game_result(msg);
                    opponent_session.SendMessage("result", funmsg);
                }

                Common.Redirect(opponent_session, "lobby");
            };

            Event.Invoke(update);
        }
Exemplo n.º 2
0
 public static void AppendExtension_game_result(this FunMessage message, GameResultMessage value)
 {
     ProtoBuf.Extensible.AppendValue(message, (int)ExtendedMessageFieldNumber.FunMessage_game_result, value);
 }
        public static void OnHandleResult(Session session, Session.EncodingScheme encoding)
        {
            // 패배한 쪽만 result를 보내도록 되어있습니다.

            // 내 아이디를 가져옵니다.
            string id;

            session.GetFromContext("id", out id);

            // 상대방의 아이디와 세션을 가져옵니다.
            string opponent_id;

            Log.Verify(session.GetFromContext("opponent", out opponent_id));
            Session opponent_session = AccountManager.FindLocalSession(opponent_id);

            User user          = User.FetchById(id);
            User opponent_user = User.FetchById(opponent_id);

            Event.AssertNoRollback();

            // 편의상 아래 함수에서 ORM 데이터 업데이트 처리도 합니다.
            Leaderboard.OnWin(opponent_user);
            Leaderboard.OnLose(user);

            // 상대에게 승리했음을 알립니다.
            if (opponent_session != null)
            {
                if (encoding == Session.EncodingScheme.kJsonEncoding)
                {
                    opponent_session.SendMessage("result", Utility.MakeResponse("win"));
                }
                else
                {
                    Log.Assert(encoding == Session.EncodingScheme.kProtobufEncoding);
                    FunMessage        funmsg = new FunMessage();
                    GameResultMessage msg    = new GameResultMessage();
                    msg.result = "win";
                    funmsg.AppendExtension_game_result(msg);
                    opponent_session.SendMessage("result", funmsg);
                }

                opponent_session.DeleteFromContext("opponent");
                Common.Redirect(opponent_session, "lobby");
            }

            // 패배 확인 메세지를 보냅니다.
            if (encoding == Session.EncodingScheme.kJsonEncoding)
            {
                session.SendMessage("result", Utility.MakeResponse("lose"));
            }
            else
            {
                Log.Assert(encoding == Session.EncodingScheme.kProtobufEncoding);
                FunMessage        funmsg = new FunMessage();
                GameResultMessage msg    = new GameResultMessage();
                msg.result = "lose";
                funmsg.AppendExtension_game_result(msg);
                session.SendMessage("result", funmsg);
            }
            session.DeleteFromContext("opponent");
            Common.Redirect(session, "lobby");
        }
Exemplo n.º 4
0
 public static bool TryGetExtension_game_result(this FunMessage message, out GameResultMessage value)
 {
     return(ProtoBuf.Extensible.TryGetValue(message, (int)ExtendedMessageFieldNumber.FunMessage_game_result, out value));
 }