示例#1
0
 public static void LoadGlobalBadges()
 {
     // fourtf badges
     Task.Run(() =>
     {
         try
         {
             var request = WebRequest.Create("https://fourtf.com/chatterino/badges.json");
             using (var response = request.GetResponse())
                 using (var stream = response.GetResponseStream())
                 {
                     var parser   = new JsonParser();
                     dynamic json = parser.Parse(stream);
                     foreach (var badge in json["badges"])
                     {
                         var emote = new LazyLoadedImage {
                             Url = badge["image"], Tooltip = badge["tooltip"]
                         };
                         foreach (string user in badge["users"])
                         {
                             FourtfGlobalBadges[user] = emote;
                         }
                     }
                 }
         }
         catch { }
     });
 }
示例#2
0
 public _CheerEmote(LazyLoadedImage light, LazyLoadedImage dark, int min_bits, string color)
 {
     this.light    = light;
     this.dark     = dark;
     this.min_bits = min_bits;
     this.color    = color;
 }
示例#3
0
        public void Add(LazyLoadedImage light, LazyLoadedImage dark, int min_bits, string color)
        {
            _CheerEmote emote = new _CheerEmote(light, dark, min_bits, color);
            int         i     = _CheerEmotes.BinarySearch(emote, new _MinBitsCompare());

            if (i >= 0)
            {
                _CheerEmotes[i] = emote;
            }
            else
            {
                _CheerEmotes.Insert(~i, emote);
            }
        }
示例#4
0
        public bool GetCheerEmote(int cheer, bool light, out LazyLoadedImage outemote, out string color)
        {
            _CheerEmote emote;

            outemote = null;
            color    = null;

            if ((emote = _findMaxBits(_CheerEmotes, cheer)) != null)
            {
                outemote = light?emote.light:emote.dark;
                color    = emote.color;
                return(true);
            }

            return(false);
        }
示例#5
0
        public static LazyLoadedImage GetTwitchEmoteById(string id, string name)
        {
            LazyLoadedImage e;

            if (!TwitchEmotesByIDCache.TryGetValue(id, out e))
            {
                double scale;
                e = new LazyLoadedImage
                {
                    Name    = name,
                    Url     = GetTwitchEmoteLink(id, out scale),
                    Scale   = scale,
                    Tooltip = name + "\nTwitch Emote",
                    IsEmote = true
                };
                TwitchEmotesByIDCache[id] = e;
            }

            return(e);
        }
示例#6
0
        public static LazyLoadedImage GetTwitchEmoteById(string id, string name)
        {
            LazyLoadedImage e;
            double          scale;
            double          fake;
            string          url = GetTwitchEmoteLink(id, false, out scale);

            if (!TwitchEmotesByIDCache.TryGetValue(id, out e) || Math.Abs(scale - e.Scale) > .01)
            {
                e = new LazyLoadedImage
                {
                    Name            = name,
                    Url             = url,
                    TooltipImageUrl = GetTwitchEmoteLink(id, true, out fake),
                    Scale           = scale,
                    Tooltip         = name + "\nTwitch Emote",
                    IsEmote         = true
                };
                TwitchEmotesByIDCache[id] = e;
            }

            return(e);
        }
