Skip to content

feat(seniority): ancienneté recalculée supprimée un an après le départ - #402

Merged
AntoineJT merged 1 commit into
masterfrom
feat/seniority-retention
Nov 10, 2026
Merged

AntoineJT merged 1 commit into
masterfrom
feat/seniority-retention

Conversation

@AntoineJT

@AntoineJT AntoineJT commented Nov 10, 2026 •

Copy link
Copy Markdown
Member

🇫🇷 Français

🎯 Résumé

Une ancienneté recalculée est supprimée un an après le départ du membre, au sens du calendrier : le même jour, un an plus tard. Troisième niveau de la pile #401 → #399 → cette PR, qui sort dans la même release que #399.

🤔 Motivation

/privacy delete ne fonctionne que depuis le serveur, donc un membre parti ne peut plus effacer sa date recalculée. Sans limite, elle resterait indéfiniment. Un an laisse le temps de revenir, la date restant alors juste.

📦 Contenu

  • 🗓️ Tâche de maintenance quotidienne (sweep-departures), à 04 h 30 UTC et au démarrage du bot.
    • Elle compare les dates recalculées à la liste des membres du serveur, chargée une fois et partagée avec les autres modules : aucune requête par membre.
    • Elle date les départs, oublie ceux des membres revenus et supprime la date un an après. Elle rattrape ce que le bot a manqué pendant une panne.
    • Si la liste est indisponible ou incomplète, elle interroge Discord membre par membre.
    • Elle tourne même quand le module est écarté (intent manquant).
    • Elle supprime les dates d'un serveur où le module est désactivé.
    • Une erreur sur un membre ou un serveur ne bloque pas les autres.
  • 🗄️ Colonne leftAt (le jour où le bot a constaté le départ), avec sa propre migration. Un recalcul la remet à zéro.
  • 🔧 fetchMember peut interroger Discord plutôt que le cache, et traite un identifiant sans utilisateur comme un membre parti.
  • 📝 Doc : functional.md et politique de confidentialité (fr et en), qui précise aussi ce qui se passe quand le bot quitte un serveur.
  • ✅ Validation :
    • 2 passes de revue corrective, avant les derniers ajustements (liste des membres, année calendaire) ;
    • 2 331 tests ; build, oxlint, oxfmt et build de la doc OK ;
    • migrations appliquées dans l'ordre feat(seniority): recalcul de l'ancienneté à la demande #399 puis cette PR sur un Postgres jetable : une ligne déjà enregistrée survit, sans écart avec le schéma.

🧭 À noter

  • ⚠️ Le départ est daté le jour où le bot le constate, c'est-à-dire au balayage suivant ou au redémarrage après une panne.
  • ⚠️ Si le bot quitte un serveur, ses dates restent enregistrées jusqu'à son retour, comme la configuration.

🇬🇧 English

🎯 Summary

A recomputed seniority is deleted a calendar year after the member leaves: on the same day, a year later. Third level of the stack #401 → #399 → this PR, which ships in the same release as #399.

🤔 Motivation

/privacy delete only works from within the server, so a member who left can no longer delete their recomputed date. With no limit, it would stay forever. A year leaves time to come back, with the date still right.

📦 What's included

  • 🗓️ Daily maintenance task (sweep-departures), at 04:30 UTC and when the bot starts.
    • It compares the recomputed dates with the server's member list, loaded once and shared with the other modules: no request per member.
    • It dates departures, forgets those of members who came back and deletes the date a year later. It catches up on what the bot missed while it was down.
    • If the list is unavailable or incomplete, it asks Discord member by member.
    • It runs even when the module is skipped (missing intent).
    • It deletes the dates of a server where the module is disabled.
    • An error on one member or one server does not block the others.
  • 🗄️ leftAt column (the day the bot noticed the departure), with its own migration. A recompute resets it.
  • 🔧 fetchMember can ask Discord rather than the cache, and treats an id with no user as a member who left.
  • 📝 Docs: functional.md and privacy policy (fr and en), which also says what happens when the bot leaves a server.
  • ✅ Validation:
    • 2 corrective review passes, before the last adjustments (member list, calendar year);
    • 2,331 tests; build, oxlint, oxfmt and the docs build pass;
    • migrations applied in order (feat(seniority): recalcul de l'ancienneté à la demande #399, then this PR) on a throwaway Postgres: an existing row survives, with no drift from the schema.

🧭 Notes

  • ⚠️ A departure is dated on the day the bot notices it, which is the next sweep or the restart after an outage.
  • ⚠️ If the bot leaves a server, its dates stay stored until the bot comes back, like the configuration.

Autofix with [code]smith
Open in [code]smith · Need help on this PR? Tag @codesmith-bot with what you need.

@AntoineJT AntoineJT added type: module Add a new module or edit an existing one scope: add features Add new features labels Nov 10, 2026
@AntoineJT
AntoineJT force-pushed the feat/seniority-retention branch from 2cf71e9 to 6ebecf9 Compare November 10, 2026 03:32
@AntoineJT
AntoineJT added this pull request to stack #403 November 10, 2026 03:38
@AntoineJT
AntoineJT force-pushed the feat/seniority-retention branch 2 times, most recently from 3bdc6cb to 8be45da Compare November 10, 2026 03:44
Base automatically changed from feat/seniority-recompute to master November 10, 2026 03:47
Un membre parti ne peut plus lancer /privacy delete : sa date recalculée
est désormais supprimée un an (calendaire) après son départ. Une tâche de
maintenance quotidienne, lancée aussi au démarrage, compare les dates à
la liste des membres du serveur, chargée une fois et partagée avec les
autres modules : elle date les départs, oublie ceux des membres revenus
et rattrape ce que le bot a manqué pendant une panne. Sans liste
complète, elle interroge Discord membre par membre. Elle tourne même
quand le module est écarté, et supprime les dates d'un serveur où il est
désactivé.

fetchMember peut interroger Discord plutôt que le cache, et traite un
identifiant sans utilisateur comme un membre parti.
@AntoineJT
AntoineJT force-pushed the feat/seniority-retention branch from 8be45da to 86dfc32 Compare November 10, 2026 03:47
@AntoineJT
AntoineJT merged commit 3ca512e into master Nov 10, 2026
17 checks passed
@AntoineJT
AntoineJT deleted the feat/seniority-retention branch November 10, 2026 03:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

scope: add features Add new features type: module Add a new module or edit an existing one

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant