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:
@@ -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>.
|
||||||
@@ -41,6 +41,8 @@ public sealed class FirstRunWizard : Window
|
|||||||
|
|
||||||
public override void Draw()
|
public override void Draw()
|
||||||
{
|
{
|
||||||
|
using var _style = HellionStyle.Push();
|
||||||
|
|
||||||
ImGui.TextWrapped(HellionStrings.Wizard_Intro);
|
ImGui.TextWrapped(HellionStrings.Wizard_Intro);
|
||||||
ImGui.Spacing();
|
ImGui.Spacing();
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -66,6 +66,8 @@ internal sealed class Privacy : ISettingsTab
|
|||||||
|
|
||||||
public void Draw(bool changed)
|
public void Draw(bool changed)
|
||||||
{
|
{
|
||||||
|
using var _style = HellionStyle.Push();
|
||||||
|
|
||||||
if (ImGui.Button(HellionStrings.Wizard_Reopen_Button))
|
if (ImGui.Button(HellionStrings.Wizard_Reopen_Button))
|
||||||
Plugin.FirstRunWizard.IsOpen = true;
|
Plugin.FirstRunWizard.IsOpen = true;
|
||||||
ImGui.Spacing();
|
ImGui.Spacing();
|
||||||
|
|||||||
@@ -1,34 +1,91 @@
|
|||||||
# Chat 2
|
# Hellion Chat
|
||||||
#### Electric Boogaloo - ♪ A whole new chat, a new fantastic chat window ♪
|
|
||||||
|
|
||||||
Chat 2 is a complete rewrite of the in-game chat window as a plugin.
|
A GDPR-compliant, Linux-aware fork of [Chat 2](https://github.com/Infiziert90/ChatTwo)
|
||||||
It supports:
|
for FINAL FANTASY XIV / Dalamud.
|
||||||
|
|
||||||
- Unlimited tabs
|
Same chat replacement you know from upstream, with extra controls for what
|
||||||
- Tabs that always send to a certain channel
|
actually gets stored:
|
||||||
- More flexible filtering
|
|
||||||
- RGB channel colouring
|
|
||||||
- Completely variable font size
|
|
||||||
- Sidebar tabs
|
|
||||||
- Unread counts
|
|
||||||
- Emotes
|
|
||||||
- Screenshot mode (obfuscate names)
|
|
||||||
|
|
||||||
---
|
- **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
|
## Status
|
||||||

|
|
||||||
|
|
||||||
### With SimpleTweaks "Chat Name Colors"
|
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
|
The upstream maintainer has left filtering-related issues open since 2024
|
||||||
Other plugins can easily integrate their functionality into the context menu of chat2
|
([#84](https://github.com/Infiziert90/ChatTwo/issues/84),
|
||||||
For more infos read [IPC Guide](ipc.md)
|
[#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
|
## Build
|
||||||
The original dev Anna~
|
|
||||||
|
```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`.
|
||||||
|
|||||||
Reference in New Issue
Block a user