示例#7
0
文件: Emotes.cs 项目: lyx0/chatterino
        static Emotes()
        {
            Func <int, string, string, LazyLoadedImage> getEmoteReplacement = (id, name, url) =>
            {
                var emote = new LazyLoadedImage()
                {
                    Url     = url,
                    Name    = name,
                    Tooltip = $"{name}\nTwitch Global Emote\n(chatterino dankmode friendly version)",
                    IsEmote = true
                };
                emote.LoadAction = () =>
                {
                    object img;

                    try
                    {
                        var request = WebRequest.Create(url);
                        if (AppSettings.IgnoreSystemProxy)
                        {
                            request.Proxy = null;
                        }
                        using (var response = request.GetResponse())
                            using (var stream = response.GetResponseStream())
                            {
                                img = GuiEngine.Current.ReadImageFromStream(stream);
                            }

                        GuiEngine.Current.FreezeImage(img);
                    }
                    catch
                    {
                        img = null;
                    }

                    if (img == null)
                    {
                        double scale;
                        url       = GetTwitchEmoteLink(id, out scale);
                        emote.Url = url;

                        try
                        {
                            var request = WebRequest.Create(url);
                            if (AppSettings.IgnoreSystemProxy)
                            {
                                request.Proxy = null;
                            }
                            using (var response = request.GetResponse())
                                using (var stream = response.GetResponseStream())
                                {
                                    img = GuiEngine.Current.ReadImageFromStream(stream);
                                }

                            GuiEngine.Current.FreezeImage(img);
                        }
                        catch
                        {
                            img = null;
                        }
                    }

                    return(img);
                };
                return(emote);
            };

            TwitchEmotesByIDCache.TryAdd(17,
                                         getEmoteReplacement(17, "StoneLightning",
                                                             "https://fourtf.com/chatterino/emotes/replacements/StoneLightning.png"));
            TwitchEmotesByIDCache.TryAdd(18,
                                         getEmoteReplacement(18, "TheRinger", "https://fourtf.com/chatterino/emotes/replacements/TheRinger.png"));
            TwitchEmotesByIDCache.TryAdd(20,
                                         getEmoteReplacement(20, "EagleEye", "https://fourtf.com/chatterino/emotes/replacements/EagleEye.png"));
            TwitchEmotesByIDCache.TryAdd(22,
                                         getEmoteReplacement(22, "RedCoat", "https://fourtf.com/chatterino/emotes/replacements/RedCoat.png"));
            TwitchEmotesByIDCache.TryAdd(33,
                                         getEmoteReplacement(33, "DansGame", "https://fourtf.com/chatterino/emotes/replacements/DansGame.png"));

            twitchEmotesCodeReplacements[@"[oO](_|\.)[oO]"] = "o_O";
            twitchEmotesCodeReplacements[@"\&gt\;\("]       = ">(";
            twitchEmotesCodeReplacements[@"\&lt\;3"]        = "<3";
            twitchEmotesCodeReplacements[@"\:-?(o|O)"]      = ":O";
            twitchEmotesCodeReplacements[@"\:-?(p|P)"]      = ":P";
            twitchEmotesCodeReplacements[@"\:-?[\\/]"]      = ":/";
            twitchEmotesCodeReplacements[@"\:-?[z|Z|\|]"]   = ":z";
            twitchEmotesCodeReplacements[@"\:-?\("]         = ":(";
            twitchEmotesCodeReplacements[@"\:-?\)"]         = ":)";
            twitchEmotesCodeReplacements[@"\:-?D"]          = ":D";
            twitchEmotesCodeReplacements[@"\;-?(p|P)"]      = ";P";
            twitchEmotesCodeReplacements[@"\;-?\)"]         = ";)";
            twitchEmotesCodeReplacements[@"R-?\)"]          = "R-)";

            _bttvHatEmotes["IceCold"] = null;
            //_bttvHatEmotes["SoSnowy"] = null;
            _bttvHatEmotes["TopHat"]   = null;
            _bttvHatEmotes["SantaHat"] = null;

            //ChatterinoEmotes["WithAHat"] = new LazyLoadedImage { Name = "WithAHat", Tooltip = "WithAHat\nChatterino Emote", Url = "https://fourtf.com/chatterino/emotes/img/WithAHat_x1.png", IsHat = true };
        }
