// ReSharper disable once ReturnTypeCanBeEnumerable.Global
        public static EmojiRenderResult[] RenderEmojiAsStringList(EmojiPackType pack, IList <long> activeEmoji)
        {
            var result     = new List <EmojiRenderResult>();
            var dictionary = emojiList[pack];

            for (int i = 0; i < activeEmoji.Count; i++)
            {
                bool u   = false;
                int  max = Math.Min(i + 3, activeEmoji.Count - 1);
                int  j   = max;
                for (; j >= i; j--)
                {
                    var a = new List <long>();
                    for (int n = i; n <= j; n++)
                    {
                        a.Add(activeEmoji[n]);
                    }

                    var emojiString = GetStringForCodes(a);
                    if (dictionary.Contains(emojiString))
                    {
                        u = true;
                        result.Add(new EmojiRenderResult()
                        {
                            emojiCode = emojiString
                        });
                        break;
                    }
                }

                if (u)
                {
                    // Такой сиквенс, который начинается на activeEmoji[i] есть в словаре
                    i = j;
                }
                else
                {
                    // Такого сиквенса не существует
                    result.Add(new EmojiRenderResult()
                    {
                        isSuccess = false,
                        rawText   = Utf8ToUnicode.UnicodeCodeToString(activeEmoji[i])
                    });
                }
            }

            return(result.ToArray());
        }
        private static string AddMessageReactionHTMLWithEmojiPack(
            NKDiscordChatWidget.DiscordBot.Classes.EventMessageCreate.EventMessageCreate_Reaction reaction,
            EmojiPackType emojiPack
            )
        {
            var longs = Utf8ToUnicode.ToUnicodeCode(reaction.emoji.name);
            var u     = longs.Any(code => !UnicodeEmojiEngine.IsInIntervalEmoji(code, emojiPack));

            if (u)
            {
                // Реакция без ID, но при этом не является эмодзи, рисуем как есть
                return(HttpUtility.HtmlEncode(reaction.emoji.name));
            }

            // Реакция без ID и является эмодзи, поэтому рисуем как картинку
            var localEmojiList = UnicodeEmojiEngine.RenderEmojiAsStringList(
                emojiPack, longs);
            var emojiHtml = "";

            // ReSharper disable once LoopCanBeConvertedToQuery
            foreach (var item in localEmojiList)
            {
                if (!item.isSuccess)
                {
                    // Этого символа нет в паке, выводим как есть. Куда деваться
                    emojiHtml += HttpUtility.HtmlEncode(item.rawText);
                    continue;
                }

                // hint: localEmojiList.Count может быть больше 1 в случае сложных эмодзи типа :one:
                var emojiSubFolderName = UnicodeEmojiEngine.GetImageSubFolder(emojiPack);
                var emojiExtension     = UnicodeEmojiEngine.GetImageExtension(emojiPack);
                var url = string.Format("/images/emoji/{0}/{1}.{2}",
                                        emojiSubFolderName,
                                        item.emojiCode,
                                        emojiExtension
                                        );

                emojiHtml += string.Format("<img src='{0}' alt=':{1}:'>",
                                           HttpUtility.HtmlEncode(url),
                                           HttpUtility.HtmlEncode(reaction.emoji.name)
                                           );
            }

            return(emojiHtml);
        }
        public static string GetImageSubFolder(EmojiPackType pack)
        {
            switch (pack)
            {
            case EmojiPackType.Twemoji:
                return("twemoji");

            case EmojiPackType.JoyPixels:
                return("joypixels");

            case EmojiPackType.StandardOS:
                return("");

            default:
                return("");
            }
        }
        public static string GetImageExtension(EmojiPackType pack)
        {
            switch (pack)
            {
            case EmojiPackType.Twemoji:
                return("svg");

            case EmojiPackType.JoyPixels:
                return("png");

            case EmojiPackType.StandardOS:
                return("");

            default:
                return("");
            }
        }
        public static string RenderEmojiStringListAsHtml(
            IEnumerable <UnicodeEmojiEngine.EmojiRenderResult> codes,
            EmojiPackType pack,
            Dictionary <string, string> waitDictionary,
            int emojiShow
            )
        {
            var text = "";
            var emojiSubFolderName = UnicodeEmojiEngine.GetImageSubFolder(pack);
            var emojiExtension     = UnicodeEmojiEngine.GetImageExtension(pack);

            foreach (var item in codes)
            {
                if (item.isSuccess)
                {
                    var wait = GetWaitString();
                    var url  = string.Format("/images/emoji/{0}/{1}.{2}",
                                             emojiSubFolderName,
                                             item.emojiCode,
                                             emojiExtension
                                             );

                    waitDictionary[wait] = string.Format(
                        "<span class='emoji unicode-emoji {0}'><img src='{1}' alt=':{2}:'></span>",
                        (emojiShow == 1) ? "blur" : "",
                        HttpUtility.HtmlEncode(url),
                        HttpUtility.HtmlEncode(item.emojiCode)
                        );

                    text += wait;
                }
                else
                {
                    text += item.rawText;
                }
            }

            return(text);
        }
 public static bool IsInIntervalEmoji(long code, EmojiPackType pack)
 {
     return(IsInStandardUnicodeEmoji(code) || emojiCodesList[pack].Contains(code));
 }