public void SetModel(LevelRecord.Performance performance) { SetModel(new RankingEntry { score = performance.Score, accuracy = performance.Accuracy }); }
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()))); }