示例#8
0
文件: Emotes.cs 项目: lyx0/chatterino
        public static void LoadGlobalEmotes()
        {
            // twitchemotes

            /*
             * Task.Run(() =>
             * {
             *  try
             *  {
             *      Directory.CreateDirectory("./Cache");
             *
             *      System.Text.Json.JsonParser parser = new System.Text.Json.JsonParser();
             *
             *      // twitchemotes api global emotes
             *      if (!File.Exists(twitchemotesGlobalCache) || DateTime.Now - new FileInfo(twitchemotesGlobalCache).LastWriteTime > TimeSpan.FromHours(24))
             *      {
             *          try
             *          {
             *              if (Util.IsLinux)
             *              {
             *                  Util.LinuxDownloadFile("https://twitchemotes.com/api_cache/v2/global.json", twitchemotesGlobalCache);
             *              }
             *              else
             *              {
             *                  using (var webClient = new WebClient())
             *                  using (var readStream = webClient.OpenRead("https://twitchemotes.com/api_cache/v2/global.json"))
             *                  using (var writeStream = File.OpenWrite(twitchemotesGlobalCache))
             *                  {
             *                      readStream.CopyTo(writeStream);
             *                  }
             *              }
             *          }
             *          catch (Exception e)
             *          {
             *              e.Message.Log("emotes");
             *          }
             *      }
             *
             *      using (var stream = File.OpenRead(twitchemotesGlobalCache))
             *      {
             *          dynamic json = parser.Parse(stream);
             *          dynamic templates = json["template"];
             *          string template112 = templates["large"];
             *
             *          foreach (KeyValuePair<string, object> e in json["emotes"])
             *          {
             *              string code = e.Key;
             *
             *              TwitchGlobalEmotes[code.ToUpper()] = code;
             *          }
             *      }
             *      EmotesLoaded?.Invoke(null, EventArgs.Empty);
             *  }
             *  catch { }
             * });
             */

            // bttv emotes
            Task.Run(() =>
            {
                try
                {
                    var parser = new System.Text.Json.JsonParser();

                    // better twitch tv emotes
                    //if (!File.Exists(bttvEmotesGlobalCache))
                    {
                        try
                        {
                            if (Util.IsLinux)
                            {
                                Util.LinuxDownloadFile("https://api.betterttv.net/2/emotes", bttvEmotesGlobalCache);
                            }
                            else
                            {
                                using (var webClient = new WebClient())
                                    using (var readStream = webClient.OpenRead("https://api.betterttv.net/2/emotes"))
                                        using (var writeStream = File.OpenWrite(bttvEmotesGlobalCache))
                                        {
                                            readStream.CopyTo(writeStream);
                                        }
                            }
                        }
                        catch (Exception e)
                        {
                            e.Message.Log("emotes");
                        }
                    }

                    using (var stream = File.OpenRead(bttvEmotesGlobalCache))
                    {
                        dynamic json = parser.Parse(stream);
                        var template = "https:" + json["urlTemplate"]; //{{id}} {{image}}

                        foreach (var e in json["emotes"])
                        {
                            string id        = e["id"];
                            string code      = e["code"];
                            string imageType = e["imageType"];
                            string url       = template.Replace("{{id}}", id);

                            double scale;
                            url = GetBttvEmoteLink(url, out scale);

                            BttvGlobalEmotes[code] = new LazyLoadedImage {
                                Name = code, Url = url, IsHat = IsBttvEmoteAHat(code), Scale = scale, Tooltip = code + "\nBetterTTV Global Emote", IsEmote = true
                            };
                        }
                    }
                    EmotesLoaded?.Invoke(null, EventArgs.Empty);
                }
                catch (Exception exc)
                {
                    Console.WriteLine("error loading emotes: " + exc.Message);
                }
            });

            // ffz emotes
            Task.Run(() =>
            {
                try
                {
                    var parser = new System.Text.Json.JsonParser();

                    //if (!File.Exists(ffzEmotesGlobalCache))
                    {
                        try
                        {
                            if (Util.IsLinux)
                            {
                                Util.LinuxDownloadFile("https://api.frankerfacez.com/v1/set/global", ffzEmotesGlobalCache);
                            }
                            else
                            {
                                using (var webClient = new WebClient())
                                    using (var readStream = webClient.OpenRead("https://api.frankerfacez.com/v1/set/global"))
                                        using (var writeStream = File.OpenWrite(ffzEmotesGlobalCache))
                                        {
                                            readStream.CopyTo(writeStream);
                                        }
                            }
                        }
                        catch (Exception e)
                        {
                            e.Message.Log("emotes");
                        }
                    }

                    using (var stream = File.OpenRead(ffzEmotesGlobalCache))
                    {
                        dynamic json = parser.Parse(stream);

                        foreach (var set in json["sets"])
                        {
                            var val = set.Value;

                            foreach (LazyLoadedImage emote in GetFfzEmoteFromDynamic(val["emoticons"], true))
                            {
                                FfzGlobalEmotes[emote.Name] = emote;
                            }
                        }
                    }
                    EmotesLoaded?.Invoke(null, EventArgs.Empty);
                }
                catch (Exception exc)
                {
                    Console.WriteLine("error loading emotes: " + exc.Message);
                }
            });

            // ffz event emotes
            Task.Run(() =>
            {
                try
                {
                    var set = 0;

                    var parser = new System.Text.Json.JsonParser();
                    using (var webClient = new WebClient())
                        using (var readStream = webClient.OpenRead("https://cdn.frankerfacez.com/script/event.json"))
                        {
                            dynamic json = parser.Parse(readStream);

                            string _set = json["set"];

                            int.TryParse(_set, out set);
                        }

                    if (set != 0)
                    {
                        using (var webClient = new WebClient())
                            using (var readStream = webClient.OpenRead("https://api.frankerfacez.com/v1/set/" + set))
                            {
                                dynamic json = parser.Parse(readStream);
                                dynamic _set = json["set"];

                                dynamic emoticons = _set["emoticons"];

                                foreach (LazyLoadedImage emote in GetFfzEmoteFromDynamic(emoticons, true))
                                {
                                    FfzGlobalEmotes[emote.Name] = emote;
                                }
                            }
                    }
                }
                catch (Exception e)
                {
                    e.Message.Log("emotes");
                }
            });
        }
