public static void GetAndSendRankTop8(Session session, Session.EncodingScheme encoding, bool single = false)
        {
            funapi.Leaderboard.QueryRequest request =
                new funapi.Leaderboard.QueryRequest(
                    single ? kSingleLeaderboardId : kLeaderboardId, funapi.Leaderboard.Timespan.kAllTime,
                    new funapi.Leaderboard.Range(funapi.Leaderboard.RangeType.kFromTop, 0, 7));

            funapi.Leaderboard.GetLeaderboard(request, (_1, _2, _3) => { OnGetRankTop8(_1, _2, _3, session, encoding, single); });
        }
        public static void OnGetRankTop8(
            funapi.Leaderboard.QueryRequest request, funapi.Leaderboard.QueryResponse response,
            bool error, Session session, Session.EncodingScheme encoding, bool single)
        {
            if (error)
            {
                Log.Error("Failed to query leaderboard. Leaderboard system error.");
                return;
            }
            string msgtype = single ? "ranklist_single" : "ranklist";

            if (encoding == Session.EncodingScheme.kJsonEncoding)
            {
                JObject result = new JObject();
                result ["ranks"] = new JObject();
                int index = 0;
                foreach (funapi.Leaderboard.Record record in response.Records)
                {
                    string index_str = index.ToString();
                    result ["ranks"] [index_str]           = new JObject();
                    result ["ranks"] [index_str] ["rank"]  = record.Rank;
                    result ["ranks"] [index_str] ["score"] = record.Score;
                    result ["ranks"] [index_str] ["id"]    = record.PlayerAccount.Id;
                    ++index;
                }
                session.SendMessage(msgtype, result, Session.Encryption.kDefault);
            }
            else
            {
                Log.Assert(encoding == Session.EncodingScheme.kProtobufEncoding);

                FunMessage         message = new FunMessage();
                LobbyRankListReply reply   = new LobbyRankListReply();
                reply.result = "Success";
                int index = 0;
                foreach (funapi.Leaderboard.Record record in response.Records)
                {
                    LobbyRankListReply.RankElement el = new LobbyRankListReply.RankElement();
                    string index_str = index.ToString();
                    el.rank  = record.Rank;
                    el.score = (int)record.Score;
                    el.id    = record.PlayerAccount.Id;
                    reply.rank.Add(el);
                    ++index;
                }
                message.AppendExtension_lobby_rank_list_repl(reply);
                session.SendMessage(msgtype, message, Session.Encryption.kDefault);
            }
        }
        public static int GetRecord(string account_id, bool single = false)
        {
            // TODO: Async API 로 교체

            funapi.Leaderboard.QueryRequest request =
                new funapi.Leaderboard.QueryRequest(
                    single ? kSingleLeaderboardId : kLeaderboardId, kAccountServiceProvider,
                    account_id, funapi.Leaderboard.Timespan.kAllTime,
                    new funapi.Leaderboard.Range(funapi.Leaderboard.RangeType.kNearby, 0, 0));
            funapi.Leaderboard.QueryResponse response;

            if (!funapi.Leaderboard.GetLeaderboardSync(request, out response))
            {
                Log.Error("Failed to query leaderboard. Leaderboard system error.");
                return(0);
            }

            List <funapi.Leaderboard.Record> .Enumerator enumerator = response.Records.GetEnumerator();
            if (!enumerator.MoveNext())
            {
                return(0);
            }
            return((int)enumerator.Current.Score);
        }