public static ScPlayerScore Convert(this PlayerScore playerScore, IModParser modParser) { if (!_playerScores.TryGetValue(playerScore, out var scPlayerScore)) { _playerScores[playerScore] = scPlayerScore = new ScPlayerScore(playerScore); } scPlayerScore.Accuracy = OsuScore.CalculateAccuracy((PlayMode)scPlayerScore.Mode, scPlayerScore.Hit50, scPlayerScore.Hit100, scPlayerScore.Hit300, scPlayerScore.HitMiss, scPlayerScore.HitGeki, scPlayerScore.HitKatu) * 100; scPlayerScore.Grade = OsuScore.CalculateGrade((PlayMode)scPlayerScore.Mode, (Mods)scPlayerScore.Mods, scPlayerScore.Accuracy, scPlayerScore.Hit50, scPlayerScore.Hit100, scPlayerScore.Hit300, scPlayerScore.HitMiss); scPlayerScore.ModsStr = modParser.GetModsFromEnum(scPlayerScore.Mods, true); return(scPlayerScore); }
public async Task GetBeatmap(string ID, string mode = null, string action = null) { SocketUserMessage msg = await Context.Channel.SendMessageAsync("Fetching data...", attachID : true); OsuGameModes gameMode = (string.IsNullOrEmpty(mode) ? OsuGameModes.None : OsuGameModesConverter.FromOfficialNumeration(byte.Parse(mode))); OsuBeatmap beatmap = await OsuNetwork.DownloadBeatmap(int.Parse(ID), gameMode, msg); gameMode = beatmap.GameMode; OsuUser creator = await OsuNetwork.DownloadUser(beatmap.Creator, OsuGameModes.STD, tolerateNull : true, maxAttempts : 3); Task <OsuScore[]> bestPlayDownloader = OsuNetwork.DownloadBeatmapBest(beatmap, gameMode, scoreCount: 3, logger: msg, tolerateNull: true, maxAttempts: 2); OsuBoundUserDB bound = await OsuDB.GetBoundUserBy_DiscordID(Context.Message.Author.ID); Task <OsuScore[]> boundBestScoreDownloader = OsuNetwork.DownloadBeatmapBest(beatmap, gameMode, user: bound.UserID, logger: msg, tolerateNull: true, maxAttempts: 3); EmbedBuilder eb = beatmap.ToEmbedBuilder(gameMode, creator); OsuScore[] bestPlays = await bestPlayDownloader; await msg.EditAsync("Fetching best plays...", null); if (bestPlays[0] != null) { EmbedFieldBuilder rankingsField = new EmbedFieldBuilder { Name = $"{CustomEmoji.Osu.Gamemode.GetGamemodeEmoji(beatmap.GameMode)}", Value = "report to LtLi0n" }; OsuUser[] bestPlayUsers = new OsuUser[bestPlays.Length]; int longestName = int.MinValue; for (int i = 0; i < bestPlays.Length; i++) { bestPlayUsers[i] = await OsuNetwork.DownloadUser(bestPlays[i].Username, beatmap.GameMode, logger : msg, maxAttempts : 2); if (bestPlayUsers[i].Username.Length > longestName) { longestName = bestPlayUsers[i].Username.Length; } } for (int i = 0; i < bestPlayUsers.Length; i++) { string toAdd = bestPlays[i].ToScoreString(bestPlayUsers[i].Country, gameMode, i + 1, nameFormat: '\u200b'); if (i == 0) { rankingsField.Value = toAdd; } else { rankingsField.Value += toAdd; } } rankingsField.IsInline = true; eb.AddField(rankingsField); if (bound != null) { try { OsuScore boundBestScore = (await boundBestScoreDownloader)[0]; if (boundBestScore != null) { eb.AddField(x => { x.Name = $"Your best"; x.Value = boundBestScore.ToScoreString(bound.Country, gameMode, includeReplay: boundBestScore.HasReplay, nameFormat: '\u200b'); x.IsInline = true; }); } } catch (Exception e) { } } } else { string[] lines_f1 = eb.Fields[0].Value.ToString().Split('\n'); lines_f1[0] += "\t\t\u200b"; string convertBack = ""; Tool.ForEach(lines_f1, x => convertBack += (x + '\n')); eb.Fields[0].Value = convertBack; eb.Fields[1].Value = '\u200b'; } string additional = string.Empty; if (action != null) { additional = action.ToLower() == "json" ? $"```json\n{JValue.Parse(JsonConvert.SerializeObject(beatmap)).ToString(Formatting.Indented)}```" : string.Empty; } await msg.EditAsync((additional), embed : eb.Build()); }