示例#1
0
            public void ReturnsUnsuccessfulResultIfEmojiIsNotCustomEmoji()
            {
                var emoji     = new Emoji(null, "booga");
                var getActual = CDN.GetEmojiUrl(emoji);

                Assert.False(getActual.IsSuccess);
                Assert.IsType <UnsupportedArgumentError>(getActual.Unwrap());
            }
示例#2
0
            /// <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));
            }
示例#3
0
            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);
            }
示例#4
0
        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());
            }
        }
示例#5
0
        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());
            }
        }
示例#6
0
    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));
    }