Forge Announce / Post changelog to Hellion Forge (push) Successful in 9s
Security Scan (reusable) / Security Scan (push) Successful in 27s
Security / scan (push) Successful in 27s
Build / Build (Release) (push) Successful in 34s
Release / Build and attach release ZIP (push) Successful in 31s
BetterTTV emote support is removed rather than switched off. Its shared-emote
endpoint went behind authentication and that is where nearly all of them came
from; what was left is the 65-entry global set, eleven of those on the plugin's
own known-broken list, so 54 largely static images from Twitch's early days.
Exactly one is animated, and that one is 492 frames at 140x140 -- 37 MB of
texture memory for a single emote, uploaded one frame at a time. Not worth a
network call and an on-disk cache on every start.
Gone with it: the download path, the cache directory, the GIF renderer, the
settings section, the block list, and 13 translation keys across 50 resource
files. 1567 lines. The plugin now makes no outbound network calls at all, which
is the claim PRIVACY.md has always wanted to make without an asterisk.
EmotePayload and its MessagePack type byte stay, deliberately. Around a thousand
rows in a two-month-old database carry them, and dropping the type would make
those fail to deserialise -- the history is the one thing 2.0.0 promised not to
touch. Nothing writes one any more and a stored emote renders as the code that
was typed, which is what the sender saw when they typed it.
Five descriptions in the Window tab printed {0} where the plugin name belonged,
handed to the widget directly instead of through string.Format the way the rows
around them do. Every language was affected including English; German surfaced
it because the placeholder lands at the start of the sentence there. A test now
walks every placeholder-carrying resource string, finds its uses, and fails on
an unformatted one -- verified by putting the defect back and watching it go red.
New preview images. The old set was from 2026-05-08, older than every cycle in
2.0.0, and showed stacked ImGui defaults to anyone browsing the installer. Taken
with screenshot mode on so no character names reach a public repo. The wizard
takes the theme picker's slot.
148 lines
5.6 KiB
C#
148 lines
5.6 KiB
C#
using Dalamud.Bindings.ImGui;
|
|
using Dalamud.Interface;
|
|
using Dalamud.Interface.Utility;
|
|
using Dalamud.Interface.Utility.Raii;
|
|
using HellionChat.Resources;
|
|
using HellionChat.Ui.StyleEngine;
|
|
using HellionChat.Util;
|
|
|
|
namespace HellionChat.Ui.Components.Settings.Tabs;
|
|
|
|
internal sealed class ChatTab
|
|
{
|
|
private readonly Plugin _plugin;
|
|
private readonly SettingsWidgets _w;
|
|
|
|
public ChatTab(Plugin plugin, TokenResolver resolver)
|
|
{
|
|
_plugin = plugin;
|
|
_w = new SettingsWidgets(plugin, new SettingsPalette(resolver));
|
|
}
|
|
|
|
public void Draw()
|
|
{
|
|
if (_w.Section(ImGui.GetID("chat.display"u8), HellionStrings.Settings_Section_DisplayModes))
|
|
{
|
|
_w.ToggleRow(
|
|
ImGui.GetID("chat.display.density"u8),
|
|
HellionStrings.Appearance_UseCompactDensity_Name,
|
|
HellionStrings.Appearance_UseCompactDensity_Description,
|
|
() => Plugin.Config.UseCompactDensity,
|
|
v => Plugin.Config.UseCompactDensity = v
|
|
);
|
|
_w.ToggleRow(
|
|
ImGui.GetID("chat.display.clock"u8),
|
|
HellionStrings.Settings_Chat_Clock24_Name,
|
|
null,
|
|
() => Plugin.Config.Use24HourClock,
|
|
v => Plugin.Config.Use24HourClock = v
|
|
);
|
|
_w.ToggleRow(
|
|
ImGui.GetID("chat.display.samestamps"u8),
|
|
Language.Options_HideSameTimestamps_Name,
|
|
Language.Options_HideSameTimestamps_Description,
|
|
() => Plugin.Config.HideSameTimestamps,
|
|
v => Plugin.Config.HideSameTimestamps = v
|
|
);
|
|
|
|
// Descriptions move out of the help markers and onto the row. They
|
|
// were written to be read; a (?) the user has to hover is where an
|
|
// explanation goes to be ignored.
|
|
_w.EnumComboRow(
|
|
ImGui.GetID("chat.display.worldsuffix"u8),
|
|
HellionStrings.Settings_Chat_WorldSuffix_Name,
|
|
HellionStrings.Settings_Chat_WorldSuffix_Description,
|
|
() => Plugin.Config.WorldSuffixMode,
|
|
v => Plugin.Config.WorldSuffixMode = v,
|
|
v => v.Name()
|
|
);
|
|
_w.EnumComboRow(
|
|
ImGui.GetID("chat.display.nameform"u8),
|
|
HellionStrings.Settings_Chat_NameForm_Name,
|
|
HellionStrings.Settings_Chat_NameForm_Description,
|
|
() => Plugin.Config.NameFormMode,
|
|
v => Plugin.Config.NameFormMode = v,
|
|
v => v.Name()
|
|
);
|
|
}
|
|
|
|
if (_w.Section(ImGui.GetID("chat.history"u8), HellionStrings.Settings_Section_History))
|
|
{
|
|
// The one setting that decides whether the chat log shows anything
|
|
// from before this game session. It had no control at all: only the
|
|
// first-run wizard ever wrote it, and only if the user actually
|
|
// reached step 3 -- skip the wizard and it stays on its default of
|
|
// false, leaving the log empty on every launch with no way to fix it.
|
|
//
|
|
// Named for what it does. The stored name describes filtering, and
|
|
// the wizard's own "Load previous session on startup" checkbox
|
|
// writes a field nothing reads.
|
|
_w.ToggleRow(
|
|
ImGui.GetID("chat.history.previoussessions"u8),
|
|
HellionStrings.Settings_Chat_PreviousSessions_Name,
|
|
HellionStrings.Settings_Chat_PreviousSessions_Description,
|
|
() => Plugin.Config.FilterIncludePreviousSessions,
|
|
v =>
|
|
{
|
|
Plugin.Config.FilterIncludePreviousSessions = v;
|
|
// Takes effect at once rather than on the next launch: the
|
|
// window is open and the user just asked for the history.
|
|
_plugin.MessageManager.FilterAllTabs();
|
|
}
|
|
);
|
|
}
|
|
|
|
if (
|
|
_w.Section(
|
|
ImGui.GetID("chat.commandhelp"u8),
|
|
HellionStrings.Settings_Section_CommandHelp,
|
|
open: false
|
|
)
|
|
)
|
|
{
|
|
_w.EnumComboRow(
|
|
ImGui.GetID("chat.commandhelp.side"u8),
|
|
HellionStrings.Settings_Chat_CommandHelpSide_Name,
|
|
HellionStrings.Settings_Chat_CommandHelpSide_Description,
|
|
() => Plugin.Config.CommandHelpSide,
|
|
v => Plugin.Config.CommandHelpSide = v,
|
|
v => v.Name()
|
|
);
|
|
}
|
|
|
|
if (
|
|
_w.Section(
|
|
ImGui.GetID("chat.disclosure"u8),
|
|
HellionStrings.Settings_Section_PluginDisclosure,
|
|
open: false
|
|
)
|
|
)
|
|
{
|
|
_w.ToggleRow(
|
|
ImGui.GetID("chat.disclosure.notify"u8),
|
|
HellionStrings.Settings_Chat_NotifyPluginDisclosure_Name,
|
|
HellionStrings.Settings_Chat_NotifyPluginDisclosure_Description,
|
|
() => Plugin.Config.NotifyPluginDisclosure,
|
|
v => Plugin.Config.NotifyPluginDisclosure = v
|
|
);
|
|
}
|
|
|
|
if (
|
|
_w.Section(
|
|
ImGui.GetID("chat.autotranslate"u8),
|
|
HellionStrings.Settings_Section_AutoTranslate,
|
|
open: false
|
|
)
|
|
)
|
|
{
|
|
_w.ToggleRow(
|
|
ImGui.GetID("chat.autotranslate.sort"u8),
|
|
Language.Options_SortAutoTranslate_Name,
|
|
Language.Options_SortAutoTranslate_Description,
|
|
() => Plugin.Config.SortAutoTranslate,
|
|
v => Plugin.Config.SortAutoTranslate = v
|
|
);
|
|
}
|
|
}
|
|
}
|