diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a34c07e --- /dev/null +++ b/LICENSE @@ -0,0 +1,332 @@ +HellionChat — a privacy-focused fork of ChatTwo + +Copyright (c) 2024-2025 Infiziert90 (Infi) and Anna Clemens + (original ChatTwo authors and copyright holders of the upstream work + this fork is built on) +Copyright (c) 2025-2026 Florian Wathling / Hellion Online Media + (HellionChat-specific modifications, Privacy/Export/Auto-Tell-Tabs + features, Hellion theme, German localisation, EUPL-1.2 fork + maintenance) + +Licensed under the European Union Public Licence (EUPL), Version 1.2 only. + +You may obtain a copy of the Licence at: +https://eupl.eu/1.2/en/ + +Unless required by applicable law or agreed to in writing, software +distributed under the Licence is distributed on an "AS IS" basis, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +Licence for the specific language governing permissions and limitations +under the Licence. + +The full Licence text follows below. + +================================================================================ + +EUROPEAN UNION PUBLIC LICENCE v. 1.2 + +EUPL (c) the European Union 2007, 2016 + +This European Union Public Licence (the 'EUPL') applies to the Work (as +defined below) which is provided under the terms of this Licence. Any use +of the Work, other than as authorised under this Licence is prohibited (to +the extent such use is covered by a right of the copyright holder of the +Work). + +The Work is provided under the terms of this Licence when the Licensor (as +defined below) has placed the following notice immediately following the +copyright notice for the Work: + + Licensed under the EUPL + +or has expressed by any other means his willingness to license under the +EUPL. + +1. Definitions + +In this Licence, the following terms have the following meaning: + +- 'The Licence': this Licence. + +- 'The Original Work': the work or software distributed or communicated by + the Licensor under this Licence, available as Source Code and also as + Executable Code as the case may be. + +- 'Derivative Works': the works or software that could be created by the + Licensee, based upon the Original Work or modifications thereof. This + Licence does not define the extent of modification or dependence on the + Original Work required in order to classify a work as a Derivative Work; + this extent is determined by copyright law applicable in the country + mentioned in Article 15. + +- 'The Work': the Original Work or its Derivative Works. + +- 'The Source Code': the human-readable form of the Work which is the most + convenient for people to study and modify. + +- 'The Executable Code': any code which has generally been compiled and + which is meant to be interpreted by a computer as a program. + +- 'The Licensor': the natural or legal person that distributes or + communicates the Work under the Licence. + +- 'Contributor(s)': any natural or legal person who modifies the Work under + the Licence, or otherwise contributes to the creation of a Derivative + Work. + +- 'The Licensee' or 'You': any natural or legal person who makes any usage + of the Work under the terms of the Licence. + +- 'Distribution' or 'Communication': any act of selling, giving, lending, + renting, distributing, communicating, transmitting, or otherwise making + available, online or offline, copies of the Work or providing access to + its essential functionalities at the disposal of any other natural or + legal person. + +2. Scope of the rights granted by the Licence + +The Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +sublicensable licence to do the following, for the duration of copyright +vested in the Original Work: + +- use the Work in any circumstance and for all usage, +- reproduce the Work, +- modify the Work, and make Derivative Works based upon the Work, +- communicate to the public, including the right to make available or + display the Work or copies thereof to the public and perform publicly, + as the case may be, the Work, +- distribute the Work or copies thereof, +- lend and rent the Work or copies thereof, +- sublicense rights in the Work or copies thereof. + +Those rights can be exercised on any media, supports and formats, whether +now known or later invented, as far as the applicable law permits so. + +In the countries where moral rights apply, the Licensor waives his right +to exercise his moral right to the extent allowed by law in order to make +effective the licence of the economic rights here above listed. + +The Licensor grants to the Licensee royalty-free, non-exclusive usage +rights to any patents held by the Licensor, to the extent necessary to +make use of the rights granted on the Work under this Licence. + +3. Communication of the Source Code + +The Licensor may provide the Work either in its Source Code form, or as +Executable Code. If the Work is provided as Executable Code, the Licensor +provides in addition a machine-readable copy of the Source Code of the +Work along with each copy of the Work that the Licensor distributes or +indicates, in a notice following the copyright notice attached to the +Work, a repository where the Source Code is easily and freely accessible +for as long as the Licensor continues to distribute or communicate the +Work. + +4. Limitations on copyright + +Nothing in this Licence is intended to deprive the Licensee of the +benefits from any exception or limitation to the exclusive rights of the +rights owners in the Work, of the exhaustion of those rights or of other +applicable limitations thereto. + +5. Obligations of the Licensee + +The grant of the rights mentioned above is subject to some restrictions +and obligations imposed on the Licensee. Those obligations are the +following: + +Attribution right: The Licensee shall keep intact all copyright, patent or +trademarks notices and all notices that refer to the Licence and to the +disclaimer of warranties. The Licensee must include a copy of such notices +and a copy of the Licence with every copy of the Work he/she distributes +or communicates. The Licensee must cause any Derivative Work to carry +prominent notices stating that the Work has been modified and the date of +modification. + +Copyleft clause: If the Licensee distributes or communicates copies of the +Original Works or Derivative Works, this Distribution or Communication +will be done under the terms of this Licence or of a later version of +this Licence unless the Original Work is expressly distributed only under +this version of the Licence. The Licensee (becoming Licensor) cannot +offer or impose any additional terms or conditions on the Work or +Derivative Work that alter or restrict the terms of the Licence. + +Compatibility clause: If the Licensee Distributes or Communicates +Derivative Works or copies thereof based upon both the Work and another +work licensed under a Compatible Licence, this Distribution or +Communication can be done under the terms of this Compatible Licence. For +the sake of this clause, 'Compatible Licence' refers to the licences +listed in the appendix attached to this Licence. Should the Licensee's +obligations under the Compatible Licence conflict with his/her obligations +under this Licence, the obligations of the Compatible Licence shall +prevail. + +Provision of Source Code: When distributing or communicating copies of +the Work, the Licensee will provide a machine-readable copy of the Source +Code or indicate a repository where this Source will be easily and freely +available for as long as the Licensee continues to distribute or +communicate the Work. + +Legal Protection: This Licence does not grant permission to use the trade +names, trademarks, service marks, or names of the Licensor, except as +required for reasonable and customary use in describing the origin of the +Work and reproducing the content of the copyright notice. + +6. Chain of Authorship + +The original Licensor warrants that the copyright in the Original Work +granted hereunder is owned by him/her or licensed to him/her and that +he/she has the power and authority to grant the Licence. + +Each Contributor warrants that the copyright in the modifications he/she +brings to the Work are owned by him/her or licensed to him/her and that +he/she has the power and authority to grant the Licence. + +Each time You accept the Licence, the original Licensor and subsequent +Contributors grant You a licence to their contributions to the Work, +under the terms of this Licence. + +7. Disclaimer of Warranty + +The Work is a work in progress, which is continuously improved by +numerous Contributors. It is not a finished work and may therefore contain +defects or 'bugs' inherent to this type of development. + +For the above reason, the Work is provided under the Licence on an 'as +is' basis and without warranties of any kind concerning the Work, +including without limitation merchantability, fitness for a particular +purpose, absence of defects or errors, accuracy, non-infringement of +intellectual property rights other than copyright as stated in Article 6 +of this Licence. + +This disclaimer of warranty is an essential part of the Licence and a +condition for the grant of any rights to the Work. + +8. Disclaimer of Liability + +Except in the cases of wilful misconduct or damages directly caused to +natural persons, the Licensor will in no event be liable for any direct +or indirect, material or moral, damages of any kind, arising out of the +Licence or of the use of the Work, including without limitation, damages +for loss of goodwill, work stoppage, computer failure or malfunction, +loss of data or any commercial damage, even if the Licensor has been +advised of the possibility of such damage. However, the Licensor will be +liable under statutory product liability laws as far such laws apply to +the Work. + +9. Additional agreements + +While distributing the Work, You may choose to conclude an additional +agreement, defining obligations or services consistent with this Licence. +However, if accepting obligations, You may act only on your own behalf +and on your sole responsibility, not on behalf of the original Licensor +or any other Contributor, and only if You agree to indemnify, defend, and +hold each Contributor harmless for any liability incurred by, or claims +asserted against such Contributor by the fact You have accepted any +warranty or additional liability. + +10. Acceptance of the Licence + +The provisions of this Licence can be accepted by clicking on an icon 'I +agree' placed under the bottom of a window displaying the text of this +Licence or by affirming consent in any other similar way, in accordance +with the rules of applicable law. Clicking on that icon indicates your +clear and irrevocable acceptance of this Licence and all of its terms and +conditions. + +Similarly, you irrevocably accept this Licence and all of its terms and +conditions by exercising any rights granted to You by Article 2 of this +Licence, such as the use of the Work, the creation by You of a Derivative +Work or the Distribution or Communication by You of the Work or copies +thereof. + +11. Information to the public + +In case of any Distribution or Communication of the Work by means of +electronic communication by You (for example, by offering to download the +Work from a remote location) the distribution channel or media (for +example, a website) must at least provide to the public the information +requested by the applicable law regarding the Licensor, the Licence and +the way it may be accessible, concluded, stored and reproduced by the +Licensee. + +12. Termination of the Licence + +The Licence and the rights granted hereunder will terminate automatically +upon any breach by the Licensee of the terms of the Licence. + +Such a termination will not terminate the licences of any person who has +received the Work from the Licensee under the Licence, provided such +persons remain in full compliance with the Licence. + +13. Miscellaneous + +Without prejudice of Article 9 above, the Licence represents the complete +agreement between the Parties as to the Work. + +If any provision of the Licence is invalid or unenforceable under +applicable law, this will not affect the validity or enforceability of +the Licence as a whole. Such provision will be construed or reformed so +as necessary to make it valid and enforceable. + +The European Commission may publish other linguistic versions or new +versions of this Licence or updated versions of the Appendix, so far this +is required and reasonable, without reducing the scope of the rights +granted by the Licence. New versions of the Licence will be published +with a unique version number. + +All linguistic versions of this Licence, approved by the European +Commission, have identical value. Parties can take advantage of the +linguistic version of their choice. + +14. Jurisdiction + +Without prejudice to specific agreement between parties, + +- any litigation resulting from the interpretation of this License, + arising between the European Union institutions, bodies, offices or + agencies, as a Licensor, and any Licensee, will be subject to the + jurisdiction of the Court of Justice of the European Union, as laid + down in article 272 of the Treaty on the Functioning of the European + Union, + +- any litigation arising between other parties and resulting from the + interpretation of this License, will be subject to the exclusive + jurisdiction of the competent court where the Licensor resides or + conducts its primary business. + +15. Applicable Law + +Without prejudice to specific agreement between parties, + +- this Licence shall be governed by the law of the European Union Member + State where the Licensor has his seat, resides or has his registered + office, + +- this licence shall be governed by Belgian law if the Licensor has no + seat, residence or registered office inside a European Union Member + State. + +Appendix + +'Compatible Licences' according to Article 5 EUPL are: + +- GNU General Public License (GPL) v. 2, v. 3 +- GNU Affero General Public License (AGPL) v. 3 +- Open Software License (OSL) v. 2.1, v. 3.0 +- Eclipse Public License (EPL) v. 1.0 +- CeCILL v. 2.0, v. 2.1 +- Mozilla Public Licence (MPL) v. 2 +- GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3 +- Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) + for works other than software +- European Union Public Licence (EUPL) v. 1.1, v. 1.2 +- Quebec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong + Reciprocity (LiLiQ-R+) + +The European Commission may update this Appendix to later versions of the +above licences without producing a new version of the EUPL, as long as +they provide the rights granted in Article 2 of this Licence and protect +the covered Source Code from exclusive appropriation. + +All other changes or additions to this Appendix require the production of +a new EUPL version. diff --git a/NOTICE.md b/NOTICE.md new file mode 100644 index 0000000..feb30ee --- /dev/null +++ b/NOTICE.md @@ -0,0 +1,89 @@ +# Notice + +## Acknowledgements + +HellionChat is a fork of [Chat 2](https://github.com/Infiziert90/ChatTwo) by +**Infiziert90 (Infi)** and **Anna Clemens**, both of whom kept that plugin +running and maintained for years before I ever opened the source. Without +their work this fork would not exist, full stop. I owe them the architecture, +the message store, the channel filtering, the sidebar tab system, the +hooks into FFXIV's chat, the localisation infrastructure, and countless +small decisions that I only noticed because they had already been made +correctly. + +If you find HellionChat useful, please remember that the foundation came +from Chat 2. The code Anna and Infi wrote is doing most of the heavy +lifting in this fork too. + +## A direct word to Infi and Anna + +Hi. I am Florian (Flo, also Jon Kazama in-game on Phoenix). I forked Chat 2 +because I wanted a privacy-by-default version for my own use case and a +small group of friends I play with, not because I thought I could do +anything better than what you built. The opposite is true. ChatTwo's +default of full history and cross-character logging is the right call for +most users. I just have a different threat model and a different +data-handling philosophy that fits a smaller, locally-stored, retention- +limited approach. + +What HellionChat adds is mostly Hellion-specific surface area: a privacy +filter, per-channel retention windows, an export pipeline, an Auto-Tell- +Tabs feature for FFXIV club greeters, the Hellion theme and font, German +localisation, and a settings UX rebuild. None of it touches the bones of +what you built. Where I had to modify your code I tried to keep the +edits minimal, isolated to clearly-marked Hellion files, and reversible. + +Concrete example: when API 15 hit, I cherry-picked your fix for the +BetterTTV emote regression with `git cherry-pick -x` so authorship and +co-author trail stay intact. That is the standard I want to keep using as +long as both projects are alive. You should never have to look at this +fork and wonder if I quietly ate your work. + +If anything in this fork ever steps on something you would not be okay +with, please reach out and I will fix it. Genuinely. The list of contacts +is below. + +## Maintainer contact + +If something in HellionChat causes problems, especially if it relates back +to Chat 2 or to anything Infi or Anna would want flagged: + +- **GitHub Issues:** [JonKazama-Hellion/HellionChat/issues](https://github.com/JonKazama-Hellion/HellionChat/issues) +- **Discord:** `@j.j_kazama` +- **Email (business):** maintainer@hellion-media.de + +I respond on weekdays during European business hours. For anything +urgent (security, attribution, takedown), email is the fastest path. + +## Why this fork is not upstreamed + +The privacy-by-default position fits a small audience. ChatTwo's +full-history-by-default position fits a much larger one, including the +roleplaying community where chat archive is part of the play experience. +Trying to upstream HellionChat's defaults would have meant arguing that +Chat 2's defaults are wrong, and they are not. They are right for the +user base ChatTwo serves. So I keep the fork separate, attribute clearly, +and pull selected upstream patches when they apply. + +## Why HellionChat left the GitHub fork network + +The Dalamud plugin ecosystem treats the GitHub-Fork relation as a signal +that a fork is either a development branch or a dead mirror. HellionChat +is neither. It is an independently-maintained EUPL-1.2 fork with its own +release cadence, its own custom repo, its own user base. Detaching the +fork-network relation just makes the situation honest. The git history, +the cherry-pick trail, and the attribution stay exactly the same. The +only thing that changes is the GitHub UI no longer says "forked from". + +## Trademarks and naming + +"Chat 2" and "ChatTwo" are the names Infi and Anna chose for the upstream +plugin. HellionChat does not use either of those names in user-facing +copy except where required to describe origin (settings tab, manifest, +this file, the README). The Hellion brand is mine. + +## Questions + +This file is the canonical place for "is this attribution correct, is the +maintainer reachable, is the relationship to Chat 2 documented". If +anything in here is wrong, please open an issue or contact me directly. diff --git a/README.md b/README.md index 1ea5ba2..15b0411 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,14 @@ # Hellion Chat -**Version 0.3.1** — DSGVO-bewusste Erweiterung von [Chat 2](https://github.com/Infiziert90/ChatTwo) für FINAL FANTASY XIV / Dalamud. +**Version 0.5.1** — DSGVO-bewusste Erweiterung von [Chat 2](https://github.com/Infiziert90/ChatTwo) für FINAL FANTASY XIV / Dalamud. Hellion Chat baut auf Chat 2 auf und ergänzt es um Datenschutz- und Daten-Handling-Kontrollen, die mit den Datenschutz-Regeln in der EU, den USA und Japan im Einklang sind. Alle Chat-2-Funktionen, Befehle und Tastenkürzel funktionieren unverändert. Eigenständiger Plugin-Slot, eigene Konfiguration, eigene Datenbank. -Privates Repository, EUPL-1.2-lizenziert. Distribution über Custom-Repo während der Bootstrap-Phase. +Eigenständiges Repository, EUPL-1.2-lizenziert. Distribution über Custom-Repo. Selektive Cherry-Picks von Upstream-Chat-2 nach Bedarf, dokumentiert in [UPSTREAM_SYNC.md](UPSTREAM_SYNC.md). + +## Acknowledgements + +Hellion Chat baut auf [Chat 2](https://github.com/Infiziert90/ChatTwo) von **Infiziert90 (Infi)** und **Anna Clemens** auf, die das Plugin über Jahre gepflegt haben bevor ich den Source-Code überhaupt gesehen habe. Die ganze Kern-Architektur, der Message-Store, die Channel-Logik, das Hook-System und vieles mehr stammt von ihnen. Wenn dir Hellion Chat hilft, dann läuft die Anerkennung dafür zu großen Teilen an Infi und Anna. Eine ausführliche Danksagung liegt in [NOTICE.md](NOTICE.md). --- @@ -265,7 +269,7 @@ Phase 3 (offen, kein festes Datum): ## Lizenz -EUPL-1.2 (gleiche Lizenz wie Upstream Chat 2). Siehe `LICENCE`. +EUPL-1.2 (gleiche Lizenz wie Upstream Chat 2). Volltext liegt in [LICENSE](LICENSE), persönliche Danksagung an die Upstream-Autoren in [NOTICE.md](NOTICE.md). © 2023–2026 die Chat-2-Autoren (Infi, Anna und die Upstream-Contributors) für die Engine, IPC und Storage-Schicht. © 2026 Hellion Online Media für die Hellion-Chat-Erweiterungen. diff --git a/UPSTREAM_SYNC.md b/UPSTREAM_SYNC.md new file mode 100644 index 0000000..1337756 --- /dev/null +++ b/UPSTREAM_SYNC.md @@ -0,0 +1,110 @@ +# Upstream sync workflow + +HellionChat is a standalone EUPL-1.2 fork of [Chat 2](https://github.com/Infiziert90/ChatTwo). +We pull selected patches from upstream manually instead of running an +automated mirror. This file documents how that works so anyone (including +future-me) can do it cleanly. + +## One-time setup + +Add the upstream repo as a remote on a fresh clone: + +```bash +git remote add upstream https://github.com/Infiziert90/ChatTwo.git +git fetch upstream +``` + +Verify both remotes are wired up: + +```bash +git remote -v +# origin https://github.com/JonKazama-Hellion/HellionChat.git (fetch) +# origin https://github.com/JonKazama-Hellion/HellionChat.git (push) +# upstream https://github.com/Infiziert90/ChatTwo.git (fetch) +# upstream https://github.com/Infiziert90/ChatTwo.git (push) +``` + +You never push to `upstream`. It is read-only for us. + +## Reviewing what is new upstream + +Before any feature cycle starts I run a quick check: + +```bash +git fetch upstream +git log --oneline main..upstream/main | head -30 +``` + +That shows every commit Infi or contributors landed since the last sync. +Read the messages, decide which ones apply. + +## What we cherry-pick + +**Always:** security fixes, API-version compatibility patches (Dalamud +API 15 → 16 → ...), BetterTTV / emote-cache fixes, regression fixes for +the upstream behaviour we still rely on. + +**Sometimes:** small bug fixes in `MessageManager.cs`, `MessageStore.cs`, +`ChatLogWindow.cs`, the Tabs system. Pull them when they touch code we +have not heavily modified. + +**Never:** webinterface changes (the entire webinterface tree is gone in +HellionChat), changes that conflict with the privacy filter, changes that +re-add upstream defaults we deliberately reversed (full-history logging, +Tell Exclusive defaults, etc.). + +## How we cherry-pick + +Always with `-x` so authorship and the original commit hash stay +visible: + +```bash +git checkout -b sync/upstream- main +git cherry-pick -x +``` + +`-x` adds a `(cherry picked from commit )` line to the commit +message. That preserves the upstream-author credit and lets anyone +reading `git log` trace the change back to ChatTwo. Co-Author trail +intact, no AI lines, no "Hellion" prefix on commits that were not +authored by us. + +## Conflict handling + +When a cherry-pick conflicts: + +1. Resolve the conflict by hand. Do not "fix" upstream code to match + Hellion conventions; that is what the merge marker showed us. +2. If the conflict is fundamental (touches code that no longer exists + in our fork), abort the cherry-pick and document why in + `Hellion Chat Backlog.md` instead. Some upstream patches are not + portable; that is fine. +3. After a successful resolve, the commit message stays identical to + the upstream message, with the `-x` cherry-pick footer Git appends + automatically. Do not rewrite the message to match our format. + +## Pushing the sync + +Cherry-picked commits go through the same review as our own work: the +sync branch lands in `main` via a no-fast-forward merge, then a release +tag if the user-visible behaviour changes (otherwise just merged). + +```bash +git checkout main +git merge --no-ff sync/upstream- -m "merge: upstream sync — " +``` + +## When upstream goes silent + +If Chat 2 stops receiving updates entirely we keep this workflow alive +anyway. The remote stays configured, the documentation stays here. The +moment maintenance picks back up we are ready to pull again. + +## When upstream takes a direction we cannot follow + +If a future ChatTwo release breaks compatibility with our privacy +philosophy in a way we cannot resolve (e.g. mandatory cloud sync, +removal of the local message store, a license change that makes EUPL +incompatible), HellionChat continues on its own from the last +compatible cherry-pick. The history we already inherited stays under +EUPL-1.2 and stays attributed.