示例#9
0
        // ctor
        private TwitchChannel(string channelName)
        {
            if (!channelName.StartsWith("/"))
            {
                Name             = channelName.Trim('#');
                SubLink          = $"https://www.twitch.tv/{Name}/subscribe?ref=in_chat_subscriber_link";
                ChannelLink      = $"https://twitch.tv/{Name}";
                PopoutPlayerLink = $"https://player.twitch.tv/?channel={Name}";

                Join();

                ReloadEmotes();

                // recent chat
                Task.Run(() =>
                {
                    loadData();

                    if (RoomID != -1)
                    {
                        try
                        {
                            var request =
                                WebRequest.Create($"https://badges.twitch.tv/v1/badges/channels/{RoomID}/display");
                            if (AppSettings.IgnoreSystemProxy)
                            {
                                request.Proxy = null;
                            }
                            using (var response = request.GetResponse())
                                using (var stream = response.GetResponseStream())
                                {
                                    var parser = new JsonParser();

                                    dynamic json = parser.Parse(stream);

                                    dynamic badgeSets  = json["badge_sets"];
                                    dynamic subscriber = badgeSets["subscriber"];
                                    dynamic versions   = subscriber["versions"];

                                    foreach (var version in versions)
                                    {
                                        int months = int.Parse(version.Key);

                                        dynamic value = version.Value;

                                        string imageUrl    = value["image_url_1x"];
                                        string title       = value["title"];
                                        string description = value["description"];
                                        string clickUrl    = value["click_url"];

                                        SubscriberBadges[months] = new LazyLoadedImage
                                        {
                                            Name    = title,
                                            Url     = imageUrl,
                                            Tooltip = "Subscriber Badge" + (months == 0 ? "" : $" ({months} months)")
                                        };
                                    }
                                }
                        }
                        catch
                        {
                        }

                        try
                        {
                            var messages = new List <Message>();

                            var request =
                                WebRequest.Create(
                                    $"https://tmi.twitch.tv/api/rooms/{RoomID}/recent_messages?client_id={IrcManager.DefaultClientID}");
                            if (AppSettings.IgnoreSystemProxy)
                            {
                                request.Proxy = null;
                            }
                            using (var response = request.GetResponse())
                                using (var stream = response.GetResponseStream())
                                {
                                    var parser = new JsonParser();

                                    dynamic json = parser.Parse(stream);

                                    dynamic _messages = json["messages"];

                                    foreach (string s in _messages)
                                    {
                                        IrcMessage msg;

                                        if (IrcMessage.TryParse(s, out msg))
                                        {
                                            messages.Add(new Message(msg, this)
                                            {
                                                HighlightTab = false
                                            });
                                        }
                                    }

                                    //StreamReader reader = new StreamReader(stream);
                                    //string line;
                                    //while ((line = reader.ReadLine()) != null)
                                    //{
                                    //    IrcMessage msg;

                                    //    if (IrcMessage.TryParse(line, out msg))
                                    //    {
                                    //        if (msg.Params != null)
                                    //            messages.Add(new Message(msg, this, false, false));
                                    //    }
                                    //}
                                }

                            AddMessagesAtStart(messages.ToArray());
                        }
                        catch
                        {
                        }
                    }
                });

                // get chatters
                Task.Run(() =>
                {
                    fetchUsernames();
                });

                checkIfIsLive();
            }

            Emotes.EmotesLoaded             += Emotes_EmotesLoaded;
            IrcManager.Connected            += IrcManager_Connected;
            IrcManager.Disconnected         += IrcManager_Disconnected;
            IrcManager.NoticeAdded          += IrcManager_NoticeAdded;
            AppSettings.MessageLimitChanged += AppSettings_MessageLimitChanged;
            AppSettings.FontChanged         += AppSettings_FontChanged;
        }
