public async Task GetBeatmapPack(string ID) { SocketUserMessage msg = await Context.Channel.SendMessageAsync("Fetching data...", attachID : true); IEnumerable <OsuBeatmap> beatmapPack = await OsuNetwork.DownloadBeatmapPack(int.Parse(ID), logger : msg); beatmapPack = beatmapPack.OrderBy(x => x.Difficulty.Rating).OrderBy(x => x.GameMode); OsuGameModes[] gameModes; //get amount of gamemodes present in the beatmapset { List <OsuGameModes> collector = new List <OsuGameModes>(); Tool.ForEach(beatmapPack, x => { if (!collector.Contains(x.GameMode)) { collector.Add(x.GameMode); } }); gameModes = collector.ToArray(); } OsuBeatmap packRef = beatmapPack.First(); OsuUser creator = await OsuNetwork.DownloadUser(packRef.Creator, OsuGameModes.STD, tolerateNull : true, maxAttempts : 3); EmbedBuilder eb = new EmbedBuilder(); eb.WithAuthor(x => { x.Name = packRef.Title; x.Url = packRef.URL; x.IconUrl = "https://cdn.discordapp.com/attachments/420948614966411299/421301562032390164/beatmapPackLogo.png"; }); eb.Image = $"{packRef.CoverPictureURL}"; //$"https://b.ppy.sh/thumb/{packRef.BeatmapSetID}l.jpg"; eb.Description = ""; if (creator != null) { eb.Description += $"Created By: [{creator.Username}]({creator.ProfileURL})\n"; } eb.Description += $"📥 **[Download]({packRef.DownloadURL(false)})**"; eb.Color = Color.FromArgb(28, 164, 185); eb.Thumbnail = packRef.ThumbnailPictureURL; eb.Footer = packRef.GetFooter(creator); eb.AddField(x => { x.Name = $"{packRef.Length} ⏱ {packRef.FavouriteCount} ❤️"; x.Value = $"BPM: **{string.Format("{0:0.##}", packRef.BPM)}**"; }); //Display beatmaps { void addBeatmapField(OsuGameModes gamemode, bool includeName) { eb.AddField(x => { x.Name = includeName ? $"{CustomEmoji.Osu.Gamemode.GetGamemodeEmoji(gamemode)} {OsuGameModesConverter.GameModeName(gamemode)}" : CustomEmoji.Void.ToString(); x.Value = "empty"; x.IsInline = true; }); } for (int i = 0; i < gameModes.Length; i++) { for (int ii = 0; ii < 2; ii++) { addBeatmapField(gameModes[i], ii == 0); } } OsuGameModes previousMode = OsuGameModes.None; int efbRef = 0; int efbPos = -1; foreach (OsuBeatmap beatmap in beatmapPack) { if (previousMode != beatmap.GameMode) { previousMode = beatmap.GameMode; efbPos++; efbRef = 0; } string beatmapVersion = beatmap.Version; if (beatmapVersion.Length > 14) { beatmapVersion = beatmapVersion.Substring(0, 14) + "..."; } string beatmapInfo = $"{CustomEmoji.Osu.Difficulty.GetDifficultyEmoji(beatmap.Difficulty.Rating, beatmap.GameMode)} **[{beatmapVersion}](https://osu.ppy.sh/b/{beatmap.BeatmapID})**\n"; // - *{string.Format("{0:0.##}", beatmap.Difficulty.Rating)}★* if (eb.Fields[efbPos * 2 + efbRef + 1].Value == "empty") { eb.Fields[efbPos * 2 + efbRef + 1].Value = beatmapInfo; } else { eb.Fields[efbPos * 2 + efbRef + 1].Value += beatmapInfo; } efbRef++; if (efbRef == 2) { efbRef = 0; } } } //Insert a zero width space char to make a new line or remove useless \n for (int i = 1; i < eb.Fields.Count; i++) { string efbStr = eb.Fields[i].Value.ToString(); if (i < eb.Fields.Count - 2) { eb.Fields[i].Value = efbStr + '\u200b'; } else { if (eb.Fields[i].Value == "empty") { eb.Fields.Remove(eb.Fields[i]); } else { eb.Fields[i].Value = efbStr.Remove(efbStr.Length - 1, 1); } } } await msg.EditAsync($"showing {beatmapPack.Count()} beatmaps", eb.Build()); }
//Thanks to peppy no longer needed /*public static async Task<bool> ReplayExists(OsuGameModes gameMode, object beatmapID, object userID) => (await NetworkHandler.DownloadJSON( * $"{api}get_replay?" + * $"k={Keys.API_KEYS["Osu"]}&" + * $"m={OsuGameModesConverter.ToOfficialNumeration(gameMode)}&" + * $"b={beatmapID}&" + * $"u={userID}", 2)).Contains("content");*/ private static async Task <T[]> DownloadObjects <T>(string url, int maxAttempts, SocketUserMessage logger, bool tolerateNull = false, object additional = null) { string json = await NetworkHandler.DownloadJSON(url, maxAttempts); try { object[] rawTypes = JsonConvert.DeserializeObject <object[]>(json); if (rawTypes.Length == 0) { if (!tolerateNull) { throw new ArgumentNullException(); } else { return(new T[1]); //so it can return null when obtaining a singular object with [0] } } T[] converted = new T[rawTypes.Length]; for (int i = 0; i < rawTypes.Length; i++) { converted[i] = (T)(additional != null ? Activator.CreateInstance(typeof(T), rawTypes[i], additional) : Activator.CreateInstance(typeof(T), rawTypes[i])); } return(converted); } catch (ArgumentNullException e) { if (logger != null) { if (typeof(OsuUser) == typeof(T)) { await logger.EditAsync( "User was unable to be retrieved from the official osu! api. ❔\n" + "Possible instances: bound user, top 3 players of a beatmap", null); } if (typeof(OsuBeatmap) == typeof(T)) { await logger.EditAsync("This beatmap(or beatmap pack) was unable to be retrieved from the official osu! api. ❔", null); } else if (typeof(OsuUserRecent) == typeof(T)) { await logger.EditAsync($"No recent plays have been found for game mode {OsuGameModesConverter.GameModeName((OsuGameModes)additional)}. 🔎", null); } else if (typeof(OsuScore) == typeof(T)) { await logger.EditAsync($"Scores were unable to be retrieved from the official osu! api. 🔎", null); } throw e; } } return(default(T[])); }
public async Task OsuBindUser([Remainder] string input) { OsuBoundUserDB bound = await OsuDB.GetBoundUserBy_DiscordID(Context.Message.Author.ID); string[] args = input.Split(' '); if (args[0].ToLower() == "mainmode") { if (bound == null) { await Context.Channel.SendMessageAsync("You need to bind your osu user first. `OsuBind [username]`"); } else { if (args.Length == 1) { await Context.Channel.SendMessageAsync("You need to specify a Game Mode type. It defaults to `standard`."); } else { OsuGameModes gameMode = OsuGameModesConverter.FromOfficialName(input.Substring(args[0].Length + 1), true); bound.MainMode = gameMode; await OsuDB.UpdateBoundOsuUser(bound); await Context.Channel.SendMessageAsync($"Main mode has been successfully changed to **{OsuGameModesConverter.GameModeName(gameMode)}**!"); } } } else { OsuUser osuUser = await OsuNetwork.DownloadUser(input, OsuGameModes.STD); if (bound == null) { await OsuDB.RegisterBoundOsuUser(osuUser, Context.Message.Author.ID); await Context.Channel.SendMessageAsync($"Binded {input} to `{OsuSQL.table_name}`"); } else { await Context.Channel.SendMessageAsync($"{input} is already binded."); } } }