// 세션을 정리합니다. 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); }
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"); }
public static bool TryGetExtension_game_result(this FunMessage message, out GameResultMessage value) { return(ProtoBuf.Extensible.TryGetValue(message, (int)ExtendedMessageFieldNumber.FunMessage_game_result, out value)); }