Utilisation de l'IA pour créer un wrapper BBCode pour cacher le contenu

En utilisant un wrapper BBCode générique, créez un composant de thème qui masque le contenu s’il ne se trouve pas dans une variable de chaîne de groupe.

Afficher les brouillons

Création d’un wrapper BBCode générique et d’un composant de thème
Comprendre les exigences
Sur la base de votre demande, nous allons créer :
Un wrapper BBCode générique qui peut accepter des attributs personnalisés.
Un composant de thème qui masque le contenu en fonction d’une variable de chaîne de groupe passée au wrapper BBCode.
Implémentation du wrapper BBCode
Nous allons créer un wrapper BBCode qui peut accepter des attributs arbitraires. Ces attributs seront transmis au composant de thème pour évaluation.

Ruby

# config/initializers/bbcode.rb
Discourse::Plugins::BBCode.add_parser(:hide_if_not_in_group) do |tag, content|
  attributes = tag.attributes || {}
  "<div class='hide-if-not-in-group' data-group-names='#{attributes[:groups]}'>#{content}</div>"
end

Utilisez le code avec prudence.

Création du composant de thème
Le composant de thème vérifiera si l’utilisateur actuel appartient à l’un des groupes spécifiés dans l’attribut data-group-names. Sinon, il masquera le contenu.

JavaScript

// app/assets/javascripts/discourse/components/hide-if-not-in-group.js
import Component from 'discourse/components/component';

export default Component.extend({
  tagName: 'div',
  classNames: ['hide-if-not-in-group'],

  didInsertElement() {
    const currentUserId = Discourse.currentUser.id;
    const groupNames = this.element.dataset.groupNames.split(',');

    // Fonction pour vérifier si l'utilisateur fait partie de l'un des groupes spécifiés
    const userIsInAnyGroup = (userId, groupNames) => {
      // Remplacez ceci par votre logique pour vérifier l'appartenance de l'utilisateur aux groupes
      // Par exemple, en utilisant l'API de Discourse ou une logique personnalisée
      return groupNames.some(groupName => {
        // Vérifiez si l'utilisateur fait partie du groupe nommé `groupName`
        // Retournez true si l'utilisateur fait partie du groupe, sinon false
      });
    };

    if (!userIsInAnyGroup(currentUserId, groupNames)) {
      this.element.style.display = 'none';
    }
  }
});

Utilisez le code avec prudence.

Utilisation du BBCode
Vous pouvez utiliser le BBCode comme ceci :

[hide_if_not_in_group groups="staff,moderators"]
Ce contenu est masqué pour les utilisateurs qui ne sont ni du personnel ni des modérateurs.
[/hide_if_not_in_group]

Considérations importantes
Vérification de l’appartenance aux groupes : remplacez la logique de substitution pour la vérification de l’appartenance aux groupes par votre implémentation réelle. Vous pourriez avoir besoin d’utiliser l’API de Discourse ou une logique personnalisée pour déterminer l’appartenance aux groupes.
Performance : pour un grand nombre d’utilisateurs ou de groupes, l’optimisation de la vérification de l’appartenance aux groupes pourrait être nécessaire.
Sécurité : assurez une validation et une assainissement appropriés des noms de groupes pour éviter les vulnérabilités de sécurité.
Flexibilité : envisagez d’autoriser des attributs supplémentaires pour le BBCode afin de contrôler d’autres comportements (par exemple, afficher un message au lieu de masquer le contenu).
En suivant ces étapes, vous disposerez d’un wrapper BBCode et d’un composant de thème flexibles qui peuvent masquer le contenu en fonction de l’appartenance aux groupes.


Utilisation de Gemini. J’ai réussi à obtenir les extraits de code ci-dessus. Cependant, j’ai du mal à les faire fonctionner.

Si quelqu’un peut me guider sur l’endroit où placer dans un composant personnalisé avec les sections pour saisir et corriger le code si nécessaire.

La première erreur qui est apparue lorsque j’ai mis le JavaScript dans le commun était une erreur sur « import » que j’attendais d’un {

[Détails=“Capture d’écran de l’erreur”]

[/Détails]

2 « J'aime »

C’est très cool !

La mise en garde, que vous connaissez probablement, est que le texte est disponible de plusieurs manières puisqu’il est simplement caché avec du CSS. L’une d’elles est cette route de publication :

/posts/123/raw

2 « J'aime »

En effet. Il y avait un composant personnalisé que quelqu’un avait créé en utilisant une manière plus complexe de supprimer du contenu. Mais il semble qu’il soit cassé.

Si je me souviens bien, il supprime le contenu de l’élément cuit ?

1 « J'aime »

Voici le sujet où un collègue a créé un composant mais quand j’ai essayé, il ne fonctionnait pas et j’ai envoyé un message privé au développeur. Mais il est peut-être passé à autre chose.

Désolé. Je viens de lire que vous n’arrivez pas à le faire fonctionner.

La chose à faire est d’utiliser le discourse_theme pour générer un nouveau thème vide. Ensuite, recherchez un autre composant de thème qui a une section “étend le composant”… Oh. Je ne pense pas que cela fonctionnera. Vous aurez besoin de votre code pour cibler et modifier ce qui est déjà dans le DOM. En fait, je ne suis pas entièrement sûr que ce soit correct, car je suis encore assez mauvais en la matière.

Je pense que vous pouvez le faire avec juste du CSS si vous utilisez ce composant qui ajoute l’appartenance au groupe au CSS.

Mais le markdown brut est disponible dans la route que j’ai montrée dans mon dernier message. Je ne vois pas comment même un plugin peut le rendre sûr de telle sorte qu’il soit impossible pour les gens de voir le texte caché. Quelque chose comme des notes d’utilisateur pourrait résoudre votre problème, ou si vous avez vraiment besoin qu’il cible des messages, vous pourriez utiliser les notes d’utilisateur comme modèle pour créer des notes de message qui ajouteraient un champ personnalisé de message que seul le personnel pourrait voir.

2 « J'aime »

Oui, vous ne pouvez pas résoudre cela correctement sans modifier l’API, ce qui signifie qu’il faudrait un plugin, pas un composant de thème.

Si vous n’utilisez pas les murmures sur votre site pour la modération, vous pourriez peut-être utiliser ceux qui sont prêts à l’emploi ?

2 « J'aime »

L’application pour cela ne serait pas axée sur la sécurité.

Ce serait plutôt pour des applications légères. Dans un sujet précédent, une personne cherchait quelque chose comme ça pour un JdR sur table. Ainsi, par exemple, le maître du jeu pourrait avoir besoin d’accéder à la fiche de personnage d’un joueur. La fiche de personnage serait visible par le joueur et les maîtres du jeu.

Le composant général que le type a fabriqué a l’air bien. Cependant, il semble cassé quand je l’ai essayé. Mais bien sûr, je crois que même celui-ci pourrait être assez facile à compromettre. Si je ne me trompe pas, comme désactiver Java. Ou même une personne astucieuse qui connaît le mode sans échec du site. Le mode sans échec peut-il être restreint au personnel/administrateur ?

Tout composant, étant donné que les mods côté client ne sont bien sûr pas destinés aux besoins de sécurité. Même un script Tampermonkey peut être utilisé par les membres de manière similaire ou identique aux thèmes/composants de thème.

En poussant cette idée plus loin, vous pourriez en théorie masquer le contenu en fonction des badges, etc.

1 « J'aime »

oui. désactiver cela fera en sorte que seul le personnel puisse utiliser le mode sans échec.

image

2 « J'aime »