このプラグインの目的
このプラグインは以下のことを実現します:
-
Discourse サーバーを介して Discord ボットを動作させ、両システムを連携させる機能を提供します。このリポジトリをフォークし、簡単な Ruby コードを追加することで、あらゆるボット機能を実装できます。
-
既存の機能は例や便利なユーティリティとして機能します:
- 特定の条件を満たすコンテンツの双方向自動投稿を提供します。
- 任意のタイミングでメッセージを Discourse にコピーするコマンド
- Discord サーバーのロールメンバーシップと Discourse インスタンスのグループメンバーシップを同期させるコマンド
このプラグインは、追加機能を実装するための拡張可能なスケルトンを提供します。一般的に有用な追加機能の PR は歓迎します。
これらは同期コマンドそのものではなく、可能なボット相互作用の一例です。スクリーンショットの 2 番目のコマンドは開発中に非推奨となりました;)
設定にはある程度の複雑さが伴いますが、両システムのファンで、少なくとも機能的・概念的なレベルで各システムの仕組みを理解する時間を割く意欲がある方には最適です。このプラグインを最大限に活用するには、Discourse と Discord のユーザー管理の仕組みに関する基礎知識が必要です。
ボットコマンド
以下の 4 つのコマンドがあります:
- Ping!
- !disckick
- !discsync
- !disccopy
Ping!
ボットが応答しているか確認するには、「Ping!」と入力してください。ボットは「
: Pong!」と応答するはずです。素晴らしいですね:D(これはちょっとしたネタです!)
!disckick <min_trust_level: デフォルト 2>
このコマンドを入力すると、Discourse 上に存在するが、指定した値より低い信頼レベル(Trust Level)を持つユーザーが全員キックされます。値を指定しない場合、デフォルトは 2 です。
例:
!discsync <clean up: デフォルト false, min_visibility: デフォルト 0, include automated groups: デフォルト false>
このコマンドは、指定された条件(または指定がない場合はデフォルト)に一致するすべてのグループを Discord のロールにコピーしようとします。その後、Discourse のグループメンバーシップに基づいてロールを埋めようとします。これは一方向の同期のみで、Discourse のデータは一切変更されません。
!disccopy <number_of_messages> <optional_target_category_name> <optional_target_topic_name>
Discord チャット内から、Discord のメッセージ履歴を Discourse インスタンスにコピーできます。一度に数千件のメッセージを処理可能ですが、その場合は時間がかかります。
双方向通信
設定は以下の通りです。
- プラグイン設定で、Discord の「Announcements Channel」を指定できます。
- 割り当てられた Discord の Announcements Channel にメッセージを入力すると、プラグイン設定で指定された Discourse のトピックに投稿されます。
- 誰かが特定のカテゴリに投稿したり、新しいトピックを作成したり(またはその両方)した場合に、Discord の Announcements Channel に投稿する Discourse のカテゴリリストを設定できます。
- 自動化されたメッセージ単位のチャットコピー:チャンネル名がカテゴリ名と一致する場合、そのチャンネルのメッセージが自動的に Discourse にコピーされます。

