public static void HandleSingleModeResult(Session session, bool win, Session.EncodingScheme encoding) { string id; if (!session.GetFromContext("id", out id)) { Log.Warning("Failed to update singlemode game result. Not logged in."); if (encoding == Session.EncodingScheme.kJsonEncoding) { session.SendMessage("error", Utility.MakeResponse("fail", "not logged in")); } else { Log.Assert(encoding == Session.EncodingScheme.kProtobufEncoding); FunMessage funmsg = new FunMessage(); PongErrorMessage msg = new PongErrorMessage(); msg.result = "fail"; msg.msg = "not logged in"; funmsg.AppendExtension_pong_error(msg); session.SendMessage("error", funmsg); } return; } User user = User.FetchById(id); if (user == null) { Log.Error("Cannot find uwer's id in db: id={0}", id); return; } if (win) { Leaderboard.OnWin(user, true); } else { Leaderboard.OnLose(user, true); } }
// 세션을 정리합니다. 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 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"); }