public async Task GetPpAsync( [Description("Id of the beatmap.")] long beatmapId = -1, [Description("Accuracy of the play.")] float accuracy = 100.0f, [OverrideTypeParser(typeof(EnumModeTypeParser))][Description("Modes of the play.")] Mode modes = Mode.None, [Description("Combo of the play.")] int combo = -1) { if (_osuService.LastBeatmapPerChannel.TryGetValue(Context.Channel.Id, out var bmId) && beatmapId == -1) { beatmapId = bmId; } else if (beatmapId != -1) { _osuService.AddOrUpdateValue(Context.Channel.Id, beatmapId); } if (beatmapId == -1) { await RespondEmbedAsync("Unknown beatmap."); return; } var ppData = await OppaiClient.GetPPAsync(beatmapId, modes, accuracy, combo); await RespondEmbedAsync(string.Format( "[This map](https://osu.ppy.sh/beatmaps/{5}) (`{1}` | `{2}%` | `{3}/{4} combos`) is worth: `{0}`pp", ppData.Pp, ppData.Mods.ToModeString(_osuService.Osu), accuracy, ppData.Combo, ppData.MaxCombo, beatmapId)); }
public async Task OsuRecentCommand([Remainder] string player = null) { var embed = new KaguyaEmbedBuilder(); OsuClient client = OsuBase.Client; User user = await DatabaseQueries.GetOrCreateUserAsync(Context.User.Id); Server server = await DatabaseQueries.GetOrCreateServerAsync(Context.Guild.Id); OsuSharp.User osuPlayer = player == null ? await client.GetUserByUserIdAsync(user.OsuId, GameMode.Standard) : await client.GetUserByUsernameAsync(player, GameMode.Standard); // Maybe the user provided an ID to search for. if (osuPlayer == null && long.TryParse(player, out long id)) { osuPlayer = await client.GetUserByUserIdAsync(id, GameMode.Standard); } // If it's still null, they don't exist. if (osuPlayer == null) { embed.Description = $"{Context.User.Mention} Failed to acquire username! " + "Please specify a player or set your osu! username with " + $"`{server.CommandPrefix}osuset`!"; await ReplyAsync(embed : embed.Build()); return; } Score osuRecent = player == null ? (await client.GetUserRecentsByUserIdAsync(user.OsuId, GameMode.Standard, 1)).FirstOrDefault() : (await client.GetUserRecentsByUsernameAsync(player, GameMode.Standard, 1)).FirstOrDefault(); if (osuRecent == null) { embed.WithAuthor(author => { author .WithName($"{osuPlayer.Username} doesn't have any recent plays.") .WithIconUrl("https://a.ppy.sh/" + osuPlayer.UserId); }); await SendEmbedAsync(embed); return; } // Reset the embed as its values were changed in the above code. embed = new KaguyaEmbedBuilder(); Beatmap beatmap = await osuRecent.GetBeatmapAsync(); //Author embed.WithAuthor(author => { author .WithName($"Recent: {osuPlayer.Username} | {beatmap.Title} [{beatmap.Difficulty}] by {beatmap.Author}") .WithIconUrl("https://a.ppy.sh/" + osuPlayer.UserId); }); //Description PerformanceData scoredPerformance = await OppaiClient.GetPPAsync(osuRecent.BeatmapId, osuRecent.Mods, (float)osuRecent.Accuracy, osuRecent.MaxCombo); PerformanceData wouldbePerformance = await OppaiClient.GetPPAsync(osuRecent.BeatmapId, osuRecent.Mods, (float)osuRecent.Accuracy, beatmap.MaxCombo); string beatmapLink = $"https://osu.ppy.sh/b/{beatmap.BeatmapId}"; string discussionLink = $"https://osu.ppy.sh/beatmapsets/{beatmap.BeatmapsetId}/discussion"; string downloadLink = $"https://osu.ppy.sh/beatmapsets/{beatmap.BeatmapsetId}/download"; var descSb = new StringBuilder(); // Links (Row 0) descSb.AppendLine($"**Links:** [Listing]({beatmapLink}) ▸ [Modding]({discussionLink}) ▸ [Download]({downloadLink})"); descSb.AppendLine(); // Row 1 descSb.AppendLine($@"• {OsuBase.OsuGradeEmote(osuRecent.Rank)} {osuRecent.Mods.ToModeString(OsuBase.Client) .Replace("No Mode", "No Mod") .Replace("DTNC", "NC")} | {scoredPerformance.Stars:N2}★"); // Row 2 descSb.Append($"• **Combo:** {osuRecent.MaxCombo:N0}x / {beatmap.MaxCombo:N0}x ▸ "); descSb.AppendLine($"**Accuracy:** {osuRecent.Accuracy:N2}% ▸ **Score:** {osuRecent.TotalScore:N0}"); // Row 3 descSb.Append($"• {osuRecent.Count300:N0} / {osuRecent.Count100:N0} / {osuRecent.Count50:N0} / {osuRecent.Miss:N0} ▸ "); descSb.AppendLine($"**BPM:** {beatmap.Bpm:N0} ▸ **Length:** {beatmap.TotalLength.TotalMinutes:00}:{beatmap.TotalLength.Seconds:00}"); // Row 4 descSb.Append($"• **CS:** {GetStatNumAsString(scoredPerformance.Cs)} ▸ **AR:** {GetStatNumAsString(scoredPerformance.Ar)} ▸ "); descSb.AppendLine($"**OD:** {GetStatNumAsString(scoredPerformance.Od)} ▸ **HP:** {GetStatNumAsString(scoredPerformance.Hp)}"); // Row 5 descSb.AppendLine($"• **Performance:** {scoredPerformance.Pp:N2}pp ({wouldbePerformance.Pp:N2}pp for {osuRecent.Accuracy:N2}% FC)"); if (osuRecent.MaxCombo == beatmap.MaxCombo) { embed.SetColor(EmbedColor.GOLD); descSb.Append("Full combo!"); } embed.Description = descSb.ToString(); //Footer TimeSpan difference = DateTime.UtcNow - osuRecent.Date.Value.DateTime; string humanizedDif = difference.Humanize(2, minUnit: TimeUnit.Second); embed.WithFooter($"{osuPlayer.Username} performed this play {humanizedDif} ago."); await ReplyAsync(embed : embed.Build()); }
private static async Task Main() { //Osu Client var client = new OsuClient(new OsuSharpConfiguration { ApiKey = "" }); client.Logger.LogMessageReceived += Logger_LogMessageReceived; //Replay var rpl = ReplayFile.FromStream(new MemoryStream(File.ReadAllBytes(@"C:\Users\user\AppData\Local\osu!\Replays\a.osr"))); var replay = await client.GetReplayByUsernameAsync(142954, "Bikko", GameMode.Standard); var beatmap = await client.GetBeatmapByIdAsync(142954); var scores = await client.GetScoresByBeatmapIdAndUsernameAsync(142954, "Bikko", GameMode.Standard); var rplFle = ReplayFile.CreateReplayFile(replay, scores.First(), beatmap); //Oppai API var pp = await OppaiClient.GetPPAsync(824242); Console.WriteLine($"{pp.Pp} performance points"); pp = await OppaiClient.GetPPAsync(824242, Mode.DoubleTime | Mode.Hidden); Console.WriteLine($"{pp.Pp} performance points"); pp = await OppaiClient.GetPPAsync(824242, 99.0F); Console.WriteLine($"{pp.Pp} performance points"); pp = await OppaiClient.GetPPAsync(824242, Mode.DoubleTime | Mode.Hidden, 99.0F); Console.WriteLine($"{pp.Pp} performance points"); //Oppai API from a score or beatmap: var bmOppai = await client.GetBeatmapByHashAsync("86d35e59965dbf2078a0843f87415ebe"); pp = await bmOppai.GetPPAsync(Mode.DoubleTime | Mode.Hidden); Console.WriteLine($"{pp.Pp} performance points"); pp = await bmOppai.GetPPAsync(99.0F); Console.WriteLine($"{pp.Pp} performance points"); pp = await bmOppai.GetPPAsync(Mode.DoubleTime | Mode.Hidden, 99.0F); Console.WriteLine($"{pp.Pp} performance points"); var scoreOppai = await client.GetUserBestsByUsernameAsync("Evolia", GameMode.Standard); pp = await scoreOppai.First().GetPPAsync(); //Osu API endpoints var bm1 = await client.GetBeatmapByHashAsync("86d35e59965dbf2078a0843f87415ebe"); //EXTREME F*****G SOCA PARTY, Renard, Snaggletooth, Nogard's Extra var bm2 = await client.GetBeatmapByIdAsync(824242); //EXTREME F*****G SOCA PARTY, Renard, Snaggletooth, Nogard's Extra var bs3 = await client.GetBeatmapsAsync(); //Last 500 beatmaps submitted var bs4 = await client.GetBeatmapsAsync(DateTimeOffset.UtcNow - TimeSpan.FromDays(365)); //Bm submitted 1 year ago var bs5 = await client.GetBeatmapsAsync(DateTimeOffset.UtcNow - TimeSpan.FromDays(365), GameMode.Standard); //Bm submitted 1 year ago and only standard var bs6 = await client.GetBeatmapsAsync(GameMode.Taiko, false); //Latest 500 taiko map not converted var bs7 = await client.GetBeatmapsByAuthorIdAsync(19048); //Beatmaps by Mismagius var bs8 = await client.GetBeatmapsByAuthorUsernameAsync("DJPop"); //Beatmaps by DJPop var bs9 = await client.GetBeatmapsetAsync(1391); //Kanbu de Todomatte Sugu Tokeru ~ Kyouki no Udongein, IOSYS, DJPop var u1 = await client.GetUserByUserIdAsync(2363, GameMode.Standard); var u2 = await client.GetUserByUserIdAsync(6170507, GameMode.Taiko); var u3 = await client.GetUserByUsernameAsync("Mismagius", GameMode.Standard); var u4 = await client.GetUserByUsernameAsync("Exgon", GameMode.Catch); var ub1 = await client.GetUserBestsByUserIdAsync(6170507, GameMode.Taiko, 34); var ub2 = await client.GetUserBestsByUserIdAsync(10785994, GameMode.Mania); var ub3 = await client.GetUserBestsByUsernameAsync("Evolia", GameMode.Catch, 82); var ub4 = await client.GetUserBestsByUsernameAsync("LaChipsNinja", GameMode.Standard); var ur1 = await client.GetUserRecentsByUserIdAsync(6170507, GameMode.Taiko); var ur2 = await client.GetUserRecentsByUserIdAsync(10785994, GameMode.Mania); var ur3 = await client.GetUserRecentsByUsernameAsync("Evolia", GameMode.Catch, 82); var ur4 = await client.GetUserRecentsByUsernameAsync("LaChipsNinja", GameMode.Standard); var s1 = await client.GetScoresByBeatmapIdAndUserIdAsync(611753, 6170507, GameMode.Standard); var s2 = await client.GetScoresByBeatmapIdAndUsernameAsync(40017, "Rucker", GameMode.Standard); var s3 = await client.GetScoresByBeatmapIdAndUserIdAsync(40017, 284905, GameMode.Standard, Mode.Hidden | Mode.Flashlight); var s4 = await client.GetScoresByBeatmapIdAndUsernameAsync(40017, "Ekoro", GameMode.Standard, Mode.Hidden | Mode.Flashlight); var sb1 = await client.GetScoresByBeatmapId(1849148, GameMode.Standard); var sb2 = await client.GetScoresByBeatmapId(1849148, GameMode.Standard, Mode.Hidden); var r1 = await client.GetReplayByUsernameAsync(1849148, "twoj stary", GameMode.Standard); var r2 = await client.GetReplayByUserIdAsync(1849148, 1516650, GameMode.Standard); var mp1 = await client.GetMultiplayerRoomAsync(1936471); //Tracker var user = await client.GetUserByUsernameAsync("Evolia", GameMode.Standard); var tracker = new UserAnalyzer(client); tracker.EntityUpdated += EntityUpdated; tracker.AddEntity(user.UserId, user); var id = user.UserId; while (true) { await Task.Delay(10000); await tracker.UpdateEntityAsync(id); } }
private async Task DiscordOnMessageReceived(MessageReceivedEventArgs e) { var db = _serviceProvider.GetRequiredService <AatroxDbContext>(); var repo = db.RequestRepository <IGetOrAddRepository <GuildEntity> >(); var guild = await repo.GetOrAddAsync(e.Message.Guild.Id); if (!guild.ResolveOsuUrls) { return; } if (!Uri.TryCreate(e.Message.Content, UriKind.Absolute, out var uri)) { return; } if (uri.Host != "osu.ppy.sh") { return; } var url = uri.AbsoluteUri; var split = url.Split('/', StringSplitOptions.RemoveEmptyEntries); var mode = split[3].Split('#')[1]; mode = mode switch { "fruits" => "catch", "osu" => "standard", "taiko" => "taiko", _ => "standard" }; var beatmapId = split[4]; var beatmap = await Osu.GetBeatmapByIdAsync(long.Parse(beatmapId), (GameMode)Enum.Parse(typeof(GameMode), mode, true), true); ReadOnlyDictionary <float, PerformanceData>?pps = null; if (beatmap == null) { _log.Warn("Beatmap null?"); return; } var gc = (CachedGuildChannel)e.Message.Channel; var permission = gc.Guild.CurrentMember.GetPermissionsFor(gc); if (permission.Has(Permission.Administrator) || permission.Has(Permission.ManageMessages)) { await((CachedUserMessage)e.Message).ModifyAsync(x => x.Flags = MessageFlags.SuppressedEmbeds); } try { pps = await OppaiClient.GetPPAsync(long.Parse(beatmapId), new float[] { 100, 99, 98, 97, 95 }); } catch (Exception ex) { _log.Error("Attempting to get PP for a converted beatmap. It failed.", ex); } var successRate = 0.0; if (beatmap.PassCount.HasValue && beatmap.PlayCount.HasValue) { successRate = Math.Round((double)beatmap.PassCount.Value / beatmap.PlayCount.Value, 2) * 100; } var embed = new LocalEmbedBuilder { Color = _config.DefaultEmbedColor, Author = new LocalEmbedAuthorBuilder { Name = $"{beatmap.Title} - {beatmap.Artist} [{beatmap.Difficulty}] | {beatmap.GameMode}", Url = uri.ToString(), IconUrl = beatmap.ThumbnailUri.ToString() }, Description = $"This beatmap was made by `{beatmap.Author}` (`{beatmap.AuthorId}`). It has an average BPM of `{beatmap.Bpm}`.", Footer = new LocalEmbedFooterBuilder { Text = $"{beatmap.State} since {beatmap.LastUpdate:g} | {beatmap.FavoriteCount} favs | {successRate}% success rate" }, ThumbnailUrl = beatmap.ThumbnailUri.ToString() }; var str = $"CS: `{beatmap.CircleSize}` | AR: `{beatmap.ApproachRate}`" + $"\nOD: `{beatmap.OverallDifficulty}` | HP: `{beatmap.HpDrain}`"; if (beatmap.MaxCombo.HasValue) { str += $"\nMax combo: `{beatmap.MaxCombo}`"; } else if (pps != null) { str += $"\nMax combo: `{pps.First().Value.MaxCombo}`"; } if (pps != null) { str += $"\n`{Math.Round(pps.First().Value.Stars, 2)}` stars"; } embed.AddField("Difficulties", str, true); embed.AddField("Lengths", $"Length: `{beatmap.TotalLength:g}`" + $"\nHit Length: `{beatmap.HitLength:g}`", true); if (pps != null) { var lines = pps.Select(x => $"`{Math.Round(x.Key)}%: {Math.Round(x.Value.Pp)}`"); embed.AddField("Performance Points", string.Join(" | ", lines)); } if (beatmap.GameMode == GameMode.Catch || beatmap.GameMode == GameMode.Mania) { embed.AddField("Not supported!", $"**`{beatmap.GameMode}` is not supported. Star rating and performance points cannot be calculated.**"); } await e.Message.Channel.SendMessageAsync(embed : embed.Build()); AddOrUpdateValue(e.Message.Channel.Id, beatmap.BeatmapId); } }