Commit Graph

906 Commits

Author SHA1 Message Date
JonKazama-Hellion c09aa26ffc Remove webinterface dependencies and build artifacts
Drops Watson.Lite (the HTTP server) and Newtonsoft.Json (only used by
the webinterface JSON wire format) from the package references and
removes websiteBuild.zip plus the UnzipBuild target that extracted it
into the build output. The commented-out NodeJS compile blocks for
the Svelte frontend go with them.

DbViewer used to ship a CreateTempJsonFile button that exported the
database in the webinterface message-protocol shape (MessageResponse,
MessageTemplate, WebPayloadType). With no client able to consume that
shape any more the button, the method and the two helper methods are
removed. The Privacy tab's MessageExporter already covers Markdown,
JSON and CSV exports with channel and date filters and is the
supported way to get history out of the plugin.

Build verified clean (Release, 0 warnings, 0 errors). The lockfile
shrinks accordingly.
2026-05-02 02:23:56 +02:00
JonKazama-Hellion c2801c4113 Remove webinterface server, HTTP routes and Svelte frontend
Drops the entire ChatTwo/Http/ tree (ServerCore, HostContext,
RouteController, Processing, SSEConnection, the message protocol DTOs
and the bundled Svelte frontend) plus WebinterfaceUtil. Also removes
every ServerCore.Send* call site that fed the SSE stream:

  - MessageManager.ProcessMessage no longer broadcasts new messages
  - Chat.cs no longer notifies on login
  - PayloadHandler no longer rebroadcasts on screenshot-mode toggle
  - ChatLogWindow no longer announces tab and channel switches

The Plugin class drops the ServerCore field, the auto-start branch and
the Dispose hook. The DbViewer still imported a stale namespace from
the message protocol; the using is removed.

Language.resx and its generated Designer file keep the Webinterface
string keys for now so future upstream cherry-picks do not break on
missing resources. They are dead code from our perspective but harmless.
2026-05-02 02:20:43 +02:00
JonKazama-Hellion 7bacd1aaba Remove webinterface settings tab and configuration fields
Webinterface adds a third-party HTTP surface that contradicts the
DSGVO-by-default promise: it broadcasts every chat message including
filtered ChatTypes (privacy filter only covers DB writes), ships a
five-digit numeric auth code seeded from System.Random, binds on all
interfaces by default and sets cookies without security flags.

Hardening it for our threat model would land 500+ lines of code and
permanent maintenance for a feature very few users actually use. The
forks audience wants less surface, not more, so the entire feature is
being removed in a focused commit cluster. This first commit drops
the user-facing surface: settings tab class, tab registration and
the Configuration fields plus their UpdateFrom mirror.
2026-05-02 02:18:43 +02:00
JonKazama-Hellion 23e0f37dfb Bump to v0.1.2 with About-tab rebrand and Hellion-style README
Manifest moves to 0.1.2.0 so existing testers get an in-place
update offer once the matching GitHub release is published.

Changes since 0.1.1 are surface and packaging:

  - The inherited About tab now reflects the fork: Hellion Online
    Media as maintainer with hellion-media.de as the contact
    channel, EUPL-1.2 dual-copyright statement, FINAL FANTASY XIV
    SQUARE ENIX disclaimer, explicit acknowledgment of Chat 2 by
    Infi & Anna as the upstream foundation, and the original
    ChatTwo translator list relabelled as upstream Crowdin
    contributors so it isn't mistaken for Hellion translators.
  - Cherry-picked the upstream DBViewer UI improvements
    (auto-scroll-reset on page change, localized tooltips on the
    date reset, folder export, export-running notifications and
    the pagination arrows).
  - README rewritten in the Hellion project style: German prose,
    tech-stack table, architecture tree, database column list, a
    proper migration guide for users coming from Chat 2 (with
    Linux and Windows manual recovery commands), upstream-sync
    workflow notes for cherry-picks, project-status checklist
    separating bootstrap-done from phase-2-open work, and the
    Hellion Online Media footer.
  - repo.json regenerated to point at the v0.1.2 GitHub release
    asset URL.

