diff --git a/.github/forge-posts/v2.0.0.md b/.github/forge-posts/v2.0.0.md new file mode 100644 index 0000000..0a9122f --- /dev/null +++ b/.github/forge-posts/v2.0.0.md @@ -0,0 +1,11 @@ +--- +subtitle: "Rebuilt, Repaired, Reset" +versionsnatur: "Major-Release mit Config-Reset" +--- +- **Deine Einstellungen werden zurückgesetzt.** Neun Zyklen Umbau haben gespeicherte Werte hinterlassen, die auf Oberflächen zeigen, die es nicht mehr gibt. Neu anzufangen ist der einzige Weg, dass alle dieselben Vorgaben haben. **Dein Nachrichtenverlauf bleibt unberührt**, der liegt in einer eigenen Datenbank. Die alten Einstellungen liegen als `HellionChat.json.pre-2.0.0.bak` daneben. +- **Behoben, und mehrere davon haben Daten verloren oder versteckt:** Die rückwirkende Bereinigung ließ sich nie anwenden. Das Verdichten der Datenbank schlug fehl und meldete danach, es sei nichts gelöscht worden, während alles weg war. Gelöschte Nachrichten blieben im Suchindex. Angepinnte Flüster-Tabs kamen eine ganze Sitzung lang leer hoch. Der Export schrieb ungültiges JSON. Ein Auskoppelfenster mit Titelleiste ließ sich nicht schließen. Ein 403 eines Emote-Dienstes riss alle 65 funktionierenden Emotes mit. +- **Was sich am Speichern ändert:** Das Kanalraster entscheidet jetzt allein. Bisher griff die Unbekannt-Absicherung auch bei bekannten Kanälen, ein abgewählter Kanal wurde also trotzdem geschrieben. Wen das betraf, der speichert ab jetzt weniger. Nichts in der Datenbank wird angefasst. +- **Jedes Fenster zeichnet das Plugin selbst** und alle sprechen eine Sprache: Struktur trägt die Typografie, alles Drückbare bekommt eine Fläche, jede Farbe wird gegen ihren Untergrund gemessen. Dazu benannte Typo-Rollen, Zeitstempel in eigener Spalte, kursive Systemmeldungen. +- **Wieder erreichbar:** Export, Tab-Editor, Datenbankpflege und Anpinnen hatten beim Umbau ihre Zugänge verloren. Der Screenshot-Modus erreichte eine von vier Flächen mit Tab-Namen, jetzt alle vier. Der DSGVO-Hinweis beim Profil "Volle Historie" war in 25 Sprachen übersetzt und seit Mai unsichtbar. +- **Gestrichen:** sechs Einstellungen mit Regler, gespeichertem Wert und ohne jeden Leser. Ein Regex-Filter pro Tab, den der spieleigene Wortfilter abdeckt. Ein Assistenten-Häkchen, das abgefragt, als angewendet gemeldet und nie gelesen wurde. +- **Neu:** Emote-Tab im Standard-Layout (Testerwunsch), Orts- und Serverzeit in der Statusleiste, Screenshot-Modus aus der Eingabezeile erreichbar, `/hellion wizard`, ein Stil-Labor unter `/hellion lab`, und ein Hinweis im Assistenten, dass Plugins in FFXIV eine Grauzone sind und nicht in öffentliche Kanäle gehören. diff --git a/HellionChat/HellionChat.csproj b/HellionChat/HellionChat.csproj index 2c7b7d6..d91a870 100644 --- a/HellionChat/HellionChat.csproj +++ b/HellionChat/HellionChat.csproj @@ -1,7 +1,7 @@ - 1.14.0 + 2.0.0 enable enable diff --git a/HellionChat/HellionChat.yaml b/HellionChat/HellionChat.yaml index 28f9e9b..b7aa277 100755 --- a/HellionChat/HellionChat.yaml +++ b/HellionChat/HellionChat.yaml @@ -35,6 +35,39 @@ tags: - Replacement - Privacy changelog: |- + **v2.0.0 — Rebuilt, Repaired, Reset (2026-08-19)** + + Nine development cycles in one release. Everything built as v1.6.0 through v1.15.0 ships here; those versions were never published on their own. + + **This update resets your settings.** Nine cycles of rebuilding left saved values pointing at surfaces that no longer exist, and starting over is the only way to be sure every install is on the same defaults. **Your message history is untouched** — it lives in a separate database. Your old settings are kept next to the config file as `HellionChat.json.pre-2.0.0.bak`. + + Fixed, and several of these lost data or hid it: + + - Retroactive cleanup could never be applied at all. The preview took the database lock itself and that counted as a change, so every preview went stale the instant it finished and the apply button never appeared. + - Compacting the database ran against an open reader and failed, after which the plugin reported that nothing had been deleted — while everything had. + - Deleting messages left them in the search index, so search kept returning rows that were already gone. + - Pinned tell tabs came up empty for a whole session: the history query ran at plugin start, before any character is logged in, and never tried again. + - Export wrote invalid JSON where a setting value was involved, and a byte-order mark that strict parsers reject. + - A pop-out with its title bar switched on could not be closed, and a tell from a popped-out partner hijacked the main window's active tab. + - One third-party emote service started returning 403, and that response took all 65 working global emotes down with it on every start. + - The GDPR notice for the full-history profile had been translated into 25 languages and shown nowhere since May. + + Changed, and one of these changes what gets stored: + + - **The channel grid is now authoritative.** Until now the unknown-channel failsafe was applied to known channels too, so a channel you had unticked was still being written while that failsafe was on. If that was you, this release stores less than before. Nothing already in the database is touched. + - Every window is drawn by the plugin rather than by ImGui defaults, and they share one visual language: structure carried by typography, a surface on anything you can press, and colours measured against what sits behind them. + - Typography has named roles — sender, body and timestamp mean the same thing everywhere, timestamps sit in their own column, system messages are italic. + - Export, the tab editor, database maintenance and pinning had lost their entry points during the rebuild and are reachable again. + - Screenshot mode reached one of four surfaces that draw a tab name. It reaches all four now. + + Removed: six settings that had a control and a saved value but no reader anywhere in the plugin; a per-tab regex filter the game's own blackword filter covers; and a wizard checkbox that was collected, reported as applied and never read. + + New: an Emote tab in the default layout, local and server clocks in the status bar, a screenshot mode reachable from the input row, `/hellion wizard` to reopen the setup wizard, a style lab under `/hellion lab`, and 25 UI languages with the settings window and wizard fully covered. + + Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2). The two codebases have diverged far enough that they no longer line up. + + --- + **v1.5.6 — Settings Overhaul + Filter & Notification Polish (2026-05-23)** - Settings window reorganised: ten tabs down to seven (General, Appearance, Chat, Window, Channels, Data & Privacy, About). Each tab now uses collapsible sections grouped by control type. Sections start collapsed every time you open a tab — less noise, easier to find what you need. @@ -116,65 +149,4 @@ changelog: |- Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2). - --- - - **v1.5.3 — Localisation Wave + Bundled-Font Overhaul (2026-05-19)** - - Multi-language pass plus a long-standing first-frame HITCH lands - as a side effect of a font-stack rewrite. - - User-visible: - - - 24 selectable UI languages (was 2). Catalan, Czech, Danish, - Dutch, English, Finnish, French, German, Greek, Hungarian, - Italian, Japanese, Korean, Norsk bokmål, Polish, Portuguese - (BR + PT), Romanian, Russian, Spanish, Swedish, Turkish, - Ukrainian, Simplified + Traditional Chinese. Sorted by endonym, - "None" pinned first. Non-native locales are AI-assisted and - flagged for native-speaker review via the Forge Discord. - - Bundled Inter Light replaces Exo 2 (SIL OFL 1.1, 343 KB). The - Inter font ships Latin Extended-A/B, Greek polytonic and - Cyrillic Supplement coverage; NotoSansCjkRegular joins as a - third merge layer for Hangul and Simplified-Han glyphs the - FFXIV Japanese game font does not ship. - - First-frame HITCH dropped from ~74 ms (v1.5.2 baseline that - held since v1.4.x) to a median of ~20 ms (5-reload sample - 17.9-23.6 ms, Linux/Wine). The bundled-font path silently - fell back to the FFXIV Axis font for the entire v1.5.x series - because of an early-return in the draw loop. The fix that - routes RegularFont through draw also lands the defer-pattern - win the v1.5.1 cycle was reaching for. - - ExtraGlyphRanges auto-activates on language change. Korean, - ChineseFull and the two new flags (LatinExtended, Greek) toggle - on without a manual visit to Fonts and Colours. - - New WarningText under the language dropdown notes FFXIV's - chat input only fully supports EN/DE/FR/JA character sets. - Other languages render in HellionChat but may garble when - typed into in-game chat. - - Under the hood: - - - Three-layer font stack: Inter Light primary, FFXIV - JapaneseFont merge 1 for kana/kanji style, NotoSansCjkRegular - merge 2 for everything else CJK. - - LanguageOverride enum gains ten locales plus three previously - commented out (Italian, Korean, Norwegian as `nb`). New - values append to the enum so existing config integers stay - stable across update. - - Crowdin gap closed: four post-sync ChatTwo keys backfilled - into 13 legacy locales with per-key AI markers. - - Plugin.LoadAsync runs a one-shot migration that ORs in the - matching ExtraGlyphRanges flag for users already on a - non-default language. Settings.Apply auto-activates on - change going forward. - - Em-dash sweep across the EN source and 18 translations to the - house style. Russian and Ukrainian keep the typographic norm. - - Migration v17 stays. UseHellionFont users transition from Exo 2 - to Inter Light transparently on first reload. - - Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2). - - --- - - Full history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases + Earlier history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases diff --git a/HellionChat/Plugin.cs b/HellionChat/Plugin.cs index 9eba48a..2701c1f 100755 --- a/HellionChat/Plugin.cs +++ b/HellionChat/Plugin.cs @@ -520,6 +520,7 @@ public sealed class Plugin : IAsyncDalamudPlugin { Config.Tabs.Add(TabsUtil.VanillaGeneral); Config.Tabs.Add(TabsUtil.HellionSystem); + Config.Tabs.Add(TabsUtil.HellionEmote); Config.Tabs.Add(TabsUtil.HellionFreeCompany); Config.Tabs.Add(TabsUtil.HellionParty); Config.Tabs.Add(TabsUtil.HellionLinkshell); @@ -556,7 +557,7 @@ public sealed class Plugin : IAsyncDalamudPlugin new SelfTests.SettingsWindowOpenStep(this), new SelfTests.OnOpenMainUiRoutesMainWindowStep(this), new SelfTests.TypingIpcStateStep(this), - new SelfTests.ConfigMigrationV26Step(this), + new SelfTests.ConfigMigrationV27Step(this), new SelfTests.DbGateWiringStep(this), new SelfTests.ChannelPopoutBindStep(this), new SelfTests.HoverStateFootprintStep(), diff --git a/HellionChat/Resources/HellionStrings.Designer.cs b/HellionChat/Resources/HellionStrings.Designer.cs index a02a41a..218106b 100644 --- a/HellionChat/Resources/HellionStrings.Designer.cs +++ b/HellionChat/Resources/HellionStrings.Designer.cs @@ -284,6 +284,7 @@ internal class HellionStrings // Hellion Chat — Default tab presets (channel-themed) internal static string Tabs_Presets_System => Get(nameof(Tabs_Presets_System)); + internal static string Tabs_Presets_Emote => Get(nameof(Tabs_Presets_Emote)); internal static string Tabs_Presets_FreeCompany => Get(nameof(Tabs_Presets_FreeCompany)); internal static string Tabs_Presets_Party => Get(nameof(Tabs_Presets_Party)); internal static string Tabs_Presets_Beginner => Get(nameof(Tabs_Presets_Beginner)); diff --git a/HellionChat/Resources/HellionStrings.ca.resx b/HellionChat/Resources/HellionStrings.ca.resx index dec91cf..12f27d6 100644 --- a/HellionChat/Resources/HellionStrings.ca.resx +++ b/HellionChat/Resources/HellionStrings.ca.resx @@ -611,6 +611,9 @@ Sistema + + Emotes + Free Company diff --git a/HellionChat/Resources/HellionStrings.cs.resx b/HellionChat/Resources/HellionStrings.cs.resx index 42b4770..f8de5ac 100644 --- a/HellionChat/Resources/HellionStrings.cs.resx +++ b/HellionChat/Resources/HellionStrings.cs.resx @@ -611,6 +611,9 @@ Systém + + Emoty + Free Company diff --git a/HellionChat/Resources/HellionStrings.da.resx b/HellionChat/Resources/HellionStrings.da.resx index 302e2f5..7516fd3 100644 --- a/HellionChat/Resources/HellionStrings.da.resx +++ b/HellionChat/Resources/HellionStrings.da.resx @@ -611,6 +611,9 @@ System + + Emotes + Free Company diff --git a/HellionChat/Resources/HellionStrings.de.resx b/HellionChat/Resources/HellionStrings.de.resx index b67cad4..12f4d50 100644 --- a/HellionChat/Resources/HellionStrings.de.resx +++ b/HellionChat/Resources/HellionStrings.de.resx @@ -611,6 +611,9 @@ System + + Emotes + Free Company diff --git a/HellionChat/Resources/HellionStrings.el.resx b/HellionChat/Resources/HellionStrings.el.resx index 909ae82..a26922e 100644 --- a/HellionChat/Resources/HellionStrings.el.resx +++ b/HellionChat/Resources/HellionStrings.el.resx @@ -611,6 +611,9 @@ System + + Emotes + Free Company diff --git a/HellionChat/Resources/HellionStrings.es.resx b/HellionChat/Resources/HellionStrings.es.resx index 7dfd531..b2398c8 100644 --- a/HellionChat/Resources/HellionStrings.es.resx +++ b/HellionChat/Resources/HellionStrings.es.resx @@ -611,6 +611,9 @@ Sistema + + Emotes + Free Company diff --git a/HellionChat/Resources/HellionStrings.fi.resx b/HellionChat/Resources/HellionStrings.fi.resx index 129fe69..09d2f2c 100644 --- a/HellionChat/Resources/HellionStrings.fi.resx +++ b/HellionChat/Resources/HellionStrings.fi.resx @@ -611,6 +611,9 @@ Järjestelmä + + Emootiot + Free Company diff --git a/HellionChat/Resources/HellionStrings.fr.resx b/HellionChat/Resources/HellionStrings.fr.resx index dee3c6f..dae4a98 100644 --- a/HellionChat/Resources/HellionStrings.fr.resx +++ b/HellionChat/Resources/HellionStrings.fr.resx @@ -611,6 +611,9 @@ Système + + Emotes + Compagnie libre diff --git a/HellionChat/Resources/HellionStrings.hu.resx b/HellionChat/Resources/HellionStrings.hu.resx index c81945b..e957ce9 100644 --- a/HellionChat/Resources/HellionStrings.hu.resx +++ b/HellionChat/Resources/HellionStrings.hu.resx @@ -611,6 +611,9 @@ Rendszer + + Emote-ok + Free Company diff --git a/HellionChat/Resources/HellionStrings.it.resx b/HellionChat/Resources/HellionStrings.it.resx index 3812831..9bcee0b 100644 --- a/HellionChat/Resources/HellionStrings.it.resx +++ b/HellionChat/Resources/HellionStrings.it.resx @@ -611,6 +611,9 @@ Sistema + + Emote + Free Company diff --git a/HellionChat/Resources/HellionStrings.ja.resx b/HellionChat/Resources/HellionStrings.ja.resx index 8ba0665..55aff0c 100644 --- a/HellionChat/Resources/HellionStrings.ja.resx +++ b/HellionChat/Resources/HellionStrings.ja.resx @@ -611,6 +611,9 @@ システム + + エモート + フリーカンパニー diff --git a/HellionChat/Resources/HellionStrings.ko.resx b/HellionChat/Resources/HellionStrings.ko.resx index 7d0f10f..5f1b593 100644 --- a/HellionChat/Resources/HellionStrings.ko.resx +++ b/HellionChat/Resources/HellionStrings.ko.resx @@ -611,6 +611,9 @@ 시스템 + + 감정 표현 + 자유부대 diff --git a/HellionChat/Resources/HellionStrings.nb.resx b/HellionChat/Resources/HellionStrings.nb.resx index 15f8ae6..b789d8f 100644 --- a/HellionChat/Resources/HellionStrings.nb.resx +++ b/HellionChat/Resources/HellionStrings.nb.resx @@ -611,6 +611,9 @@ System + + Emotes + Free Company diff --git a/HellionChat/Resources/HellionStrings.nl.resx b/HellionChat/Resources/HellionStrings.nl.resx index 891720e..a6abe90 100644 --- a/HellionChat/Resources/HellionStrings.nl.resx +++ b/HellionChat/Resources/HellionStrings.nl.resx @@ -611,6 +611,9 @@ Systeem + + Emotes + Free Company diff --git a/HellionChat/Resources/HellionStrings.pl.resx b/HellionChat/Resources/HellionStrings.pl.resx index 7c4c06e..f0c77af 100644 --- a/HellionChat/Resources/HellionStrings.pl.resx +++ b/HellionChat/Resources/HellionStrings.pl.resx @@ -611,6 +611,9 @@ System + + Emoty + Free Company diff --git a/HellionChat/Resources/HellionStrings.pt-BR.resx b/HellionChat/Resources/HellionStrings.pt-BR.resx index 206b4a7..6a93311 100644 --- a/HellionChat/Resources/HellionStrings.pt-BR.resx +++ b/HellionChat/Resources/HellionStrings.pt-BR.resx @@ -611,6 +611,9 @@ Sistema + + Emotes + Free Company diff --git a/HellionChat/Resources/HellionStrings.pt-PT.resx b/HellionChat/Resources/HellionStrings.pt-PT.resx index b8deb8b..9d4b236 100644 --- a/HellionChat/Resources/HellionStrings.pt-PT.resx +++ b/HellionChat/Resources/HellionStrings.pt-PT.resx @@ -611,6 +611,9 @@ Sistema + + Emotes + Free Company diff --git a/HellionChat/Resources/HellionStrings.resx b/HellionChat/Resources/HellionStrings.resx index ece8e5f..0de0899 100644 --- a/HellionChat/Resources/HellionStrings.resx +++ b/HellionChat/Resources/HellionStrings.resx @@ -604,6 +604,9 @@ System + + Emotes + Free Company diff --git a/HellionChat/Resources/HellionStrings.ro.resx b/HellionChat/Resources/HellionStrings.ro.resx index b235dbc..0e672a3 100644 --- a/HellionChat/Resources/HellionStrings.ro.resx +++ b/HellionChat/Resources/HellionStrings.ro.resx @@ -611,6 +611,9 @@ System + + Emotes + Free Company diff --git a/HellionChat/Resources/HellionStrings.ru.resx b/HellionChat/Resources/HellionStrings.ru.resx index 8d0a780..84f505a 100644 --- a/HellionChat/Resources/HellionStrings.ru.resx +++ b/HellionChat/Resources/HellionStrings.ru.resx @@ -611,6 +611,9 @@ Система + + Эмоции + Свободная компания diff --git a/HellionChat/Resources/HellionStrings.sv.resx b/HellionChat/Resources/HellionStrings.sv.resx index 7ff6f01..292458c 100644 --- a/HellionChat/Resources/HellionStrings.sv.resx +++ b/HellionChat/Resources/HellionStrings.sv.resx @@ -611,6 +611,9 @@ System + + Emotes + Free Company diff --git a/HellionChat/Resources/HellionStrings.tr.resx b/HellionChat/Resources/HellionStrings.tr.resx index 4b57636..61a0d41 100644 --- a/HellionChat/Resources/HellionStrings.tr.resx +++ b/HellionChat/Resources/HellionStrings.tr.resx @@ -611,6 +611,9 @@ Sistem + + Emote'lar + Free Company diff --git a/HellionChat/Resources/HellionStrings.uk.resx b/HellionChat/Resources/HellionStrings.uk.resx index 4bc8d79..6385148 100644 --- a/HellionChat/Resources/HellionStrings.uk.resx +++ b/HellionChat/Resources/HellionStrings.uk.resx @@ -611,6 +611,9 @@ Система + + Емоти + Free Company diff --git a/HellionChat/Resources/HellionStrings.zh-Hans.resx b/HellionChat/Resources/HellionStrings.zh-Hans.resx index ab42f5f..a8ec765 100644 --- a/HellionChat/Resources/HellionStrings.zh-Hans.resx +++ b/HellionChat/Resources/HellionStrings.zh-Hans.resx @@ -611,6 +611,9 @@ 系统 + + 情感动作 + 部队 diff --git a/HellionChat/Resources/HellionStrings.zh-Hant.resx b/HellionChat/Resources/HellionStrings.zh-Hant.resx index 0e6d95e..19fc512 100644 --- a/HellionChat/Resources/HellionStrings.zh-Hant.resx +++ b/HellionChat/Resources/HellionStrings.zh-Hant.resx @@ -611,6 +611,9 @@ 系統 + + 情感動作 + 部隊 diff --git a/HellionChat/SelfTests/ConfigMigrationV26Step.cs b/HellionChat/SelfTests/ConfigMigrationV27Step.cs similarity index 74% rename from HellionChat/SelfTests/ConfigMigrationV26Step.cs rename to HellionChat/SelfTests/ConfigMigrationV27Step.cs index a64d0ea..70de61d 100644 --- a/HellionChat/SelfTests/ConfigMigrationV26Step.cs +++ b/HellionChat/SelfTests/ConfigMigrationV27Step.cs @@ -4,24 +4,37 @@ using Dalamud.Plugin.SelfTest; namespace HellionChat.SelfTests; // Pins the post-migration shape of the config. By /xlperf time the schema gate -// has already stamped Config.Version and run both migrations, so the fields -// below must carry valid values here. This probe never rewrites config; the -// migrations themselves are load-time and verified by the prepared-config smoke -// in the plan. -internal sealed class ConfigMigrationV26Step : ISelfTestStep +// has stamped Config.Version and the 2.0.0 reset has run, so the fields below +// must carry valid values here. This probe never rewrites config; the reset +// itself is load-time. +internal sealed class ConfigMigrationV27Step : ISelfTestStep { - public ConfigMigrationV26Step(Plugin plugin) + public ConfigMigrationV27Step(Plugin plugin) { _ = plugin; } - public string Name => "Hellion Chat - Config v26 migration"; + public string Name => "Hellion Chat - Config v27 migration"; public SelfTestStepResult RunStep() { - if (Plugin.Config.Version != 26) + if (Plugin.Config.Version != 27) { - ImGui.Text($"Config.Version is {Plugin.Config.Version}, expected 26"); + ImGui.Text($"Config.Version is {Plugin.Config.Version}, expected 27"); + return SelfTestStepResult.Fail; + } + + // v27 replaces the config rather than migrating it, and CreateFresh + // hands back an empty tab list. The seeding in LoadAsync is what fills + // it, and it runs in a different method than the reset does -- if that + // ordering ever breaks, every user comes out of the update with no tabs + // at all and nothing else in the plugin would notice. + if (Plugin.Config.Tabs.Count == 0) + { + ImGui.Text( + "No tabs at all. The v27 reset empties the list and LoadAsync is what " + + "seeds the presets back -- reaching this point empty means it did not." + ); return SelfTestStepResult.Fail; } diff --git a/HellionChat/Ui/FirstRunWizard.cs b/HellionChat/Ui/FirstRunWizard.cs index 53c14b0..d8fa371 100644 --- a/HellionChat/Ui/FirstRunWizard.cs +++ b/HellionChat/Ui/FirstRunWizard.cs @@ -22,7 +22,7 @@ namespace HellionChat.Ui; // fields, and CommitPending() applies only the non-null ones so // users who skip a step never get their existing config overwritten. // -// This is the first thing a tester ever sees, and until v1.15.0 it was the last +// This is the first thing a tester ever sees, and until v2.0.0 it was the last // surface still drawn in ImGui defaults -- stock buttons under a hardcoded // bronze that ignored the theme. It speaks the window's language now: the // settings backdrop, tracked-caps headings, the chamfered accent pill for the @@ -66,7 +66,7 @@ public sealed class FirstRunWizard : Window }; } - // Until v1.15.0 the wizard could only ever open once per session, so its + // Until v2.0.0 the wizard could only ever open once per session, so its // state living as long as the plugin never showed. /hellion wizard makes // reopening possible, and a second run that started on step 4 with the // first run's choices still pending would commit picks the user never saw. diff --git a/HellionChat/Util/TabsUtil.cs b/HellionChat/Util/TabsUtil.cs index 264e186..e41f9b5 100755 --- a/HellionChat/Util/TabsUtil.cs +++ b/HellionChat/Util/TabsUtil.cs @@ -97,6 +97,21 @@ public static class TabsUtil Channel = InputChannel.NoviceNetwork, }; + // Requested by a tester: emotes have their own rhythm and get lost between + // system notices. Echo rides along because /echo is where emote-adjacent + // output lands. + public static Tab HellionEmote => + new() + { + Name = HellionStrings.Tabs_Presets_Emote, + SelectedChannels = new Dictionary + { + [ChatType.CustomEmote] = (ChatSourceExt.All, ChatSourceExt.All), + [ChatType.StandardEmote] = (ChatSourceExt.All, ChatSourceExt.All), + [ChatType.Echo] = (ChatSourceExt.All, ChatSourceExt.All), + }, + }; + public static Tab HellionSystem => new() { diff --git a/README.md b/README.md index 7c9d010..be82db7 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-v1.5.6-brightgreen)](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/latest) +[![Latest release](https://img.shields.io/badge/release-v2.0.0-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,8 +11,8 @@ Hellion Forge

