bf5d03c7ea
README's Stability section gains a "what is missing compared to Chat 2" block that names the five concrete reasons the upstream webinterface could not stay (System.Random auth code, bind on all interfaces, unflagged cookies, SSE stream that bypassed the privacy filter, and the cumulative hardening cost). The project status list reflects 0.2.0 with Phase 1.5 marked done and the remaining audit follow-ups queued under Phase 2. The About tab gets a single-line acknowledgement that the upstream webinterface is intentionally absent, so users coming from Chat 2 do not look for it under settings or assume it broke. The Obsidian project note is updated separately under Vault/Ideen/Hellion Chat Plugin (ChatTwo Fork).md to record the audit decision and the six-commit cleanup.
128 lines
5.8 KiB
C#
Executable File
128 lines
5.8 KiB
C#
Executable File
using System.Numerics;
|
||
using ChatTwo.Resources;
|
||
using ChatTwo.Util;
|
||
using Dalamud.Interface;
|
||
using Dalamud.Interface.Colors;
|
||
using Dalamud.Interface.Utility;
|
||
using Dalamud.Interface.Utility.Raii;
|
||
using Dalamud.Bindings.ImGui;
|
||
|
||
namespace ChatTwo.Ui.SettingsTabs;
|
||
|
||
internal sealed class About : ISettingsTab
|
||
{
|
||
public string Name => string.Format(Language.Options_About_Tab, Plugin.PluginName) + "###tabs-about";
|
||
|
||
private readonly List<string> Translators =
|
||
[
|
||
"q673135110", "Akizem", "d0tiKs",
|
||
"Moonlight_Everlit", "Dark32", "andreycout",
|
||
"Button_", "Cali666", "cassandra308",
|
||
"lokinmodar", "jtabox", "AkiraYorumoto",
|
||
"MKhayle", "elena.space", "imlisa",
|
||
"andrei5125", "ShivaMaheshvara", "aislinn87",
|
||
"nishinatsu051", "lichuyuan", "Risu64",
|
||
"yummypillow", "witchymary", "Yuzumi",
|
||
"zomsakura", "Sirayuki"
|
||
];
|
||
|
||
internal About()
|
||
{
|
||
Translators.Sort((a, b) => string.Compare(a.ToLowerInvariant(), b.ToLowerInvariant(), StringComparison.Ordinal));
|
||
}
|
||
|
||
public void Draw(bool changed)
|
||
{
|
||
using var wrap = ImRaii.TextWrapPos(0.0f);
|
||
|
||
ImGui.TextUnformatted(string.Format(Language.Options_About_Opening, Plugin.PluginName));
|
||
|
||
ImGuiHelpers.ScaledDummy(10.0f);
|
||
|
||
ImGui.TextUnformatted(Language.Options_About_Authors);
|
||
ImGui.SameLine();
|
||
ImGui.TextColored(ImGuiColors.ParsedGold, Plugin.Interface.Manifest.Author);
|
||
|
||
ImGui.TextUnformatted(Language.Options_About_Discord);
|
||
ImGui.SameLine();
|
||
ImGui.TextColored(ImGuiColors.ParsedGold, "@j.j_kazama");
|
||
|
||
ImGui.TextUnformatted(Language.Options_About_Version);
|
||
ImGui.SameLine();
|
||
ImGui.TextColored(ImGuiColors.ParsedOrange, Plugin.Interface.Manifest.AssemblyVersion.ToString(3));
|
||
|
||
ImGuiHelpers.ScaledDummy(10.0f);
|
||
|
||
ImGui.TextUnformatted(Language.Options_About_Github_Issues);
|
||
ImGui.SameLine();
|
||
if (ImGuiUtil.IconButton(FontAwesomeIcon.ExternalLinkAlt, "githubIssues"))
|
||
Dalamud.Utility.Util.OpenLink("https://github.com/JonKazama-Hellion/HellionChat/issues");
|
||
|
||
ImGuiHelpers.ScaledDummy(10.0f);
|
||
|
||
// Hellion-specific maintainer / attribution / license / SE-
|
||
// disclaimer block. Hand-rolled in English here rather than via
|
||
// HellionStrings — the legal-ish copy stays close to the EUPL-1.2
|
||
// wording and the SE disclaimer is the same in every locale.
|
||
ImGui.TextColored(ImGuiColors.ParsedGold, "Maintainer");
|
||
ImGui.TextUnformatted("Hellion Chat is maintained by Hellion Online Media (Florian Wathling).");
|
||
ImGui.TextUnformatted("Website:");
|
||
ImGui.SameLine();
|
||
if (ImGuiUtil.IconButton(FontAwesomeIcon.ExternalLinkAlt, "hellionMedia"))
|
||
Dalamud.Utility.Util.OpenLink("https://hellion-media.de");
|
||
ImGui.TextUnformatted("For licensing, legal or contact inquiries please reach out via the website above.");
|
||
|
||
ImGuiHelpers.ScaledDummy(10.0f);
|
||
|
||
ImGui.TextColored(ImGuiColors.ParsedGold, "Built on Chat 2");
|
||
ImGui.TextUnformatted("Hellion Chat is a fork of Chat 2 by Infi and Anna (ascclemens).");
|
||
ImGui.TextUnformatted("Every chat replacement feature, the IPC integration, the rendering engine and the storage core come from upstream Chat 2.");
|
||
ImGui.TextUnformatted("The upstream webinterface is intentionally not part of Hellion Chat — it could not be hardened to the privacy guarantees this fork makes by default.");
|
||
ImGui.TextUnformatted("Upstream repository:");
|
||
ImGui.SameLine();
|
||
if (ImGuiUtil.IconButton(FontAwesomeIcon.ExternalLinkAlt, "chatTwoUpstream"))
|
||
Dalamud.Utility.Util.OpenLink("https://github.com/Infiziert90/ChatTwo");
|
||
|
||
ImGuiHelpers.ScaledDummy(10.0f);
|
||
|
||
ImGui.TextColored(ImGuiColors.ParsedGold, "License");
|
||
ImGui.TextUnformatted("Hellion Chat and Chat 2 are licensed under the European Union Public License v1.2 (EUPL-1.2).");
|
||
ImGui.TextUnformatted("© 2023–2026 the Chat 2 authors (Infi, Anna and the upstream contributors).");
|
||
ImGui.TextUnformatted("© 2026 Hellion Online Media — for the Hellion Chat additions.");
|
||
|
||
ImGuiHelpers.ScaledDummy(10.0f);
|
||
|
||
ImGui.TextColored(ImGuiColors.DalamudOrange, "FINAL FANTASY XIV disclaimer");
|
||
ImGui.TextUnformatted("FINAL FANTASY XIV © SQUARE ENIX CO., LTD. All rights reserved.");
|
||
ImGui.TextUnformatted("Hellion Chat is an unofficial, fan-made plugin and is not affiliated with, endorsed, sponsored or approved by Square Enix.");
|
||
|
||
ImGui.Spacing();
|
||
|
||
ImGui.TextColored(ImGuiColors.ParsedGold, "Localization");
|
||
ImGui.TextUnformatted("German translations of Hellion-specific UI strings (HellionStrings.de.resx) are written by the Hellion Online Media maintainer.");
|
||
ImGui.TextUnformatted("All other locales for Hellion-specific strings are not currently provided.");
|
||
ImGui.TextUnformatted("The translator list below covers the upstream Chat 2 community translators on Crowdin — their work covers the inherited Chat 2 strings, not the Hellion additions.");
|
||
|
||
ImGui.Spacing();
|
||
|
||
var height = ImGui.GetContentRegionAvail().Y - ImGui.CalcTextSize("A").Y - ImGui.GetStyle().ItemSpacing.Y * 2;
|
||
using (var aboutChild = ImRaii.Child("about", new Vector2(-1, height)))
|
||
{
|
||
if (aboutChild)
|
||
{
|
||
using var treeNode = ImRaii.TreeNode("Chat 2 community translators (upstream)");
|
||
if (treeNode)
|
||
{
|
||
using var translatorChild = ImRaii.Child("translators");
|
||
if (translatorChild)
|
||
{
|
||
foreach (var translator in Translators)
|
||
ImGui.TextUnformatted(translator);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
ImGui.Spacing();
|
||
}
|
||
}
|