🦁

[Discord] 既存 bot の組合せで半手動の入会認証システムをつくる

に公開

先日,一部の同級生(最終的には 70 人くらいになると思う)が入るための Discord のサーバを建てる機会がありました。

以前聞いたところによると,@everyone に書き込み権限を与えていたことが原因で悪意あるユーザによりサーバが消し飛んだという事件があったそうなので,対策の必要を感じました。かといって Discord の bot づくりを一から勉強している余裕はないので,既存の汎用 bot を組み合わせることで簡易的に「パスワード(事前に非公開の LINE グループ等で共有しておく)を入力することで書き込み権限が得られる」ような仕組みを作ろうと考えました。

結論から言うと,パスワード入力から書き込み権限ゲットまでを完全自動化するには至らず,半手動(?)システムにとどまりました。が,今回のサーバの必要を満たすような仕組みを作ることはできたと思うので,今後の備忘として書き残しておきます。

ツール

使ったもの

  • Ticket Tool - Discord サーバ内でお問い合わせ窓口のようなものを作るツール
  • Dyno - 汎用の Discord ボット

候補には挙がったが最終的には使わなかったもの

  • Carl-bot
    • 本件では使ってませんが,同じ鯖でリアクションロールに使わせてもらってます。
  • ProBot

成果物:認証(?)フロー

※ サーバ単位では @everyone には読み書き権限を付与しないでおく

  1. 新規のサーバ参加者は参加と同時に @new ロールを付与され,#関所の入口 チャンネルのみ見ることができる。
    • こんな感じ

  2. 同チャンネルに設置されたボタンを押すと,その人専用のパスワード入力用チャンネル(ここでは「関所」と呼びます)が生成され,そこに誘導される。
    • こんな感じ

  3. この関所で正しいパスワードを入力・送信すると,@moderator に指示が飛ぶ。指示の内容は,
    1. 例の新規参加者に @member ロール(読み書き権限を持つ。@everyone の代わり)を付与し,@new を外す
    2. この関所を削除する(ボタン操作)
    • こんな感じ

この 3. が「半手動」の所以です() まあ,実際の権限付与の時に明らかに怪しいアカウントを人の目で排除できるというのは利点ともとれますね(?)。いずれにせよ,本件ではサーバ参加者の人数が高々 2 桁で有限なのと,参加から権限付与までが一刻を争うような性質のものではない(@moderator 数人で十分対応できる)と判断したため,この半手動仕様でいきました。

実装方法

Discordサーバ側でやること

以下のロールを用意します。

  • @new - 新規のサーバ参加者に自動で付与される。未認証であることを示す。
    • サーバ単位では書き込みの権限は持たない。
    • 読みについては,チャンネルの閲覧権限は持たないが,「メッセージ履歴を読む」権限を持つ(理由は後述)。
  • @member - @everyone の代わり[1]
    • 読み書きの権限を持つ。
  • @moderator - ロール付け外しの担当者。人力。

以下のチャンネルを用意します。

  • #関所の入口
    • @new@moderator(とボット)が見れるプライベートチャンネル。

Ticket Tool でやること

そもそも Ticket Tool は本来,Discord サーバ内でお問い合わせ窓口的なものを作れるツールです。窓口は複数種類設置することができて,それぞれを panel と呼びます(合ってる?)。本件では関所用の panel を作ります。

panel の作り方や設定方法は Discord Ticket Tool とかでググれば出てくるので割愛。今回の本筋に関係するのは Support Team Roles の設定(お問い合わせ窓口で対応する担当ロールを登録するもの)です。Ticket Tool の Dashboard の [Panel Configs] > [General] の中にあるので,これに @moderator @Dyno を入れておきます(ここで Dyno を入れ忘れると,後述する Auto Response が動かなくてハマります)。

生成される各「関所」(= Ticket Tool の「ticket」)では,

  • 対応担当者(今回は @moderator と Dyno)にロール単位で
  • その関所 / ticket を生成した本人(今回は各 @new)に個別で

読み書きの権限が付与されます。これにより,原則書き込み権限を持たない @new のユーザが,個別の関所内でのみ書き込み(パスワード送信)できるようになります。また,@new の人は当然自分の生成した関所以外の関所は見れません(これがないと他の関所で送信されてるパスワードが丸見えです)。

それと,Ticket Tool から Discord 内に送られてくる各システムメッセージは自分でカスタマイズできるので,翻訳するなり独自用語(今回でいう「関所」)を織り交ぜるなり,よしなに設定しましょう。

もろもろの設定が済んだら,例の「関所に行く」ボタンを #関所の入口 に送信します(Dashboard の Send ボタンから)。

Dyno でやること

Auto Responder の設定

Dyno の Modules のうち Auto Responder を使います。

使い方はごく単純で,Trigger にパスワードにしたい文字列を,その Response に @moderator への指示を設定するだけです。ただし,Allowed Roles には @new のみ設定しておきます。これにより,@new を持っていない普通の参加者が他のチャンネルで偶然パスワードと同一の文言を送ってしまっても反応することはありません[2]

Auto Roles の設定

(普通に書き忘れてました。追記。)

サーバ参加と同時に @new を付与するのには,Dyno の Auto Roles を使います。これに関してはそれ以上言うことない。

結言

書くべきことは書いたと思いますが,何かあったら追記します。

脚注
  1. 特に本題と関係ありませんが,ボットには付与していません。ボットには各ボットの専用ロールがあるので。 ↩︎

  2. オートレスポンス対象のチャンネルを指定する設定もある(Allowed Channels や Ignored Channels)のですが,今回の場合は対象のチャンネル(関所)が都度増えたり減ったりしてしまうので用いませんでした。そもそも @new ロールの人が書き込みできるのは自分の生成した関所のチャンネル内のみなので,Allowed Roles の設定だけで必要十分です。 ↩︎

Discussion