-**Version 1.5.6** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, built on -[Chat 2](https://github.com/Infiziert90/ChatTwo) (EUPL-1.2). +**Version 2.0.0** — 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 plugin built on the Chat 2 foundation. The majority of the engine comes from Chat 2 (message store, channel logic, hook system), and most keyboard shortcuts continue @@ -301,6 +301,15 @@ An optional submission to the Dalamud main plugin repo (in addition to the custo ## Project Status +**Version 2.0.0** — Rebuilt, Repaired, Reset. Nine development cycles replaced every +window in the plugin: the sidebar, tab strip and status bar, the settings window, the +message list, the input row and the first-run wizard are drawn by the plugin rather than +by ImGui defaults, and share one visual language. Typography carries structure, anything +you can press gets a surface, and colours are measured against what sits behind them. +**This update resets your settings** — nine cycles of window rebuilds left saved values +pointing at surfaces that no longer exist. The message database is untouched and the old +config is kept alongside it as `HellionChat.json.pre-2.0.0.bak`. + **Version 1.5.6** — Settings Overhaul + Filter & Notification Polish. The Settings window has been reorganised from ten tabs to seven (General, Appearance, Chat, Window, Channels, Data & Privacy, About). Each tab now uses collapsible sections grouped by control type; diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index f7e7651..fa83b79 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -11,6 +11,48 @@ releases as an overview and links to the release pages for details. --- +## [2.0.0] — 2026-08-19 + +Rebuilt, repaired, reset. Everything developed as v1.6.0 through v1.15.0 ships +here: those versions were never published on their own, because the whole window +layer was being rewritten from ImGui defaults to custom drawing and shipping it +half-done would have been worse than shipping nothing. + +**This release resets your configuration.** Nine cycles of window rebuilds left +saved values pointing at surfaces that no longer exist, and starting over is the +only way to be sure every install is on the same defaults. The message database is +untouched — it lives in its own file. The previous config is kept alongside it as +`HellionChat.json.pre-2.0.0.bak`. + +### Added + +- An Emote tab in the default layout, requested by a tester: custom emotes, + standard emotes and echo, which is where emote-adjacent output lands. +- `/hellion wizard` reopens the first-run wizard. It had no way back into it at + all — the reopen button lost its call site in the four-step rewrite and nothing + replaced it, so the only route was closing the game and editing the config. +- The plugin notice on the welcome page: plugins are a grey area in this game and + do not belong in public channels. + +### Changed + +- The first-run wizard is drawn like the rest of the plugin. Profile cards are + tiles in the row language, sized to their own text so a privacy description is + never cut off mid-sentence, and their emoji are icon-font glyphs. +- The welcome page is opaque, unlike every other window here. It is read once and + carries a privacy decision; the game showing through it was noise. +- Config version 27 replaces the config instead of migrating it. + +### Fixed + +- The GDPR notice for the full-history profile is shown again. It had been + translated into 25 languages and drawn nowhere since 2026-05-18. +- Two profile cards claimed to be recommended at once: the badge sat on one while + the other still said "(recommended)" in its heading, in every language. +- Reopening the wizard no longer carries staged choices from a previous run. + +--- + ## [1.14.0] — unreleased (local only) The input row. It was the one surface a user actually works in and it spoke three diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 4e6b69f..27a348c 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -10,52 +10,58 @@ be a poor fit for the plugin's privacy-first scope during brainstorming. --- -## Current development (unreleased) +## Released -The published release is **v1.5.6**. Development since then runs as a UI rebuild towards v2.0.0 and -is not published: the whole window layer is being rewritten from ImGui defaults to custom drawing. -Versions v1.6.0 through v1.14.0 are local development states, and `repo.json` deliberately keeps -its download links on v1.5.6 so nobody updates into a partial state. +**v2.0.0 — Rebuilt, Repaired, Reset (2026-08-19)** ships everything that was +developed as v1.6.0 through v1.15.0. Those versions were never published on their +own: the whole window layer was being rewritten from ImGui defaults to custom +drawing, and `repo.json` deliberately kept its download links on v1.5.6 so nobody +would update into a partial state. -Where it stands: +What went into it, cycle by cycle: -- **v1.6.0 to v1.8.x** — new window layer, settings window, channel pop-outs, and the restoration - pass that brought v1.5.6 behaviour back onto it. +- **v1.6.0 to v1.8.x** — new window layer, settings window, channel pop-outs, and + the restoration pass that brought v1.5.6 behaviour back onto it. - **v1.9.0** — polish and a concurrency hardening pass. -- **v1.10.0** — the style foundation: a scale-aware layout layer, held hover state, and five drawn - widgets, applied to the sidebar, the tab strip and the status bar. -- **v1.11.0** — the settings window rebuilt on those widgets, and the defects that surfaced while - doing it: three settings with no control, a pinned tell tab that never loaded its history, six - switches that changed nothing, and dropdowns listing blank rows. Contrast is measured against the - surface now rather than taken from the theme. -- **v1.12.0** — the reconnection pass. The v1.6.0 window rebuild had left export, the tab editor, - database maintenance and pinning unreachable, and 433 of 824 translation keys with no caller. All - four features are back, the settings window is translated into 25 languages, and the channel grid - is authoritative over what gets stored. -- **v1.13.0** — typography. Named type roles instead of one size, a channel header above the - conversation, timestamps in a column of their own, and rows with a surface. Screenshot mode - reached one of four surfaces that draw a tab name and now reaches all of them. -- **v1.14.0** — the input row: two ghost buttons and a menu where five filled defaults sat, a - field with its own surface and focus rail, popups built from the sidebar's row shape, and a - softened seam between the tab list and the conversation. Plus a style lab under - `/hellion lab` and a preflight guard for the RGBA/ABGR contrast trap. -- **v1.15.0** — the first-run wizard, the last surface still drawn in ImGui defaults, and the - first thing a tester sees. +- **v1.10.0** — the style foundation: a scale-aware layout layer, held hover state, + and five drawn widgets, applied to the sidebar, the tab strip and the status bar. +- **v1.11.0** — the settings window rebuilt on those widgets, and the defects that + surfaced while doing it: three settings with no control, a pinned tell tab that + never loaded its history, six switches that changed nothing, and dropdowns + listing blank rows. Contrast is measured against the surface now rather than + taken from the theme. +- **v1.12.0** — the reconnection pass. The v1.6.0 window rebuild had left export, + the tab editor, database maintenance and pinning unreachable, and 433 of 824 + translation keys with no caller. All four features are back, the settings window + is translated into 25 languages, and the channel grid is authoritative over what + gets stored. +- **v1.13.0** — typography. Named type roles instead of one size, a channel header + above the conversation, timestamps in a column of their own, and rows with a + surface. Screenshot mode reached one of four surfaces that draw a tab name and + now reaches all of them. +- **v1.14.0** — the input row: two ghost buttons and a menu where five filled + defaults sat, a field with its own surface and focus rail, popups built from the + sidebar's row shape, and a softened seam between the tab list and the + conversation. Plus a style lab under `/hellion lab` and a preflight guard for the + RGBA/ABGR contrast trap. +- **v2.0.0** — the first-run wizard, the last surface still drawn in ImGui + defaults and the first thing a new user sees. Plus the config reset that puts + every install on the same defaults after nine cycles of rebuilding. -The sidebar is no longer on this list. Earlier drafts had it moving from tab rows to channel -rows, but both reasons for that are gone: it was flat and unstyled when the idea was written, -and it is neither now — it draws its own row surfaces and already groups pinned and auto-tell -tabs under headings. What remained was a change to how the plugin is operated rather than how -it looks, and tabs are what users have learned. They stay. - -A tester beta follows once the visual pass is complete. +The sidebar is no longer on this list. Earlier drafts had it moving from tab rows +to channel rows, but both reasons for that are gone: it was flat and unstyled when +the idea was written, and it is neither now — it draws its own row surfaces and +already groups pinned and auto-tell tabs under headings. What remained was a change +to how the plugin is operated rather than how it looks, and tabs are what users have +learned. They stay. ## After that -**v1.5.7 — Ad-Block / Spam-Filter** remains the next feature scope: the hybrid ad-block and -spam-filter cycle, combining a lightweight built-in filter with optional `NoSoliciting` -IPC integration. Plugin Integrations Wave 2-6 (Context-Menu, NotificationMaster, Moodles, -ExtraChat, XIVIM Quick-DM) follows. +**Ad-Block / Spam-Filter** is the next feature scope: a hybrid cycle combining a +lightweight built-in filter with optional `NoSoliciting` IPC integration. It was +planned as v1.5.7 before the window rebuild took priority. Plugin Integrations +Wave 2-6 (Context-Menu, NotificationMaster, Moodles, ExtraChat, XIVIM Quick-DM) +follows. Native-speaker review of the AI-assisted v1.5.3 translations (13 legacy Crowdin locales) runs in parallel as a continuous correction pass, gathered via the Hellion Forge Discord. diff --git a/repo.json b/repo.json index 51e45e2..cf8715f 100644 --- a/repo.json +++ b/repo.json @@ -1,42 +1,42 @@ [ - { - "Author": "Jon Kazama (Hellion Forge)", - "Name": "Hellion Chat", - "InternalName": "HellionChat", - "AssemblyVersion": "1.5.6.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", - "Tags": [ - "Social", - "UI", - "Chat", - "Replacement", - "Privacy" - ], - "DalamudApiLevel": 15, - "LoadRequiredState": 0, - "LoadSync": false, - "CanUnloadAsync": false, - "LoadPriority": 0, - "Punchline": "A Hellion Forge plugin. Privacy-first chat for FFXIV, built to stay out of your way.", - "Changelog": "**v1.5.6 — Settings Overhaul + Filter & Notification Polish (2026-05-23)**\n\n- Settings window reorganised: ten tabs down to seven (General, Appearance, Chat, Window, Channels, Data & Privacy, About). Each tab now uses collapsible sections grouped by control type. Sections start collapsed every time you open a tab — less noise, easier to find what you need.\n- New sender-name display options under Chat → Messages: separate world-suffix and name-format modes (Full name / First name only / Initials × Never / Other worlds only / Always).\n- Plugin-only symbols now show a pre-send warning so other players do not get empty boxes (Chat → Messages → \"Warn before sending plugin-only symbols\").\n- Separate window opacity for focused vs. inactive chat window (Appearance → Window style → \"Inactive window opacity\"). The slider above sets the focused value.\n- Custom notification sound volume slider (General → Sound, and mirrored in Channels → per-tab → Notification). Affects only the three bundled custom sounds; the 16 game sounds are unaffected.\n- The per-tab regex filter that briefly shipped earlier in this cycle has been removed — FFXIV's built-in blackword filter covers the same need.\n- All 24 locale files updated for the new section labels and the v1.5.6 control labels (machine translation; native review continues via the Hellion Forge Discord).\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.5.5 — Upstream-Sync Tab-Features (2026-05-21)**\n\nA backlog-sync cycle: inherited tab-feature items plus a new fox\nbanner image and custom notification sounds.\n\nUser-visible:\n\n- Failed tells now raise a warning toast when a message you sent\n could not be delivered (recipient offline, in an instance, or\n blocking you). Toggle in Settings, Chat tab.\n- Per-tab notification sound: each tab can play a sound when a\n message arrives while you are looking at a different tab. Pick\n one of the 16 game chat sounds or one of three bundled Hellion\n sounds, with a preview button to hear it. Off by default,\n respects the global sound toggle.\n- The tab rename field in the right-click menu now focuses\n itself when the menu opens and accepts up to 512 characters,\n matching the settings-tab rename.\n- A jump-to-latest button appears in the chat log header while\n you are scrolled up from the live end.\n- Map flags and item links can be inserted into the chat input\n from its right-click menu.\n- The Hellion Forge fox banner in the first-run wizard and the\n Information tab is now a real image instead of ASCII art.\n\nSchema bumped to v18 (additive fields only, no data migration).\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.5.4 — Polish and Motion (2026-05-20)**\n\nA polish cycle: smoother theme switching, faster theme and tab\naccess, and subtle hover motion. Three P3 items plus an\naccessibility toggle.\n\nUser-visible:\n\n- Theme switches now crossfade smoothly over ~300 ms across every\n Hellion-rendered surface — sidebar, title, buttons, tabs,\n scrollbar, separators. The window background snaps deliberately\n so the per-window opacity override from Dalamud's pinning menu\n stays untouched.\n- New header quick-picker: a palette button left of the cog opens\n a compact popup with two sections — every built-in and custom\n theme, and every tab. The active entry carries a check glyph;\n clicking another switches without closing the popup.\n- Sidebar icons ease their opacity on hover, and card-mode message\n borders highlight per tab while the cursor is over their rows.\n Framerate-independent, so a stalled Wine frame cannot overshoot\n the animation.\n- New \"Reduce motion\" toggle in Theme & Layout disables the\n crossfade, the hover animations and the unread-tab pulse for\n users who prefer a static UI.\n\nUnder the hood:\n\n- Two pure-helper lerp paths (ThemeAbgrCacheLerp, FrameLerp) with\n xUnit coverage in the Build Suite, plus a ColourUtil.ApplyAlpha\n alpha modulator. Two new /xlperf self-test steps pin the\n crossfade and quick-picker contracts.\n\nNo schema bump, no migration. Migration v17 stays.\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.5.3 — Localisation Wave + Bundled-Font Overhaul (2026-05-19)**\n\nMulti-language pass plus a long-standing first-frame HITCH lands\nas a side effect of a font-stack rewrite.\n\nUser-visible:\n\n- 24 selectable UI languages (was 2). Catalan, Czech, Danish,\n Dutch, English, Finnish, French, German, Greek, Hungarian,\n Italian, Japanese, Korean, Norsk bokmål, Polish, Portuguese\n (BR + PT), Romanian, Russian, Spanish, Swedish, Turkish,\n Ukrainian, Simplified + Traditional Chinese. Sorted by endonym,\n \"None\" pinned first. Non-native locales are AI-assisted and\n flagged for native-speaker review via the Forge Discord.\n- Bundled Inter Light replaces Exo 2 (SIL OFL 1.1, 343 KB). The\n Inter font ships Latin Extended-A/B, Greek polytonic and\n Cyrillic Supplement coverage; NotoSansCjkRegular joins as a\n third merge layer for Hangul and Simplified-Han glyphs the\n FFXIV Japanese game font does not ship.\n- First-frame HITCH dropped from ~74 ms (v1.5.2 baseline that\n held since v1.4.x) to a median of ~20 ms (5-reload sample\n 17.9-23.6 ms, Linux/Wine). The bundled-font path silently\n fell back to the FFXIV Axis font for the entire v1.5.x series\n because of an early-return in the draw loop. The fix that\n routes RegularFont through draw also lands the defer-pattern\n win the v1.5.1 cycle was reaching for.\n- ExtraGlyphRanges auto-activates on language change. Korean,\n ChineseFull and the two new flags (LatinExtended, Greek) toggle\n on without a manual visit to Fonts and Colours.\n- New WarningText under the language dropdown notes FFXIV's\n chat input only fully supports EN/DE/FR/JA character sets.\n Other languages render in HellionChat but may garble when\n typed into in-game chat.\n\nUnder the hood:\n\n- Three-layer font stack: Inter Light primary, FFXIV\n JapaneseFont merge 1 for kana/kanji style, NotoSansCjkRegular\n merge 2 for everything else CJK.\n- LanguageOverride enum gains ten locales plus three previously\n commented out (Italian, Korean, Norwegian as `nb`). New\n values append to the enum so existing config integers stay\n stable across update.\n- Crowdin gap closed: four post-sync ChatTwo keys backfilled\n into 13 legacy locales with per-key AI markers.\n- Plugin.LoadAsync runs a one-shot migration that ORs in the\n matching ExtraGlyphRanges flag for users already on a\n non-default language. Settings.Apply auto-activates on\n change going forward.\n- Em-dash sweep across the EN source and 18 translations to the\n house style. Russian and Ukrainian keep the typographic norm.\n\nMigration v17 stays. UseHellionFont users transition from Exo 2\nto Inter Light transparently on first reload.\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\nFull history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases", - "AcceptsFeedback": true, - "DownloadLinkInstall": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.5.6/latest.zip", - "DownloadLinkUpdate": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.5.6/latest.zip", - "DownloadLinkTesting": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.5.6/latest.zip", - "TestingAssemblyVersion": "1.5.6.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" - ], - "DownloadCount": 0, - "IsHide": false, - "IsTestingExclusive": false, - "CategoryTags": [ - "social" - ] - } + { + "Author": "Jon Kazama (Hellion Forge)", + "Name": "Hellion Chat", + "InternalName": "HellionChat", + "AssemblyVersion": "2.0.0.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", + "Tags": [ + "Social", + "UI", + "Chat", + "Replacement", + "Privacy" + ], + "DalamudApiLevel": 15, + "LoadRequiredState": 0, + "LoadSync": false, + "CanUnloadAsync": false, + "LoadPriority": 0, + "Punchline": "A Hellion Forge plugin. Privacy-first chat for FFXIV, built to stay out of your way.", + "Changelog": "**v2.0.0 — Rebuilt, Repaired, Reset (2026-08-19)**\n\nNine development cycles in one release. Everything built as v1.6.0 through v1.15.0 ships here; those versions were never published on their own.\n\n**This update resets your settings.** Nine cycles of rebuilding left saved values pointing at surfaces that no longer exist, and starting over is the only way to be sure every install is on the same defaults. **Your message history is untouched** — it lives in a separate database. Your old settings are kept next to the config file as `HellionChat.json.pre-2.0.0.bak`.\n\nFixed, and several of these lost data or hid it:\n\n- Retroactive cleanup could never be applied at all. The preview took the database lock itself and that counted as a change, so every preview went stale the instant it finished and the apply button never appeared.\n- Compacting the database ran against an open reader and failed, after which the plugin reported that nothing had been deleted — while everything had.\n- Deleting messages left them in the search index, so search kept returning rows that were already gone.\n- Pinned tell tabs came up empty for a whole session: the history query ran at plugin start, before any character is logged in, and never tried again.\n- Export wrote invalid JSON where a setting value was involved, and a byte-order mark that strict parsers reject.\n- A pop-out with its title bar switched on could not be closed, and a tell from a popped-out partner hijacked the main window's active tab.\n- One third-party emote service started returning 403, and that response took all 65 working global emotes down with it on every start.\n- The GDPR notice for the full-history profile had been translated into 25 languages and shown nowhere since May.\n\nChanged, and one of these changes what gets stored:\n\n- **The channel grid is now authoritative.** Until now the unknown-channel failsafe was applied to known channels too, so a channel you had unticked was still being written while that failsafe was on. If that was you, this release stores less than before. Nothing already in the database is touched.\n- Every window is drawn by the plugin rather than by ImGui defaults, and they share one visual language: structure carried by typography, a surface on anything you can press, and colours measured against what sits behind them.\n- Typography has named roles — sender, body and timestamp mean the same thing everywhere, timestamps sit in their own column, system messages are italic.\n- Export, the tab editor, database maintenance and pinning had lost their entry points during the rebuild and are reachable again.\n- Screenshot mode reached one of four surfaces that draw a tab name. It reaches all four now.\n\nRemoved: six settings that had a control and a saved value but no reader anywhere in the plugin; a per-tab regex filter the game's own blackword filter covers; and a wizard checkbox that was collected, reported as applied and never read.\n\nNew: an Emote tab in the default layout, local and server clocks in the status bar, a screenshot mode reachable from the input row, `/hellion wizard` to reopen the setup wizard, a style lab under `/hellion lab`, and 25 UI languages with the settings window and wizard fully covered.\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2). The two codebases have diverged far enough that they no longer line up.", + "AcceptsFeedback": true, + "DownloadLinkInstall": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.0/latest.zip", + "DownloadLinkUpdate": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.0/latest.zip", + "DownloadLinkTesting": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.0/latest.zip", + "TestingAssemblyVersion": "2.0.0.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" + ], + "DownloadCount": 0, + "IsHide": false, + "IsTestingExclusive": false, + "CategoryTags": [ + "social" + ] + } ]