Besoin d'aide pour limiter les messages des utilisateurs par catégorie et période

Salut tout le monde,

Je cherche des conseils pour réaliser une fonctionnalité spécifique dans Discourse. Je gère une communauté où je dois appliquer une règle qui empêche les utilisateurs de créer un nouveau sujet dans deux catégories spécifiques s’ils ont déjà posté dans l’une de ces catégories au cours des 14 derniers jours. Cette restriction devrait s’appliquer même si leur sujet précédent a été supprimé.

Après quelques recherches, j’ai découvert le plugin discourse-flexible-rate-limits, qui semble être un bon point de départ. Il permet des limites de fréquence flexibles basées sur les groupes d’utilisateurs et les actions, mais il se concentre sur la fréquence à court terme (minutes, heures, jours) et ne prend pas directement en charge :

  1. La vérification des publications dans plusieurs catégories.
  2. L’application d’un délai aussi long que 14 jours.
  3. L’inclusion des sujets supprimés dans la vérification.

Avant de me lancer dans la personnalisation de ce plugin ou dans la création de quelque chose à partir de zéro, je voulais demander :

  • Quelqu’un connaît-il un plugin ou une méthode existante qui pourrait déjà gérer ce type de fonctionnalité ?
  • Existe-t-il des approches recommandées pour modifier un plugin existant comme discourse-flexible-rate-limits afin d’inclure une restriction inter-catégories et à plus long terme ?
  • Des conseils généraux sur la manière de mettre cela en œuvre efficacement ?

J’apprécierais toute idée ou suggestion de cette communauté formidable. Si cela vous intéresse, je serais également heureux de partager des mises à jour sur la façon dont j’aurai fini par mettre cela en œuvre.

Merci beaucoup d’avance pour votre aide !

Je ne suis pas sûr de bien comprendre, mais je pense que vous voulez un plugin qui retire un utilisateur d’un groupe lorsqu’il publie dans un ensemble de catégories (en utilisant un hook de création de sujet) et qui exécute ensuite une tâche quotidienne pour le réintégrer dans le groupe après un certain nombre de jours depuis son dernier sujet dans cet ensemble de catégories.

Probablement 3 à 5 heures de travail, peut-être un peu plus avec de bonnes spécifications/tests.

2 « J'aime »

Salut, @pfaffman, joyeuses fêtes et merci pour ta réponse !

J’ai essayé de créer un organigramme pour clarifier :

