public static void OnSingleRanklistRequested2(Session session, FunMessage message) { Leaderboard.GetAndSendRankTop8(session, Session.EncodingScheme.kProtobufEncoding, true); }
public static void OnSingleRanklistRequested(Session session, JObject message) { Leaderboard.GetAndSendRankTop8(session, Session.EncodingScheme.kJsonEncoding, 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); }
private static void OnLogin_Completed(string account_id, Session session, bool success, Session.EncodingScheme encoding) { if (!success) { // 로그인에 실패 응답을 보냅니다. 중복 로그인이 원인입니다. // (1. 같은 ID 로 이미 다른 Session 이 로그인 했거나, // 2. 이 Session 이 이미 로그인 되어 있는 경우) Log.Info("Failed to login: id={0}", account_id); if (encoding == Session.EncodingScheme.kJsonEncoding) { session.SendMessage("login", Utility.MakeResponse("nop", "failed to login"), Session.Encryption.kDefault); } else { Log.Assert(encoding == Session.EncodingScheme.kProtobufEncoding); FunMessage funmsg = new FunMessage(); LobbyLoginReply reply = new LobbyLoginReply(); reply.result = "nop"; reply.msg = "failed to login"; funmsg.AppendExtension_lobby_login_repl(reply); session.SendMessage("login", funmsg); } // 아래 로그아웃 처리를 한 후 자동으로 로그인 시킬 수 있지만 // 일단 클라이언트에서 다시 시도하도록 합니다. // 1. 이 ID 의 로그인을 풀어버립니다.(로그아웃) AccountManager.LogoutCallback logout_cb = (string param_account_id, Session param_session, bool param_success) => { if (!param_success) { return; } if (param_session != null) { // 같은 서버에 로그인 되어 있었습니다. Log.Info("Logged out(local) by duplicated login request: id={0}", param_account_id); session.Close(); } else { // 다른 서버에 로그인 되어 있었습니다. // 해당 서버의 OnLoggedOutRemotely() 에서 처리합니다. Log.Info("Logged out(remote) by duplicated login request: id={0}", param_account_id); } }; AccountManager.SetLoggedOutGlobalAsync(account_id, new AccountManager.LogoutCallback(logout_cb)); // 2. 이 Session 의 로그인을 풀어버립니다.(로그아웃) string account_id_logged_in = AccountManager.FindLocalAccount(session); if (account_id_logged_in != string.Empty) { // OnSessionClosed 에서 처리합니다. Log.Info("Close session. by duplicated login request: id={0}", account_id); session.Close(); } return; } // User Object 를 가져옵니다. User user = User.FetchById(account_id); if (user == null) { // 새로운 유저를 생성합니다. user = User.Create(account_id); Log.Info("Registered new user: id={0}", account_id); } Event.AssertNoRollback(); Log.Info("Succeed to login: id={0}", account_id); // 로그인 Activitiy Log 를 남깁니다. ActivityLog.PlayerLoggedIn(session.Id.ToString(), account_id, WallClock.Now); // Session 에 Login 한 ID 를 저장합니다. session.AddToContext("id", account_id); if (encoding == Session.EncodingScheme.kJsonEncoding) { JObject response = Utility.MakeResponse("ok"); response ["id"] = account_id; response ["winCount"] = user.GetWinCount(); response ["loseCount"] = user.GetLoseCount(); response ["curRecord"] = Leaderboard.GetRecord(account_id); response ["singleWinCount"] = user.GetWinCountSingle(); response ["singleLoseCount"] = user.GetLoseCountSingle(); response ["singleCurRecord"] = Leaderboard.GetRecord(account_id, true); session.SendMessage("login", response, Session.Encryption.kDefault); } else { Log.Assert(encoding == Session.EncodingScheme.kProtobufEncoding); FunMessage funmsg = new FunMessage(); LobbyLoginReply reply = new LobbyLoginReply(); reply.result = "ok"; reply.id = account_id; reply.win_count = (int)user.GetWinCount(); reply.lose_count = (int)user.GetLoseCount(); reply.cur_record = (int)Leaderboard.GetRecord(account_id); reply.win_count_single = (int)user.GetWinCountSingle(); reply.lose_count_single = (int)user.GetLoseCountSingle(); reply.cur_record_single = Leaderboard.GetRecord(account_id, true); funmsg.AppendExtension_lobby_login_repl(reply); session.SendMessage("login", funmsg, Session.Encryption.kDefault); } }
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"); }