AIを使って隠すコンテンツのbbcodeラッパーを作成する

グループ文字列変数に基づいてコンテンツを非表示にする、汎用BBCodeラッパーとテーマコンポーネントを作成します。

下書きを表示

汎用BBCodeラッパーとテーマコンポーネントの作成
要件の理解
ご要望に基づき、以下を作成します。
カスタム属性を受け入れられる汎用BBCodeラッパー。
BBCodeラッパーに渡されたグループ文字列変数に基づいてコンテンツを非表示にするテーマコンポーネント。
BBCodeラッパーの実装
任意の属性を受け入れられるBBCodeラッパーを作成します。これらの属性は、評価のためにテーマコンポーネントに渡されます。

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

コードの使用は注意してください。

テーマコンポーネントの作成
テーマコンポーネントは、現在のユーザーがdata-group-names属性で指定されたグループのいずれかに属しているかどうかを確認します。属していない場合は、コンテンツを非表示にします。

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

    // 指定されたグループのいずれかにユーザーがいるかどうかを確認する関数
    const userIsInAnyGroup = (userId, groupNames) => {
      // ユーザーグループメンバーシップを確認するには、ここにあなたのロジックを置き換えてください
      // 例: DiscourseのAPIまたはカスタムロジックを使用する
      return groupNames.some(groupName => {
        // `groupName` という名前のグループにユーザーがいるか確認する
        // ユーザーがグループにいる場合はtrueを返し、そうでない場合はfalseを返す
      });
    };

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

コードの使用は注意してください。

BBCodeの使用
BBCodeは次のように使用できます。

[hide_if_not_in_group groups="staff,moderators"]
このコンテンツは、スタッフまたはモデレーターではないユーザーには非表示になります。
[/hide_if_not_in_group]

重要な考慮事項
グループメンバーシップのチェック: ユーザーグループメンバーシップを確認するためのプレースホルダーロジックを、実際のインプリメンテーションに置き換えてください。グループメンバーシップを判断するために、DiscourseのAPIまたはカスタムロジックを使用する必要がある場合があります。
パフォーマンス: 大量のユーザーまたはグループの場合、グループメンバーシップチェックの最適化が必要になる場合があります。
セキュリティ: グループ名の適切な検証とサニタイズを行い、セキュリティ脆弱性を防いでください。
柔軟性: BBCodeに他の属性を許可して、他の動作を制御することを検討してください(例: コンテンツを非表示にする代わりにメッセージを表示する)。
これらの手順に従うことで、グループメンバーシップに基づいてコンテンツを非表示にできる、柔軟なBBCodeラッパーとテーマコンポーネントが得られます。


Geminiを使用しています。上記のコードスニペットを取得できましたが、機能させるのに苦労しています。

カスタムコンポーネントにどこに配置し、コードを必要に応じて修正・入力するか、ガイドしていただけますか?

JavaScriptをcommonに配置した際に最初に発生したエラーは、「import」が期待通りに機能しないというものでした。

エラー画像

「いいね!」 2

それは素晴らしいですね!

ご存知かもしれませんが、テキストはCSSで隠されているだけなので、いくつかの方法で利用可能です。その一つがこの投稿ルートです。

/posts/123/raw

「いいね!」 2

確かに。誰かがより複雑な方法でコンテンツを削除するカスタムコンポーネントを作成しました。しかし、それは壊れているようです。

記憶が正しければ、それは調理済み要素からコンテンツを削除しますか?

「いいね!」 1

コンポーネントを作成した人がいますが、試してみたところ動作しませんでした。DeVにプライベートメッセージを送りましたが、もう移動したかもしれません。

申し訳ありません。うまく機能しないことを読みました。

やるべきことは、discourse_theme を使用して新しい空のテーマを生成することです。次に、「コンポーネントを拡張する」セクションがある別のテーマコンポーネントを探します… ああ。うまくいかないと思います。コードが DOM に既に存在するものをターゲットにして変更する必要があります。実際、まだかなり下手なので、それが正しいかどうかは完全にはわかりません。

グループメンバーシップを CSS に追加するコンポーネントを使用すれば、CSS だけでできると思います。

しかし、生の Markdown は、前の投稿で示したルートで利用可能です。プラグインでさえ、人々が隠されたテキストを見ることが不可能になるように安全にすることはできないと思います。ユーザーノートのようなもので問題が解決するかもしれません。または、本当に投稿をターゲットにする必要がある場合は、ユーザーノートをモデルとして使用して、スタッフのみが見ることができる投稿カスタムフィールドを追加する投稿ノートを作成できます。

「いいね!」 2

APIを変更しないと適切に解決できないため、テーマコンポーネントではなくプラグインが必要になります。

サイトでモデレーションのためにウィスパーを使用していない場合は、標準機能のウィスパーを使用できるかもしれません。

「いいね!」 2

これはセキュリティ中心のアプリケーションではありません。

これは、軽いアプリケーション向けです。以前のトピックで、テーブルトップRPGのようなものを探している人がいました。たとえば、ダンジョンマスターがプレイヤーのキャラクターシートにアクセスする必要がある場合があります。キャラクターシートは、プレイヤーとゲームマスターに表示されます。

その人が作ったアンブレラコンポーネントは良さそうに見えます。しかし、試してみたところ壊れているようです。もちろん、それもかなり簡単に侵害できると思います。たとえばJavaを無効にするなど。あるいは、サイトのセーフモードについて知っている巧妙な人でも。セーフモードはスタッフ/管理者に制限できますか?

クライアントサイドのモッドは、セキュリティニーズには適していません。タンパーモンキースクリプトでさえ、メンバーがテーマ/テーマコンポーネントと同様または同じように使用できます。

このアイデアをさらに拡張すると、理論的にはバッジなどに基づいてコンテンツを難読化できます。

「いいね!」 1

はい。これを無効にすると、スタッフのみがセーフモードを使用できるようになります。

image

「いいね!」 2