Bundle changelog summarises the same so testers see the new
content in their plugin list before they pull the update.
v0.1.2
2026-05-02 00:13:54 +02:00
JonKazama-Hellion 96fa05dc9b Clarify translator credits in the About tab
The inherited Translators tree node was rendered under the
upstream `Options_About_Translators` label and could be misread
as "people who translated Hellion Chat". The list is in fact the
Chat 2 community Crowdin contributors and covers the inherited
upstream strings only — the Hellion-specific strings live in
HellionStrings.<lang>.resx and are maintained by the Hellion
Online Media maintainer (currently EN + DE; other locales are
not yet covered).

Add a Localization block right above the tree node that spells
this out, and rename the tree node label to "Chat 2 community
translators (upstream)" so the attribution is unambiguous.
2026-05-02 00:07:50 +02:00
JonKazama-Hellion d891ec5e50 Rebrand the About tab around the Hellion fork
The inherited About tab still pointed at Infi's Discord handle,
the Chat 2 community Discord thread, the Infiziert90/ChatTwo
issue tracker and the chattwo Crowdin project — all upstream
references that don't apply to this fork. Replace them with:

  - Discord handle: @j.j_kazama
  - GitHub Issues: JonKazama-Hellion/HellionChat
  - The Chat 2 community Discord thread is dropped (no equivalent
    Hellion community channel yet)
  - The chattwo Crowdin link is dropped (we have no separate
    Crowdin project; Hellion-specific strings live in the bundled
    HellionStrings.<lang>.resx files maintained by hand)

Adds four Hellion-specific blocks below the version line:

  Maintainer  → Hellion Online Media (Florian Wathling), with the
                hellion-media.de website as the contact channel for
                any licensing or legal inquiries.

  Built on    → makes it explicit that Hellion Chat is a fork of
  Chat 2        Chat 2 by Infi and Anna; every chat-replacement
                feature, IPC integration, rendering and storage
                code comes from upstream. Links to the upstream
                Infiziert90/ChatTwo repository.

  License     → EUPL-1.2 with the dual copyright statement
                covering the upstream Chat 2 authors and the
                Hellion Chat additions.

  FFXIV       → standard SQUARE ENIX disclaimer naming the plugin
  disclaimer    as unofficial and fan-made, so anyone reading the
                tab knows up front that this is not endorsed by SE.

The original ChatTwo translator credits stay intact below — the
upstream contributors deserve to remain visible in the fork.
2026-05-02 00:02:13 +02:00
Infi e219b3e1fe - Improve DBViewer behaviour and UI
(cherry picked from commit cb41787f5525aa73175ad06299d0a799ebf731e2)
2026-05-01 23:56:53 +02:00
JonKazama-Hellion 135f7a9bf7 Bump to v0.1.1 with packaging and migration fixes
Manifest version moves to 0.1.1.0 so Dalamud offers existing
testers an in-place update once the new release is published.

Description rewritten to lead with the "built on top of Chat 2"
framing — every upstream feature, command and shortcut still
works identically — and to position the privacy additions as
alignment with modern EU, US and Japanese data-protection
expectations rather than citing specific paragraphs.

Punchline becomes "Chat 2 with privacy controls aligned to EU,
US and JP rules" so the plugin-list one-liner reflects what's
actually different rather than just calling itself a fork.

Changelog entry for 0.1.1 covers the three changes since 0.1.0:
icon now in the bundle (DalamudPackager override), icon resized
to 256×256, migration hardened with per-file try/catch and a
warning notification when files are locked, plus the README
troubleshooting section.