示例#10
0
        public void ReloadEmotes()
        {
            var channelName = Name;

            var bttvChannelEmotesCache = Path.Combine(Util.GetUserDataPath(), "Cache", $"bttv_channel_{channelName}");
            var ffzChannelEmotesCache  = Path.Combine(Util.GetUserDataPath(), "Cache", $"ffz_channel_{channelName}");

            // bttv channel emotes
            Task.Run(() =>
            {
                try
                {
                    var parser = new JsonParser();

                    //if (!File.Exists(bttvChannelEmotesCache))
                    {
                        try
                        {
                            if (Util.IsLinux)
                            {
                                Util.LinuxDownloadFile("https://api.betterttv.net/2/channels/" + channelName, bttvChannelEmotesCache);
                            }
                            else
                            {
                                using (var webClient = new WebClient())
                                    using (var readStream = webClient.OpenRead("https://api.betterttv.net/2/channels/" + channelName))
                                        using (var writeStream = File.OpenWrite(bttvChannelEmotesCache))
                                        {
                                            readStream.CopyTo(writeStream);
                                        }
                            }
                        }
                        catch (Exception e)
                        {
                            e.Message.Log("emotes");
                        }
                    }

                    using (var stream = File.OpenRead(bttvChannelEmotesCache))
                    {
                        dynamic json = parser.Parse(stream);
                        var template = "https:" + json["urlTemplate"]; //{{id}} {{image}}

                        BttvChannelEmotes.Clear();

                        foreach (var e in json["emotes"])
                        {
                            string id      = e["id"];
                            string code    = e["code"];
                            string channel = e["channel"];

                            LazyLoadedImage emote;
                            if (Emotes.BttvChannelEmotesCache.TryGetValue(id, out emote))
                            {
                                BttvChannelEmotes[code] = emote;
                            }
                            else
                            {
                                string imageType = e["imageType"];
                                string url       = template.Replace("{{id}}", id);

                                double scale;
                                url = Emotes.GetBttvEmoteLink(url, out scale);

                                Emotes.BttvChannelEmotesCache[id] =
                                    BttvChannelEmotes[code]       =
                                        new LazyLoadedImage
                                {
                                    Name    = code,
                                    Url     = url,
                                    Tooltip = code + "\nBetterTTV Channel Emote\nChannel: " + channel,
                                    Scale   = scale,
                                    IsEmote = true
                                };
                            }
                        }
                    }
                    updateEmoteNameList();
                }
                catch { }
            });

            // ffz channel emotes
            Task.Run(() =>
            {
                try
                {
                    var parser = new JsonParser();

                    //if (!File.Exists(ffzChannelEmotesCache))
                    {
                        try
                        {
                            if (Util.IsLinux)
                            {
                                Util.LinuxDownloadFile("https://api.frankerfacez.com/v1/room/" + channelName, ffzChannelEmotesCache);
                            }
                            else
                            {
                                using (var webClient = new WebClient())
                                    using (var readStream = webClient.OpenRead("https://api.frankerfacez.com/v1/room/" + channelName))
                                        using (var writeStream = File.OpenWrite(ffzChannelEmotesCache))
                                        {
                                            readStream.CopyTo(writeStream);
                                        }
                            }
                        }
                        catch (Exception e)
                        {
                            e.Message.Log("emotes");
                        }
                    }

                    using (var stream = File.OpenRead(ffzChannelEmotesCache))
                    {
                        dynamic json = parser.Parse(stream);

                        dynamic room = json["room"];

                        try
                        {
                            object moderator;

                            if (room.TryGetValue("moderator_badge", out moderator))
                            {
                                if (moderator != null && !string.IsNullOrWhiteSpace((string)moderator))
                                {
                                    var url        = "https:" + (moderator as string);
                                    ModeratorBadge = new LazyLoadedImage
                                    {
                                        Url        = url,
                                        Tooltip    = "custom moderator badge\nFFZ",
                                        LoadAction = () =>
                                        {
                                            try
                                            {
                                                object img;

                                                var request = WebRequest.Create(url);
                                                if (AppSettings.IgnoreSystemProxy)
                                                {
                                                    request.Proxy = null;
                                                }
                                                using (var response = request.GetResponse())
                                                    using (var s = response.GetResponseStream())
                                                    {
                                                        img = GuiEngine.Current.ReadImageFromStream(s);
                                                    }

                                                GuiEngine.Current.FreezeImage(img);

                                                return(GuiEngine.Current.DrawImageBackground(img, HSLColor.FromRGB(0x45A41E)));
                                            }
                                            catch
                                            {
                                                return(null);
                                            }
                                        }
                                    };
                                }
                            }
                        }
                        catch { }

                        dynamic sets = json["sets"];

                        FfzChannelEmotes.Clear();

                        foreach (var set in sets.Values)
                        {
                            string title = set["title"];

                            dynamic emoticons = set["emoticons"];

                            foreach (LazyLoadedImage emote in Emotes.GetFfzEmoteFromDynamic(emoticons, false))
                            {
                                FfzChannelEmotes[emote.Name] = emote;
                            }
                        }
                    }
                    updateEmoteNameList();
                }
                catch { }
            });
        }
