diff --git a/.github/forge-posts/v2.0.5.md b/.github/forge-posts/v2.0.5.md new file mode 100644 index 0000000..440c99b --- /dev/null +++ b/.github/forge-posts/v2.0.5.md @@ -0,0 +1,12 @@ +--- +subtitle: "Fokus bleibt, Tabs lassen sich schließen" +versionsnatur: "Bugfix-Release" +--- +Zwei Meldungen aus dem Test, beide in derselben Ecke: was ein eintreffendes Flüstern mit dem macht, was du gerade tust — und was du mit einem Tab machen kannst, wenn er erst einmal da ist. + +- **Ein Flüstern, das ankam während du geschrieben hast, hat dir die Tastatur weggenommen.** Der Tab wechselte unter dir weg, und in diesem Spiel heißt das, dass die nächsten Tasten deine Figur bewegen statt Text zu schreiben. Schlimmer: Der halb getippte Satz konnte beim Falschen landen. Was du tippst gehört dem Fenster, der Empfänger wird aber von dem Tab gelesen, der beim Enter gerade aktiv ist. Solange du an einer Zeile schreibst, springt jetzt nichts mehr — in keinem Modus. Der Tab taucht trotzdem auf und wartet mit seinem Ungelesen-Punkt. +- **Ein Flüster-Tab ließ sich überhaupt nicht schließen.** Der Eintrag ging beim Fenster-Neubau in 2.0.0 verloren: Er lebte im alten Menü, und das neue hat Umbenennen, Töne, Herauslösen und Anheften zurückgebracht, das Schließen aber nie. Flüster-Tabs sind absichtlich aus dem Einstellungs-Editor ausgenommen, mit einem Verweis auf das Kontextmenü — das sie ebenfalls nicht schließen konnte. Jetzt per Rechtsklick auf jedem Tab. Bei einem angehefteten Flüster-Tab musst du erst die Anheftung lösen, damit ein Fehlklick kein Gespräch beendet, das du behalten wolltest. +- **Zwei Einstellungen entschieden, wo ein Flüstern aufgeht, und die ältere gewann immer.** "Neue /tell-Tabs direkt als Pop-out öffnen" feuerte beim Anlegen des Tabs, einen Tick bevor der Modus darunter überhaupt gefragt wurde — deshalb sah der aus, als täte er nichts. Beide sind jetzt eine. Deine bisherige Wahl wird übernommen. +- **"Aus" ist aus dieser Auswahl verschwunden.** Es hat nie verhindert, dass ein Flüster-Tab entsteht, das macht der Schalter weiter oben. Es hat nur den Sprung dorthin unterbunden, und genau dafür ist der Schalter darunter da. +- **Einen Tab zu schließen konnte ein Pop-out beschädigen, in dem du gerade warst.** Der Fokus sprang immer auf den ersten Tab der Liste, auch wenn der in einem eigenen Fenster offen war, und nahm ihm dabei seine Flüster-Bindung. +- **Kleinkram.** "Pop Out" im Kontextmenü war auf jedem Client englisch, die Modusnamen ebenfalls. Der Hinweis zum Anheft-Limit verwies auf eine Funktion, die im Mai entfernt wurde. Im Spanischen stand ein Wort, das es nicht gibt, im Griechischen ein unübersetztes, im europäischen Portugiesisch eines, das seinem eigenen Knopf widersprach. Und segmentierte Einstellungszeilen haben lange Beschriftungen abgeschnitten. diff --git a/HellionChat/HellionChat.csproj b/HellionChat/HellionChat.csproj index 9a279a7..805278d 100644 --- a/HellionChat/HellionChat.csproj +++ b/HellionChat/HellionChat.csproj @@ -1,7 +1,7 @@ - 2.0.4 + 2.0.5 enable enable diff --git a/HellionChat/HellionChat.yaml b/HellionChat/HellionChat.yaml index fdcd16f..5788ea0 100755 --- a/HellionChat/HellionChat.yaml +++ b/HellionChat/HellionChat.yaml @@ -21,6 +21,18 @@ tags: - Replacement - Privacy changelog: |- + **v2.0.5 — Focus, and a way out (2026-08-23)** + + Two tester reports, both about the same corner: what a tell does to what you were doing, and what you can do about a tab once it exists. + + - **A tell arriving while you were typing took the keyboard.** The tab switched under you, and in this game that means the next thing you type walks your character around. It could also send your sentence to the wrong person: what you have typed belongs to the window, while the recipient is read off whichever tab is active when you press Enter — so a line meant for one person could leave addressed to whoever had just written. Nothing is revealed now while you are mid-sentence, in any mode. The tab still appears with its unread mark and waits for you. + - **A tell tab could not be closed.** The entry was lost in the 2.0.0 window rebuild: it lived in the old menu, and the rebuilt one restored renaming, sounds, pop-outs and pinning but not this. Tell tabs are kept out of the settings editor on purpose, with a note pointing at the context menu — which could not close them either. Right-click any tab to close it. A pinned tell tab asks you to unpin it first, so one misclick cannot end a conversation you meant to keep. + - **Two settings decided where a tell opens, and the older one always won.** "Open new /tell tabs as a pop-out" fired when the tab was created, a tick before the mode below it was ever asked — which is why that mode looked like it did nothing. They are one setting now and your existing choice carries over. "Off" went with them: it never stopped tell tabs from being created, that is the switch further up, it only stopped the jump to them, which is what the switch below it does. + - **Closing a tab could break a pop-out you were using.** Re-anchoring always jumped to the first tab in the list, even when that tab was open in its own window, and stripped its tell binding on the way there. + - **Smaller things.** "Pop Out" in the context menu was English on every client, as were the tell-open modes. The pinned-tab limit still pointed at a feature removed in May. Spanish had a word that does not exist, Greek had an untranslated one, Portuguese contradicted its own button. Segmented settings rows cut long labels in half. The last compiler warning in the project is gone. + + --- + **v2.0.4 — Housekeeping (2026-08-20)** Nothing changes in how the plugin behaves. Two pieces of tidying that were overdue. @@ -44,13 +56,4 @@ changelog: |- - **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. - - - 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. - - 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. - Earlier history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases diff --git a/README.md b/README.md index 584a14a..ee74d5f 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.4-brightgreen)](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/latest) +[![Latest release](https://img.shields.io/badge/release-v2.0.5-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.4** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, originally +**Version 2.0.5** — 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 6d62978..d557ba8 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.5] — 2026-08-23 + +Two tester reports about the same corner of the plugin: what an incoming tell does +to what you were doing, and what you can do about a tab once it exists. + +### Fixed + +- A tell arriving while you were typing took the keyboard focus, which in this game + means the next keystrokes reach the character rather than the chat. It could also + send the half-typed line to the wrong person: the text belongs to the window, the + recipient is read off whichever tab is active at Enter. Nothing is revealed now + while an input is in use, in any mode. +- Tell tabs could not be closed at all. The context menu lost its close entry in the + 2.0.0 window rebuild, and the settings editor excludes tell tabs by design. +- Closing a tab re-anchored on the first tab in the list even when that tab was open + in a pop-out, stripping its tell binding. With every tab popped out, the seed and + the re-anchor contradicted each other on every frame. +- The pinned-tab limit message pointed at a feature removed in May. Spanish carried a + non-existent word, Greek an untranslated one, and European Portuguese used a verb + that contradicted its own button. +- Segmented settings rows measured a flat 200px and cut off longer labels. + +### Changed + +- Where a tell opens is one setting now. "Open new /tell tabs as a pop-out" and the + tell-open mode both decided it, and the former won every time because it fired at + tab creation. Config schema 28 carries the existing choice forward. +- The tell-open mode dropped its "Off" option, which never prevented tell tabs — that + is the auto-tell switch — and only suppressed the jump to them, which the switch + below it already does. +- "Pop Out" in the tab context menu and the tell-open mode names were hardcoded + English on every client. They are translated into all 25 languages. +- `Metrics.Scale` no longer calls the obsolete `GlobalScaleSafe`. The project builds + without compiler warnings. + +--- + ## [2.0.4] — 2026-08-20 Housekeeping. Nothing changes in how the plugin behaves. diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index dce8c4e..c8d5abd 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -12,6 +12,16 @@ be a poor fit for the plugin's privacy-first scope during brainstorming. ## Released +**v2.0.5 — Focus, and a way out (2026-08-23)** came out of two tester reports about +the same corner. A tell arriving mid-sentence took the keyboard, which in this game +sends the next keystrokes to the character; worse, it could address a half-typed line +to the wrong person, since the input buffer belongs to the window while the recipient +is read off whichever tab is active at Enter. Tell tabs, separately, could not be +closed at all — the entry was lost in the 2.0.0 rebuild, and the settings editor +excludes them on purpose. Where a tell opens is one setting now rather than two that +raced each other, and the tell-open modes plus the context menu's Pop Out entry were +the last hardcoded English strings in the plugin. + **v2.0.2 — Emotes out, placeholders fixed (2026-08-19)** removed BetterTTV emote support entirely. Its shared-emote endpoint went behind authentication and that was where nearly all of them came from; what remained was 54 mostly static images, one @@ -94,8 +104,14 @@ a later pass rather than rushed into a patch: - **An orphaned `EmoteCacheV1/` directory** stays on disk for anyone who ran a version before 2.0.2. Nothing reads or writes it. A one-time cleanup on load would be tidier than asking people to delete it by hand. -- **`Metrics.Scale` uses the deprecated `ImGuiHelpers.GlobalScaleSafe`**, which is - the only compiler warning left in the build. +- **`PopoutSlotMap` is unsynchronised.** A plain dictionary plus a bool array, + written from the draw thread and from the framework thread. Reading a dictionary + while another thread writes it can hang or return the wrong slot. Found during the + 2.0.5 review and deliberately left out of a patch release: a lock here needs its + ordering against `TabsListLock` worked out first. +- **The database viewer and the symbol picker are still English.** The symbol picker + alone carries 90 Unicode character names, which is a cycle of its own rather than + an addition to a patch. --- diff --git a/repo.json b/repo.json index 23f9d35..05486cb 100644 --- a/repo.json +++ b/repo.json @@ -3,7 +3,7 @@ "Author": "Jon Kazama (Hellion Forge)", "Name": "Hellion Chat", "InternalName": "HellionChat", - "AssemblyVersion": "2.0.4.0", + "AssemblyVersion": "2.0.5.0", "Description": "A chat window that stores your own conversations and nothing else. Public chat, NPC dialogue, system messages and battle logs stay out of the database until you switch them on.\n\nRetention per channel, retroactive wipe, export to Markdown, JSON or CSV. Setup wizard with four profiles. 25 languages. Its own config and database.\n\nSupport: https://discord.gg/X9V7Kcv5gR", "ApplicableVersion": "any", "RepoUrl": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat", @@ -20,12 +20,12 @@ "CanUnloadAsync": false, "LoadPriority": 0, "Punchline": "Chat replacement for FFXIV that keeps your conversations and forgets the rest.", - "Changelog": "**v2.0.4 \u2014 Housekeeping (2026-08-20)**\n\nNothing changes in how the plugin behaves. Two pieces of tidying that were overdue.\n\n- **The installer description was long, and one line of it was wrong.** It ran to 908 characters and opened by naming a category instead of saying what the plugin does. It also claimed 24 interface languages when there are 25, and the two manifests carried different one-line summaries, so the store listing and the plugin details showed different sentences.\n- **30 translation keys for the webinterface are gone.** That feature, its HTTP routes and its frontend left the code in May; the strings stayed behind in all 25 languages, along with a generated property for each. Every key was checked against the whole repository before anything was removed.\n\n---\n\n**v2.0.3 \u2014 Pop-out context menu, screenshot mode (2026-08-20)**\n\n- **The context menu never opened in a pop-out window.** Right-clicking a name or an item there did nothing at all. Every chat surface shares one popup state, and whichever window drew first cleared the menu it had not opened before the pop-out got its turn. The menu now stays with the window the click came from.\n- **Screenshot mode could not be turned off.** It is a saved setting, but neither of its two toggles wrote the change to the config file, so switching it off never survived a reload and the mode came back on at every plugin load. Both toggles save now. If it is stuck on for you, one click off is enough.\n- **Text the game colours itself could render invisible.** Some of those colours arrive without an alpha byte, and the byte order swap then left them fully transparent.\n\n---\n\n**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.", + "Changelog": "**v2.0.5 — Focus, and a way out (2026-08-23)**\n\nTwo tester reports, both about the same corner: what a tell does to what you were doing, and what you can do about a tab once it exists.\n\n- **A tell arriving while you were typing took the keyboard.** The tab switched under you, and in this game that means the next thing you type walks your character around. It could also send your sentence to the wrong person: what you have typed belongs to the window, while the recipient is read off whichever tab is active when you press Enter — so a line meant for one person could leave addressed to whoever had just written. Nothing is revealed now while you are mid-sentence, in any mode. The tab still appears with its unread mark and waits for you.\n- **A tell tab could not be closed.** The entry was lost in the 2.0.0 window rebuild: it lived in the old menu, and the rebuilt one restored renaming, sounds, pop-outs and pinning but not this. Tell tabs are kept out of the settings editor on purpose, with a note pointing at the context menu — which could not close them either. Right-click any tab to close it. A pinned tell tab asks you to unpin it first, so one misclick cannot end a conversation you meant to keep.\n- **Two settings decided where a tell opens, and the older one always won.** \"Open new /tell tabs as a pop-out\" fired when the tab was created, a tick before the mode below it was ever asked — which is why that mode looked like it did nothing. They are one setting now and your existing choice carries over. \"Off\" went with them: it never stopped tell tabs from being created, that is the switch further up, it only stopped the jump to them, which is what the switch below it does.\n- **Closing a tab could break a pop-out you were using.** Re-anchoring always jumped to the first tab in the list, even when that tab was open in its own window, and stripped its tell binding on the way there.\n- **Smaller things.** \"Pop Out\" in the context menu was English on every client, as were the tell-open modes. The pinned-tab limit still pointed at a feature removed in May. Spanish had a word that does not exist, Greek had an untranslated one, Portuguese contradicted its own button. Segmented settings rows cut long labels in half. The last compiler warning in the project is gone.\n\n---\n\n**v2.0.4 — Housekeeping (2026-08-20)**\n\nNothing changes in how the plugin behaves. Two pieces of tidying that were overdue.\n\n- **The installer description was long, and one line of it was wrong.** It ran to 908 characters and opened by naming a category instead of saying what the plugin does. It also claimed 24 interface languages when there are 25, and the two manifests carried different one-line summaries, so the store listing and the plugin details showed different sentences.\n- **30 translation keys for the webinterface are gone.** That feature, its HTTP routes and its frontend left the code in May; the strings stayed behind in all 25 languages, along with a generated property for each. Every key was checked against the whole repository before anything was removed.\n\n---\n\n**v2.0.3 — Pop-out context menu, screenshot mode (2026-08-20)**\n\n- **The context menu never opened in a pop-out window.** Right-clicking a name or an item there did nothing at all. Every chat surface shares one popup state, and whichever window drew first cleared the menu it had not opened before the pop-out got its turn. The menu now stays with the window the click came from.\n- **Screenshot mode could not be turned off.** It is a saved setting, but neither of its two toggles wrote the change to the config file, so switching it off never survived a reload and the mode came back on at every plugin load. Both toggles save now. If it is stuck on for you, one click off is enough.\n- **Text the game colours itself could render invisible.** Some of those colours arrive without an alpha byte, and the byte order swap then left them fully transparent.\n\n---\n\n**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.4/latest.zip", - "DownloadLinkUpdate": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.4/latest.zip", - "DownloadLinkTesting": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.4/latest.zip", - "TestingAssemblyVersion": "2.0.4.0", + "DownloadLinkInstall": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.5/latest.zip", + "DownloadLinkUpdate": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.5/latest.zip", + "DownloadLinkTesting": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v2.0.5/latest.zip", + "TestingAssemblyVersion": "2.0.5.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",