Ejemplo n.º 1
0
        public MapStats(OsuBeatmap beatmap, OsuMods mods)
        {
            Beatmap = beatmap;
            Mods    = mods;

            Calculate();
        }
Ejemplo n.º 2
0
        ///Defines the limit of difficulty values based on the mods used
        public static double CalculateDifficultyLimit(OsuMods mods)
        {
            double limit = 10;

            if ((mods & OsuMods.HardRock) != 0 && ((mods & OsuMods.DoubleTime) != 0 || (mods & OsuMods.Nightcore) != 0))
            {
                limit = 11;
            }
            return(limit);
        }
Ejemplo n.º 3
0
        ///Returns a Beatmap object containing information on the map
        public static OsuBeatmap GetBeatmap(string id, OsuMods mods = OsuMods.None, OsuMode mode = OsuMode.Standard)
        {
            string url = apiUrl + "get_beatmaps?k=" + OsuApiKey.Key + "&b=" + id + "&m=" + (int)mode + "&a=1&mods=" +
                         (int)mods.ModParser(true);
            List <OsuBeatmap> maps = APIHelper <List <OsuBeatmap> > .GetData(url, true);

            if (maps != null && maps.Count > 0)
            {
                maps[0].Mode     = mode;
                maps[0].Mods     = mods;
                maps[0].MapStats = new MapStats(maps[0], mods);
            }

            return((maps != null && maps.Count > 0) ? maps[0] : null);
        }
Ejemplo n.º 4
0
        ///Applies mods to the difficulty values
        public static double CalculateDifficulty(OsuMods mods, double baseValue)
        {
            double value = baseValue;
            double limit = CalculateDifficultyLimit(mods);

            if ((mods & OsuMods.HardRock) != 0)
            {
                value *= 1.4f;
            }

            if ((mods & OsuMods.Easy) != 0)
            {
                value *= 0.5f;
            }

            return(System.Math.Max(System.Math.Min(value, limit), 0));
        }
Ejemplo n.º 5
0
        public static float CalculateDifficulty(OsuMods mods, float baseValue)
        {
            float value = baseValue;
            float limit = CalculateDifficultyLimit(mods);

            if ((mods & OsuMods.HardRock) != 0)
            {
                value *= 1.4f;
            }

            if ((mods & OsuMods.Easy) != 0)
            {
                value *= 0.5f;
            }

            return(Mathf.Max(Mathf.Min(value, limit), 0));
        }
Ejemplo n.º 6
0
        ///Converts an OsuMods enum to an API-ready enum
        public static OsuMods ModParser(this OsuMods mods, bool forApi = false)
        {
            OsuMods _mods = mods;

            //Stuff like NC has DT aswell, we gotta filter stuff like that
            if (!forApi)
            {
                if ((mods & OsuMods.Nightcore) == OsuMods.Nightcore)
                {
                    _mods &= ~OsuMods.DoubleTime;
                }
            }
            else
            {
                //If target is API usage, we can only have several mods available
                _mods &= OsuMods.APIMods;
            }

            return(_mods);
        }