repo.json regenerated to 0.1.1.0 with the v0.1.1 release asset
URL so the custom-repo manifest matches what GitHub will serve.
v0.1.1
2026-05-01 23:42:37 +02:00
JonKazama-Hellion 81d3c9ca6b Pack the plugin icon into the release ZIP
DalamudPackager's default targets do not enable the HandleImages /
ImagesPath flags, so the images/ directory was silently excluded
from the build output even after the .csproj started copying
icon.png next to the DLL. The local Dalamud plugin loader then
fell back to the placeholder question-mark icon because there was
nothing to load at <plugindir>/images/icon.png.

Override the default by dropping a DalamudPackager.targets next to
the csproj — its presence disables the SDK's default target, which
is guarded on `!Exists($(PackagerTargetFile))`. The override
mirrors the SDK property list verbatim and adds HandleImages=true
plus ImagesPath=$(ProjectDir)images so the packager actually walks
the images directory and copies its contents into both the dev
plugin output and the release ZIP.

Verified: latest.zip now contains images/icon.png at the expected
path; both dev plugins and Custom-Repo installs will render the
Hellion logo locally without depending on the remote IconUrl.
2026-05-01 23:35:19 +02:00
JonKazama-Hellion cb90c6ab93 Make the ChatTwo→HellionChat migration loud about locked files
A tester migrating from upstream Chat 2 ended up with a zero-row
database in the new layout: Chat 2 was still loaded when Hellion
Chat first started, the SQLite handle kept chat-sqlite.db locked,
and File.Move silently fell into the catch-all without telling
the user anything. Anyone hitting this would think Hellion Chat
lost their history when it just hadn't been allowed to take it.

Wrap each move on its own so a single locked file no longer
abandons the rest of the migration: the JSON config, font cache
and EmoteCacheV1 directory still travel even if the database
itself is held open. When any IOException fires during the moves,
flag a sticky 30-second warning notification on plugin start that
tells the user exactly what's going on — disable Chat 2, fully
close the game, restart — and points at the README troubleshooting
section.

The README now spells out the migration order step by step in two
sections (fresh install vs. coming from Chat 2) and includes the
manual mv/Move-Item one-liner for both Linux and Windows so users
can recover without waiting for the next plugin update.
2026-05-01 23:22:02 +02:00
JonKazama-Hellion 2ad81cc3ef Shrink the plugin icon from 1024×1024 to 256×256
Dalamud renders plugin-list icons at roughly 64×64, so shipping
a 1024×1024 / 492 KB asset just made the IconUrl fetch slower
without buying any visible quality. Down-sample to 256×256 (still
plenty of headroom for the rendered size) and strip metadata,
which drops the file to ~53 KB. The 1024×1024 Hellion logo stays
untouched in the Hellion Online Media brand repository as the
authoritative source. Will land in the next plugin release; the
already-published v0.1.0 keeps its larger icon until v0.1.1 ships.
2026-05-01 23:08:14 +02:00
JonKazama-Hellion d8802881c8 Wire up the custom-repo distribution
Add repo.json at the repo root so testers can drop the raw URL
into Dalamud's Custom Plugin Repositories list and pick Hellion
Chat up like any other Dalamud plugin. The file is generated from
the in-assembly HellionChat.json plus the extra fields a Dalamud
custom-repo entry needs:

  - DownloadLinkInstall / Update / Testing point at the GitHub
    release asset for v0.1.0 (latest.zip), so refreshing the
    plugin list pulls the released ZIP rather than building from
    source.
  - IconUrl points at the raw icon.png in the repository so the
    plugin list can render the Hellion logo even before the user
    installs the plugin.
  - CategoryTags, IsHide and IsTestingExclusive use sane defaults
    for a single-track release.

README gains an Install section with the exact custom-repo URL,
the steps to add it in Dalamud and a note about disabling
upstream Chat 2 first so the layout migration runs clean.
v0.1.0
2026-05-01 22:50:19 +02:00
JonKazama-Hellion 984b00ac0d Bundle the Hellion icon and Exo 2 font
Replace the inherited Chat 2 icon with the 1024×1024 Hellion logo
from the Hellion Online Media brand assets so the plugin shows
its real identity in Dalamud's plugin list. Bundle Exo 2 Variable
(SIL Open Font License 1.1) as an embedded resource together with
the OFL license text — keeps the license travelling with the font
inside the assembly as the OFL requires.

