Commit Graph

143 Commits

Author SHA1 Message Date
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 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 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
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 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 4f9a6cd5be - API 14 2025-12-19 06:49:18 +01:00
Infi 9b3e3f79e3 - Fix imgui asserts on table 2025-09-19 22:49:51 +02:00
Infi efddaf30ad - API 13 2025-08-06 22:24:45 +02:00
Simon Schürrle 0d075ca060 Merge pull request #150
* Hash message links so messages with different links aren't considered…

* Add option to toggle if links should be considered for the message ha…
2025-06-22 20:17:19 +02:00
Infi cb8abc9ed6 - Implement independent hide condition for popouts (closes #124) 2024-12-14 16:39:36 +01:00
Infi 92d4a75ec4 Small oops 2024-12-14 14:59:42 +01:00
Infi 97a8b96326 - Display name even if invalid channel is selected
- Add NoMove & NoResize to tabs
2024-12-14 14:54:20 +01:00
Infi d0a55e80ea - Switch SetTooltip to ImRaii based Tooltip
- Shorter date format for db viewer
2024-11-21 12:31:09 +01:00
Infi 1a1995759a - Handle NBSP payloads
- Use ingame version of axis font
2024-11-21 08:34:24 +01:00
Infi 45fdac0dd6 API 11 2024-11-13 04:13:18 +01:00
Infi 725fe449f8 - Support locked channels
- Implement render limit for webinterface [default 1000]
2024-09-02 12:46:09 +02:00
Infi 8d973ff966 Remove migration code 2024-08-30 23:53:34 +02:00
Infi db3d513f9e Loc the string 2024-08-29 19:06:49 +02:00
Infi cdf4f92ffa Allow users to collapse usage notice 2024-08-29 19:05:46 +02:00
Infi 6cb01aa2f4 Add button indicator for url link 2024-08-28 14:49:50 +02:00
Infi c77a1f9d2d Complete the webinterface config panel 2024-08-28 14:43:49 +02:00
Infi 8d6f59f9fa - Loc updates
- Add access URL to webinterface panel
2024-08-28 14:31:25 +02:00
Infi 2ababa82b0 - Implement better start/stop for the webinterface
- Save session tokens between startups
2024-08-28 14:09:09 +02:00
Infi 1d7153fc50 Redo the auth system and implement rate limits 2024-08-25 15:37:13 +02:00
Infi 5e93732183 Add pre-testing version of the webinterface 2024-08-24 03:05:33 +02:00
Infi 16a16b1f12 Implement #101 2024-08-14 14:46:00 +02:00
Infi 9d6fcd2abe Fix #108 2024-08-14 14:21:27 +02:00
Infi 459cfa72ea Correctly reset italic 2024-07-25 15:38:25 +02:00
Infi 906eeb5095 Remove legacy migration 2024-07-25 15:33:05 +02:00
Infi 41c59f6aa0 Make italic font chooseable 2024-07-25 15:19:08 +02:00
Infi 9c86ee788f fix 2024-07-25 14:03:08 +02:00
Infi fecab7760e Add reset buttons for fonts 2024-07-25 14:02:37 +02:00
Infi 97654b1c53 Rewrite font handling, use dalamud font chooser 2024-07-23 20:46:38 +02:00
Dean Sheather 56f6855da2 feat: autohide improvements
- Adds new setting "Enable inactivity hide during battle" (default:
  true) which determines whether autohide should apply during battle
  (thanks @aurieh)
- Adds new setting "Chat channels considered for activity" which allows
  customizing which channels incoming messages must match to "bump" the
  inactivity timer
- Adds new per-tab setting "Unhide the chat window on activity" to
  configure whether it will be considered for "bumping" the inactivity
  timer when receiving messages that match the new channel filter. Note
  that the foreground tab is currently always considered.
- Extends autohide code to apply to poped-out tabs as well. Each popout
  window has its own inactivity timer, but focusing the main window will
  restore all popped out windows.

Co-authored-by: Auri <me@aurieh.me>
2024-07-21 15:09:45 +10:00
Dean Sheather 352088dfed feat: add configurable hotkeys to cycle tabs
Adds two configurable hotkeys (plus the required code infrastructure to
handle configurable hotkeys) for cycling the active chat tab forward by
one and backwards by one.
2024-07-15 19:17:32 +10:00
Dean Sheather c3c60e7e43 feat: add autohide after inactivity
After not receiving a message for X seconds (configurable) in the
current tab or any tab with unread mode enabled, the chat will be
hidden. Focus can be returned with return or slash as usual.

Having input focus or hovering the mouse over the chat window "bumps"
it every frame.

Also fixes a bug that prevented focus from being restored to tabs with
input disabled. The chat window will be brought back but the activated
event won't be fully processed.

Co-authored-by: Auri <me@aurieh.me>
2024-07-13 16:30:42 +10:00
Infi cd750a3ccb Rename close to hide and change icon 2024-07-08 12:10:27 +02:00
Dean Sheather fef9122eca feat: add close button to chat log 2024-07-08 16:57:37 +10:00
Infi f76f0e91d0 Update for 7.0, part 1 2024-06-30 05:07:11 +02:00
Infi 6ff1b80641 Merge pull request #53 from deansheather/dean/message-sorting-fixes
fix: fix sorting problems
2024-05-25 17:11:42 +02:00
Infi 0c19772b18 - Replace all possible hooks with CS
- Mark ones that can be replaced soon
- Use Dalamuds ConfigOption for chat color parsing
2024-05-25 16:50:37 +02:00
Dean Sheather e9ae8362f5 fix: fix sorting problems 2024-05-25 21:50:30 +10:00
Infi c91858183a Add changelog tab 2024-05-22 03:39:31 +02:00
Infi e19682e50d Shuffle entries 2024-05-21 10:56:42 +02:00
Infi 6daa0bb9e2 Move preview config to its own tab 2024-05-21 10:53:37 +02:00