素晴らしいです。ところで、もしまたコーディングを再開されるようでしたら、このプラグインに対する汎用的な有用な改善案であれば、喜んで検討させていただきます ![]()
よし、まずはゆっくり始めましょう。このリポジトリに初めてのプルリクエストを送りました
。
https://github.com/merefield/discourse-discord-bot/pull/3
マージしました
ありがとう!
こんにちは!Discordで、Discourseプロフィールのバッジに基づいてユーザーにロールを付与するプラグインを探しているのですが、貴社のプラグインで可能でしょうか?もし可能でなければ、そもそもそのような機能は実現可能でしょうか?よろしくお願いします!
現時点では対応していませんが、フォークしてその機能を実装するための適切なコマンドを追加するのは問題ありません!
実装が適切であれば、PR のマージを検討します。ただし、これは一般的な用途には少し特殊すぎるかもしれません。おそらく、バッジ名とロール名が一致しない限り、何らかのマッピングを維持する必要があるでしょう。いずれにせよ、そのほとんどをフィルタリングする必要があります。これは一般的な用途では複雑になる可能性があります。プラグインの一般ユーザーでも使える、非常にクリーンな管理方法を見つけた場合は、お知らせください。
とにかく、フォークして自由に実装してください!
ぜひ実現可能かどうか確認してみたいですね。それが実現すれば、このプラグインへの関心がさらに高まると思います。![]()
ちょっとした質問ですが、ロールを更新するたびに !discsync を手動で実行する必要がありますか、それとも自動ですか?
残念ながら、その通りです。「x 時間後に再実行」というパラメータを追加するのは素敵な機能拡張かもしれません(プルリクエストを歓迎しますし、私に実装を依頼することもできます)。しかし、このトピックで以前にも触れたように、API を活用して新しいプラグインを作成し、スケジュールされた Sidekiq ジョブを実装する方が望ましいでしょう。ボットは楽しい解決策ですが、スケジュール同期には最適なアーキテクチャではありません。
どうも、ありがとうございます。はい、すでに代替案についても検討していました。
Discourse のグループを Discord のロールと同期させたいと考えていたのですが、完璧な解決策は見つからなかったようです。
そこで現在、Webhook を使用した独自のボットを作成する方向で進めています。ユーザーのグループが更新された場合(またはユーザー名が変更された場合)に、Discourse からカスタムソリューションへ Webhook をトリガーし、それによって Discord 側でロールを割り当てる仕組みです。
Guild(サーバー)の取得には引き続き Discord OAuth を利用し、カスタムな Data Explorer クエリを作成することで、API を通じて該当する Guild を取得できるようにします。
全体の流れは以下のようになります:
- ユーザーがグループを変更するか、ユーザー名を変更する
- カスタムソリューションへ Webhook がトリガーされる
- このカスタムソリューションが Data Explorer API のカスタムクエリを呼び出し、そのユーザーに関連する Guild を取得する
- 取得した Guild をもとに Discord 側を呼び出してロールを更新する
バッチジョブを適切に実行すれば、単発的なイベントの異常によるデータ整合性の喪失を防ぐことができます。どちらの手法も完璧です。
ええと、その方法では進めませんでした…:sweat_smile:
あなたのリポジトリをフォークして、私たちのニーズに合った新しいプラグインを作成しました:
これは基本的に、すべてのグループをDiscordのロールと自動的に同期します。ユーザーがグループに追加または削除されると、同期ジョブが実行され、公開グループに基づいてロールが更新されます。さらに、「認証済みロール」をマークする設定を追加しており、これはDiscourseアカウントを持つすべてのユーザーに付与されます。また、ボットが同期時に無視する安全なロールのリストを追加する機能もサポートしています(例えば、サーバーとフォーラムで異なる管理者やモデレーターを設定したい場合などに便利です)。
さらに、ユーザー名とニックネームを同期する機能も追加しました。これにより、サーバーのニックネームをフォーラムのユーザー名と同じにすることを強制できます。
いくつかの整理を行った後、#plugin トピックをオープンする予定です。誰かの役に立つかもしれませんので。
@barreeeiroo、あなたのフォークで特に興味深かったのは、DiscourseEvents フックを活用した点です。
ボットが別スレッドで動作しているため、それは不可能だと思っていたのですが、あなたの発見により、イベントに対応してボットに影響を与えることができるようです。その洞察を共有いただき、ありがとうございます。今後発展させる上で非常に重要な気づきです。
そこで、メインのリポジトリでもその手法を採用し始めました。まずは、Discord の管理者チャンネルで発表される新しい投稿やトピックを監視する機能から始めました。
現時点ではこの機能の有用性は限られるかもしれませんが、他の人がこの概念を活用するための実証となっています。
OK、プラグインをさらに開発し、双方向通信の概念実証(POC)が動作するようになりました。
新しい設定は以下の通りです。
-
プラグイン設定で、Discord の「Announcements Channel(お知らせチャンネル)」を指定できます。
-
割り当てられた Discord の Announcements Channel にメッセージを入力すると、プラグイン設定で指定された Discourse トピックにそのメッセージが投稿されます。
-
Discourse のカテゴリリストを設定し、そのカテゴリで誰かが投稿したり新しいトピックを作成したりした場合(どちらか、または両方)、Discord の Announcements Channel に投稿されるように設定できます。
さらに、discordrb API がサポートする Discord イベントを管理する新しいファイルを追加しました。Announcements のロジックが最初の例となります(コミュニティ全体に役立つ場合は、新しい機能を開発してプルリクエストを送ってください)。
また、依存関係を更新したことで、現在プラグインには不要な libsodium-dev のインストールに必要な app.yml への変更を削除しました(音声処理は不要なため)。これにより、インストールが大幅に簡素化されます。
インストール手順に従い、再起動まで全て順調に進みました。ボットが部屋に参加しなかったので、/logsを確認しました。
これは discord_bot_token のことでしょうか?入力済みで、値も確認しました。何か手がかりはありますか?
マーク、申し訳ありません、どういうわけか見落としていました。
問題は発見できましたか?
更新して新しいバージョンを試していただけますか。そこから進めましょう。
Discourseチームが資金提供した重要なアップデートです ![]()
- 新しいコマンド
!disccopy <メッセージ数> <オプションのターゲットカテゴリ名> <オプションのターゲットトピック名>を使用すると、DiscordチャットからDiscordメッセージ履歴(そのチャンネルの)をDiscourseインスタンスにコピーできます。これは一度に数千件のメッセージを安全に処理できます(ただし、その量では時間がかかります)。 - チャネルごとにメッセージを自動コピーします。チャネル名がDiscourseのカテゴリ名と一致する場合、これが設定されていればメッセージをDiscourseにコピーします。

- DiscordからDiscourseにコピーされたメッセージについて、ユーザーが正しく表示されるようになります。これは、ユーザーがDiscordログインを使用してDiscourseにログインした場合です(Discord Botがユーザーアカウントを照合できるようになります)。
- 多くの機能でローカライゼーションサポートが追加されました。
この作業の仕様策定とスポンサーをしてくださった @erlend_sh およびDiscourseチームに感謝します!! ![]()
さらに多くのボット機能が登場します
![]()
Discord OAuth 以外の、Discourse 認証またはその他の認証でログインした場合、このプラグインは単にそれらを無視しますか?
無視しているわけではなく、相手のシステムでユーザーと一致させることができないだけです。その結果、コピーされたメッセージは「システム」からのものとして表示されます。
スレッドはサポートされていますか?
まだですが、Klaus、それは潜在的に計画中です。Ruby APIが更新されるのを待っています(ブロッカー)、その後、バッカーがその機能を追加します。