A new Configuration.UseHellionFont (default true) plus a checkbox
in the Privacy tab Appearance section route FontManager's regular
font handle through tk.AddFontFromMemory using the embedded TTF
bytes when the toggle is on; flipping it off falls back to the
existing AddFontWithFallback path so users who picked their own
system font under Settings → Fonts keep that choice.

Settings.cs now treats UseHellionFont as a font-changing setting
so toggling it triggers FontManager.BuildFonts on save without
needing a plugin reload.
2026-05-01 22:45:43 +02:00
JonKazama-Hellion 71aefd30eb Stop the BetterTTV cache and font atlas from logging on every load
Two long-standing upstream bugs surfaced in our distribution as
red error rows on every plugin load. Neither is caused by the
fork's own code, but both happen under our plugin name in the
log so they had to go before the plugin gets handed to anyone.

EmoteCache.LoadData fed BetterTTV's API responses straight into
Dictionary.TryAdd. The Top100 endpoint occasionally returns rows
with a null Code field, which tripped ArgumentNullException and
killed the entire emote load. Filter null/empty codes out
explicitly before insertion so a single bad row no longer breaks
the cache for everyone else.

FontManager.BuildFonts called fontId.AddToBuildToolkit without
guarding for the case where the configured SystemFontId points at
a font that isn't installed (e.g. "Crimson Text" on a Linux box,
or a font the user uninstalled after picking it). The atlas build
then crashed and dumped a Dalamud DelegateFontHandle error every
single load. Wrap the call in AddFontWithFallback: if the font
isn't found, log a warning, fall back to the bundled
NotoSansCjkRegular asset and continue. Applied to both the regular
and italic font handles.
2026-05-01 22:37:18 +02:00
JonKazama-Hellion 65e39d4ef7 Bump Hellion Chat manifest version to 0.1.0
Reset the version line out of the inherited Chat 2 1.35.x range
into a Hellion-specific track that starts at 0.1.0 to make the
bootstrap status visible to anyone reading the Dalamud plugin
list. The yaml changelog now lays out the full feature set added
on top of Chat 2 (privacy filter, retention, cleanup, export,
wizard, theme, localization) and explicitly calls out the upstream
1.35.3 base under EUPL-1.2.
2026-05-01 22:30:18 +02:00
JonKazama-Hellion eaf3e79c96 Clarify that AI involvement varies by area and over time
The earlier wording could be read as "Claude wrote all Hellion-
specific code." Pair-level assistance doesn't mean uniform AI
authorship — some commits are mostly hand-written with the AI as a
sounding board, others lean on it for API walkthroughs or drafts
the maintainer then edits. Spell that out, and note that the share
of hand-written work is expected to grow as the maintainer's plugin
experience grows.
2026-05-01 21:40:12 +02:00
JonKazama-Hellion ebf58cb916 Trim AI_DISCLOSURE down to a plain statement
The previous version read like a pre-emptive defense — classification
tables, workflow methodology lists, multiple "what we don't do"
sections. Disclosure should just be honest about what's used and
where; the rest is performative. Cut to the essentials: Pair level,
which directories are AI-assisted, what's deliberately not (visual
assets, DE translations), tooling list, contact.
2026-05-01 21:38:43 +02:00
JonKazama-Hellion 737ec6b868 Apply window opacity to ChildBg as well
The chat log content area is rendered as a child window, so leaving
ChildBg opaque kept the inner pane fully solid even when the slider
was dragged down — defeating the point during combat where the user
wants to see the game behind the chat. Mix the same alpha byte into
ChildBg now. FrameBg and PopupBg are deliberately left opaque so
text inputs, dropdowns, tooltips and modals stay readable on top.
2026-05-01 21:25:13 +02:00
JonKazama-Hellion 7fdbc81c22 Add window opacity slider to the Hellion theme
True per-window focus-aware transparency would require touching
ChatLogWindow and SettingsWindow individually (both upstream code,
both prone to cherry-pick churn). Instead expose a single opacity
slider that mixes a configured alpha into the WindowBg color in
PushGlobal — applies to every Hellion-rendered pane uniformly,
the game shines through, and form fields / dialogs / popups stay
opaque on top so input remains readable.

