From c285dcb0a0aa0323bcff72ec0290e678c219bcfb Mon Sep 17 00:00:00 2001 From: JonKazama-Hellion Date: Fri, 1 May 2026 21:00:07 +0200 Subject: [PATCH] Polish: README, AI disclosure, scoped Hellion ImGui style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the inherited upstream README with a Hellion-specific one that lists the privacy/retention/cleanup/export features, links to upstream and the relevant unanswered filtering issues, documents the EUPL-1.2 license relationship, and acknowledges Infi & Anna for the Chat 2 engine that everything builds on. Add AI_DISCLOSURE.md with the goatcorp Pair classification, an explicit list of what AI is and is not used for in this fork (translations, visual assets and license-sensitive boundaries are handled by the maintainer), and the tooling list. Drops in before v0.1 so it's already in place when the repo goes public. HellionStyle.Push() returns a disposable bundle of ImGui color pushes (cyan-teal accents on a deep-slate frame with steel borders) and pops them in reverse on Dispose. Privacy tab and the first-run wizard wrap their Draw with `using var _style = HellionStyle.Push()` so only Hellion-owned surfaces get the HUD-flavored palette while upstream Chat 2 tabs render in their original style — important so cherry-picks from upstream don't fight with our color overrides. --- AI_DISCLOSURE.md | 83 ++++++++++++++++++++++ ChatTwo/Ui/FirstRunWizard.cs | 2 + ChatTwo/Ui/HellionStyle.cs | 70 +++++++++++++++++++ ChatTwo/Ui/SettingsTabs/Privacy.cs | 2 + README.md | 107 ++++++++++++++++++++++------- 5 files changed, 239 insertions(+), 25 deletions(-) create mode 100644 AI_DISCLOSURE.md create mode 100644 ChatTwo/Ui/HellionStyle.cs diff --git a/AI_DISCLOSURE.md b/AI_DISCLOSURE.md new file mode 100644 index 0000000..bec37f9 --- /dev/null +++ b/AI_DISCLOSURE.md @@ -0,0 +1,83 @@ +# AI assistance disclosure + +This document follows the [Dalamud Plugin AI Usage Policy](https://github.com/goatcorp/DalamudPluginsD17/) +disclosure guidelines. + +## Classification + +**Pair** — from the official spectrum (None / Hint / Assist / **Pair** / Copilot / Auto). + +The maintainer (JonKazama-Hellion / Florian Wathling) plans the architecture, +makes every design decision, reviews and integrates each change, and personally +tests the plugin against a running game client. Claude (Anthropic) acts as a +mentor/reviewer: it explains Dalamud APIs from official documentation, +suggests implementation patterns, drafts code snippets when asked, and +challenges design choices — but it never autonomously decides what gets +shipped, and it cannot test the running game itself. + +The pragmatic test of "Pair" is not "did you type every character yourself" +but "can you explain why each piece of code is the way it is". The maintainer +can answer that question about every line of Hellion-specific code in this +fork. + +## What is upstream and what is Hellion + +This fork is built on top of [Chat 2 by Infi & Anna](https://github.com/Infiziert90/ChatTwo). +The upstream code is licensed under EUPL-1.2 and was not produced by AI +assistance; the upstream repository has its own contribution history and +licensing. + +Hellion-specific changes (everything in +`ChatTwo/Privacy/`, `ChatTwo/Export/`, `ChatTwo/Resources/HellionStrings*.resx`, +`ChatTwo/Resources/HellionStrings.Designer.cs`, `ChatTwo/Ui/SettingsTabs/Privacy.cs`, +`ChatTwo/Ui/FirstRunWizard.cs`, the Migrate3 idempotency block in +`MessageStore.cs`, the assembly rename and migration logic in `Plugin.cs`) +were authored under the Pair workflow described above. Existing files +modified for the fork carry the same EUPL-1.2 license; original copyright +headers remain in place. + +## Workflow rules followed + +1. **Understanding before code.** Every Dalamud API used was checked against + the official `dalamud.dev/versions/v15` documentation, ChatTwo's own + usage as a reference, or the FFXIVClientStructs source. +2. **Verified APIs.** Microsoft Learn / Dalamud docs are consulted before + accepting AI-suggested API surfaces, because LLM training data + frequently lags behind Dalamud's API changes. +3. **Live testing.** Every feature was loaded as a dev plugin, exercised in + the running game, and the database state inspected via `sqlite3` / + `python3 -m sqlite3` queries to confirm the expected effect. +4. **Hand-drawn icon — no AI artwork.** The Hellion logo, when added, will + be human-drawn. The `images/icon.png` currently in the repository is the + original Chat 2 icon by the upstream authors. +5. **Transparent disclosure.** This file is part of the repository from + v0.1 onward, before any submission to the official Dalamud plugin repo. + +## Tooling + +- **Claude (Anthropic) via Claude Code CLI** — primary AI mentor, used + through interactive sessions. Each session starts with the maintainer + describing intent and architectural questions; Claude reviews proposed + changes, points out issues, and produces code drafts that the maintainer + reads, edits, and integrates. +- **Context7** — official documentation lookup MCP, used to ground answers + about Dalamud, .NET, MessagePack, MySqlConnector etc. in current docs + rather than LLM training memory. +- **Microsoft Learn** — referenced for .NET SDK 10 features and + cross-platform behavior. + +## What AI is *not* used for in this fork + +- **Code review of license-sensitive boundaries.** All EUPL-1.2 attribution + decisions are made by the maintainer. +- **Translations.** German translations in `Resources/HellionStrings.de.resx` + are written and reviewed by the maintainer (native speaker). Future + community translations will go through human translators or + community-driven platforms (e.g. a dedicated Crowdin project), not + bulk-translated via LLM. +- **Visual assets.** No AI-generated icons, banners, or screenshots. + +## Contact + +Issues with this disclosure or with the AI handling of any specific commit +can be raised at . diff --git a/ChatTwo/Ui/FirstRunWizard.cs b/ChatTwo/Ui/FirstRunWizard.cs index 99928e7..0f7f57b 100644 --- a/ChatTwo/Ui/FirstRunWizard.cs +++ b/ChatTwo/Ui/FirstRunWizard.cs @@ -41,6 +41,8 @@ public sealed class FirstRunWizard : Window public override void Draw() { + using var _style = HellionStyle.Push(); + ImGui.TextWrapped(HellionStrings.Wizard_Intro); ImGui.Spacing(); ImGui.Separator(); diff --git a/ChatTwo/Ui/HellionStyle.cs b/ChatTwo/Ui/HellionStyle.cs new file mode 100644 index 0000000..46f1412 --- /dev/null +++ b/ChatTwo/Ui/HellionStyle.cs @@ -0,0 +1,70 @@ +using ChatTwo.Util; +using Dalamud.Bindings.ImGui; +using Dalamud.Interface.Utility.Raii; + +namespace ChatTwo.Ui; + +/// +/// Local ImGui style override applied inside Hellion-owned settings surfaces +/// (Privacy tab, first-run wizard). Industrial HUD palette: deep slate +/// background with cyan-teal accents and sharper geometric framing. Scoped +/// via using-blocks so upstream Chat 2 tabs render in their original style. +/// +internal static class HellionStyle +{ + // Palette — kept central so a future theme switch only edits one file. + private const uint AccentRgba = 0xFF00B8D4; // cyan-teal accent + private const uint AccentHoverRgba = 0xFF26C6DA; + private const uint AccentActiveRgba = 0xFF00838F; + private const uint FrameBgRgba = 0xFF102027; // deep slate + private const uint FrameBgHoverRgba = 0xFF1B2C36; + private const uint FrameBgActiveRgba = 0xFF263A45; + private const uint BorderRgba = 0xFF37474F; // steel border + private const uint HeaderRgba = 0xFF1B2C36; + private const uint HeaderHoverRgba = 0xFF263A45; + private const uint HeaderActiveRgba = 0xFF324A57; + private const uint TitleBgActiveRgba = 0xFF00838F; + private const uint CheckMarkRgba = 0xFF00B8D4; + private const uint SliderGrabRgba = 0xFF00B8D4; + private const uint SliderGrabActiveRgba = 0xFF26C6DA; + + /// + /// Push the Hellion color stack. Returns a disposable bundle that pops + /// every color in reverse order on Dispose. Use inside a `using` block. + /// + internal static IDisposable Push() + { + var stack = new StackHandle(); + // Order matters less than count: each PushColor needs a matching pop. + stack.Add(ImRaii.PushColor(ImGuiCol.Button, ColourUtil.RgbaToAbgr(AccentRgba))); + stack.Add(ImRaii.PushColor(ImGuiCol.ButtonHovered, ColourUtil.RgbaToAbgr(AccentHoverRgba))); + stack.Add(ImRaii.PushColor(ImGuiCol.ButtonActive, ColourUtil.RgbaToAbgr(AccentActiveRgba))); + stack.Add(ImRaii.PushColor(ImGuiCol.FrameBg, ColourUtil.RgbaToAbgr(FrameBgRgba))); + stack.Add(ImRaii.PushColor(ImGuiCol.FrameBgHovered, ColourUtil.RgbaToAbgr(FrameBgHoverRgba))); + stack.Add(ImRaii.PushColor(ImGuiCol.FrameBgActive, ColourUtil.RgbaToAbgr(FrameBgActiveRgba))); + stack.Add(ImRaii.PushColor(ImGuiCol.Border, ColourUtil.RgbaToAbgr(BorderRgba))); + stack.Add(ImRaii.PushColor(ImGuiCol.Header, ColourUtil.RgbaToAbgr(HeaderRgba))); + stack.Add(ImRaii.PushColor(ImGuiCol.HeaderHovered, ColourUtil.RgbaToAbgr(HeaderHoverRgba))); + stack.Add(ImRaii.PushColor(ImGuiCol.HeaderActive, ColourUtil.RgbaToAbgr(HeaderActiveRgba))); + stack.Add(ImRaii.PushColor(ImGuiCol.TitleBgActive, ColourUtil.RgbaToAbgr(TitleBgActiveRgba))); + stack.Add(ImRaii.PushColor(ImGuiCol.CheckMark, ColourUtil.RgbaToAbgr(CheckMarkRgba))); + stack.Add(ImRaii.PushColor(ImGuiCol.SliderGrab, ColourUtil.RgbaToAbgr(SliderGrabRgba))); + stack.Add(ImRaii.PushColor(ImGuiCol.SliderGrabActive, ColourUtil.RgbaToAbgr(SliderGrabActiveRgba))); + return stack; + } + + private sealed class StackHandle : IDisposable + { + private readonly List _items = new(16); + + internal void Add(IDisposable d) => _items.Add(d); + + public void Dispose() + { + // Pop in reverse order so the ImGui stack unwinds cleanly. + for (var i = _items.Count - 1; i >= 0; i--) + _items[i].Dispose(); + _items.Clear(); + } + } +} diff --git a/ChatTwo/Ui/SettingsTabs/Privacy.cs b/ChatTwo/Ui/SettingsTabs/Privacy.cs index e0502e5..7267cc4 100644 --- a/ChatTwo/Ui/SettingsTabs/Privacy.cs +++ b/ChatTwo/Ui/SettingsTabs/Privacy.cs @@ -66,6 +66,8 @@ internal sealed class Privacy : ISettingsTab public void Draw(bool changed) { + using var _style = HellionStyle.Push(); + if (ImGui.Button(HellionStrings.Wizard_Reopen_Button)) Plugin.FirstRunWizard.IsOpen = true; ImGui.Spacing(); diff --git a/README.md b/README.md index 6a13a4c..98a3ada 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,91 @@ -# Chat 2 -#### Electric Boogaloo - ♪ A whole new chat, a new fantastic chat window ♪ +# Hellion Chat -Chat 2 is a complete rewrite of the in-game chat window as a plugin. -It supports: +A GDPR-compliant, Linux-aware fork of [Chat 2](https://github.com/Infiziert90/ChatTwo) +for FINAL FANTASY XIV / Dalamud. -- Unlimited tabs -- Tabs that always send to a certain channel -- More flexible filtering -- RGB channel colouring -- Completely variable font size -- Sidebar tabs -- Unread counts -- Emotes -- Screenshot mode (obfuscate names) +Same chat replacement you know from upstream, with extra controls for what +actually gets stored: ---- +- **Channel whitelist** for database persistence (GDPR Art. 25 — privacy by + default). Out-of-the-box only your own conversations are kept: Tells, Party, + Free Company, Linkshells, Cross-World Linkshells, Alliance, ExtraChat. Public + chat from strangers (Say/Shout/Yell), Novice Network, NPC dialogue, system + spam and battle messages stay outside the database unless you opt them in. +- **Per-channel retention** with a 24-hour idempotent background sweep. Tells + default to 365 days, own-conversation channels to 90, the global default to + 30. Off until you switch it on — the plugin never deletes history without + your explicit consent. +- **Retroactive cleanup** with a Ctrl+Shift confirm. Apply the current + whitelist to an existing 800-MB+ database, watch it shrink to MBs, all on a + background thread. +- **Export** to Markdown, JSON or CSV (GDPR Art. 15 right of access). Filter + by channel, date range or sender substring; written via Dalamud's file + dialog without blocking the UI. +- **First-run wizard** with three profiles (Privacy-First / Casual / Full + History) that maps to concrete configuration sets. Reopenable from the + Privacy tab any time. +- **Independent plugin state.** Config and database live under + `pluginConfigs/HellionChat/`, completely separate from upstream Chat 2 — you + can run both side by side, or migrate from Chat 2 once and keep going. +- **Migration recovery.** Heals databases left in a half-applied Migrate3 + state (columns added, `user_version` never bumped) without needing the + backup file upstream creates. +- **Localized UI (EN + DE).** All Hellion-specific surfaces follow Dalamud's + language override and switch live. Translations live in + `Resources/HellionStrings..resx`. -### Chat Window -![chatWindow.png](ChatTwo/images/chatWindow.png) +## Status -### With SimpleTweaks "Chat Name Colors" -![withSimpleTweaks.png](ChatTwo/images/withSimpleTweaks.png) +Bootstrap (v0.1.x). Used in production on a single user's setup. Not (yet) +submitted to the official Dalamud plugin repository — distributed as a +custom-repo / dev-plugin while the architecture stabilises. ---- +## Why a fork -### IPC Integration -Other plugins can easily integrate their functionality into the context menu of chat2 -For more infos read [IPC Guide](ipc.md) +The upstream maintainer has left filtering-related issues open since 2024 +([#84](https://github.com/Infiziert90/ChatTwo/issues/84), +[#173](https://github.com/Infiziert90/ChatTwo/issues/173), +[#174](https://github.com/Infiziert90/ChatTwo/issues/174)). The original +design treats the database as an unlimited searchable archive of *everything* +the chat window sees, which is fine in the US-/JP-shaped privacy mindset but +hard to reconcile with EU GDPR data minimization rules when the archive +contains messages from third parties. ---- +Forking under EUPL-1.2 is explicitly permitted, the upstream stays +authoritative for the chat-replacement engine, and we cherry-pick relevant +upstream bugfixes from `Infiziert90/ChatTwo` periodically. -### Thanks to -The original dev Anna~ +## Build + +```bash +# Linux with XIVLauncher Core +cp .env.example .env +# adjust DALAMUD_HOME if your hooks live somewhere else +set -a; source .env; set +a +dotnet build ChatTwo/ChatTwo.csproj +``` + +The output assembly is `ChatTwo/bin/Debug/HellionChat.dll`. Add the parent +directory as a Dev Plugin Location in Dalamud's experimental settings. + +## Branding assets + +`ChatTwo/images/icon.png` is the upstream Chat 2 icon and stays in place +until a hand-drawn Hellion logo replaces it. **No AI-generated artwork — +ever.** + +## License + +EUPL-1.2 (same as upstream Chat 2). See `LICENCE`. + +## Acknowledgments + +- **Infi & Anna (ascclemens)** — original Chat 2 engine, filtering, IPC, all + the heavy lifting before this fork existed. +- **Dalamud team** — the plugin framework underneath everything. +- **JonKazama-Hellion** — fork maintenance, privacy/retention/export + features, German localization. + +## AI assistance disclosure + +See `AI_DISCLOSURE.md`.