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 { } }); }
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; }
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); } }
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); }
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); }
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); }
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[@"\>\;\("] = ">("; twitchEmotesCodeReplacements[@"\<\;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 }; }
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"); } }); }
// 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; }
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 { } }); }
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[@"\>\;\("] = ">("; twitchEmotesCodeReplacements[@"\<\;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; }
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); } }); }