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()
|
||||
{
|
||||
using var _style = HellionStyle.Push();
|
||||
|
||||
ImGui.TextWrapped(HellionStrings.Wizard_Intro);
|
||||
ImGui.Spacing();
|
||||
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)
|
||||
{
|
||||
using var _style = HellionStyle.Push();
|
||||
|
||||
if (ImGui.Button(HellionStrings.Wizard_Reopen_Button))
|
||||
Plugin.FirstRunWizard.IsOpen = true;
|
||||
ImGui.Spacing();
|
||||
|
||||
@@ -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
|
||||

|
||||
## 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
|
||||
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`.
|
||||
|
||||
Reference in New Issue
Block a user