Verwendung von KI zum Erstellen eines Hide-Inhalts BBCode-Wrappers

Erstellen Sie mit einem generischen BBCode-Wrapper eine Themenkomponente, die Inhalte ausblendet, wenn sie nicht in einer Gruppen-Zeichenfolgenvariablen enthalten sind.

Entwürfe anzeigen

Erstellen einer generischen BBCode-Wrapper- und Themenkomponente
Anforderungen verstehen
Basierend auf Ihrer Anfrage erstellen wir:
Ein generischer BBCode-Wrapper, der benutzerdefinierte Attribute akzeptieren kann.
Eine Themenkomponente, die Inhalte basierend auf einer Gruppen-Zeichenfolgenvariablen ausblendet, die an den BBCode-Wrapper übergeben wird.
Implementierung des BBCode-Wrappers
Wir erstellen einen BBCode-Wrapper, der beliebige Attribute akzeptieren kann. Diese Attribute werden zur Auswertung an die Themenkomponente übergeben.

Ruby

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

Code mit Vorsicht verwenden.

Erstellung der Themenkomponente
Die Themenkomponente prüft, ob der aktuelle Benutzer zu einer der Gruppen gehört, die im Attribut data-group-names angegeben sind. Wenn nicht, wird der Inhalt ausgeblendet.

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(',');

    // Funktion zur Überprüfung, ob der Benutzer zu einer der angegebenen Gruppen gehört
    const userIsInAnyGroup = (userId, groupNames) => {
      // Ersetzen Sie dies durch Ihre Logik zur Überprüfung der Benutzergruppenmitgliedschaft
      // Zum Beispiel mithilfe der Discourse-API oder benutzerdefinierter Logik
      return groupNames.some(groupName => {
        // Prüfen Sie, ob der Benutzer zur Gruppe mit dem Namen `groupName` gehört
        // Geben Sie true zurück, wenn der Benutzer zur Gruppe gehört, andernfalls false
      });
    };

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

Code mit Vorsicht verwenden.

Verwendung des BBCode
Sie können den BBCode wie folgt verwenden:

[hide_if_not_in_group groups="staff,moderators"]
Dieser Inhalt ist für Benutzer verborgen, die keine Mitarbeiter oder Moderatoren sind.
[/hide_if_not_in_group]

Wichtige Überlegungen
Überprüfung der Gruppenmitgliedschaft: Ersetzen Sie die Platzhalterlogik für die Überprüfung der Benutzergruppenmitgliedschaft durch Ihre tatsächliche Implementierung. Möglicherweise müssen Sie die Discourse-API oder benutzerdefinierte Logik verwenden, um die Gruppenmitgliedschaft zu ermitteln.
Leistung: Bei einer großen Anzahl von Benutzern oder Gruppen kann eine Optimierung der Überprüfung der Gruppenmitgliedschaft erforderlich sein.
Sicherheit: Stellen Sie eine ordnungsgemäße Validierung und Bereinigung von Gruppennamen sicher, um Sicherheitslücken zu vermeiden.
Flexibilität: Erwägen Sie, zusätzliche Attribute für den BBCode zuzulassen, um andere Verhaltensweisen zu steuern (z. B. das Anzeigen einer Nachricht anstelle des Ausblendens von Inhalten).
Wenn Sie diese Schritte befolgen, erhalten Sie einen flexiblen BBCode-Wrapper und eine Themenkomponente, die Inhalte basierend auf der Gruppenmitgliedschaft ausblenden können.


Verwendung von Gemini. Ich konnte die obigen Code-Snippets erhalten. Habe aber Schwierigkeiten, sie zum Laufen zu bringen.

Wenn mir jemand sagen kann, wo ich sie in einer benutzerdefinierten Komponente mit den Eingabeabschnitten und ggf. Codekorrekturen platzieren soll.

