[Discord] 既存 bot の組合せで半手動の入会認証システムをつくる
先日,一部の同級生(最終的には 70 人くらいになると思う)が入るための Discord のサーバを建てる機会がありました。
以前聞いたところによると,@everyone
に書き込み権限を与えていたことが原因で悪意あるユーザによりサーバが消し飛んだという事件があったそうなので,対策の必要を感じました。かといって Discord の bot づくりを一から勉強している余裕はないので,既存の汎用 bot を組み合わせることで簡易的に「パスワード(事前に非公開の LINE グループ等で共有しておく)を入力することで書き込み権限が得られる」ような仕組みを作ろうと考えました。
結論から言うと,パスワード入力から書き込み権限ゲットまでを完全自動化するには至らず,半手動(?)システムにとどまりました。が,今回のサーバの必要を満たすような仕組みを作ることはできたと思うので,今後の備忘として書き残しておきます。
ツール
使ったもの
- Ticket Tool - Discord サーバ内でお問い合わせ窓口のようなものを作るツール
- Dyno - 汎用の Discord ボット
候補には挙がったが最終的には使わなかったもの
成果物:認証(?)フロー
※ サーバ単位では @everyone
には読み書き権限を付与しないでおく
- 新規のサーバ参加者は参加と同時に
@new
ロールを付与され,#関所の入口
チャンネルのみ見ることができる。-
こんな感じ
-
- 同チャンネルに設置されたボタンを押すと,その人専用のパスワード入力用チャンネル(ここでは「関所」と呼びます)が生成され,そこに誘導される。
-
こんな感じ
-
- この関所で正しいパスワードを入力・送信すると,
@moderator
に指示が飛ぶ。指示の内容は,- 例の新規参加者に
@member
ロール(読み書き権限を持つ。@everyone
の代わり)を付与し,@new
を外す - この関所を削除する(ボタン操作)
-
こんな感じ
- 例の新規参加者に
この 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 を使います。これに関してはそれ以上言うことない。
結言
書くべきことは書いたと思いますが,何かあったら追記します。
Discussion