Polish: README, AI disclosure, scoped Hellion ImGui style

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.
This commit is contained in:
2026-05-01 21:00:07 +02:00
parent 68a6910c53
commit c285dcb0a0
5 changed files with 239 additions and 25 deletions
+83
View File
@@ -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 <https://github.com/JonKazama-Hellion/HellionChat/issues>.
+2
View File
@@ -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();
+70
View File
@@ -0,0 +1,70 @@
using ChatTwo.Util;
using Dalamud.Bindings.ImGui;
using Dalamud.Interface.Utility.Raii;
namespace ChatTwo.Ui;
/// <summary>
/// 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.
/// </summary>
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;
/// <summary>
/// Push the Hellion color stack. Returns a disposable bundle that pops
/// every color in reverse order on Dispose. Use inside a `using` block.
/// </summary>
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<IDisposable> _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();
}
}
}
+2
View File
@@ -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();
+82 -25
View File
@@ -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.<lang>.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`.