Ejemplo n.º 7
0
        public async Task GetCompare(string osuId, bool findWithUsername, bool dUser = false, ulong dUserId = 0)
        {
            try
            {
                CakeUser databaseUser = null;
                if (!dUser)
                {
                    databaseUser = await GetDatabaseEntityAsync(Module.Context.User.Id).ConfigureAwait(false);
                }
                else
                {
                    databaseUser = await GetDatabaseEntityAsync(dUserId).ConfigureAwait(false);
                }
                var mode = databaseUser.OsuMode;

                if (osuId.IsNullOrEmpty())
                {
                    osuId            = databaseUser.OsuId.ToString();
                    findWithUsername = false;
                }

                var user  = GetJsonUser(osuId, findWithUsername, mode);
                var info  = "";
                var mapId = Database.Queries.ChannelQueries.FindOrCreateChannel(Module.Context.Channel.Id).Result.OsuMapId;

                if (mapId == 0)
                {
                    throw new CakeException("`No beatmap found in channel`");
                }

                var scoreBuilder = new OsuScoreBuilder
                {
                    BeatmapId = mapId,
                    Mode      = mode,
                    UserId    = user.user_id
                };

                var score = scoreBuilder.Execute();

                if (!score.Any())
                {
                    throw new CakeException($"`No score(s) found in {mapId}`");
                }

                foreach (var t in score)
                {
                    var modName = t.enabled_mods == "0" ? "No Mod" : OsuMods.Modnames(Convert.ToInt32(t.enabled_mods));

                    var dateTicks  = TimeSpan.FromTicks(DateTime.UtcNow.Ticks - t.date.UtcTicks);
                    var timeFormat = new TimeFormat(dateTicks);

                    var date = dateTicks.TotalDays > 30 ? timeFormat.ToShortString() : timeFormat.ToLongString();

                    info += $"***{modName}*** \n";
                    if (t.pp != null)
                    {
                        info += $"⤷ **PP:** {Math.Round((double)t.pp, 0)} " +
                                $"**Rank:**{t.rank.LevelEmotes()} ";
                    }
                    else
                    {
                        info += $"⤷ **Rank:**{t.rank.LevelEmotes()} ";
                    }

                    info += $"**Accuracy:** {Math.Round(t.calculated_accuracy, 2)}% " +
                            $"**Combo:** {t.maxcombo}({t.Beatmap.max_combo}) \n" +
                            $" {OsuEmoteCodes.Emote300} {t.count300} ♢ {OsuEmoteCodes.Emote100} {t.count100} ♢ {OsuEmoteCodes.Emote50} {t.count50} ♢ {OsuEmoteCodes.EmoteX} {t.countmiss}\n " +
                            $" {date} ago\n\n";
                }

                await SendEmbedAsync(Embeds.OsuModuleEmbeds.ReturnChannelCompare(user, score[0].Beatmap, info, mode));
            }
            catch (CakeException e)
            {
                await SendMessageAsync(e.Message);
            }
            catch (Exception e)
            {
                _logger.LogError(e);
            }
        }
Ejemplo n.º 8
0
        public async Task GetUserRecent(string osuId, bool findWithUsername, bool dUser = false, ulong dUserId = 0)
        {
            try
            {
                CakeUser databaseUser = !dUser
                    ? await GetDatabaseEntityAsync(Module.Context.User.Id)
                    : await GetDatabaseEntityAsync(dUserId);

                var info = "";

                if (osuId.IsNullOrEmpty())
                {
                    osuId            = databaseUser.OsuId.ToString();
                    findWithUsername = false;
                }

                var user = GetJsonUser(osuId, findWithUsername, databaseUser.OsuMode);

                var recentBuilder = new OsuUserRecentBuilder
                {
                    Mode   = databaseUser.OsuMode,
                    Limit  = "1",
                    UserId = user.user_id
                };
                var recent = OsuTimeConverter.ConvertScorableDate(user.country, recentBuilder.Execute());

                var retryCount = 0;

                if (recent.Count == 0)
                {
                    throw new CakeException($"`No recent play(s) has been found for {user.username}`");
                }

                for (var i = 0; i < recent.Count; i++)
                {
                    var t = recent[i];

                    retryCount = OsuCheckRetries.Tries(databaseUser.OsuMode, t.user_id, t.Beatmap.beatmap_id);
                    info       = $"**{t.rounded_score} ♢ " +
                                 $"{t.rank.LevelEmotes()} ♢ {t.maxcombo}x*({ t.Beatmap.max_combo}x)*** {OsuMods.Modnames(Convert.ToInt32(t.enabled_mods))} \n " +
                                 $"{OsuEmoteCodes.Emote300} {t.count300} ♢ {OsuEmoteCodes.Emote100} {t.count100} ♢ {OsuEmoteCodes.Emote50} {t.count50} ♢ {OsuEmoteCodes.EmoteX} {t.countmiss} ♢ {Math.Round(t.calculated_accuracy, 2)}%\n";

                    if (t.rank == "F")
                    {
                        info += $"{Math.Round(t.completion, 2)}% completed ♢ if completed **{Math.Round(t.pp, 2)} PP**\n";
                    }
                    else
                    {
                        if (!t.choked)
                        {
                            info += $"**{Math.Round(t.pp, 2)} PP**\n\n";
                        }
                        else
                        {
                            info += $"**{Math.Round(t.pp, 2)} PP** ♢ {Math.Round(t.nochokepp, 2)} PP if FC ({Math.Round(t.nochokeaccuracy, 2)}%)\n\n";
                        }
                    }
                }

                await SendEmbedAsync(Embeds.OsuModuleEmbeds.ReturnUserRecent(user, recent[0].Beatmap, recent[0], info, databaseUser.OsuMode, retryCount));

                if (recent[0].Beatmap.beatmap_id != 0)
                {
                    OsuModule.SetMapId(recent[0].Beatmap.beatmap_id);
                }
            }
            catch (CakeException e)
            {
                await SendMessageAsync(e.Message);
            }
            catch (Exception e)
            {
                _logger.LogError(e);
            }
        }