示例#11
0
        static Emotes()
        {
            Func <string, string, string, LazyLoadedImage> getEmoteReplacement = (id, name, url) =>
            {
                var emote = new LazyLoadedImage()
                {
                    Url     = url,
                    Name    = name,
                    Tooltip = $"{name}\nTwitch Global Emote\n(chatterino dankmode friendly version)",
                    IsEmote = true
                };
                emote.LoadAction = () =>
                {
                    ChatterinoImage img;

                    try
                    {
                        var request = WebRequest.Create(url);
                        if (AppSettings.IgnoreSystemProxy)
                        {
                            request.Proxy = null;
                        }
                        using (var response = request.GetResponse()) {
                            using (var stream = response.GetResponseStream())
                            {
                                MemoryStream mem = new MemoryStream();
                                stream.CopyTo(mem);
                                img = GuiEngine.Current.ReadImageFromStream(mem);
                            }
                            response.Close();
                        }

                        GuiEngine.Current.FreezeImage(img);
                    }
                    catch
                    {
                        img = null;
                    }

                    if (img == null)
                    {
                        double scale;
                        double fake;
                        string tooltipurl;
                        url                   = GetTwitchEmoteLink(id, false, out scale);
                        tooltipurl            = GetTwitchEmoteLink(id, true, out fake);
                        emote.Url             = url;
                        emote.TooltipImageUrl = tooltipurl;

                        try
                        {
                            var request = WebRequest.Create(url);
                            if (AppSettings.IgnoreSystemProxy)
                            {
                                request.Proxy = null;
                            }
                            using (var response = request.GetResponse()) {
                                using (var stream = response.GetResponseStream())
                                {
                                    MemoryStream mem = new MemoryStream();
                                    stream.CopyTo(mem);
                                    img = GuiEngine.Current.ReadImageFromStream(mem);
                                }
                                response.Close();
                            }

                            GuiEngine.Current.FreezeImage(img);
                        }
                        catch
                        {
                            img = null;
                        }
                    }

                    return(img);
                };
                return(emote);
            };

            twitchEmotesCodeReplacements[@"[oO](_|\.)[oO]"] = "o_O";
            twitchEmotesCodeReplacements[@"\&gt\;\("]       = ">(";
            twitchEmotesCodeReplacements[@"\&lt\;3"]        = "<3";
            twitchEmotesCodeReplacements[@"\:-?(o|O)"]      = ":O";
            twitchEmotesCodeReplacements[@"\:-?(p|P)"]      = ":P";
            twitchEmotesCodeReplacements[@"\:-?[\\/]"]      = ":/";
            twitchEmotesCodeReplacements[@"\:-?[z|Z|\|]"]   = ":z";
            twitchEmotesCodeReplacements[@"\:-?\("]         = ":(";
            twitchEmotesCodeReplacements[@"\:-?\)"]         = ":)";
            twitchEmotesCodeReplacements[@"\:-?D"]          = ":D";
            twitchEmotesCodeReplacements[@"\;-?(p|P)"]      = ";P";
            twitchEmotesCodeReplacements[@"\;-?\)"]         = ";)";
            twitchEmotesCodeReplacements[@"R-?\)"]          = "R-)";

            _bttvHatEmotes["IceCold"]   = null;
            _bttvHatEmotes["SoSnowy"]   = null;
            _bttvHatEmotes["TopHat"]    = null;
            _bttvHatEmotes["SantaHat"]  = null;
            _bttvHatEmotes["ReinDeer"]  = null;
            _bttvHatEmotes["CandyCane"] = null;
            _bttvHatEmotes["cvHazmat"]  = null;
            _bttvHatEmotes["cvMask"]    = null;
        }
