示例#1
0
 public void SetModel(LevelRecord.Performance performance)
 {
     SetModel(new RankingEntry {
         score = performance.Score, accuracy = performance.Accuracy
     });
 }
示例#2
0
    public IPromise <(int, List <RankingEntry>)> GetLevelRankings(string levelId, string chartType)
    {
        var entries = new List <RankingEntry>();
        var top10   = new List <RankingEntry>();

        if (IsAuthenticated)
        {
            return(RestClient.GetArray <RankingEntry>(new RequestHelper
            {
                Uri = $"{Context.ApiUrl}/levels/{levelId}/charts/{chartType}/records?limit=10",
                Headers = GetRequestHeaders(),
                EnableDebug = true
            })
                   .Then(data =>
            {
                top10 = data.ToList();
                // Add the first 3
                entries.AddRange(top10.GetRange(0, Math.Min(3, top10.Count)));

                return RestClient.GetArray <RankingEntry>(new RequestHelper
                {
                    Uri =
                        $"{Context.ApiUrl}/levels/{levelId}/charts/{chartType}/user_ranking?limit=6",
                    Headers = GetRequestHeaders(),
                    EnableDebug = true
                });
            })
                   .Then(data =>
            {
                var list = data.ToList();

                // Find user's position
                var userRank = -1;
                RankingEntry userEntry = null;
                for (var index = 0; index < data.Length; index++)
                {
                    var entry = data[index];
                    if (entry.owner.Uid == Context.Player.Id)
                    {
                        userRank = entry.rank;
                        userEntry = entry;
                        break;
                    }
                }

                if (userRank == -1 || userRank <= 10)
                {
                    // Just use top 10
                    entries = top10;
                }
                else
                {
                    // Add previous 6 and next 6, and remove accordingly
                    var append = new List <RankingEntry>();
                    append.AddRange(list);
                    append.RemoveRange(0, Math.Max(3, Math.Max(0, 10 - userRank)));
                    if (append.Count > 7)
                    {
                        append.RemoveRange(7, append.Count - 7);
                    }
                    entries.AddRange(append);
                }

                if (userEntry != null)
                {
                    // Replace local performance only if higher or equal score
                    var record = Context.Database.GetLevelRecord(levelId);
                    if (record == null || !record.BestPerformances.ContainsKey(chartType) ||
                        record.BestPerformances[chartType].Score < userEntry.score ||
                        (record.BestPerformances[chartType].Score == userEntry.score && record.BestPerformances[chartType].Accuracy < userEntry.accuracy))
                    {
                        if (record == null)
                        {
                            record = new LevelRecord
                            {
                                LevelId = levelId
                            }
                        }
                        ;

                        var newBest = new LevelRecord.Performance
                        {
                            Score = userEntry.score,
                            Accuracy = userEntry.accuracy
                        };
                        record.BestPerformances[chartType] = newBest;
                        Context.Database.SetLevelRecord(record);

                        if (Context.LevelManager.LoadedLocalLevels.ContainsKey(levelId))
                        {
                            Context.LevelManager.LoadedLocalLevels[levelId].Record = record;
                        }

                        OnLevelBestPerformanceUpdated.Invoke(levelId);
                        Debug.Log("Updating: " + levelId);
                    }
                }

                return (userRank, entries);
            }));
        }

        return(RestClient.GetArray <RankingEntry>(new RequestHelper
        {
            Uri = $"{Context.ApiUrl}/levels/{levelId}/charts/{chartType}/records",
            EnableDebug = true,
        }).Then(array => (-1, array.ToList())));
    }