Ejemplo n.º 9
0
        public async Task GetUserBest(string osuId, bool findWithUsername, bool recent, int?play, bool dUser = false, ulong dUserId = 0)
        {
            try
            {
                var      fields       = new List <Tuple <string, string> >();
                CakeUser databaseUser = !dUser
                    ? await GetDatabaseEntityAsync(Module.Context.User.Id)
                    : await GetDatabaseEntityAsync(dUserId);

                if (osuId.IsNullOrEmpty())
                {
                    osuId            = databaseUser.OsuId.ToString();
                    findWithUsername = false;
                }

                var user = GetJsonUser(osuId, findWithUsername, databaseUser.OsuMode);

                var bestBuilder = new OsuUserBestBuilder
                {
                    Mode       = databaseUser.OsuMode,
                    Limit      = (recent || play != null ? 100 : 5).ToString(),
                    UserId     = user.user_id,
                    Recent     = recent,
                    PlayNumber = play
                };

                var best = OsuTimeConverter.ConvertScorableDate(user.country, bestBuilder.Execute());

                foreach (var item in best)
                {
                    if (play != null)
                    {
                        item.play_number = (int)play;
                    }

                    var dateTicks  = TimeSpan.FromTicks(DateTime.UtcNow.Ticks - item.date.UtcTicks);
                    var timeFormat = new TimeFormat(dateTicks);

                    var date = dateTicks.TotalDays > 30 ? timeFormat.ToShortString() : timeFormat.ToLongString();

                    var starRating = Math.Abs(item.starrating) <= 0 ? item.Beatmap.difficultyrating : item.starrating;

                    fields.Add(new Tuple <string, string>($"#{item.play_number}: {item.Beatmap.complete_title} {OsuMods.Modnames(Convert.ToInt32(item.enabled_mods))} {Math.Round(starRating, 2)}★",
                                                          $@"⤷ **PP:** {Math.Round(item.pp, 0)} " +
                                                          $"**Rank:** {item.rank.LevelEmotes()} " +
                                                          $"**Combo:** {item.maxcombo}({item.Beatmap.max_combo}) \n" +
                                                          $" {OsuEmoteCodes.Emote300} {item.count300} ♢ {OsuEmoteCodes.Emote100} {item.count100} ♢ {OsuEmoteCodes.Emote50} {item.count50} ♢ {OsuEmoteCodes.EmoteX} {item.countmiss} ♢ {Math.Round(item.calculated_accuracy, 2)}%\n" +
                                                          $" **Downloads:** [Beatmap]({item.Beatmap.beatmap_url})" +
                                                          $"([no vid]({item.Beatmap.beatmap_url + "n"})) " +
                                                          $"[Bloodcat]({item.Beatmap.bloodcat})\n" +
                                                          $" {date} ago\n"));
                }

                await SendEmbedAsync(Embeds.OsuModuleEmbeds.ReturnUserBest(user, $"https://b.ppy.sh/thumb/{best.First().Beatmap.beatmapset_id}l.jpg", fields, databaseUser.OsuMode));
            }
            catch (CakeException e)
            {
                await SendMessageAsync(e.Message);
            }
            catch (Exception e)
            {
                _logger.LogError(e);
            }
        }