diff --git a/.github/forge-posts/v2.0.2.md b/.github/forge-posts/v2.0.2.md new file mode 100644 index 0000000..03a2883 --- /dev/null +++ b/.github/forge-posts/v2.0.2.md @@ -0,0 +1,7 @@ +--- +subtitle: "Emotes raus, Platzhalter gefixt" +versionsnatur: "Aufräum-Release" +--- +- **BetterTTV-Emotes sind raus.** Der Endpunkt für geteilte Emotes liegt hinter einer Anmeldung, und von dort kam fast alles. Übrig blieben 54 überwiegend statische Bilder aus der Twitch-Frühzeit, davon genau eines animiert, und das wollte 492 Einzelbilder und 37 MB Grafikspeicher. Das Plugin macht jetzt **gar keine ausgehenden Netzwerkaufrufe** mehr. Gespeicherte Nachrichten mit Emotes bleiben lesbar und zeigen den getippten Code. +- **Fünf Beschreibungen im Fenster-Tab zeigten `{0}` statt des Plugin-Namens.** Betroffen waren alle 25 Sprachen, im Deutschen fiel es zuerst auf, weil der Platzhalter dort am Satzanfang steht. Ein Test prüft das jetzt dauerhaft. +- **Neue Vorschaubilder** im Plugin-Installer. Die alten waren vom 8. Mai und zeigten die Oberfläche vor dem Umbau. diff --git a/HellionChat/Configuration.cs b/HellionChat/Configuration.cs index 02a0c9f..8504f6f 100755 --- a/HellionChat/Configuration.cs +++ b/HellionChat/Configuration.cs @@ -244,8 +244,6 @@ public class Configuration : IPluginConfiguration public bool NotifyPluginDisclosure = true; public bool KeepInputFocus = true; public bool Use24HourClock = true; - public bool ShowEmotes = true; - public HashSet BlockedEmotes = []; public bool FontsEnabled = true; public ExtraGlyphRanges ExtraGlyphRanges = 0; public float FontSizeV2 = 12.75f; diff --git a/HellionChat/EmoteCache.cs b/HellionChat/EmoteCache.cs deleted file mode 100644 index 260da90..0000000 --- a/HellionChat/EmoteCache.cs +++ /dev/null @@ -1,445 +0,0 @@ -using System.Collections.Concurrent; -using System.Numerics; -using System.Text.Json; -using System.Text.Json.Serialization; -using Dalamud.Bindings.ImGui; -using Dalamud.Interface.Textures; -using Dalamud.Interface.Textures.TextureWraps; -using Dalamud.Utility; -using SixLabors.ImageSharp; -using SixLabors.ImageSharp.PixelFormats; - -namespace HellionChat; - -public static class EmoteCache -{ - private static readonly string[] NotWorking = - [ - ":tf:", - "(ditto)", - "c!", - "h!", - "l!", - "M&Mjc", - "LUL3D", - "p!", - "POLICE2", - "r!", - "Pussy", - "s!", - "v!", - "w!", - "x0r6ztGiggle", - "z!", - "xar2EDM", - "iron95Pls", - "Clap2", - "AlienPls3", - "Life", - "peepoPogClimbingTreeHard4House", - "monkaGIGAftRobertDowneyJr", - "DogLookingSussyAndCold", - "DICKS", - ]; - - private static readonly HttpClient Client = new(); - - private const string BetterTTV = "https://api.betterttv.net/3"; - private const string GlobalEmotes = $"{BetterTTV}/cached/emotes/global"; - private const string Top100Emotes = "{0}/emotes/shared/top?before={1}&limit=100"; - private const string EmotePath = "https://cdn.betterttv.net/emote/{0}/3x"; - - [Serializable] - private struct Top100() - { - [JsonPropertyName("emote")] - public Emote Emote { get; set; } - - [JsonPropertyName("id")] - public required string Id { get; set; } - } - - [Serializable] - public struct Emote() - { - [JsonPropertyName("id")] - public required string Id { get; set; } - - [JsonPropertyName("code")] - public required string Code { get; set; } - - [JsonPropertyName("imageType")] - public required string ImageType { get; set; } - } - - public enum LoadingState - { - Unloaded, - Loading, - Done, - } - - // All fields below are uninitialised while State != Done. - public static LoadingState State = LoadingState.Unloaded; - - private static readonly Dictionary Cache = new(); - private static readonly Dictionary EmoteImages = new(); - - public static string[] SortedCodeArray = []; - - // Cancelled on Dispose to stop in-flight downloads; replaced on re-enable. - private static CancellationTokenSource Cts = new(); - internal static CancellationToken Token => Cts.Token; - - // Tracks in-flight loads so Dispose can drain them before teardown. - private static readonly ConcurrentBag PendingLoads = new(); - - internal static void TrackLoad(Task loadTask, string emoteCode) - { - PendingLoads.Add( - loadTask.ContinueWith( - t => - { - if (t.IsFaulted) - Plugin.LogProxy.Error( - t.Exception!, - $"EmoteCache load failed for {emoteCode}" - ); - }, - TaskScheduler.Default - ) - ); - } - - public static async Task LoadData() - { - if (State is not LoadingState.Unloaded) - return; - - // Reset CTS if Dispose was called and the plugin is being re-enabled. - if (Cts.IsCancellationRequested) - Cts = new CancellationTokenSource(); - - State = LoadingState.Loading; - var ct = Cts.Token; - try - { - var global = await Client.GetAsync(GlobalEmotes, ct); - if (!global.IsSuccessStatusCode) - { - // Nothing usable at all -- let the catch below reset to Unloaded - // so a later trigger can retry. - throw new HttpRequestException( - $"BetterTTV global emotes returned {(int)global.StatusCode}." - ); - } - - var globalList = await global.Content.ReadAsStringAsync(ct); - - foreach (var emote in JsonSerializer.Deserialize(globalList)!) - if (!string.IsNullOrEmpty(emote.Code) && !NotWorking.Contains(emote.Code)) - Cache.TryAdd(emote.Code, emote); - - var lastId = string.Empty; - for (var i = 0; i < 15; i++) - { - var top = await Client.GetAsync(Top100Emotes.Format(BetterTTV, lastId), ct); - - // The shared-emote endpoint went behind authentication and now - // answers 403 with a JSON object. Deserializing that as a list - // threw on every single start, and took the global emotes -- which - // still work -- down with it. The global set is the useful half - // anyway, so a failure here stops paging instead of the load. - if (!top.IsSuccessStatusCode) - { - Plugin.LogProxy.Warning( - $"BetterTTV shared emotes unavailable ({(int)top.StatusCode}); " - + "continuing with global emotes only." - ); - break; - } - - var topList = await top.Content.ReadAsStringAsync(ct); - - var jsonList = JsonSerializer.Deserialize>(topList); - if (jsonList is not { Count: > 0 }) - break; - - // BetterTTV occasionally returns entries with a null Code; - // skip them so a single bad row doesn't break the whole cache. - foreach (var emote in jsonList) - if ( - !string.IsNullOrEmpty(emote.Emote.Code) - && !NotWorking.Contains(emote.Emote.Code) - ) - Cache.TryAdd(emote.Emote.Code, emote.Emote); - - lastId = jsonList[^1].Id; - } - - SortedCodeArray = Cache.Keys.Order().ToArray(); - State = LoadingState.Done; - } - catch (OperationCanceledException) - { - // Plugin disposed mid-load; State stays on Loading so re-enable can retry. - } - catch (Exception ex) - { - // Reset to Unloaded so a later trigger can retry without a plugin reload. - State = LoadingState.Unloaded; - Plugin.LogProxy.Error(ex, "BetterTTV cache wasn't initialized"); - } - } - - public static void Dispose() - { - Cts.Cancel(); - - // 5s upper bound; anything still running gets abandoned. - try - { - Task.WaitAll(PendingLoads.ToArray(), TimeSpan.FromSeconds(5)); - } - catch (AggregateException) - { - // Faults already logged in TrackLoad. - } - - while (PendingLoads.TryTake(out _)) { } - - foreach (var emote in EmoteImages.Values) - emote.InnerDispose(); - } - - internal static bool Exists(string code) - { - return State is LoadingState.Done && SortedCodeArray.Contains(code); - } - - internal static EmoteBase? GetEmote(string code) - { - if (State is not LoadingState.Done) - return null; - - if (!Cache.TryGetValue(code, out var emoteDetail)) - return null; - - if (EmoteImages.TryGetValue(emoteDetail.Id, out var emote)) - return emote; - - try - { - if (emoteDetail.ImageType == "gif") - { - var animatedEmote = new ImGuiGif().Prepare(emoteDetail); - EmoteImages.Add(emoteDetail.Id, animatedEmote); - return animatedEmote; - } - - var staticEmote = new ImGuiEmote().Prepare(emoteDetail); - EmoteImages.Add(emoteDetail.Id, staticEmote); - - return staticEmote; - } - catch - { - Plugin.LogProxy.Error("Failed to convert"); - return null; - } - } - - public abstract class EmoteBase - { - public bool Failed; - public bool IsLoaded; - - public byte[] RawData = []; - - protected IDalamudTextureWrap? Texture; - - public virtual void Draw(Vector2 size) - { - ImGui.Image(Texture!.Handle, size); - } - - internal async Task LoadAsync(Emote emote, CancellationToken ct) - { - // Path-traversal guard: resolve and verify the candidate path stays - // inside the cache directory before reading or writing. - var dir = Path.GetFullPath( - Path.Join(Plugin.Interface.ConfigDirectory.FullName, "EmoteCacheV1") - ); - Directory.CreateDirectory(dir); - - var dirPrefix = dir.EndsWith(Path.DirectorySeparatorChar) - ? dir - : dir + Path.DirectorySeparatorChar; - var filePath = Path.GetFullPath(Path.Join(dir, $"{emote.Id}.{emote.ImageType}")); - if (!filePath.StartsWith(dirPrefix, StringComparison.Ordinal)) - throw new InvalidOperationException( - $"Emote path escapes cache directory: id={emote.Id}, type={emote.ImageType}" - ); - - if (File.Exists(filePath)) - { - RawData = await File.ReadAllBytesAsync(filePath, ct); - } - else - { - var content = await Client.GetAsync(EmotePath.Format(emote.Id), ct); - RawData = await content.Content.ReadAsByteArrayAsync(ct); - - await using var stream = new FileStream( - filePath, - FileMode.Create, - FileAccess.Write, - FileShare.Read - ); - await stream.WriteAsync(RawData, ct); - } - - return RawData; - } - - public abstract void InnerDispose(); - } - - public sealed class ImGuiEmote : EmoteBase - { - public ImGuiEmote Prepare(Emote emote) - { - var ct = EmoteCache.Token; - // Task.Run keeps the sync prefix off the ImGui render thread. - EmoteCache.TrackLoad(Task.Run(() => LoadAsyncTracked(emote, ct), ct), emote.Code); - return this; - } - - private async Task LoadAsyncTracked(Emote emote, CancellationToken ct) - { - try - { - var image = await LoadAsync(emote, ct); - if (image.Length <= 0) - return; - - ct.ThrowIfCancellationRequested(); - Texture = await Plugin.TextureProvider.CreateFromImageAsync( - image, - cancellationToken: ct - ); - IsLoaded = true; - } - catch (OperationCanceledException) { } - catch (Exception ex) - { - Failed = true; - Plugin.LogProxy.Error(ex, $"Unable to load {emote.Code} with id {emote.Id}"); - } - } - - public override void InnerDispose() - { - Texture?.Dispose(); - } - } - - public sealed class ImGuiGif : EmoteBase - { - private List<(IDalamudTextureWrap Texture, float Delay)> Frames = []; - private float FrameTimer; - private int CurrentFrame; - private ulong GlobalFrameCount; - - public override void Draw(Vector2 size) - { - if (Frames.Count == 0) - return; - - if (CurrentFrame >= Frames.Count) - { - CurrentFrame = 0; - FrameTimer = -1f; - } - - var frame = Frames[CurrentFrame]; - if (FrameTimer <= 0.0f) - FrameTimer = frame.Delay; - - ImGui.Image(frame.Texture.Handle, size); - - if (GlobalFrameCount == Plugin.Interface.UiBuilder.FrameCount) - return; - - GlobalFrameCount = Plugin.Interface.UiBuilder.FrameCount; - - FrameTimer -= ImGui.GetIO().DeltaTime; - if (FrameTimer <= 0f) - CurrentFrame++; - } - - public override void InnerDispose() - { - Frames.ForEach(f => f.Texture.Dispose()); - Frames.Clear(); - } - - public ImGuiGif Prepare(Emote emote) - { - var ct = EmoteCache.Token; - EmoteCache.TrackLoad(Task.Run(() => LoadAsyncTracked(emote, ct), ct), emote.Code); - return this; - } - - private async Task LoadAsyncTracked(Emote emote, CancellationToken ct) - { - try - { - var image = await LoadAsync(emote, ct); - if (image.Length <= 0) - return; - - using var ms = new MemoryStream(image); - using var img = Image.Load(ms); - if (img.Frames.Count == 0) - return; - - var frames = new List<(IDalamudTextureWrap Tex, float Delay)>(); - foreach (var frame in img.Frames) - { - ct.ThrowIfCancellationRequested(); - - var delay = frame.Metadata.GetGifMetadata().FrameDelay / 100f; - - // Match browser behaviour: anything under 20ms rounds up to 100ms. - if (delay < 0.02f) - delay = 0.1f; - - var buffer = new byte[4 * frame.Width * frame.Height]; - frame.CopyPixelDataTo(buffer); - var tex = await Plugin.TextureProvider.CreateFromRawAsync( - RawImageSpecification.Rgba32(frame.Width, frame.Height), - buffer, - cancellationToken: ct - ); - frames.Add((tex, delay)); - } - - Frames = frames; - IsLoaded = true; - } - catch (OperationCanceledException) - { - // Plugin disposed mid-load; release any partial frames. - foreach (var f in Frames) - f.Texture.Dispose(); - Frames = []; - } - catch (Exception ex) - { - Failed = true; - Plugin.LogProxy.Error(ex, $"Unable to load {emote.Code} with id {emote.Id}"); - } - } - } -} diff --git a/HellionChat/HellionChat.csproj b/HellionChat/HellionChat.csproj index 5299d9d..18edd7d 100644 --- a/HellionChat/HellionChat.csproj +++ b/HellionChat/HellionChat.csproj @@ -1,7 +1,7 @@ - 2.0.1 + 2.0.2 enable enable diff --git a/HellionChat/HellionChat.yaml b/HellionChat/HellionChat.yaml index d67ef63..f52d514 100755 --- a/HellionChat/HellionChat.yaml +++ b/HellionChat/HellionChat.yaml @@ -27,7 +27,7 @@ icon_url: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/br image_urls: - https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/chatWindow.png - https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/settingsOverview.png - - https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/themesPicker.png + - https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/firstRunWizard.png tags: - Social - UI @@ -35,6 +35,14 @@ tags: - Replacement - Privacy changelog: |- + **v2.0.2 — Emotes out, placeholders fixed (2026-08-19)** + + - **BetterTTV emote support is gone.** Its shared-emote endpoint went behind authentication, and that was where nearly all of them came from — what remained was a 65-entry global set, eleven of which are on the known-broken list, so 54 mostly static images from Twitch's early days. Exactly one was animated, and that one wanted 492 frames and 37 MB of video memory. The plugin now makes no outbound network calls at all. Messages stored with emotes still read fine; they show the code that was typed. + - **Five settings descriptions printed `{0}` instead of the plugin name.** All 25 languages were affected, English included — it just hid better there, since "Hide {0} during cutscenes" still scans as a sentence while German puts the placeholder first. A test now walks every resource string with a placeholder and fails if one reaches a widget unformatted. + - **New preview images.** The ones in the plugin installer were from 8 May and showed the interface as it looked before any of the window rebuilds. + + --- + **v2.0.1 — Hotfix (2026-08-19)** A same-day follow-up to 2.0.0 with no user-facing changes. Install it if you picked up 2.0.0 in the first hour; there is nothing new to look at, it just carries a dependency update the 2.0.0 archive was built without. @@ -89,35 +97,4 @@ changelog: |- Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2). - --- - - **v1.5.5 — Upstream-Sync Tab-Features (2026-05-21)** - - A backlog-sync cycle: inherited tab-feature items plus a new fox - banner image and custom notification sounds. - - User-visible: - - - Failed tells now raise a warning toast when a message you sent - could not be delivered (recipient offline, in an instance, or - blocking you). Toggle in Settings, Chat tab. - - Per-tab notification sound: each tab can play a sound when a - message arrives while you are looking at a different tab. Pick - one of the 16 game chat sounds or one of three bundled Hellion - sounds, with a preview button to hear it. Off by default, - respects the global sound toggle. - - The tab rename field in the right-click menu now focuses - itself when the menu opens and accepts up to 512 characters, - matching the settings-tab rename. - - A jump-to-latest button appears in the chat log header while - you are scrolled up from the live end. - - Map flags and item links can be inserted into the chat input - from its right-click menu. - - The Hellion Forge fox banner in the first-run wizard and the - Information tab is now a real image instead of ASCII art. - - Schema bumped to v18 (additive fields only, no data migration). - - Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2). - Earlier history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases diff --git a/HellionChat/Message.cs b/HellionChat/Message.cs index 154ba93..7bfd79a 100755 --- a/HellionChat/Message.cs +++ b/HellionChat/Message.cs @@ -175,8 +175,6 @@ public partial class Message } var nextIsAutoTranslate = false; - var checkForEmotes = - (Code.IsPlayerMessage() || extraChatChannel != Guid.Empty) && Plugin.Config.ShowEmotes; foreach (var chunk in oldChunks) { // Use as is if it's not a text chunk, it already has a payload, or is auto translate @@ -207,25 +205,6 @@ public partial class Message var wordUsed = false; var tokenUsed = false; - if ( - checkForEmotes - && EmoteCache.Exists(word) - && !Plugin.Config.BlockedEmotes.Contains(word) - ) - { - // Add the previous sentence before adding the emote - AddChunkWithMessage(text.NewWithStyle(chunk, sentenceBuilder.ToString())); - AddChunkWithMessage( - new TextChunk(chunk.Source, EmotePayload.ResolveEmote(word), word) - { - FallbackColour = text.FallbackColour, - } - ); - - wordUsed = true; - sentenceBuilder.Clear(); - } - if (token.TokenType == Tokenizer.TokenType.UrlString) { // Add the previous sentence before adding the url diff --git a/HellionChat/MessageStore.cs b/HellionChat/MessageStore.cs index ab97840..3897237 100644 --- a/HellionChat/MessageStore.cs +++ b/HellionChat/MessageStore.cs @@ -90,6 +90,8 @@ public class PayloadMessagePackFormatter : IMessagePackFormatter return new PartyFinderPayload(reader.ReadUInt32()); case PayloadMessagePackType.Uri: return new UriPayload(new Uri(reader.ReadString() ?? "")); + // Read-only since 2.0.2: nothing writes this any more, but rows + // stored before then carry it and must keep deserialising. case PayloadMessagePackType.Emote: return EmotePayload.ResolveEmote(reader.ReadString() ?? ""); case PayloadMessagePackType.Other: diff --git a/HellionChat/Plugin.cs b/HellionChat/Plugin.cs index dea9032..7926afd 100755 --- a/HellionChat/Plugin.cs +++ b/HellionChat/Plugin.cs @@ -620,9 +620,6 @@ public sealed class Plugin : IAsyncDalamudPlugin // or already ran within the past 24 hours. RunRetentionSweepIfDue(); - if (Config.ShowEmotes) - _ = EmoteCache.LoadData(); - // FilterAllTabsAsync now runs from MessageManagerInitHostedService // during Host.StartAsync (same Reason-not-Boot guard there). @@ -841,7 +838,6 @@ public sealed class Plugin : IAsyncDalamudPlugin } // Static-class cleanups the container has no handle on. - failure = CaptureFailure(failure, () => EmoteCache.Dispose()); failure = CaptureFailure(failure, InputHistoryService.Reset); if (failure is not null) diff --git a/HellionChat/Resources/HellionStrings.Designer.cs b/HellionChat/Resources/HellionStrings.Designer.cs index 218106b..2d89050 100644 --- a/HellionChat/Resources/HellionStrings.Designer.cs +++ b/HellionChat/Resources/HellionStrings.Designer.cs @@ -202,8 +202,6 @@ internal class HellionStrings internal static string AutoTellTabs_UnGreetedTooltip => Get(nameof(AutoTellTabs_UnGreetedTooltip)); internal static string PinTab_MenuPin => Get(nameof(PinTab_MenuPin)); internal static string PinTab_MenuUnpin => Get(nameof(PinTab_MenuUnpin)); - internal static string PinTab_MenuPromote => Get(nameof(PinTab_MenuPromote)); - internal static string PinTab_PromoteTooltip => Get(nameof(PinTab_PromoteTooltip)); internal static string PinTab_LimitReached => Get(nameof(PinTab_LimitReached)); internal static string PinTab_PinnedTooltip => Get(nameof(PinTab_PinnedTooltip)); internal static string PinTab_PinTooltip => Get(nameof(PinTab_PinTooltip)); @@ -438,7 +436,6 @@ internal class HellionStrings internal static string Settings_About_GiteaRepo => Get(nameof(Settings_About_GiteaRepo)); internal static string Settings_About_CustomRepo => Get(nameof(Settings_About_CustomRepo)); internal static string Settings_Section_AutoTranslate => Get(nameof(Settings_Section_AutoTranslate)); - internal static string Settings_Emotes_Block => Get(nameof(Settings_Emotes_Block)); internal static string Settings_Telemetry_None => Get(nameof(Settings_Telemetry_None)); internal static string Settings_Section_Database => Get(nameof(Settings_Section_Database)); @@ -549,7 +546,6 @@ internal class HellionStrings internal static string Settings_Section_Messages => Get(nameof(Settings_Section_Messages)); internal static string Settings_Section_InputPreview => Get(nameof(Settings_Section_InputPreview)); internal static string Settings_Section_AutoTellTabs => Get(nameof(Settings_Section_AutoTellTabs)); - internal static string Settings_Section_Emotes => Get(nameof(Settings_Section_Emotes)); internal static string Settings_Section_LinksTooltips => Get(nameof(Settings_Section_LinksTooltips)); internal static string Settings_Section_NoviceNetwork => Get(nameof(Settings_Section_NoviceNetwork)); diff --git a/HellionChat/Resources/HellionStrings.ca.resx b/HellionChat/Resources/HellionStrings.ca.resx index fed51c2..e45caac 100644 --- a/HellionChat/Resources/HellionStrings.ca.resx +++ b/HellionChat/Resources/HellionStrings.ca.resx @@ -467,12 +467,6 @@ Desfixa la pestanya - - Converteix en pestanya permanent - - - Converteix aquest TempTell en una pestanya normal. L'enllaç del tell amb el company es perd: la pestanya capturarà missatges pels seus filtres de canal a partir d'ara. Per a "la pestanya sobreviu al reconnectar mentre continua lligada a aquest company", utilitza Fixa la pestanya. - Les pestanyes fixades sobreviuen al reconnectar i continuen lligades a aquest interlocutor. @@ -903,9 +897,6 @@ Pestanyes de tell automàtic - - Emotes - Enllaços i consells @@ -1100,9 +1091,6 @@ Traducció automàtica - - Bloqueja - Vés al missatge més recent diff --git a/HellionChat/Resources/HellionStrings.cs.resx b/HellionChat/Resources/HellionStrings.cs.resx index 783b971..8580025 100644 --- a/HellionChat/Resources/HellionStrings.cs.resx +++ b/HellionChat/Resources/HellionStrings.cs.resx @@ -467,12 +467,6 @@ Odepnout záložku - - Povýšit na trvalou záložku - - - Přemění tento TempTell na normální záložku. Vazba na partnera přes tell se zruší: záložka od té doby zachytává zprávy podle filtrů kanálů. Chceš-li „záložka přežije relog a zůstane svázaná s tímto partnerem", použij raději Připnout záložku. - Připnuté záložky přeživají relog a zůstávají svázané s tímto konverzačním partnerem. @@ -902,9 +896,6 @@ Automatické karty pro tell - - Emoty - Odkazy a popisky @@ -1099,9 +1090,6 @@ Automatický překlad - - Zablokovat - Přejít na nejnovější zprávu diff --git a/HellionChat/Resources/HellionStrings.da.resx b/HellionChat/Resources/HellionStrings.da.resx index 5f7e648..5349e5b 100644 --- a/HellionChat/Resources/HellionStrings.da.resx +++ b/HellionChat/Resources/HellionStrings.da.resx @@ -467,12 +467,6 @@ Frigør tab - - Konvertér til permanent tab - - - Gør denne TempTell til en regulær tab. Tell-bindingen til samtalepartneren fjernes, og tab'en vil fremover opfange beskeder via dens kanalfiltre. Brug Fastgør tab i stedet, hvis du vil have "tab overlever genlog og forbliver bundet til denne partner". - Fastgjorte tabs overlever genlog og forbliver bundet til denne samtalepartner. @@ -902,9 +896,6 @@ Auto-tell-faner - - Emotes - Links og værktøjstip @@ -1099,9 +1090,6 @@ Auto-oversættelse - - Bloker - Hop til den seneste besked diff --git a/HellionChat/Resources/HellionStrings.de.resx b/HellionChat/Resources/HellionStrings.de.resx index 8484335..4d95b1b 100644 --- a/HellionChat/Resources/HellionStrings.de.resx +++ b/HellionChat/Resources/HellionStrings.de.resx @@ -467,12 +467,6 @@ Tab lösen - - In Standard-Tab umwandeln - - - Wandelt den temporären Flüster-Tab in einen regulären Tab um. Die Flüster-Bindung an die Person geht verloren, der Tab fängt dann Nachrichten anhand der Channel-Filter ein. Für „Tab überlebt Relog" stattdessen „Tab anpinnen" wählen. - Maximal {0} angepinnte Flüster-Tabs erreicht. Erst einen lösen oder dauerhaft behalten. @@ -897,9 +891,6 @@ Auto-Flüster-Tabs - - Emotes - Links & Tooltips @@ -1094,9 +1085,6 @@ Auto-Übersetzung - - Sperren - Zur neuesten Nachricht springen diff --git a/HellionChat/Resources/HellionStrings.el.resx b/HellionChat/Resources/HellionStrings.el.resx index 294ca5e..605acd7 100644 --- a/HellionChat/Resources/HellionStrings.el.resx +++ b/HellionChat/Resources/HellionStrings.el.resx @@ -467,12 +467,6 @@ Ξεκαρφίτσωμα καρτέλας - - Προαγωγή σε μόνιμη - - - Μετατρέπει αυτό το TempTell σε κανονική καρτέλα. Η σύνδεση tell με τον συνομιλητή καταργείται. Η καρτέλα θα συλλαμβάνει μηνύματα βάσει φίλτρων καναλιών από εδώ και εξής. Για "η καρτέλα επιβιώνει relog ενώ παραμένει συνδεδεμένη με αυτόν τον συνομιλητή", χρησιμοποίησε αντί αυτού το Καρφίτσωμα καρτέλας. - Οι καρφιτσωμένες καρτέλες επιβιώνουν relog και παραμένουν συνδεδεμένες με αυτόν τον συνομιλητή. @@ -902,9 +896,6 @@ Αυτόματες καρτέλες tell - - Εκφράσεις - Σύνδεσμοι & επεξηγήσεις @@ -1099,9 +1090,6 @@ Αυτόματη μετάφραση - - Αποκλεισμός - Μετάβαση στο πιο πρόσφατο μήνυμα diff --git a/HellionChat/Resources/HellionStrings.es.resx b/HellionChat/Resources/HellionStrings.es.resx index b60515f..9797a3b 100644 --- a/HellionChat/Resources/HellionStrings.es.resx +++ b/HellionChat/Resources/HellionStrings.es.resx @@ -467,12 +467,6 @@ Desfijar pestaña - - Convertir en pestaña permanente - - - Convierte este TempTell en una pestaña regular. Se pierde el vínculo de tell con la persona: la pestaña captará mensajes según sus filtros de canal a partir de ahora. Para "la pestaña sobrevive al relog pero sigue vinculada a esta persona", usa Fijar pestaña en su lugar. - Las pestañas fijadas sobreviven al relog y permanecen vinculadas a esta persona de conversación. @@ -903,9 +897,6 @@ Pestañas de tell automático - - Emotes - Enlaces y sugerencias @@ -1100,9 +1091,6 @@ Traducción automática - - Bloquear - Ir al mensaje más reciente diff --git a/HellionChat/Resources/HellionStrings.fi.resx b/HellionChat/Resources/HellionStrings.fi.resx index 2de9366..1c69678 100644 --- a/HellionChat/Resources/HellionStrings.fi.resx +++ b/HellionChat/Resources/HellionStrings.fi.resx @@ -467,12 +467,6 @@ Irrota välilehti - - Muuta pysyväksi välilehdeksi - - - Muuttaa tämän TempTell-välilehden tavalliseksi välilehdeksi. Tell-sidonta kumppaniin poistetaan: välilehti poimii viestit kanavasuodattimiensa perusteella tästä eteenpäin. Jos haluat "välilehti selviää relogista sidottuna tähän kumppaniin", käytä sen sijaan Kiinnitä välilehti -toimintoa. - Kiinnitetyt välilehdet selviävät relogista ja pysyvät sidottuina tähän keskustelukumppaniin. @@ -902,9 +896,6 @@ Automaattiset tell-välilehdet - - Emotet - Linkit ja työkaluvihjeet @@ -1099,9 +1090,6 @@ Automaattikäännös - - Estä - Siirry uusimpaan viestiin diff --git a/HellionChat/Resources/HellionStrings.fr.resx b/HellionChat/Resources/HellionStrings.fr.resx index 7a58f98..cd8523b 100644 --- a/HellionChat/Resources/HellionStrings.fr.resx +++ b/HellionChat/Resources/HellionStrings.fr.resx @@ -467,12 +467,6 @@ Désépingler l'onglet - - Promouvoir en permanent - - - Transforme cet onglet MP temporaire en onglet régulier. Le lien du message privé avec le partenaire est rompu. L'onglet capturera désormais les messages selon ses filtres de canaux. Pour « onglet qui survit à la reconnexion en restant lié à ce partenaire », utilisez Épingler l'onglet à la place. - Les onglets épinglés survivent à la reconnexion et restent liés à ce partenaire de conversation. @@ -903,9 +897,6 @@ Onglets de message privé automatiques - - Emotes - Liens et infobulles @@ -1100,9 +1091,6 @@ Traduction automatique - - Bloquer - Aller au message le plus récent diff --git a/HellionChat/Resources/HellionStrings.hu.resx b/HellionChat/Resources/HellionStrings.hu.resx index 90cdf6c..ca46b60 100644 --- a/HellionChat/Resources/HellionStrings.hu.resx +++ b/HellionChat/Resources/HellionStrings.hu.resx @@ -467,12 +467,6 @@ Fül rögzítésének feloldása - - Előléptetés állandó füllé - - - Ezt a TempTell-t normál füllé alakítja. A partnerhez való tell-kötés megszűnik: a fül ezentúl a csatornaszűrők alapján fogja az üzeneteket. Ha azt szeretnéd, hogy „a fül túlélje az újrabejelentkezést és kötve maradjon a partnerhez", inkább a Fül rögzítése funkciót használd. - A rögzített fülek túlélik az újrabejelentkezést, és kötve maradnak a beszélgető partnerhez. @@ -902,9 +896,6 @@ Automatikus tell lapfülek - - Emote-ok - Hivatkozások és súgóbubborékok @@ -1099,9 +1090,6 @@ Automatikus fordítás - - Letiltás - Ugrás a legutóbbi üzenetre diff --git a/HellionChat/Resources/HellionStrings.it.resx b/HellionChat/Resources/HellionStrings.it.resx index c823dc8..26b3ca2 100644 --- a/HellionChat/Resources/HellionStrings.it.resx +++ b/HellionChat/Resources/HellionStrings.it.resx @@ -467,12 +467,6 @@ Sblocca tab - - Converti in tab permanente - - - Trasforma questo TempTell in un tab normale. Il legame tell con il partner viene rimosso: il tab catturerà i messaggi tramite i suoi filtri canale da ora in poi. Per "il tab sopravvive al relog restando legato a questo partner", usa Fissa tab. - I tab fissi sopravvivono al relog e rimangono legati a questo partner di conversazione. @@ -903,9 +897,6 @@ Schede tell automatiche - - Emote - Link e tooltip @@ -1100,9 +1091,6 @@ Traduzione automatica - - Blocca - Vai al messaggio più recente diff --git a/HellionChat/Resources/HellionStrings.ja.resx b/HellionChat/Resources/HellionStrings.ja.resx index e27e937..44e5e5f 100644 --- a/HellionChat/Resources/HellionStrings.ja.resx +++ b/HellionChat/Resources/HellionStrings.ja.resx @@ -467,12 +467,6 @@ タブのピン留めを解除 - - 永続タブに昇格 - - - この TempTell を通常のタブに変換します。会話相手へのテル紐付けは解除され、以降はチャンネルフィルターでメッセージを受信します。「再ログイン後も残す + 相手との紐付けを維持」したい場合は「タブをピン留め」をご利用ください。 - ピン留めされたタブは再ログイン後も残り、会話相手との紐付けを維持します。 @@ -903,9 +897,6 @@ オートテルタブ - - エモート - リンクとツールチップ @@ -1100,9 +1091,6 @@ 定型文 - - ブロック - 最新のメッセージへ移動 diff --git a/HellionChat/Resources/HellionStrings.ko.resx b/HellionChat/Resources/HellionStrings.ko.resx index 0d4866f..f254ed5 100644 --- a/HellionChat/Resources/HellionStrings.ko.resx +++ b/HellionChat/Resources/HellionStrings.ko.resx @@ -467,12 +467,6 @@ 탭 고정 해제 - - 영구 탭으로 변환 - - - 이 임시 귓속말 탭을 일반 탭으로 변환합니다. 상대방과의 귓속말 연결이 해제되며, 이후 채널 필터로 메시지를 받습니다. "재접속 후에도 상대방과 연결 유지"를 원한다면 탭 고정을 사용하세요. - 고정된 탭은 재접속 후에도 유지되며 이 대화 상대와의 연결이 유지됩니다. @@ -903,9 +897,6 @@ 자동 귓속말 탭 - - 감정 표현 - 링크 및 툴팁 @@ -1100,9 +1091,6 @@ 정형문 - - 차단 - 최신 메시지로 이동 diff --git a/HellionChat/Resources/HellionStrings.nb.resx b/HellionChat/Resources/HellionStrings.nb.resx index 3f3e4ea..c24b57c 100644 --- a/HellionChat/Resources/HellionStrings.nb.resx +++ b/HellionChat/Resources/HellionStrings.nb.resx @@ -467,12 +467,6 @@ Løsgjør fane - - Gjør permanent - - - Gjør denne TempTell om til en vanlig fane. Tell-bindingen til samtalepartneren fjernes, og fanen vil fra nå av fange meldinger via kanalfilteret. For å overleve relog mens du forblir bundet til denne partneren, bruk Fest fane i stedet. - Festede faner overlever relog og forblir bundet til denne samtalepartneren. @@ -902,9 +896,6 @@ Automatiske tell-faner - - Emotes - Lenker og verktøytips @@ -1099,9 +1090,6 @@ Auto-oversettelse - - Blokker - Hopp til den nyeste meldingen diff --git a/HellionChat/Resources/HellionStrings.nl.resx b/HellionChat/Resources/HellionStrings.nl.resx index 52178d7..956cc79 100644 --- a/HellionChat/Resources/HellionStrings.nl.resx +++ b/HellionChat/Resources/HellionStrings.nl.resx @@ -467,12 +467,6 @@ Tabblad losmaken - - Omzetten naar permanent tabblad - - - Zet deze TempTell om naar een gewoon tabblad. De tell-koppeling met de gesprekspartner wordt verbroken: het tabblad vangt berichten voortaan op via de kanaalsfilters. Gebruik "Tabblad vastpinnen" als je wilt dat het tabblad een relog overleeft terwijl het gekoppeld blijft aan deze gesprekspartner. - Vastgepinde tabbladen overleven een relog en blijven gekoppeld aan deze gesprekspartner. @@ -903,9 +897,6 @@ Automatische tell-tabbladen - - Emotes - Links en tooltips @@ -1100,9 +1091,6 @@ Automatische vertaling - - Blokkeren - Ga naar het nieuwste bericht diff --git a/HellionChat/Resources/HellionStrings.pl.resx b/HellionChat/Resources/HellionStrings.pl.resx index a42094c..090f796 100644 --- a/HellionChat/Resources/HellionStrings.pl.resx +++ b/HellionChat/Resources/HellionStrings.pl.resx @@ -467,12 +467,6 @@ Odepnij zakładkę - - Przekształć w stałą zakładkę - - - Zamienia ten TempTell w zwykłą zakładkę. Powiązanie tell z partnerem zostaje usunięte: od tej pory zakładka będzie przechwytywać wiadomości na podstawie filtrów kanałów. Jeśli chcesz, żeby „zakładka przeżyła relog i pozostała powiązana z tym partnerem", użyj zamiast tego Przypnij zakładkę. - Przypięte zakładki przeżywają relog i pozostają powiązane z tym partnerem rozmowy. @@ -902,9 +896,6 @@ Automatyczne karty tell - - Emotki - Linki i podpowiedzi @@ -1099,9 +1090,6 @@ Autotłumaczenie - - Zablokuj - Przejdź do najnowszej wiadomości diff --git a/HellionChat/Resources/HellionStrings.pt-BR.resx b/HellionChat/Resources/HellionStrings.pt-BR.resx index 9db5d6b..8b3ca2c 100644 --- a/HellionChat/Resources/HellionStrings.pt-BR.resx +++ b/HellionChat/Resources/HellionStrings.pt-BR.resx @@ -467,12 +467,6 @@ Desafixar aba - - Promover para permanente - - - Transforma este TempTell em uma aba regular. O vínculo de tell com o parceiro é removido: a aba passará a capturar mensagens pelos filtros de canal a partir de agora. Para "aba sobrevive ao relog mantendo o vínculo com este parceiro", use Fixar aba. - Abas fixadas sobrevivem ao relog e permanecem vinculadas a este parceiro de conversa. @@ -903,9 +897,6 @@ Abas de tell automático - - Emotes - Links e dicas @@ -1100,9 +1091,6 @@ Tradução automática - - Bloquear - Ir para a mensagem mais recente diff --git a/HellionChat/Resources/HellionStrings.pt-PT.resx b/HellionChat/Resources/HellionStrings.pt-PT.resx index 920b34d..646ab52 100644 --- a/HellionChat/Resources/HellionStrings.pt-PT.resx +++ b/HellionChat/Resources/HellionStrings.pt-PT.resx @@ -467,12 +467,6 @@ Desafixar separador - - Promover a permanente - - - Transforma este TempTell num separador normal. A ligação de tell ao parceiro é removida: o separador passará a capturar mensagens pelos seus filtros de canal. Para "separador sobrevive ao relog mantendo a ligação a este parceiro", usa Fixar separador. - Os separadores fixos sobrevivem ao relog e mantêm a ligação a este parceiro de conversa. @@ -902,9 +896,6 @@ Separadores de tell automático - - Emotes - Ligações e dicas @@ -1099,9 +1090,6 @@ Tradução automática - - Bloquear - Ir para a mensagem mais recente diff --git a/HellionChat/Resources/HellionStrings.resx b/HellionChat/Resources/HellionStrings.resx index 5e3f01f..ea1b660 100644 --- a/HellionChat/Resources/HellionStrings.resx +++ b/HellionChat/Resources/HellionStrings.resx @@ -467,12 +467,6 @@ Unpin Tab - - Promote to permanent - - - Turns this TempTell into a regular tab. The tell binding to the partner is dropped. The tab will catch messages by its channel filters from now on. For "tab survives relog while staying bound to this partner", use Pin Tab instead. - Pinned tabs survive relog and stay bound to this conversation partner. @@ -993,9 +987,6 @@ Auto-tell tabs - - Emotes - Links & tooltips @@ -1120,9 +1111,6 @@ Auto-translate - - Block - off diff --git a/HellionChat/Resources/HellionStrings.ro.resx b/HellionChat/Resources/HellionStrings.ro.resx index fe6d5cd..6c584f4 100644 --- a/HellionChat/Resources/HellionStrings.ro.resx +++ b/HellionChat/Resources/HellionStrings.ro.resx @@ -467,12 +467,6 @@ Dezfixează tab-ul - - Promovează la permanent - - - Transformă acest TempTell într-un tab obișnuit. Legătura tell cu partenerul este eliminată: tab-ul va prinde mesaje după filtrele de canal de acum înainte. Pentru „tab supraviețuiește relog rămânând legat de acest partener", folosește Fixează tab-ul. - Tab-urile fixate supraviețuiesc relog-ului și rămân legate de acest partener de conversație. @@ -903,9 +897,6 @@ File tell automate - - Emote-uri - Linkuri și sugestii @@ -1100,9 +1091,6 @@ Traducere automată - - Blochează - Salt la cel mai recent mesaj diff --git a/HellionChat/Resources/HellionStrings.ru.resx b/HellionChat/Resources/HellionStrings.ru.resx index 42b2d48..aaf82af 100644 --- a/HellionChat/Resources/HellionStrings.ru.resx +++ b/HellionChat/Resources/HellionStrings.ru.resx @@ -467,12 +467,6 @@ Открепить вкладку - - Преобразовать в постоянную - - - Превращает эту TempTell в обычную вкладку. Привязка ЛС к собеседнику снимается — вкладка будет получать сообщения по фильтрам канала. Для «вкладка переживает релог, оставаясь привязанной к собеседнику» используйте «Закрепить вкладку». - Закреплённые вкладки переживают релог и остаются привязанными к этому собеседнику. @@ -903,9 +897,6 @@ Авто-вкладки tell - - Эмоции - Ссылки и подсказки @@ -1100,9 +1091,6 @@ Автоперевод - - Заблокировать - Перейти к последнему сообщению diff --git a/HellionChat/Resources/HellionStrings.sv.resx b/HellionChat/Resources/HellionStrings.sv.resx index a3dde99..e347905 100644 --- a/HellionChat/Resources/HellionStrings.sv.resx +++ b/HellionChat/Resources/HellionStrings.sv.resx @@ -467,12 +467,6 @@ Lossa flik - - Uppgradera till permanent - - - Omvandlar den här TempTell-fliken till en vanlig flik. Bindningen till konversationspartnern tas bort och fliken fångar meddelanden via sina kanalfilter från och med nu. Använd Fäst flik om du vill att fliken ska överleva omloggning och ändå vara bunden till den här partnern. - Fästa flikar överlever omloggning och är kvar bundna till den här konversationspartnern. @@ -903,9 +897,6 @@ Automatiska tell-flikar - - Emotes - Länkar och verktygstips @@ -1100,9 +1091,6 @@ Autoöversättning - - Blockera - Hoppa till det senaste meddelandet diff --git a/HellionChat/Resources/HellionStrings.tr.resx b/HellionChat/Resources/HellionStrings.tr.resx index 49b7ff2..f82c809 100644 --- a/HellionChat/Resources/HellionStrings.tr.resx +++ b/HellionChat/Resources/HellionStrings.tr.resx @@ -467,12 +467,6 @@ Sekmeyi serbest bırak - - Kalıcı sekmeye yükselt - - - Bu TempTell'i normal bir sekmeye dönüştürür. Kullanıcıya olan tell bağlantısı kaldırılır; sekme bundan sonra kanal filtrelerine göre mesaj yakalar. "Kullanıcıya bağlı kalarak yeniden giriş sonrası hayatta kalma" için bunun yerine Sekmeyi Sabitle'yi kullan. - Sabitlenmiş sekmeler yeniden girişten sonra hayatta kalır ve bu konuşma ortağına bağlı kalır. @@ -902,9 +896,6 @@ Otomatik tell sekmeleri - - Emote'lar - Bağlantılar ve araç ipuçları @@ -1099,9 +1090,6 @@ Otomatik çeviri - - Engelle - En son iletiye git diff --git a/HellionChat/Resources/HellionStrings.uk.resx b/HellionChat/Resources/HellionStrings.uk.resx index b9e2488..6dd5cc3 100644 --- a/HellionChat/Resources/HellionStrings.uk.resx +++ b/HellionChat/Resources/HellionStrings.uk.resx @@ -467,12 +467,6 @@ Відкріпити вкладку - - Перетворити на постійну - - - Перетворює цей TempTell на звичайну вкладку. Прив'язка tell до партнера знімається — вкладка надалі отримуватиме повідомлення за фільтрами каналів. Для «вкладка виживає після релогу та залишається прив'язаною до цього партнера» натомість скористайтесь «Закріпити вкладку». - Закріплені вкладки виживають після релогу та залишаються прив'язаними до цього партнера розмови. @@ -902,9 +896,6 @@ Автоматичні вкладки tell - - Емоції - Посилання та підказки @@ -1099,9 +1090,6 @@ Автопереклад - - Заблокувати - Перейти до останнього повідомлення diff --git a/HellionChat/Resources/HellionStrings.zh-Hans.resx b/HellionChat/Resources/HellionStrings.zh-Hans.resx index 074af34..4afddc2 100644 --- a/HellionChat/Resources/HellionStrings.zh-Hans.resx +++ b/HellionChat/Resources/HellionStrings.zh-Hans.resx @@ -467,12 +467,6 @@ 取消固定 - - 提升为永久标签页 - - - 将此临时密语标签页转换为普通标签页。与对话伙伴的密语绑定将被解除,之后该标签页将根据频道过滤器接收消息。若需要"标签页在重新登录后仍保持与该伙伴的绑定",请使用固定标签页功能。 - 固定的标签页在重新登录后仍会保留,并保持与该对话伙伴的绑定。 @@ -903,9 +897,6 @@ 自动密语标签页 - - 表情动作 - 链接与工具提示 @@ -1100,9 +1091,6 @@ 自动翻译 - - 屏蔽 - 跳到最新消息 diff --git a/HellionChat/Resources/HellionStrings.zh-Hant.resx b/HellionChat/Resources/HellionStrings.zh-Hant.resx index c399412..9996321 100644 --- a/HellionChat/Resources/HellionStrings.zh-Hant.resx +++ b/HellionChat/Resources/HellionStrings.zh-Hant.resx @@ -467,12 +467,6 @@ 取消釘選 - - 升格為永久標籤頁 - - - 將此 TempTell 轉換為一般標籤頁。與對話對象的悄悄話綁定將解除,標籤頁之後將依頻道篩選條件接收訊息。若要「標籤頁在重新登入後保留且持續綁定此對象」,請改用釘選標籤頁。 - 釘選的標籤頁在重新登入後仍會保留,並持續綁定此對話對象。 @@ -903,9 +897,6 @@ 自動悄悄話標籤頁 - - 情感動作 - 連結與工具提示 @@ -1100,9 +1091,6 @@ 自動翻譯 - - 封鎖 - 跳到最新訊息 diff --git a/HellionChat/Resources/Language.ca.resx b/HellionChat/Resources/Language.ca.resx index 7d47e2f..d63960f 100644 --- a/HellionChat/Resources/Language.ca.resx +++ b/HellionChat/Resources/Language.ca.resx @@ -1168,39 +1168,12 @@ Keeps the input focus, even if you enter battle or do other actions. - - Show emotes - - - Replaces words with their emote version, currently supports BetterTTV. - - - Emotes - - - Blocked emotes - - - Emote - Hide during battle Hide the chat during battles. - - Emote Stats - - - Ready - - - Not Ready - - - Emotes available: - Displays a preview with special parameter evaluated, like emotes and <item>. diff --git a/HellionChat/Resources/Language.cs.resx b/HellionChat/Resources/Language.cs.resx index 896fe53..b1afc18 100644 --- a/HellionChat/Resources/Language.cs.resx +++ b/HellionChat/Resources/Language.cs.resx @@ -1190,21 +1190,6 @@ Zachová fokus vstupu, i když vstoupíš do boje nebo provedeš jinou akci. - - Zobrazit emoty - - - Nahrazuje slova jejich emote verzí, aktuálně podporuje BetterTTV. - - - Emotes - - - Zablokované emoty - - - Emote - Skrýt v boji @@ -1217,18 +1202,6 @@ Skryje chat, když je otevřeno menu New Game+. Zavřením menu se chat znovu zobrazí. - - Statistiky emotů - - - Připraveno - - - Nepřipraveno - - - Dostupné emoty: - Zobrazí náhled se speciálními parametry, jako jsou emoty a <item>. diff --git a/HellionChat/Resources/Language.da.resx b/HellionChat/Resources/Language.da.resx index 2b0dcea..b0d0cd5 100644 --- a/HellionChat/Resources/Language.da.resx +++ b/HellionChat/Resources/Language.da.resx @@ -1190,21 +1190,6 @@ Beholder inputfokus, selvom du går i kamp eller udfører andre handlinger. - - Vis emotes - - - Erstatter ord med deres emote-version, understøtter i øjeblikket BetterTTV. - - - Emotes - - - Blokerede emotes - - - Emote - Skjul under kamp @@ -1217,18 +1202,6 @@ Skjuler chatten mens New Game+-menuen er åben. Lukning af menuen viser chatten igen. - - Emote-statistik - - - Klar - - - Ikke klar - - - Tilgængelige emotes: - Viser en forhåndsvisning med særlige parametre evalueret, som emotes og <item>. diff --git a/HellionChat/Resources/Language.de.resx b/HellionChat/Resources/Language.de.resx index 9910897..715ecca 100644 --- a/HellionChat/Resources/Language.de.resx +++ b/HellionChat/Resources/Language.de.resx @@ -1189,21 +1189,6 @@ Sie wurden gewarnt. Der Eingabefokus wird beibehalten, selbst wenn du einen Kampf betrittst oder eine andere Aktion ausführst. - - Emotes anzeigen - - - Ersetzt Wörter mit ihrer Emote-Version, unterstützt derzeit BetterTTV. - - - Emotes - - - Blockierte Emotes - - - Emote - Während des Kampfes ausblenden @@ -1216,18 +1201,6 @@ Sie wurden gewarnt. Blendet den Chat aus, solange das New-Game+ Menü geöffnet ist. Schließen des Menüs blendet den Chat wieder ein. - - Emote-Statistik - - - Bereit - - - Nicht bereit - - - Emotes verfügbar: - Zeigt eine Vorschau mit speziellen Parametern, wie Emotes und <item>. diff --git a/HellionChat/Resources/Language.el.resx b/HellionChat/Resources/Language.el.resx index d4f9094..1fb2632 100644 --- a/HellionChat/Resources/Language.el.resx +++ b/HellionChat/Resources/Language.el.resx @@ -1190,21 +1190,6 @@ Διατηρεί την εστίαση εισαγωγής, ακόμα και αν μπεις σε μάχη ή κάνεις άλλες ενέργειες. - - Εμφάνιση emotes - - - Αντικαθιστά λέξεις με την έκδοση emote τους, υποστηρίζει αυτή τη στιγμή BetterTTV. - - - Emotes - - - Αποκλεισμένα emotes - - - Emote - Απόκρυψη κατά τη μάχη @@ -1217,18 +1202,6 @@ Απόκρυψη της συνομιλίας ενώ το μενού New Game+ είναι ανοιχτό. Το κλείσιμο του μενού εμφανίζει ξανά τη συνομιλία. - - Στατιστικά Emote - - - Έτοιμο - - - Μη έτοιμο - - - Διαθέσιμα emotes: - Εμφανίζει προεπισκόπηση με αξιολόγηση ειδικών παραμέτρων, όπως emotes και <item>. diff --git a/HellionChat/Resources/Language.es.resx b/HellionChat/Resources/Language.es.resx index 976ef85..8ebc7e1 100644 --- a/HellionChat/Resources/Language.es.resx +++ b/HellionChat/Resources/Language.es.resx @@ -1168,39 +1168,12 @@ Mantiene el foco de entrada, incluso si entras en combate o realizas otras acciones. - - Mostrar emotes - - - Reemplaza las palabras por su versión de emote, actualmente soporta BetterTTV. - - - Gestos - - - Emotes bloqueados - - - Gesto - Ocultar durante el combate Ocultar el chat durante combates. - - Estadísticas de gestos - - - Listo - - - No listo - - - Gestos disponibles: - Muestra una vista previa con un parámetro especial evaluado, como emotes o <item>. diff --git a/HellionChat/Resources/Language.fi.resx b/HellionChat/Resources/Language.fi.resx index 9b05a0c..372274e 100644 --- a/HellionChat/Resources/Language.fi.resx +++ b/HellionChat/Resources/Language.fi.resx @@ -1190,21 +1190,6 @@ Pitää syöttöfokuksen, vaikka siirtyisit taisteluun tai tekisit muita toimintoja. - - Näytä emootiot - - - Korvaa sanat niiden emootioversioilla, tukee tällä hetkellä BetterTTV:tä. - - - Emootiot - - - Estetyt emootiot - - - Emootio - Piilota taistelun aikana @@ -1217,18 +1202,6 @@ Piilottaa chatin New Game+ -valikon ollessa auki. Sulkeminen näyttää chatin uudelleen. - - Emootiotilastot - - - Valmis - - - Ei valmis - - - Emootioita saatavilla: - Näyttää esikatselun erikoisparametreilla arvioituna, kuten emootiot ja <item>. diff --git a/HellionChat/Resources/Language.fr.resx b/HellionChat/Resources/Language.fr.resx index f94ad8a..43a6c03 100644 --- a/HellionChat/Resources/Language.fr.resx +++ b/HellionChat/Resources/Language.fr.resx @@ -1168,39 +1168,12 @@ Maintient le focus de saisie, même si vous entrez au combat ou faites d'autres actions. - - Afficher les emotes - - - Remplace les mots par leur version emote, prend actuellement en charge BetterTTV. - - - Emotes - - - Émotes bloquées - - - Emote - Cacher pendant le combat Cacher le chat pendant les combats. - - Statistiques de l'emote - - - Prêt - - - Pas prêt - - - Emotes disponibles : - Affiche un aperçu avec un paramètre spécial estimé, comme les emotes et <item>. diff --git a/HellionChat/Resources/Language.hu.resx b/HellionChat/Resources/Language.hu.resx index 7e0bb46..1e678e6 100644 --- a/HellionChat/Resources/Language.hu.resx +++ b/HellionChat/Resources/Language.hu.resx @@ -1190,21 +1190,6 @@ Megtartja a beviteli fókuszt, még harc közben vagy más műveletek végzésekor is. - - Emote-ok megjelenítése - - - Szavakat helyettesít az emote változatukkal, jelenleg a BetterTTV-t támogatja. - - - Emote-ok - - - Blokkolt emote-ok - - - Emote - Elrejtés harc közben @@ -1217,18 +1202,6 @@ A chat elrejtése, amíg a New Game+ menü nyitva van. A menü bezárásakor a chat újra megjelenik. - - Emote statisztikák - - - Kész - - - Nem kész - - - Elérhető emote-ok: - Előnézetet jelenít meg kiértékelt speciális paraméterekkel, például emote-ok és <item>. diff --git a/HellionChat/Resources/Language.it.resx b/HellionChat/Resources/Language.it.resx index 5bae064..24e0bf9 100644 --- a/HellionChat/Resources/Language.it.resx +++ b/HellionChat/Resources/Language.it.resx @@ -1168,39 +1168,12 @@ Keeps the input focus, even if you enter battle or do other actions. - - Show emotes - - - Replaces words with their emote version, currently supports BetterTTV. - - - Emotes - - - Blocked emotes - - - Emote - Nascondi in battaglia Nascondi la chat in battaglia. - - Emote Stats - - - Pronto - - - Non pronto - - - Emotes available: - Displays a preview with special parameter evaluated, like emotes and <item>. diff --git a/HellionChat/Resources/Language.ja.resx b/HellionChat/Resources/Language.ja.resx index 03e8cab..f0701ba 100644 --- a/HellionChat/Resources/Language.ja.resx +++ b/HellionChat/Resources/Language.ja.resx @@ -1168,39 +1168,12 @@ 戦闘に入ったり、他のアクションを行ったりしても、入力フォーカスを維持します。 - - エモートを表示 - - - 単語をエモートバージョンに置き換え、現在BetterTTVをサポートしています。 - - - エモート - - - ブロックされたエモート - - - エモート - 戦闘中は非表示 戦闘中はチャットを非表示にします。 - - Emote Stats - - - 準備完了 - - - 未準備 - - - 利用可能なエモート: - emotes や <item> のように、特別なパラメータが評価されたプレビューを表示します。 diff --git a/HellionChat/Resources/Language.ko.resx b/HellionChat/Resources/Language.ko.resx index 357cd44..3d24a8d 100644 --- a/HellionChat/Resources/Language.ko.resx +++ b/HellionChat/Resources/Language.ko.resx @@ -1168,39 +1168,12 @@ Keeps the input focus, even if you enter battle or do other actions. - - Show emotes - - - Replaces words with their emote version, currently supports BetterTTV. - - - Emotes - - - Blocked emotes - - - Emote - Hide during battle Hide the chat during battles. - - Emote Stats - - - Ready - - - Not Ready - - - Emotes available: - Displays a preview with special parameter evaluated, like emotes and <item>. diff --git a/HellionChat/Resources/Language.nb.resx b/HellionChat/Resources/Language.nb.resx index fff522a..68d2e70 100644 --- a/HellionChat/Resources/Language.nb.resx +++ b/HellionChat/Resources/Language.nb.resx @@ -1190,21 +1190,6 @@ Beholder inndatafokuset selv om du går inn i kamp eller gjør andre handlinger. - - Vis emotes - - - Erstatter ord med tilsvarende emote-versjon. Støtter for øyeblikket BetterTTV. - - - Emotes - - - Blokkerte emotes - - - Emote - Skjul under kamp @@ -1217,18 +1202,6 @@ Skjuler chatten mens New Game+-menyen er åpen. Chatten vises igjen når menyen lukkes. - - Emote-statistikk - - - Klar - - - Ikke klar - - - Tilgjengelige emotes: - Viser en forhåndsvisning med spesielle parametere evaluert, som emotes og <item>. diff --git a/HellionChat/Resources/Language.nl.resx b/HellionChat/Resources/Language.nl.resx index 0269ced..659535b 100644 --- a/HellionChat/Resources/Language.nl.resx +++ b/HellionChat/Resources/Language.nl.resx @@ -1168,39 +1168,12 @@ Houdt de invoerfocus vast, zelfs als je een gevecht aangaat of andere acties uitvoert. - - Emotes tonen - - - Vervangt woorden door hun emote-versie, ondersteunt momenteel BetterTTV. - - - Emotes - - - Geblokkeerde emotes - - - Emote - Verbergen tijdens gevecht Verberg de chat tijdens gevechten. - - Emote-statistieken - - - Gereed - - - Niet Gereed - - - Emotes beschikbaar: - Toont een voorvertoning met geëvalueerde speciale parameters, zoals emotes en <item>. diff --git a/HellionChat/Resources/Language.pl.resx b/HellionChat/Resources/Language.pl.resx index 2a5d9cf..c5198b0 100644 --- a/HellionChat/Resources/Language.pl.resx +++ b/HellionChat/Resources/Language.pl.resx @@ -1190,21 +1190,6 @@ Utrzymuje fokus na polu wprowadzania, nawet jeśli wejdziesz w walkę lub wykonasz inne czynności. - - Pokaż emoty - - - Zastępuje słowa ich wersją emotów, obecnie obsługuje BetterTTV. - - - Emoty - - - Zablokowane emoty - - - Emot - Ukryj podczas walki @@ -1217,18 +1202,6 @@ Ukrywa czat gdy menu New Game+ jest otwarte. Zamknięcie menu pokazuje czat z powrotem. - - Statystyki emotów - - - Gotowe - - - Niegotowe - - - Dostępne emoty: - Wyświetla podgląd z obliczonymi parametrami specjalnymi, jak emoty i <item>. diff --git a/HellionChat/Resources/Language.pt-BR.resx b/HellionChat/Resources/Language.pt-BR.resx index e102667..bf45344 100644 --- a/HellionChat/Resources/Language.pt-BR.resx +++ b/HellionChat/Resources/Language.pt-BR.resx @@ -1168,39 +1168,12 @@ Mantém o foco de entrada, mesmo que você entre em batalha ou faça outras ações. - - Exibir gestos - - - Substitui as palavras por sua versão de gesto, atualmente suporta BetterTTV. - - - Gesto - - - Gestos bloqueados - - - Gesto - Esconder durante combate Esconder o bate-papo durante combate. - - Status de Gestos - - - Pronto - - - Não está pronto - - - Gestos disponíveis: - Exibe uma prévia com parâmetro especial avaliado, como gestos e <item>. diff --git a/HellionChat/Resources/Language.pt-PT.resx b/HellionChat/Resources/Language.pt-PT.resx index c515bfe..5ed92eb 100644 --- a/HellionChat/Resources/Language.pt-PT.resx +++ b/HellionChat/Resources/Language.pt-PT.resx @@ -1190,21 +1190,6 @@ Mantém o foco no campo de entrada mesmo que entres em combate ou faças outras ações. - - Mostrar emotes - - - Substitui palavras pela versão em emote correspondente. Suporta atualmente o BetterTTV. - - - Emotes - - - Emotes bloqueados - - - Emote - Ocultar durante o combate @@ -1217,18 +1202,6 @@ Oculta o chat enquanto o menu New Game+ está aberto. Ao fechar o menu, o chat volta a ser apresentado. - - Estatísticas de emotes - - - Pronto - - - Não está pronto - - - Emotes disponíveis: - Apresenta uma pré-visualização com parâmetros especiais avaliados, como emotes e <item>. diff --git a/HellionChat/Resources/Language.resx b/HellionChat/Resources/Language.resx index af5ec98..47f9e05 100644 --- a/HellionChat/Resources/Language.resx +++ b/HellionChat/Resources/Language.resx @@ -1174,21 +1174,6 @@ Keeps the input focus, even if you enter battle or do other actions. - - Show emotes - - - Replaces words with their emote version, currently supports BetterTTV. - - - Emotes - - - Blocked emotes - - - Emote - Hide during battle @@ -1201,18 +1186,6 @@ Hide the chat while the New Game+ menu is open. Closing the menu shows the chat again. - - Emote Stats - - - Ready - - - Not Ready - - - Emotes available: - Displays a preview with special parameter evaluated, like emotes and <item>. diff --git a/HellionChat/Resources/Language.ro.resx b/HellionChat/Resources/Language.ro.resx index 2f63132..564d64b 100644 --- a/HellionChat/Resources/Language.ro.resx +++ b/HellionChat/Resources/Language.ro.resx @@ -1168,39 +1168,12 @@ Keeps the input focus, even if you enter battle or do other actions. - - Show emotes - - - Replaces words with their emote version, currently supports BetterTTV. - - - Emotes - - - Blocked emotes - - - Emote - Hide during battle Hide the chat during battles. - - Emote Stats - - - Ready - - - Not Ready - - - Emotes available: - Displays a preview with special parameter evaluated, like emotes and <item>. diff --git a/HellionChat/Resources/Language.ru.resx b/HellionChat/Resources/Language.ru.resx index 2ff0c6f..a1a3e12 100644 --- a/HellionChat/Resources/Language.ru.resx +++ b/HellionChat/Resources/Language.ru.resx @@ -1168,39 +1168,12 @@ Keeps the input focus, even if you enter battle or do other actions. - - Show emotes - - - Replaces words with their emote version, currently supports BetterTTV. - - - Emotes - - - Blocked emotes - - - Emote - Hide during battle Hide the chat during battles. - - Emote Stats - - - Ready - - - Not Ready - - - Emotes available: - Displays a preview with special parameter evaluated, like emotes and <item>. diff --git a/HellionChat/Resources/Language.sv.resx b/HellionChat/Resources/Language.sv.resx index 197618b..2cf473e 100644 --- a/HellionChat/Resources/Language.sv.resx +++ b/HellionChat/Resources/Language.sv.resx @@ -1168,39 +1168,12 @@ Keeps the input focus, even if you enter battle or do other actions. - - Show emotes - - - Replaces words with their emote version, currently supports BetterTTV. - - - Emotes - - - Blocked emotes - - - Emote - Hide during battle Hide the chat during battles. - - Emote Stats - - - Ready - - - Not Ready - - - Emotes available: - Displays a preview with special parameter evaluated, like emotes and <item>. diff --git a/HellionChat/Resources/Language.tr.resx b/HellionChat/Resources/Language.tr.resx index 7881709..4cecabd 100644 --- a/HellionChat/Resources/Language.tr.resx +++ b/HellionChat/Resources/Language.tr.resx @@ -1190,21 +1190,6 @@ Savaşa girerken veya başka eylemler yaparken bile giriş odağını korur. - - Emote'ları göster - - - Kelimeleri emote sürümleriyle değiştirir, şu an BetterTTV desteklenmektedir. - - - Emote'lar - - - Engellenen emote'lar - - - Emote - Savaş sırasında gizle @@ -1217,18 +1202,6 @@ New Game+ menüsü açıkken sohbeti gizler. Menüyü kapatmak sohbeti tekrar gösterir. - - Emote İstatistikleri - - - Hazır - - - Hazır Değil - - - Kullanılabilir emote'lar: - Emote'lar ve <item> gibi özel parametrelerin değerlendirildiği bir önizleme gösterir. diff --git a/HellionChat/Resources/Language.uk.resx b/HellionChat/Resources/Language.uk.resx index 7e9d983..e1e1a66 100644 --- a/HellionChat/Resources/Language.uk.resx +++ b/HellionChat/Resources/Language.uk.resx @@ -1190,21 +1190,6 @@ Зберігає фокус введення навіть під час бою чи інших дій. - - Показувати емоти - - - Замінює слова їх версіями емотів. Наразі підтримує BetterTTV. - - - Емоти - - - Заблоковані емоти - - - Емот - Приховувати під час бою @@ -1217,18 +1202,6 @@ Приховати чат, поки відкрито меню New Game+. Закриття меню знову показує чат. - - Статистика емотів - - - Готово - - - Не готово - - - Доступно емотів: - Показує попередній перегляд з обробленими спеціальними параметрами, як-от емоти та <item>. diff --git a/HellionChat/Resources/Language.zh-Hans.resx b/HellionChat/Resources/Language.zh-Hans.resx index b1e95ec..5ba61de 100644 --- a/HellionChat/Resources/Language.zh-Hans.resx +++ b/HellionChat/Resources/Language.zh-Hans.resx @@ -1168,39 +1168,12 @@ 保持输入焦点,即使你进入战斗或执行其他操作。 - - 显示表情 - - - 用表情替换单词,目前支持 BetterTTV。 - - - 表情 - - - 已屏蔽的表情 - - - 表情 - 在战斗中隐藏 在战斗中隐藏聊天窗 - - 表情状态 - - - 准备就绪 - - - 尚未准备好 - - - 可用表情: - 显示特殊参数预览,如表情和 <item>。 diff --git a/HellionChat/Resources/Language.zh-Hant.resx b/HellionChat/Resources/Language.zh-Hant.resx index e52a134..d65a01d 100644 --- a/HellionChat/Resources/Language.zh-Hant.resx +++ b/HellionChat/Resources/Language.zh-Hant.resx @@ -1169,39 +1169,12 @@ 保持輸入焦點,即使進入戰鬥或執行其他操作。 - - 顯示表情 - - - 用表情替換單詞,目前支持 BetterTTV。 - - - 表情 - - - 已屏蔽的表情 - - - 表情 - 在戰鬥中隱藏 在戰鬥中隱藏聊天窗。 - - 表情狀態 - - - 已就緒 - - - 尚未就緒 - - - 可用表情: - 顯示特殊參數預覽,如表情或 <item>。 diff --git a/HellionChat/Ui/Components/ChunkRenderer.cs b/HellionChat/Ui/Components/ChunkRenderer.cs index 2c94df1..74c89f7 100644 --- a/HellionChat/Ui/Components/ChunkRenderer.cs +++ b/HellionChat/Ui/Components/ChunkRenderer.cs @@ -88,17 +88,7 @@ internal sealed class ChunkRenderer DrawChunk(chunks[i], wrap, handler, lineWidth); if (i < chunks.Count - 1) - { ImGui.SameLine(); - } - else if (chunks[i].Link is EmotePayload && Plugin.Config.ShowEmotes) - { - // Emote payloads seem to not automatically put newlines, which - // is an issue when modern mode is disabled. - ImGui.SameLine(); - // Use default ImGui behavior for newlines. - ImGui.TextUnformatted(""); - } } } @@ -118,31 +108,6 @@ internal sealed class ChunkRenderer if (chunk is not TextChunk text) return; - if (chunk.Link is EmotePayload emotePayload && Plugin.Config.ShowEmotes) - { - var emoteSize = ImGui.CalcTextSize("W"); - emoteSize = emoteSize with { Y = emoteSize.X } * 1.5f; - - // TextWrap doesn't work for emotes, so we have to wrap them manually - if (ImGui.GetContentRegionAvail().X < emoteSize.X) - ImGui.NewLine(); - - // We only draw a dummy if it is still loading, in the case it failed we draw the actual name - var image = EmoteCache.GetEmote(emotePayload.Code); - if (image is { Failed: false }) - { - if (image.IsLoaded) - image.Draw(emoteSize); - else - ImGui.Dummy(emoteSize); - - if (ImGui.IsItemHovered()) - ImGuiUtil.Tooltip(emotePayload.Code); - - return; - } - } - var colour = text.Foreground; if (colour == null && text.FallbackColour != null) { diff --git a/HellionChat/Ui/Components/Settings/Tabs/ChatTab.cs b/HellionChat/Ui/Components/Settings/Tabs/ChatTab.cs index 88fa1b2..39f0096 100644 --- a/HellionChat/Ui/Components/Settings/Tabs/ChatTab.cs +++ b/HellionChat/Ui/Components/Settings/Tabs/ChatTab.cs @@ -13,8 +13,6 @@ internal sealed class ChatTab private readonly Plugin _plugin; private readonly SettingsWidgets _w; - private string _blockedEmoteInput = string.Empty; - public ChatTab(Plugin plugin, TokenResolver resolver) { _plugin = plugin; @@ -129,17 +127,6 @@ internal sealed class ChatTab ); } - if ( - _w.Section( - ImGui.GetID("chat.emotes"u8), - HellionStrings.Settings_Section_Emotes, - open: false - ) - ) - { - DrawEmotes(); - } - if ( _w.Section( ImGui.GetID("chat.autotranslate"u8), @@ -157,66 +144,4 @@ internal sealed class ChatTab ); } } - - // PRIVACY.md names the switch below as the way to stop the one outbound - // call the plugin makes, and it had no control at all since May. A - // documented opt-out that lives only in the JSON is not an opt-out. - private void DrawEmotes() - { - _w.ToggleRow( - ImGui.GetID("chat.emotes.show"u8), - Language.Options_ShowEmotes_Name, - Language.Options_ShowEmotes_Desc, - () => Plugin.Config.ShowEmotes, - v => Plugin.Config.ShowEmotes = v - ); - - if (!Plugin.Config.ShowEmotes) - return; - - ImGui.Spacing(); - ImGui.TextUnformatted( - EmoteCache.State == EmoteCache.LoadingState.Done - ? $"{Language.Options_Emote_Loaded} {EmoteCache.SortedCodeArray.Length:N0} ({Language.Options_Emote_Ready})" - : $"{Language.Options_Emote_Loaded} {Language.Options_Emote_NotReady}" - ); - - ImGui.Spacing(); - ImGui.TextUnformatted(Language.Options_Emote_BlockedEmotes); - - // A blocked code stops that one emote from ever being drawn or - // downloaded, which is a finer instrument than switching emotes off - // wholesale. The list has been in the config since v1.0 with nowhere to - // edit it. - ImGui.SetNextItemWidth(220f * ImGuiHelpers.GlobalScale); - ImGui.InputText("##hc-blocked-emote", ref _blockedEmoteInput, 64); - ImGui.SameLine(); - - var candidate = _blockedEmoteInput.Trim(); - using (ImRaii.Disabled(candidate.Length == 0)) - { - if (ImGui.Button(HellionStrings.Settings_Emotes_Block)) - { - lock (_plugin.ConfigMapsLock) - Plugin.Config.BlockedEmotes.Add(candidate); - _blockedEmoteInput = string.Empty; - _plugin.SaveConfig(); - } - } - - // Snapshot: the remove button mutates the set inside the loop. - foreach (var blocked in Plugin.Config.BlockedEmotes.OrderBy(e => e).ToList()) - { - using var id = ImRaii.PushId(blocked); - if (ImGuiUtil.IconButton(FontAwesomeIcon.Trash, "##remove")) - { - lock (_plugin.ConfigMapsLock) - Plugin.Config.BlockedEmotes.Remove(blocked); - _plugin.SaveConfig(); - } - - ImGui.SameLine(); - ImGui.TextUnformatted(blocked); - } - } } diff --git a/HellionChat/Ui/Components/Settings/Tabs/WindowTab.cs b/HellionChat/Ui/Components/Settings/Tabs/WindowTab.cs index 885b6df..46ff419 100644 --- a/HellionChat/Ui/Components/Settings/Tabs/WindowTab.cs +++ b/HellionChat/Ui/Components/Settings/Tabs/WindowTab.cs @@ -187,14 +187,14 @@ internal sealed class WindowTab _w.ToggleRow( ImGui.GetID("window.hide.uihidden"u8), Language.Options_HideWhenUiHidden_Name, - Language.Options_HideWhenUiHidden_Description, + string.Format(Language.Options_HideWhenUiHidden_Description, Plugin.PluginName), () => Plugin.Config.HideWhenUiHidden, v => Plugin.Config.HideWhenUiHidden = v ); _w.ToggleRow( ImGui.GetID("window.hide.loading"u8), Language.Options_HideInLoadingScreens_Name, - Language.Options_HideInLoadingScreens_Description, + string.Format(Language.Options_HideInLoadingScreens_Description, Plugin.PluginName), () => Plugin.Config.HideInLoadingScreens, v => Plugin.Config.HideInLoadingScreens = v ); @@ -212,7 +212,7 @@ internal sealed class WindowTab _w.ToggleRow( ImGui.GetID("window.hide.cutscenes"u8), Language.Options_HideDuringCutscenes_Name, - Language.Options_HideDuringCutscenes_Description, + string.Format(Language.Options_HideDuringCutscenes_Description, Plugin.PluginName), () => Plugin.Config.HideDuringCutscenes, v => Plugin.Config.HideDuringCutscenes = v ); @@ -226,7 +226,7 @@ internal sealed class WindowTab _w.ToggleRow( ImGui.GetID("window.hide.notloggedin"u8), Language.Options_HideWhenNotLoggedIn_Name, - Language.Options_HideWhenNotLoggedIn_Description, + string.Format(Language.Options_HideWhenNotLoggedIn_Description, Plugin.PluginName), () => Plugin.Config.HideWhenNotLoggedIn, v => Plugin.Config.HideWhenNotLoggedIn = v ); @@ -243,7 +243,7 @@ internal sealed class WindowTab _w.ToggleRow( ImGui.GetID("window.tooltips.native"u8), Language.Options_NativeItemTooltips_Name, - Language.Options_NativeItemTooltips_Description, + string.Format(Language.Options_NativeItemTooltips_Description, Plugin.PluginName), () => Plugin.Config.NativeItemTooltips, v => Plugin.Config.NativeItemTooltips = v ); diff --git a/HellionChat/Util/IPluginLogProxy.cs b/HellionChat/Util/IPluginLogProxy.cs index f3a7d35..ea92000 100644 --- a/HellionChat/Util/IPluginLogProxy.cs +++ b/HellionChat/Util/IPluginLogProxy.cs @@ -3,7 +3,7 @@ using System; namespace HellionChat.Util; // Plugin.LogProxy bridge for consumers that cannot take a logger via the -// constructor: static helpers (EmoteCache et al.), Dalamud-reflected types +// constructor: static helpers, Dalamud-reflected types // (Configuration), data classes with mass instantiation (Message) and // instance classes that only log from static methods (FontManager). internal interface IPluginLogProxy diff --git a/HellionChat/Util/Payloads.cs b/HellionChat/Util/Payloads.cs index 682ffcd..a0f61d8 100755 --- a/HellionChat/Util/Payloads.cs +++ b/HellionChat/Util/Payloads.cs @@ -68,6 +68,14 @@ internal class UriPayload(Uri uri) : Payload protected override byte[] EncodeImpl() => throw new NotImplementedException(); } +// Kept for reading, not for writing. BetterTTV emotes came out of the plugin in +// 2.0.2, but messages stored before that carry this payload in the database and +// have to stay readable -- MessageStore writes the type byte for it, so removing +// the type would make those rows fail to deserialise. Nothing produces one any +// more; a stored emote now renders as its own code, which is the text the user +// typed in the first place. +// +// The 0x53 below and PayloadMessagePackType.Emote must never be reassigned. internal class EmotePayload : Payload { public override PayloadType Type => (PayloadType)0x53; diff --git a/HellionChat/images/themesPicker.png b/HellionChat/images/themesPicker.png deleted file mode 100644 index 506305a..0000000 Binary files a/HellionChat/images/themesPicker.png and /dev/null differ diff --git a/README.md b/README.md index 24d7d19..9e9a6db 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Build](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/actions/workflows/build.yml/badge.svg?branch=main)](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/actions/workflows/build.yml) [![License: EUPL-1.2](https://img.shields.io/badge/License-EUPL--1.2-blue.svg)](LICENSE) -[![Latest release](https://img.shields.io/badge/release-v2.0.1-brightgreen)](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/latest) +[![Latest release](https://img.shields.io/badge/release-v2.0.2-brightgreen)](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/latest) [![Dalamud API](https://img.shields.io/badge/Dalamud-API_15-purple)](https://github.com/goatcorp/Dalamud) [![.NET](https://img.shields.io/badge/.NET-10.0-512BD4)](https://dotnet.microsoft.com/) [![FFXIV](https://img.shields.io/badge/FFXIV-Dawntrail-c3a37f)](https://www.finalfantasyxiv.com/) @@ -11,7 +11,7 @@ Hellion Forge

-**Version 2.0.1** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, originally +**Version 2.0.2** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, originally forked from [Chat 2](https://github.com/Infiziert90/ChatTwo) (EUPL-1.2). Hellion Chat is a privacy-first chat plugin that began as a fork of Chat 2. The core it grew from diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 592a9cf..57712ce 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -11,6 +11,43 @@ releases as an overview and links to the release pages for details. --- +## [2.0.2] — 2026-08-19 + +### Removed + +- BetterTTV emote support, in full. The shared-emote endpoint went behind + authentication and it supplied nearly all of them; what was left is a 65-entry + global set, eleven of those on the known-broken list, so 54 largely static + images. One was animated — 492 frames at 140x140, which is 37 MB of texture + memory for a single emote. Gone with it: the download path, the on-disk cache, + the GIF renderer, the settings section, the block list, and 13 translation + keys across 50 resource files. The plugin makes no outbound network calls at + all now. +- `EmotePayload` and its MessagePack type byte deliberately stay. Messages + stored before this release carry them, and removing the type would make those + rows fail to deserialise. Nothing writes one any more; a stored emote renders + as the code that was typed. `0x53` and `PayloadMessagePackType.Emote` must + never be reassigned. + +### Fixed + +- Five descriptions in the Window settings tab printed `{0}` where the plugin + name belonged. They were handed to the widget directly instead of through + `string.Format`, which the neighbouring rows do correctly. Every language was + affected including English, where it read less obviously — German puts the + placeholder at the start of the sentence, which is why it surfaced there. + +### Added + +- A test that walks every resource string containing a placeholder, finds each + use of it in the sources, and fails if one reaches a widget unformatted. It + was verified by falsification: reintroducing the defect turns it red. +- New preview images for the plugin installer. The previous set was from + 2026-05-08 and showed the interface as it looked before the window rebuilds. + Taken with screenshot mode on, so no character names are in them. + +--- + ## [2.0.1] — 2026-08-19 A same-day hotfix on 2.0.0 with nothing user-facing in it. diff --git a/repo.json b/repo.json index 92ebb9d..8548bf6 100644 --- a/repo.json +++ b/repo.json @@ -3,7 +3,7 @@ "Author": "Jon Kazama (Hellion Forge)", "Name": "Hellion Chat", "InternalName": "HellionChat", - "AssemblyVersion": "2.0.1.0", + "AssemblyVersion": "2.0.2.0", "Description": "A Hellion Forge plugin — privacy-focused chat replacement for FINAL FANTASY XIV, built for EU, US and JP data rules.\n\nBy default only your own conversations are stored. Public chat, NPC dialogue, system messages and battle logs are discarded at the storage layer unless you opt in. Retention windows are configurable per channel, history can be wiped retroactively, and everything can be exported on demand.\n\nFeatures:\n- Channel whitelist with a Privacy-First default\n- Per-channel retention with a daily background sweep\n- Retroactive cleanup with preview and Ctrl+Shift confirm\n- Export to Markdown, JSON or CSV\n- First-run wizard with four profiles: Privacy-First, Casual, Roleplay, Full History\n- Multi-language UI (24 locales) with live language switching\n- Own config and database — no shared state with other plugins\n\nBased on Chat 2 by Infi and Anna (EUPL-1.2).\nSupport: https://discord.gg/X9V7Kcv5gR", "ApplicableVersion": "any", "RepoUrl": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat", @@ -20,17 +20,17 @@ "CanUnloadAsync": false, "LoadPriority": 0, "Punchline": "A Hellion Forge plugin. Privacy-first chat for FFXIV, built to stay out of your way.", - "Changelog": "**v2.0.1 — Hotfix (2026-08-19)**\n\nA same-day follow-up to 2.0.0 with no user-facing changes. Install it if you picked up 2.0.0 in the first hour; there is nothing new to look at, it just carries a dependency update the 2.0.0 archive was built without.\n\n- MessagePack raised from 3.1.4 to 3.1.7. It handles the payload serialisation behind the message database. The advisories are a recursion-depth limit in `Skip` and a fault in LZ4 decompression, both reachable only through crafted input — this plugin writes and reads its own bytes in a local file, so the practical exposure needs someone who already has write access to it. Lifted anyway, because it costs nothing.\n- The release workflow publishes through the Gitea API directly. The 2.0.0 build succeeded and then failed to attach its own archive, which is why that release had to be completed by hand.", + "Changelog": "**v2.0.2 — Emotes out, placeholders fixed (2026-08-19)**\n\n- **BetterTTV emote support is gone.** Its shared-emote endpoint went behind authentication, and that was where nearly all of them came from — what remained was a 65-entry global set, eleven of which are on the known-broken list, so 54 mostly static images from Twitch's early days. Exactly one was animated, and that one wanted 492 frames and 37 MB of video memory. The plugin now makes no outbound network calls at all. Messages stored with emotes still read fine; they show the code that was typed.\n- **Five settings descriptions printed `{0}` instead of the plugin name.** All 25 languages were affected, English included — it just hid better there, since \"Hide {0} during cutscenes\" still scans as a sentence while German puts the placeholder first. A test now walks every resource string with a placeholder and fails if one reaches a widget unformatted.\n- **New preview images.** The ones in the plugin installer were from 8 May and showed the interface as it looked before any of the window rebuilds.", "AcceptsFeedback": true, - "DownloadLinkInstall": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.1/latest.zip", - "DownloadLinkUpdate": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.1/latest.zip", - "DownloadLinkTesting": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.1/latest.zip", - "TestingAssemblyVersion": "2.0.1.0", + "DownloadLinkInstall": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.2/latest.zip", + "DownloadLinkUpdate": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.2/latest.zip", + "DownloadLinkTesting": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.2/latest.zip", + "TestingAssemblyVersion": "2.0.2.0", "IconUrl": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/icon.png", "ImageUrls": [ "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/chatWindow.png", "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/settingsOverview.png", - "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/themesPicker.png" + "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/firstRunWizard.png" ], "DownloadCount": 0, "IsHide": false,