Der erste Fehler, der auftrat, als ich den JavaScript-Code in den gemeinsamen Bereich einfügte, war ein Fehler bei „import“, der ein { erwartete.

Fehler-Pic

2 „Gefällt mir“

Das ist sehr cool!

Die Einschränkung, die Sie wahrscheinlich kennen, ist, dass der Text auf verschiedene Weise verfügbar ist, da er nur mit CSS versteckt ist. Eine davon ist diese Post-Route:

/posts/123/raw

2 „Gefällt mir“

In der Tat. Es gab eine benutzerdefinierte Komponente, die jemand auf eine komplexere Weise zum Entfernen von Inhalten erstellt hat. Aber sie scheint kaputt zu sein.

Ich meine, es entfernt den Inhalt aus dem gekochten Element?

1 „Gefällt mir“

Hier ist das Thema, bei dem ein Kollege eine Komponente erstellt hat, die aber nicht funktionierte, als ich sie ausprobierte, und ich habe eine PM an DeV geschickt. Aber er ist vielleicht schon weitergezogen.

Entschuldigung. Ich habe gerade gelesen, dass Sie es nicht zum Laufen bringen können.

Was Sie tun müssen, ist, das discourse_theme zu verwenden, um eine neue leere Theme zu generieren. Suchen Sie dann nach einer anderen Theme-Komponente, die einen Abschnitt “extends component” hat… Oh. Ich glaube nicht, dass es funktionieren wird. Sie müssen Ihren Code so gestalten, dass er das bereits im DOM vorhandene Element anspricht und modifiziert. Eigentlich bin ich mir da nicht ganz sicher, da ich darin noch ziemlich schlecht bin.

Ich denke, Sie können es mit reinem CSS schaffen, wenn Sie diese Komponente verwenden, die die Gruppenmitgliedschaft zu CSS hinzufügt.

Aber der reine Markdown ist in der Route verfügbar, die ich in meinem letzten Beitrag gezeigt habe. Ich sehe nicht, wie selbst ein Plugin es sicher machen kann, so dass es für Leute unmöglich wird, den versteckten Text zu sehen. So etwas wie Benutzerhinweise könnte Ihr Problem lösen, oder wenn Sie es wirklich auf Beiträge abzielen müssen, könnten Sie Benutzerhinweise als Modell verwenden, um Beitragsnotizen zu erstellen, die ein benutzerdefiniertes Beitragsfeld hinzufügen, das nur das Personal sehen kann.

2 „Gefällt mir“

Ja, das können Sie nicht richtig lösen, ohne die API zu ändern. Das würde also eine Plugin erfordern, keine Theme-Komponente.

Wenn Sie Whispers auf Ihrer Website nicht zur Moderation verwenden, könnten Sie vielleicht diese nutzen, die sofort einsatzbereit sind?

2 „Gefällt mir“

Die Anwendung dafür wäre nicht sicherheitszentriert.

Dies wäre eher für leichte Anwendungen. In einem früheren Thema suchte jemand nach etwas Ähnlichem für Tabletop-Rollenspiele. So könnte beispielsweise der Spielleiter auf das Charakterblatt eines Spielers zugreifen müssen. Das Charakterblatt wäre für den Spieler und die Spielleiter sichtbar.

Die von dem einen Kerl erstellte Überkomponente sieht gut aus. Sie scheint jedoch kaputt zu sein, als ich sie ausprobiert habe. Aber natürlich glaube ich, dass selbst diese ziemlich leicht kompromittiert werden könnte. Wenn ich mich nicht irre, zum Beispiel durch Deaktivieren von Java. Oder sogar eine clevere Person, die sich mit dem sicheren Modus von Websites auskennt. Kann der sichere Modus auf Personal/Administratoren beschränkt werden?

Jede Komponente, da es sich um clientseitige Mods handelt, ist natürlich nicht für Sicherheitsanforderungen gedacht. Selbst ein Tampermonkey-Skript kann von Mitgliedern ähnlich oder gleich wie Themen-/Themenkomponenten verwendet werden.

Wenn man diese Idee weiter ausbaut, könnte man theoretisch Inhalte basierend auf Abzeichen usw. verschleiern.

1 „Gefällt mir“

Ja. Wenn dies deaktiviert wird, können nur Mitarbeiter den Sicherheitsmodus verwenden.

image

2 „Gefällt mir“