Default 92%, range clamped to 0.5–1.0 in the UI and 0x55–0xFF in
the alpha conversion so users can't accidentally make the panes
disappear entirely. Slider sits inside the Appearance section
right under the master Hellion-theme checkbox and is greyed out
when the theme is disabled.
2026-05-01 21:22:55 +02:00
JonKazama-Hellion 07470f527e Apply Hellion theme plugin-wide with multi-accent palette
Move from a local color stack inside Hellion-only surfaces to a
single push wrapping Plugin.Draw, so chat log, settings,
viewers, the file dialog and the wizard all render under the same
palette. The local Push() helper stays for explicit use, but the
two existing call sites (Privacy tab, FirstRunWizard) now drop
their local pushes — the global stack already covers them and
double-pushing would shift colors on every frame.

Palette grew from a single cyan accent into a three-tone HUD set:

  Primary cyan-teal (#00B8D4)  → buttons, checkboxes, slider grabs,
                                 separator hover/active.
  Secondary industrial amber   → scrollbar grab and resize-grip
  (#FFB300)                      hover/active highlights.
  Tertiary slate violet         → active title bars and active tabs
  (#7B61FF)                      so identity beats out the cyan
                                 accent without competing with it on
                                 action controls.

Surfaces are deep slate (#0E1A20 windows, #102027 children, #162831
frames) with steel borders (#37474F). Style variables flatten the
default Dalamud rounding into something more geometric: 4 px window
rounding, 2 px frame/grab/tab/scrollbar, 1 px borders.

A new Configuration.HellionThemeEnabled (default true) and a
matching Appearance section at the top of the Privacy tab let users
turn the whole thing off and fall back to the Dalamud default look.
The flag is checked once per frame in Plugin.Draw — `using
IDisposable? _ = ... ? PushGlobal() : null` — so disabling has zero
overhead beyond a bool check.
2026-05-01 21:13:58 +02:00
JonKazama-Hellion 39bd3edcd7 Register OpenMainUi callback to satisfy Dalamud validation
The plugin list expects a main UI entry point so the "Open Plugin"
button has something to fire on. Hook UiBuilder.OpenMainUi to a
toggle of the settings window — same surface as OpenConfigUi, just
exposed under both buttons. Wiring lives in Plugin.cs (not the
inherited Settings.cs) so future upstream cherry-picks don't fight
with this addition.
2026-05-01 21:09:41 +02:00
JonKazama-Hellion 83b9cc62c7 Fix HellionStyle palette byte order (RRGGBBAA, not AARRGGBB)
ChatTwo's ColourUtil.RgbaToAbgr expects the input to be 0xRRGGBBAA
(see Settings.cs Ko-fi buttons, e.g. 0xFF5E5BFF for Ko-fi pink),
not 0xAARRGGBB. The previous palette was bit-shifted by one byte,
which is why the supposedly cyan-teal accents rendered as
half-transparent magenta in-game.
2026-05-01 21:04:54 +02:00
JonKazama-Hellion c285dcb0a0 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.
2026-05-01 21:00:07 +02:00
JonKazama-Hellion 68a6910c53 Add message export for GDPR Art. 15 right of access
The privacy story is incomplete without a way to actually hand the
data over. New Export section in the Privacy tab streams matching
messages to a Markdown, JSON or CSV file using Dalamud's file
dialog and a background thread, so the settings UI stays
responsive even when the export crawls a 150k-message archive.

MessageStore.StreamForExport returns a MessageEnumerator over
non-deleted rows filtered by ChatType list and date range, sorted
ascending. MessageExporter.ExportToFile takes that enumerator,
optionally narrows by SenderSource.TextValue substring (case-
insensitive), and writes one of three formats:

  Markdown — human-readable, day headers, [HH:mm] ChatType Sender:
  prefix per line, trailing total.

  JSON — single object with metadata (filter snapshot, exported_at,
  plugin name) and a messages array carrying id, ISO-8601 date,
  numeric and named ChatType, source/target kinds, receiver,
  content_id, sender plaintext, content plaintext.

  CSV — header line plus quoted-when-needed rows for spreadsheet
  ingestion.

Sender plaintext, channel filter, date range and format are
exposed as form fields above the Export button. Empty channel
selection means "all stored channels", a 0-day range means "no
time limit". Result count and target path are reported via
WrapperUtil notifications.
2026-05-01 20:41:58 +02:00
JonKazama-Hellion 33cfc7effa Add first-run wizard with three privacy profiles
Fresh installs now open a setup window on first plugin load that
asks the user to pick one of three starting profiles. Existing
ChatTwo users keep skipping the wizard because the v6→v7 migration
sets Configuration.FirstRunCompleted = true on the same pass that
seeds the Privacy-First defaults — they already saw the migration
notification and can reopen the wizard from the Privacy tab if
they want to choose differently.

The three profiles map to concrete configuration sets:

  Privacy-First (recommended): own-conversation whitelist (30
  channels), retention enabled with the spec defaults (Tells 365
  days, own-conversation channels 90, fallback 30).

  Casual: Privacy-First plus public chat (Say/Shout/Yell, both
  emote types, Novice Network) with a 1-day retention window so
  RP players can scroll back the last scene without keeping
  third-party speech forever.

  Full History: filter off, retention off, GDPR warning shown
  inline. Behaves like upstream Chat 2.

The wizard window is non-modal but covers a wide layout (three
side-by-side cards) and closing it without picking anything is
treated as accepting whatever defaults are already in place. The
Privacy tab gains a "show wizard again" button at the top so the
choice is reversible.
2026-05-01 20:30:25 +02:00
JonKazama-Hellion 5b33a21d15 Localize the Hellion Chat surface area (EN + DE)
Add HellionStrings.resx as the English source and HellionStrings.de.resx
for German, with a hand-maintained Designer.cs that mirrors the layout
of Language.Designer.cs. Resource files live next to the upstream
Language.resx but are kept entirely separate so upstream cherry-picks
never collide with our translations and any future Hellion-only
translation tooling (Crowdin, manual contribution) can target this
file without touching the Chat 2 dictionary.

Plugin.LanguageChanged now updates HellionStrings.Culture alongside
Language.Culture so every UI string flips to the active locale at the
same moment. The Privacy tab title, master switch, channel groups
(now resolved per frame so the language can change without restart),
preset buttons, failsafe toggle, retention section, cleanup section,
status messages and notification bodies all read from HellionStrings.
The migration toast also takes its title and body from there.

Translations follow the project's German style: Du-Form, full
diacritics (ä, ö, ü), no em-dashes inside flowing prose, "Whitelist"
and "Linkshell" kept as-is because they are the established terms.
2026-05-01 20:03:18 +02:00
JonKazama-Hellion 353596fa43 Fall back to spec retention defaults before the global default
GetRetentionDays previously dropped straight from a missing user
override to RetentionDefaultDays, so every channel showed 30 days
in the UI even though the spec lists 365 for Tells and 90 for own-
conversation channels. Insert a middle layer: user override → spec
default → global default. The retention sweep now seeds its policy
from PrivacyDefaults.DefaultRetentionDays first and lets explicit
user overrides win on top, and the per-channel UI tags each row as
[override], [spec], or [global] so the source of the value is
visible without guessing.
2026-05-01 18:52:54 +02:00
JonKazama-Hellion 68c7185cea Add per-channel message retention with daily background sweep
Privacy filter trimmed history "by what" — this adds the time axis.
Each ChatType gets its own retention window in days; channels
without an explicit override fall back to a configurable global
default. The master switch defaults to OFF: the plugin never
deletes history without explicit user consent.

MessageStore.DeleteByRetentionPolicy builds an OR'd WHERE clause
over (ChatType = X AND Date < cutoff_X) plus a NOT IN catch-all
for the global default, hard-deletes matches, and only runs VACUUM
when something was actually removed.

Plugin.RunRetentionSweepIfDue runs at most once per 24 hours on a
background thread (off the load path) and persists the timestamp
so subsequent restarts skip the sweep until enough time has
passed. The Privacy tab gains a retention section with the master
switch, default-days input, per-channel override tree, reset
buttons, and a Ctrl+Shift "apply now" action that mirrors the
auto-sweep but on demand.

Spec defaults: Tells 365 days, own-conversation channels (Party,
Cross-Party, Alliance, PvP Team, FC, Linkshells 1-8, Cross-World
Linkshells 1-8, ExtraChat 1-8) 90 days, fallback 30 days.
2026-05-01 18:47:31 +02:00
JonKazama-Hellion e7b6cf245c Drop FC announcements and login/logout from Privacy-First defaults
FreeCompanyAnnouncement (Company Board) and FreeCompanyLoginLogout
are broadcasts, not personal conversation, and the design spec only
listed plain "Free Company" as a Privacy-First default channel.
Existing users who want to keep them can still tick the boxes in
the Privacy tab.
2026-05-01 18:43:17 +02:00
JonKazama-Hellion f0d6d64666 Migrate from ChatTwo layout at file level, not directory level
The original migration skipped the database move whenever
pluginConfigs/HellionChat already existed. In practice that
directory is materialised by Dalamud before our plugin constructor
runs, so the check was effectively always true and the legacy
chat-sqlite.db plus the EmoteCacheV1 directory stayed behind.

Walk the legacy directory entry by entry instead. Move every file
or subdirectory whose name is not already present on the target
side, then delete the legacy directory if it ends up empty. This
handles both fresh installs and the realistic case where Dalamud
has pre-created an empty config directory for the new plugin.
2026-05-01 18:40:06 +02:00
JonKazama-Hellion 2401ea5864 Add retroactive cleanup for the existing database
The privacy filter only catches new messages. Two new MessageStore
methods support a one-shot retroactive sweep: GetMessageCountsByChatType
returns a (ChatType, count) snapshot so the UI can preview the impact,
and CleanupRetainOnly hard-deletes everything outside the supplied
allowlist and runs VACUUM to reclaim disk space.

The Privacy tab gains a new section with a refresh-preview button, a
keep/delete summary, a per-channel breakdown tree, and a Ctrl+Shift
confirm. The cleanup runs on a background thread so a 800+ MB VACUUM
does not block the settings UI; tabs are rebuilt via the framework
thread once the delete finishes. The cleanup deliberately uses the
saved Plugin.Config whitelist (not unsaved Mutable edits) so it stays
consistent with the prospective filter.
2026-05-01 18:34:28 +02:00
JonKazama-Hellion 465aadbb1a Brand the fork as Hellion Chat with independent plugin state
Switch the assembly name to HellionChat so Dalamud uses
pluginConfigs/HellionChat for our config file and database
directory, instead of sharing those locations with the upstream
Chat 2 plugin. Code namespace stays ChatTwo.* so upstream
cherry-picks apply cleanly.

Rename the DalamudPackager manifest to HellionChat.yaml with
fork-specific name, author, repo URL, description, tags and
changelog. Plugin.PluginName becomes "Hellion Chat".

Add a one-shot migration in the plugin constructor that runs
before GetPluginConfig: if pluginConfigs/ChatTwo.json or the
ChatTwo/ directory exist and our equivalents don't, move them
into the HellionChat layout. Idempotent: only fires on the first
load where legacy paths are present and ours are not.
2026-05-01 18:26:11 +02:00
JonKazama-Hellion 1ad5cb3164 Add privacy filter with channel whitelist (GDPR Art. 25)
Introduce an opt-out channel whitelist so the database only persists
messages from channels the user explicitly wants to keep. Default
profile follows GDPR data minimization: own conversations only
(Tells, Party, FC, Linkshells, Cross-World Linkshells, Alliance,
ExtraChat). Public chat (Say/Shout/Yell), Novice Network, NPC
dialogue and system logs are dropped by default.

The filter sits inside MessageStore.UpsertMessage so any current or
future write path is covered uniformly. Configuration provides an
IsAllowedForStorage(ChatType) helper plus a "persist unknown
channels" failsafe (default off) for ChatTypes added by future
patches.

A new Privacy settings tab exposes the whitelist as grouped
checkboxes with three preset buttons (Privacy-First, Clear all,
Select all). Configuration version bumps from 6 to 7; existing
users are migrated to the Privacy-First defaults on first load
and notified once via the Dalamud notification manager.

Also includes a small .env.example and gitignore hygiene for local
development setup.
2026-05-01 18:20:09 +02:00
JonKazama-Hellion 94064bf9e4 Make Migrate3 idempotent against partial application
If Migrate3 has already applied its schema changes but failed to
bump user_version (e.g. process crashed between ALTER and
SetMigrationVersion), the next run currently hits a duplicate
column error because ALTER TABLE ADD COLUMN is not idempotent in
SQLite.

Detect the recovery case by checking for the presence of the v3
target columns and the absence of the dropped Code column, and
just record the migration version when found.
2026-05-01 18:19:39 +02:00
Infi 89e1da1211 - Loc Update 2026-05-01 12:02:45 +02:00
Infi 3bc8a223c2 - Fix #175 2026-05-01 11:59:25 +02:00
Infi 7dc34c6013 - Sort rows in the database by date
- Add fast buttons to add/remove all channels
2026-05-01 02:10:10 +02:00
Infi 33c922aaf7 - Potential fix for null ref error
- Add logging around migration
2026-04-30 22:27:23 +02:00
Infi dcf77e27f2 - Fix migration not running for new users
- Use PlayerState for character
2026-04-30 18:14:15 +02:00
Infi b4cb8b25ec - API 15
- Migrate config for API 15
- Migrate database for API 15
- Allow usage of new target source
- Implement first tell target option
2026-04-30 02:59:58 +02:00
Infi 68810e23c1 - Export required files with json 2026-04-21 14:58:11 +02:00
Infi 93faf1b5bd - Null terminate bytes if passed to Utf8String 2026-04-19 21:18:47 +02:00
Infi 69c890facb - Add JSON export option for HTML test 2026-04-11 23:35:04 +02:00
Infi df0773ac65 - Implement message history export to text file 2026-04-10 22:17:37 +02:00
Infi c424311b24 - Check auto translation for commands and execute them instead of sending
- Plugin commands trigger the command helper window now
- Fix auto translation with empty text appearing
- Switch up all dalamud payload usage to ROSS if possible
- Prepare 7.5 changes
- Cleanup
2026-04-08 21:15:28 +02:00
Infi 9f7a6267f6 - Swap Queue to ConcurrentQueue 2026-03-22 15:03:37 +01:00
Infi 4341035c74 - Fix links not showing up in webinterface
- Switch to debug logging
2026-02-09 11:32:06 +01:00
Infi 638ec1a211 - Add safety around extra chat GUID parsing 2026-02-08 05:28:23 +01:00
Infi 6744c6676c - Add missing auto translates for the symbols 2026-01-20 11:27:37 +01:00
Infi 4f9a6cd5be - API 14 2025-12-19 06:49:18 +01:00