Exemple #1
0
        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));
        }
Exemple #2
0
        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());
        }
Exemple #3
0
        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);
            }
        }
Exemple #4
0
        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);
        }
    }