flowchart TB
    A0(L'utilisateur tente de créer un nouveau sujet dans la catégorie A ou B) -- --> A1{L'utilisateur fait-il partie d'un groupe exempt ?<br/>Admin, Mod, TL3, TL4, Abonnés ?}
    A1 -- Non --> B1(Vérifier le dernier sujet de l'utilisateur dans les catégories A, B ou C,<br/>y compris les enregistrements masqués ou supprimés)
    A1 -- Oui --> Z1(Autoriser la publication)

    B1 --> B2{Ce dernier sujet a-t-il été créé il y a moins de 14 jours ?}
    B2 -- Oui --> C1(Bloquer la publication + afficher une erreur,<br/>afficher le délai de récupération,<br/>lien vers les règles)
    C1 --> E1(Sauvegarder le brouillon +<br/>désactiver le bouton de soumission) ---> Fin(Fin)
    B2 -- Non --> D1(Autoriser la publication)

    D1 --> Fin(Fin)
    Z1 --> Fin(End)
Et j'ai aussi essayé de créer une spécification simple pour aider à clarifier
```mermaid
flowchart TB
    A0(L'utilisateur tente de créer un nouveau sujet dans la catégorie A ou B) -- --> A1{L'utilisateur fait-il partie d'un groupe exempt ?<br/>Admin, Mod, TL3, TL4, Abonnés ?}
    A1 -- Non --> B1(Vérifier le dernier sujet de l'utilisateur dans les catégories A, B ou C,<br/>y compris les enregistrements masqués ou supprimés)
    A1 -- Oui --> Z1(Autoriser la publication)

    B1 --> B2{Ce dernier sujet a-t-il été créé il y a moins de 14 jours ?}
    B2 -- Oui --> C1(Bloquer la publication + afficher une erreur,<br/>afficher le délai de récupération,<br/>lien vers les règles)
    C1 --> E1(Sauvegarder le brouillon +<br/>désactiver le bouton de soumission) ---> Fin(Fin)
    B2 -- Non --> D1(Autoriser la publication)

    D1 --> Fin(Fin)
    Z1 --> Fin(End)

Explication du flux

  1. A0 : Un utilisateur tente de créer un nouveau sujet dans la catégorie A ou B.

  2. A1 : Le système vérifie si l’utilisateur appartient à un groupe exempt :

    • Administrateurs
    • Modérateurs
    • Niveau de confiance 3 (TL3)
    • Niveau de confiance 4 (TL4)
    • Un groupe personnalisé “Abonnés”
    • Si Oui, ignorer la vérification du délai de récupération et autoriser immédiatement la publication (Z1).
    • Si Non, passer à B1.
  3. B1 : Le système récupère le dernier sujet créé par l’utilisateur dans les catégories A, B ou C. Cette recherche doit inclure :

    • Les sujets supprimés logiquement (pas définitivement retirés de la base de données).
    • Les sujets déplacés vers des catégories masquées ou de conformité (par exemple, Catégorie C).
  4. B2 : Le système vérifie si la date de création du dernier sujet est inférieure à 14 jours.

    • Oui → Continuer vers C1 (la publication est bloquée).
    • Non → Passer à D1 (autoriser la publication).
  5. C1 : Le système affiche un message d’erreur informant l’utilisateur qu’il est toujours sous délai de récupération. Le message doit inclure :

    • Une déclaration simplifiée indiquant qu’il ne peut pas encore publier.
    • Le temps restant en jours et heures (pas de minutes).
    • Un lien vers la page des règles de la communauté (fournie ci-dessous).
  6. E1 : Après l’affichage de l’erreur, le contenu de l’utilisateur est automatiquement enregistré comme brouillon, et le bouton “Soumettre” ou “Créer un sujet” est désactivé.

  7. D1 : Si plus de 14 jours se sont écoulés depuis le dernier sujet de l’utilisateur, le système autorise la publication du nouveau sujet.

  8. Z1 : L’utilisateur fait partie d’un groupe exempt, il peut donc publier sans restriction.

2. Spécification détaillée

2.1 Groupes restreints vs. exempts

  • Groupes restreints :
    • Tous les utilisateurs ne faisant pas partie des groupes exempts suivants (généralement TL0, TL1, TL2).
  • Groupes exempts :
    1. Administrateurs
    2. Modérateurs
    3. Niveau de confiance 3 (TL3)
    4. Niveau de confiance 4 (TL4)
    5. Abonnés (un groupe personnalisé)

Ces groupes exempts sautent complètement la vérification des 14 jours.

2.2 Catégories concernées

  • Tentative de nouveau sujet :
    • Déclenché lorsqu’un utilisateur (dans un groupe restreint) tente de créer un nouveau sujet dans la catégorie A ou B.
  • Vérification du dernier sujet :
    • Le système vérifie le dernier sujet créé par l’utilisateur dans les catégories A, B ou C (où C est la catégorie “masquée” ou “de conformité”).

Note : La catégorie C est incluse pour capturer les situations où le sujet d’un utilisateur est déplacé pour suppression/masquage/conformité. Si l’utilisateur a créé un sujet dans la catégorie C dans les 14 derniers jours, cela compte également pour le délai de récupération.

2.3 Logique de délai de récupération de 14 jours

  • Si le sujet le plus récent de l’utilisateur (dans A/B/C) a été créé il y a moins de 14 jours, bloquer la création d’un nouveau sujet dans A ou B.
  • Si plus de 14 jours se sont écoulés, l’autoriser.

Calcul du temps

  • Afficher le temps restant en jours et heures (par exemple, “3 jours 12 heures restantes”).
  • Pas besoin d’afficher les minutes ou les secondes.

2.4 Blocage et sauvegarde de brouillon

  • Comportement de blocage :
    • Lorsque l’utilisateur est bloqué, afficher un message d’erreur (C1).
    • Le système enregistre automatiquement le contenu de l’utilisateur comme brouillon.
    • Le bouton “Soumettre” devient désactivé afin que l’utilisateur ne puisse pas continuer.
  • Exemple de message d’erreur (simplifié) :

Désolé, vous ne pouvez pas encore créer de nouveau sujet dans cette catégorie.
Votre dernier sujet a été publié il y a moins de 14 jours,
et il vous reste {X jours et Y heures} avant de pouvoir publier à nouveau.
Pour plus de détails, consultez nos règles communautaires :
https://community.lezismore.org/t/topic/26/2

2.5 Flexibilité future

  1. Catégories supplémentaires :

    • Actuellement, seules les catégories A, B et C sont configurées.
    • Si vous avez besoin d’ajouter ou de supprimer des catégories de ce délai de récupération à l’avenir, assurez-vous que le système ou le plugin peut être étendu sans modifications majeures du code.
  2. Périodes de temps différentes :

    • La période de 14 jours pourrait être configurable dans les paramètres du plugin (au cas où vous voudriez 7 jours, 30 jours, etc.).
  3. Attributions de groupes dynamiques :

    • Des groupes exempts supplémentaires ou moins nombreux (par exemple, si vous ajoutez “Abonnés” ou le supprimez) devraient être pris en charge.

3. Résumé

  1. Les groupes restreints (TL0, TL1, TL2, ou tout utilisateur n’appartenant pas à un groupe exempt) sont soumis à un délai de récupération de 14 jours avant de créer un autre sujet dans les catégories A ou B.
  2. Les groupes exempts (Admin, Modérateur, TL3, TL4, “Abonnés”) peuvent publier sans restriction.
  3. Le système vérifie la création du sujet le plus récent dans les catégories A, B ou C (y compris les sujets supprimés logiquement ou masqués). S’il a été créé il y a moins de 14 jours, le nouveau sujet est bloqué.
  4. Message d’erreur : Affiche le temps restant en jours/heures et renvoie aux règles de la communauté à l’adresse :
  5. Brouillon : Lorsqu’il est bloqué, la publication de l’utilisateur est enregistrée comme brouillon et le bouton de soumission est désactivé.
  6. Cette spécification peut être étendue à des catégories supplémentaires ou à des périodes différentes à l’avenir.

J’apprécierais toute suggestion !

1 « J'aime »

C’est à peu près ce à quoi je pensais. Ma solution est de les retirer du groupe qui autorise la publication dans ces catégories lorsqu’ils publient. Cela indique immédiatement qu’ils ne peuvent pas publier et ne nécessite aucune modification de code spéciale qui changerait le fonctionnement de la publication.

3 « J'aime »

Oh, je comprends maintenant votre solution. :folded_hands: Bien que cette approche puisse sembler simple, je suis préoccupé par les points suivants :

  1. Accès en lecture vs. en publication

    • Actuellement, les utilisateurs de TL1 (ou supérieur) peuvent à la fois lire et publier dans les catégories A et B.
    • Si nous retirons l’utilisateur de TL1 chaque fois qu’il enfreint la règle des 14 jours, il perdra également l’accès en lecture. Or, nous voulons seulement l’empêcher de publier, pas de lire.
  2. Besoin de diviser les groupes

    • Pour résoudre le scénario « lire mais ne pas pouvoir publier », nous devrions créer plusieurs sous-groupes :
    • TL1 limité – peut lire et répondre, mais ne peut pas créer de sujets dans A ou B.
    • TL1 complet – peut lire, répondre et créer des sujets.
    • Si un utilisateur enfreint la règle des 14 jours, nous le déplacerions de TL1 complet à TL1 limité. Cela semble plus compliqué.
  3. Complexité de l’automatisation

    • Même avec des groupes séparés, nous devrions automatiquement déplacer l’utilisateur vers le groupe « complet » une fois que sa période de restriction expire.
    • Cela signifie que nous devons mettre en œuvre une logique (par exemple, un travail planifié ou du code personnalisé) qui calcule quand la période de 14 jours est terminée, puis réattribue l’utilisateur de TL1 limité à TL1 complet.
    • En tant que non-programmeur, je ne me sens pas confiant pour gérer moi-même une automatisation aussi complexe.

En d’autres termes, bien que le retrait des utilisateurs de certains groupes puisse éviter de modifier directement la logique de publication, cela crée des groupes supplémentaires et des règles complexes. Nous voulons seulement restreindre la publication pendant 14 jours, pas l’accès en lecture ni d’autres privilèges.

Merci beaucoup pour toutes suggestions ou idées. J’ai essayé d’intégrer les choses via les API Discourse et les webhooks dans n8n, mais compte tenu de mon expérience limitée en programmation, cela a été assez difficile pour moi.