ディスコースにおける信頼レベルに基づく自動タイトル割り当て

皆さん、こんにちは。

カスタムタイトル付きのランキングシステムを設定しましたが、ご存知の通り、Discourse にはすべての新規ユーザーにデフォルトのタイトルを割り当てる組み込みの方法がありません。そのため、次のような回避策を作成しました。

  • 新規メンバーはグループ 1 に所属します。
  • アクティブなメンバーはグループ 2 に所属します。
  • その他…

私が使用した方法は次のとおりです。

cd /var/discourse
./launcher enter app
rails c

User.where(trust_level: 0).update_all(title: "عضو جديد")
User.where(trust_level: 1).update_all(title: "عضو جديد")
User.where(trust_level: 2).update_all(title: "عضو مشارك")
User.where(trust_level: 3).update_all(title: "عضو مبدع")

問題点

新しいユーザーが参加するたびに、これらのコマンドを手動で実行する必要があります。今日スクリプトを実行しても、新しいメンバーが明日投稿した場合、タイトルは自動的に付与されないため、サーバーにログインしてコマンドを再実行する必要があります。

Ruby スクリプトで自動化し、crontab を介して呼び出そうとしましたが、エラーが発生しました。

ChatGPT に尋ねたところ、次のように言われました。

「ユーザーモデルは、Discourse 環境外で Ruby を使用してスクリプトを直接実行するとロードされません。」

問題は、Discourse ファイル内に適切な config/environment セットアップがないことです。

追加しましたが、機能しませんでした。

私の質問

crontab を使用せずにこれを自動化する方法はありますか? それとも、毎回手動で Rails コンソールに入力せずに、ユーザータイトルを更新するスクリプトを適切に実行するにはどうすればよいですか?

よろしくお願いします!

「いいね!」 2

何かお手伝いできることはありますか?

Discourse AutomationCreate custom Automations でカスタムオートメーションを作成することで可能かもしれませんが、その仕組みがわかりません。

「いいね!」 1

User Event および User Promoted Event トリガーを使用したカスタム自動化スクリプトでこれを実現できます。新しいユーザーが作成されたとき(User Event)または信頼レベルが変更されたとき(User Promoted Event)に、信頼レベルに基づいて自動的にタイトルを割り当てるスクリプトをトリガーできます。

「いいね!」 5

ありがとう @jahan_gagan!このスクリプトを作るための助けはありますか?

素晴らしい!見事なハッキングです!:clap:

自動化されたグループでは、信頼レベルのような一部のグループ設定が利用できないのは残念なようです。信頼レベルグループに基づいてユーザータイトルを設定することは可能であるはずですが、そうではありません。

バッジシステムを使用してこれを試すことができます。メンバーが希望する信頼レベルに達したときに付与されるバッジを作成し、「バッジをタイトルとして使用することを許可する」を設定します。

その後、「バッジによるユーザーグループメンバーシップ」スクリプトを使用して、毎日実行され、ユーザーのタイトルとフレアを更新する自動化を作成できます。

「いいね!」 5

この情報を投稿/ユーザーカードに追加するテーマコンポーネントの方が柔軟性があるでしょうか?そうすれば、ユーザーはタイトルフィールドを意図したとおりに他の目的(バッジ、グループ識別子、追加したいカスタムのものなど)に使用でき、テーマコンポーネントによって追加された場合、ユーザーはそれを変更/削除できなくなります。

「いいね!」 1

こんにちは。

バッジシステム自動化でこれを実装しようとしていますが、制限に直面しています。

user_group_membership_through_badge スクリプトを実行するには、グループを指定する必要があります。しかし、すでにデフォルトのシステムグループである Trust Level 1, 2, 3, 4 を使用しています。これらのグループは組み込みであり、自動化ツールで選択することはできません。

この自動化で使用するために新しいグループを作成した場合、現在のすべてのメンバーが自動的に引き継がれず、ユーザーと信頼レベルの正確なマッピングを失うのではないかと心配しています。

グループフィールドが空のままにした場合に表示されるエラーを示すスクリーンショットを次に示します。

グループを必要とせずにバッジからタイトルへの更新を適用する方法はありますか?
または、この自動化内で直接 Trust Level グループ をターゲットにするための回避策はありますか?

@xkhalid 初めてのプラグインですが、以下のような簡単なものを作成しました。

  • 新規ユーザーにタイトルを割り当てます。
  • ユーザーのトラストレベルに応じてタイトルを変更します。例:TL1 → TL2:ユーザーはTL1のタイトルではなく、TL2のタイトルを取得します。
  • 12時間ごとにユーザータイトルを更新します(更新頻度は設定で変更可能にする予定)。

すべてのタイトルは設定で変更可能です :slightly_smiling_face:

「いいね!」 4

ありがとうございます!

これを app.yml に追加した後:

- git clone https://github.com/NateDhaliwal/add-title-based-on-trust-level.git

再構築すると、502 Bad Gateway エラーが発生しました。何か解決策はありますか?
とりあえず、app.yml から削除したところ、すべて正常に動作しました。

へえ、変だな。確か再構築後にそのエラーが出ることがあるけど、待つか再構築すれば解決するはず。

ええ、わかっています。しかし、この問題は Git リポジトリを追加して再構築した後にのみ発生しました。このエラーが表示されました。

しかし、後でもう一度試してみます。


この問題はどうですか?関連している可能性がありますか?

「いいね!」 1

もう一度確認します。お知らせいただきありがとうございます。

「いいね!」 1

@xkhalid 今試していただけますか?更新しました。

「いいね!」 1

ありがとうございます!これで動作するようになりました。

しかし、すべてのユーザーに反映されていません。例えば、このユーザーは信頼レベル1で新規ユーザーですが、タイトルが割り当てられていません。

時間がかかるということでしょうか?

@xkhalid修正をプッシュしました。これで動作するか教えてください。
ありがとうございます!

@NateDhaliwalさんのプラグインに感謝します

とても役に立ちました!タイトルは12時間ごとに更新されます。

「いいね!」 1

こんにちは、素晴らしいプラグインをありがとうございます!

より複雑なニーズがあります。
グループメンバーシップ(例:グループAまたはグループB)と信頼レベル(例:TL2、TL3など)の組み合わせに基づいて、ユーザータイトルを自動的に設定したいと思います。例えば、グループAに所属し、TL2のユーザーには「A - TL2」というタイトルが付与されるなどです。

この機能に対応するようにプラグインを拡張することは可能でしょうか、それとも実装方法について何かアドバイスはありますか?
私自身にはコーディングの経験がないため、提案やヘルプをいただけると大変助かります。

どうぞよろしくお願いいたします!

これらのグループはユーザーのプライマリグループですか?

はい、ユーザーのプライマリグループを使用してタイトルを決定したいと思います。