示例#12
0
        public static void LoadGlobalEmotes()
        {
            // bttv emotes
            Task.Run(() =>
            {
                try
                {
                    var parser = new System.Text.Json.JsonParser();

                    // better twitch tv emotes
                    //if (!File.Exists(bttvEmotesGlobalCache))
                    {
                        try
                        {
                            if (Util.IsLinux)
                            {
                                Util.LinuxDownloadFile("https://api.betterttv.net/3/cached/emotes/global", bttvEmotesGlobalCache);
                            }
                            else
                            {
                                using (var webClient = new WebClient()) {
                                    using (var readStream = webClient.OpenRead("https://api.betterttv.net/3/cached/emotes/global")) {
                                        if (File.Exists(bttvEmotesGlobalCache))
                                        {
                                            File.Delete(bttvEmotesGlobalCache);
                                        }
                                        using (var writeStream = File.OpenWrite(bttvEmotesGlobalCache))
                                        {
                                            readStream.CopyTo(writeStream);
                                        }
                                        readStream.Close();
                                    }
                                    webClient.Dispose();
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            e.Message.Log("emotes");
                        }
                    }

                    using (var stream = File.OpenRead(bttvEmotesGlobalCache))
                    {
                        dynamic json = parser.Parse(stream);
                        //var template = "https:" + json["urlTemplate"]; // urlTemplate is outdated, came from bttv v2 api, returned: //cdn.betterttv.net/emote/{{id}}/{{image}}
                        var template = "https://cdn.betterttv.net/emote/{{id}}/{{image}}";

                        foreach (var e in json)
                        {
                            string id        = e["id"];
                            string code      = e["code"];
                            string imageType = e["imageType"];
                            string url       = template.Replace("{{id}}", id);
                            double fake;
                            string tooltipurl = GetBttvEmoteLink(url, true, out fake);

                            double scale;
                            url = GetBttvEmoteLink(url, false, out scale);

                            BttvGlobalEmotes[code] = new LazyLoadedImage {
                                Name = code, Url = url, TooltipImageUrl = tooltipurl, IsHat = IsBttvEmoteAHat(code), Scale = scale, Tooltip = code + "\nBetterTTV Global Emote", IsEmote = true
                            };
                        }
                    }
                    EmotesLoaded?.Invoke(null, EventArgs.Empty);
                }
                catch (Exception exc)
                {
                    Console.WriteLine("error loading emotes: " + exc.Message);
                }
            });

            // ffz emotes
            Task.Run(() =>
            {
                try
                {
                    var parser = new System.Text.Json.JsonParser();

                    //if (!File.Exists(ffzEmotesGlobalCache))
                    {
                        try
                        {
                            if (Util.IsLinux)
                            {
                                Util.LinuxDownloadFile("https://api.frankerfacez.com/v1/set/global", ffzEmotesGlobalCache);
                            }
                            else
                            {
                                using (var webClient = new WebClient()) {
                                    using (var readStream = webClient.OpenRead("https://api.frankerfacez.com/v1/set/global")) {
                                        if (File.Exists(ffzEmotesGlobalCache))
                                        {
                                            File.Delete(ffzEmotesGlobalCache);
                                        }
                                        using (var writeStream = File.OpenWrite(ffzEmotesGlobalCache))
                                        {
                                            readStream.CopyTo(writeStream);
                                        }
                                        readStream.Close();
                                    }
                                    webClient.Dispose();
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            e.Message.Log("emotes");
                        }
                    }

                    using (var stream = File.OpenRead(ffzEmotesGlobalCache))
                    {
                        dynamic json = parser.Parse(stream);

                        foreach (var set in json["sets"])
                        {
                            var val = set.Value;

                            foreach (LazyLoadedImage emote in GetFfzEmoteFromDynamic(val["emoticons"], true))
                            {
                                FfzGlobalEmotes[emote.Name] = emote;
                            }
                        }
                    }
                    EmotesLoaded?.Invoke(null, EventArgs.Empty);
                }
                catch (Exception exc)
                {
                    Console.WriteLine("error loading emotes: " + exc.Message);
                }
            });

            // ffz event emotes
            Task.Run(() =>
            {
                try
                {
                    var set = 0;

                    var parser = new System.Text.Json.JsonParser();
                    using (var webClient = new WebClient()) {
                        using (var readStream = webClient.OpenRead("https://cdn.frankerfacez.com/script/event.json"))
                        {
                            dynamic json = parser.Parse(readStream);

                            string _set = json["set"];

                            int.TryParse(_set, out set);
                            readStream.Close();
                        }
                        webClient.Dispose();
                    }

                    if (set != 0)
                    {
                        using (var webClient = new WebClient()) {
                            using (var readStream = webClient.OpenRead("https://api.frankerfacez.com/v1/set/" + set))
                            {
                                dynamic json = parser.Parse(readStream);
                                dynamic _set = json["set"];

                                dynamic emoticons = _set["emoticons"];

                                foreach (LazyLoadedImage emote in GetFfzEmoteFromDynamic(emoticons, true))
                                {
                                    FfzGlobalEmotes[emote.Name] = emote;
                                }
                                readStream.Close();
                            }
                            webClient.Dispose();
                        }
                    }
                }
                catch (Exception e)
                {
                    e.Message.Log("emotes");
                }
            });

            //7tv global emotes
            Task.Run(() =>
            {
                try
                {
                    var parser = new System.Text.Json.JsonParser();

                    //if (!File.Exists(ffzEmotesGlobalCache))
                    {
                        try
                        {
                            if (Util.IsLinux)
                            {
                                Util.LinuxDownloadFile("https://api.7tv.app/v2/emotes/global", seventvEmotesGlobalCache);
                            }
                            else
                            {
                                using (var webClient = new WebClient()) {
                                    using (var readStream = webClient.OpenRead("https://api.7tv.app/v2/emotes/global")) {
                                        if (File.Exists(seventvEmotesGlobalCache))
                                        {
                                            File.Delete(seventvEmotesGlobalCache);
                                        }
                                        using (var writeStream = File.OpenWrite(seventvEmotesGlobalCache))
                                        {
                                            readStream.CopyTo(writeStream);
                                        }
                                        readStream.Close();
                                    }
                                    webClient.Dispose();
                                }
                            }
                        }
                        catch (Exception e)
                        {
                            e.Message.Log("emotes");
                        }
                    }

                    using (var stream = File.OpenRead(seventvEmotesGlobalCache))
                    {
                        dynamic json = parser.Parse(stream);
                        string emotename;
                        string emoteid;
                        dynamic owner;
                        string ownername;
                        string template = "https://cdn.7tv.app/emote/{{id}}/{{image}}";
                        bool getemote;
                        double fake;
                        double scale;
                        string tooltipurl;
                        string url;
                        int visibilityFlags;
                        string visibility;
                        const int zeroWidthFlag = 0x80;
                        bool zeroWidth          = false;

                        LazyLoadedImage emote;
                        foreach (var e in json)
                        {
                            emotename  = e["name"];
                            emoteid    = e["id"];
                            url        = template.Replace("{{id}}", emoteid);
                            tooltipurl = GetBttvEmoteLink(url, true, out fake);
                            url        = GetBttvEmoteLink(url, false, out scale);
                            owner      = e["owner"];
                            visibility = e["visibility"];
                            if (!string.IsNullOrEmpty(visibility) && int.TryParse(visibility, out visibilityFlags))
                            {
                                zeroWidth = (visibilityFlags & zeroWidthFlag) > 0;
                            }
                            ownername = "";
                            if (owner != null)
                            {
                                ownername = owner["display_name"];
                                if (!string.IsNullOrEmpty(ownername))
                                {
                                    ownername = owner["login"];
                                }
                                else if (string.Compare(ownername.ToUpper(), owner["login"].ToUpper()))
                                {
                                    ownername = ownername + "(" + owner["login"] + ")";
                                }
                            }
                            emote = new LazyLoadedImage
                            {
                                Name            = emotename,
                                Url             = url,
                                Tooltip         = emotename + "\n7TV Channel Emote\nChannel: " + ownername,
                                TooltipImageUrl = tooltipurl,
                                Scale           = scale,
                                IsHat           = zeroWidth,
                                IsEmote         = true
                            };
                            SeventvGlobalEmotes[emote.Name] = emote;
                        }
                    }
                    EmotesLoaded?.Invoke(null, EventArgs.Empty);
                }
                catch (Exception exc)
                {
                    Console.WriteLine("error loading emotes: " + exc.Message);
                }
            });
        }