さらに、discordrb API がサポートする Discord イベントを管理するための新しいファイルを追加しました。Announcements ロジックが最初の例です(コミュニティ全体に有用であれば、新しいものを開発して PR を送ってください)。
NB:Discord から Discourse にコピーされたメッセージについては、ユーザーは正しく表示されます(そのユーザーが Discord ログインを使用して Discourse にログインしている場合)。つまり、Discord ボットはユーザーをマッチングできます。
このプラグインの現状
このプラグインは設定が複雑です。これは避けられないことでした。
しかし、一度セットアップが完了すれば、使用するのは子供のお遊びのように簡単です。
コードは現在ベータ版として扱ってください。テスト済みであり、本番環境でも動作していますが、バグが含まれている可能性があります。本番環境のメイン Discord サーバーに適用する前に、まずは新しい Discord サーバーでテストすることを推奨します(新規構築中の場合は除きます)。
バグが発生した場合、Discourse インスタンスよりも Discord インスタンスの方が影響を受けやすいです。なぜなら、Discourse 側には変更が加えられないからです。ただし、ほとんどの事象は回復可能であり、通常は操作を繰り返すだけで問題を解決できます。Discourse はメンバーシップとグループ情報のマスターとして使用され、このデータを使用して Discord サーバーのメンバーシップとロールが更新されます。
設定手順
前提条件
- 管理者権限を持つ Discord サーバー
- Discord アプリ(下記参照)
- Discord ボット(下記参照)
- Discourse サーバーへの ssh ルートアクセス
- プラグインをインストールするための app.yml の更新
- プラグインをインストールするとログインページに Discord OAuth ログインが表示されるため、Discourse のすべてのユーザーは Discord OAuth ログインでログインする必要があります。
Discord アプリ
こちらにアクセスしてアプリを作成してください:
「New Application」をクリックします。
ボットを作成する必要があります。以下のような画面になります(「public」にはしないようにしてください):
ブラウザでボットを承認する必要があります。詳細は OAuth2 - Documentation - Discord を参照してください。
ボットの設定が完了したら、トークンをコピーしてください。後で Discourse にこのトークンを入力する必要があります。
app.yml の変更
plugin
Discord Social Login が Discourse コアにネイティブで組み込まれた現在、必要なプラグインはこれだけです(やったー
)
その後、通常通りプロンプトで ./launcher rebuild app を実行してください。
これで問題なく動作するはずです。
Discourse の設定画面でボットの認証情報をまだ入力していないため、初回ビルド時にコンソールやログにボットの起動失敗を示すエラーが表示される可能性があります(これをより graceful に処理するタスクが残っており、完了次第この部分は削除します)。ただし、害はなく、Discourse 自体は正常に動作します。
Discourse の管理画面に入ったら、「Plugin Settings」に以下の情報を入力してください:
ID は Discord のインターフェースから取得します。これらの ID をコピーできるようにするには、開発者モードを有効にする必要があります。Discord で「Settings」→「Appearance」→「ADVANCED」へ進み、開発者モードを有効にしてください:
その後、インターフェースから ID を取得できます。例:
Discord OAuth 設定も入力する必要があります。Client ID と Secret は、先ほど作成した同じ Discord アプリから取得します。
これらを設定したら、Linux のルートプロンプトに戻り、以下を入力してください:
./launcher restart app
Discord と Discourse サーバーが正しく設定されていれば、ボットがサーバーに参加しているのが確認できるはずです。
万が一ボットがダウンした場合(オフラインになる)、同じ手順を繰り返して再起動させる必要があります。Discourse コアサーバーからのボットの独立性を高めることは今後の課題です。とはいえ、長期間本番環境でボットを運用してきましたが、まだダウンしたことはありません。
今後のコマンドについて
Discourse と Discord の連携を活用し、コミュニティ全体に有用だと考えられる新しいコマンドのアイデアがあれば、返信でお知らせください。実装の可能性を検討します。NB:このボットは Discourse の範囲外のタスクを実行するものではありません。
制限事項
このプラグインの主な目的は、ユーザーが自身の Discord サーバーで、Discourse サーバーを動力源とするボットを作成し、基本的なメンバーシップ管理機能を実行できるようにすることでした。また、将来の両システム間の追加のボットのような相互作用のための基盤も提供します。ボットを使用する動機の一つは、単にそれがとても面白いからです。
ボットコマンドは本質的に任意(ad hoc)です。
既知の問題
-
サーバー上で rails console セッションに入ると、ボットが自身のインスタンスを起動してしまいます。これにより、ボットが二重に応答しているように見えます(実際にはボットが 2 つ起動しています)。rails console では、これはもはや必要ありません!::DiscordBot::Bot.discord_bot.stopと入力して追加のボットを停止してください。 -
‘online’ Discourse アップグレード中は、ロボットがアップグレードプロセス中に再起動され続けるため、少しおしゃべりになります。これは、ウェブサーバーから分岐したスレッドではなく、独立した管理プロセスでボットを実行する良い方法を見つけることに関連しています。ただし、これはすべて無害であると考えられますし、ボットの出力が Discord の管理者チャンネルにのみ表示されるのであれば、気にするでしょうか?ボットがリビルド中に 2 回のみ自己紹介を行うように変更したため、ほぼ解決しました。
謝辞
このプラグインの完成までに長い時間を要しましたが、@Wedgebert、@FoohonPie などのバックラーの方々に感謝します。Jeff さんの寛大なご支援に感謝します。また、@angus さんには激励と金銭的サポートの対応に感謝します。
このプラグインは、以前の段階で @Watercolor_Games さんが行った仕事に触発されたものであり、@featheredtoast さんが構築した Discord OAuth プラグインに依存しています。
また、準公式の Discord 対応 discordrb Ruby ライブラリ と、システムをアクセス可能にするための Discord チームの素晴らしい取り組みに依存しています。依存関係の解決に非常に迅速に対応してくれた @Falco さんにも感謝します。
もちろん、Discourse の素晴らしいプラグインエコシステム(やったー!)がなければ、これは不可能でした。
この手順書の現状
時間とともに改善され、フィードバックを歓迎します。不明な点が残っている箇所もあるでしょう。











