public void ReturnsUnsuccessfulResultIfEmojiIsNotCustomEmoji() { var emoji = new Emoji(null, "booga"); var getActual = CDN.GetEmojiUrl(emoji); Assert.False(getActual.IsSuccess); Assert.IsType <UnsupportedArgumentError>(getActual.Unwrap()); }
/// <inheritdoc /> protected override IEnumerable <Result <Uri> > GetImageUris ( Optional <CDNImageFormat> imageFormat = default, Optional <ushort> imageSize = default ) { var emoji = new Emoji(new Snowflake(0), null); yield return(CDN.GetEmojiUrl(emoji, imageFormat, imageSize)); yield return(CDN.GetEmojiUrl(emoji.ID !.Value, imageFormat, imageSize)); }
public void ReturnsCorrectAddressWithAnimatedEmojiAndCustomFormat() { var expected = new Uri ( this.ValidUriWithoutExtension + ".png" ); var emoji = new Emoji(new Snowflake(0), null, IsAnimated: true); var getActual = CDN.GetEmojiUrl(emoji, CDNImageFormat.PNG); Assert.True(getActual.IsSuccess); Assert.Equal(expected, getActual.Entity); }
public async Task YTSearch([Remainder] string query) { query.FormatForURL("+"); if (Uri.TryCreate($"https://www.youtube.com/results?search_query={query}&page=1", UriKind.Absolute, out Uri result)) { var list = new List <TrackInfo>(); try { string html = await Program.Instance.Audio.WebClient.DownloadStringTaskAsync(result); // Search string string pattern = "<div class=\"yt-lockup-content\">.*?title=\"(?<NAME>.*?)\".*?</div></div></div></li>"; MatchCollection matches = Regex.Matches(html, pattern, RegexOptions.Singleline); for (int ctr = 0; ctr <= matches.Count - 1; ctr++) { // Title string title = matches[ctr].Groups[1].Value; // Author string author = matches[ctr].Value.Substring("/user/", "class").Replace('"', ' ').Trim(); // Duration string duration = matches[ctr].Value.Substring("id=\"description-id-", "span").Substring(": ", "<").Replace(".", ""); // Url string url = String.Concat("http://www.youtube.com/watch?v=", matches[ctr].Value.Substring("watch?v=", "\"")); // Thumbnail string thumbnail = "https://i.ytimg.com/vi/" + matches[ctr].Value.Substring("watch?v=", "\"") + "/mqdefault.jpg"; // Remove playlists if (title != "__title__") { if (duration != "") { // Add item to list var track = new TrackInfo { Name = title, Author = author, Duration = duration, URL = url, Thumb = thumbnail }; list.Add(track); } } } } catch (Exception ex) { await Program.Instance.Logger.LogDiscord(new LogMessage(LogSeverity.Error, "Search", ex.Message)); } if (list.Count < 1) { await ReplyAsync("<:youtube:463135962936115214> No results, try different search terms"); return; } var emb = new EmbedBuilder { Description = "YouTube results", Color = Color.Red, Timestamp = DateTime.UtcNow }.WithFooter(new EmbedFooterBuilder() .WithIconUrl(CDN.GetEmojiUrl(463135962936115214, false))); int i = 1; foreach (var track in list) { string title = track.Name; string author = track.Author; string url = track.URL; emb.AddField($"{i}", $"{author} - {title}\n\r{url}"); i++; } await Context.Channel.SendMessageAsync("", embed : emb.Build()); } }
public async Task SCSearch([Remainder] string query) { query.FormatForURL("%20"); //609550b81957a871adb254ababcc435c if (Uri.TryCreate($"https://api.soundcloud.com/tracks?q={query}&client_id=qeKwELFPARbJJEy0QYSOzftXk8acBMsw&limit=15", UriKind.Absolute, out Uri result)) { var list = new List <TrackInfo>(); try { string json = await Program.Instance.Audio.WebClient.DownloadStringTaskAsync(result); json = json.Replace("[{", "").Replace("}]", ""); foreach (var o in json.Split("},{", StringSplitOptions.RemoveEmptyEntries)) { JObject obj = JObject.Parse("{" + o + "}"); string kind = (string)obj["kind"]; if (!kind.Equals("track")) { continue; } string title = (string)obj["title"]; string author = (string)obj["user"]["username"]; string duration = TimeSpan.FromMilliseconds(double.Parse((string)obj["duration"])).ToString(); string url = (string)obj["permalink_url"]; string thumbnail = (string)obj["artwork_url"]; if (duration != "") { // Add item to list var track = new TrackInfo { Name = title, Author = author, Duration = duration, URL = url, Thumb = thumbnail, }; list.Add(track); } } } catch (JsonReaderException ex) { await Program.Instance.Logger.LogDiscord(new LogMessage(LogSeverity.Error, "Search", "", ex)); File.WriteAllText("badjson.json", await Program.Instance.Audio.WebClient.DownloadStringTaskAsync(result)); } catch (Exception ex) { await Program.Instance.Logger.LogDiscord(new LogMessage(LogSeverity.Error, "Search", "", ex)); } if (list.Count < 1) { await ReplyAsync("<:soundcloud:463135942027509771> No results, try different search terms"); return; } var emb = new EmbedBuilder { Description = "SoundCloud results", Color = Color.Orange, Timestamp = DateTime.UtcNow }.WithFooter(new EmbedFooterBuilder() .WithIconUrl(CDN.GetEmojiUrl(463135942027509771, false))); int i = 1; foreach (var track in list) { string title = track.Name; string author = track.Author; string url = track.URL; emb.AddField($"{i}", $"{author} - {title}\n\r{url}"); i++; } await Context.Channel.SendMessageAsync("", embed : emb.Build()); } }
public async Task <Result> JumboAsync(IEmoji emoji) { string emoteUrl; if (emoji.ID is not null) { var getEmoteUrl = CDN.GetEmojiUrl(emoji); if (!getEmoteUrl.IsSuccess) { return(Result.FromError(getEmoteUrl)); } emoteUrl = getEmoteUrl.Entity.ToString(); } else { if (emoji.Name is null) { return(new UserError("Looks like a bad emoji. Oops!")); } var emojiName = emoji.Name; if (EmojiMap.Map.TryGetValue(emoji.Name, out var mappedEmote)) { emojiName = mappedEmote; } var hexValues = new List <string>(); for (var i = 0; i < emojiName.Length; ++i) { var codepoint = char.ConvertToUtf32(emojiName, i); // 0xFE0F is a variation marker, which explicitly requests a colourful version of the emoji, and // not a monochrome text variant. Since Twemoji only provides the colourful ones, we can safely // skip it. if (codepoint == 0xFE0F) { continue; } var codepointHex = codepoint.ToString("x"); hexValues.Add(codepointHex); // ConvertToUtf32() might have parsed an extra character as some characters are combinations of two // 16-bit characters which start at 0x00d800 and end at 0x00dfff (Called surrogate low and surrogate // high) // // If the character is in this span, we have already essentially parsed the next index of the string // as well. Therefore we make sure to skip the next one. if (char.IsSurrogate(emojiName, i)) { ++i; } } var emojiCode = string.Join("-", hexValues); emoteUrl = $"https://raw.githubusercontent.com/twitter/twemoji/master/assets/72x72/{emojiCode}.png"; } var response = await _httpClient.GetAsync(emoteUrl, HttpCompletionOption.ResponseHeadersRead); if (!response.IsSuccessStatusCode) { return(new UserError("Sorry, I couldn't find that emote.")); } var embed = new Embed { Colour = Color.MediumPurple, Image = new EmbedImage(emoteUrl) }; var sendEmoji = await _channelAPI.CreateMessageAsync ( _context.ChannelID, embeds : new[] { embed }, ct : this.CancellationToken ); return(sendEmoji.IsSuccess ? Result.FromSuccess() : Result.FromError(sendEmoji)); }