はじめに
この記事は HowTelevision Advent Calendar 2024 10日目の記事になります。
私は新型質問箱サービス「mond」の開発に携わっています。
mond では月額のサブスクとして、メンバー限定の回答を閲覧できるメンバーシップという機能を提供しています。
mond の回答者の中には、メンバー限定のコンテンツを Discord サーバーで展開している方々がいらっしゃいます。そのため、mond のメンバーシップ加入者限定でその Discord サーバーに参加できる権利を付与できたらいいよね、という話になりました。
最近この機能の実装に取り組んだので、本記事ではこの機能に関する設計についてまとめていこうと思います。
DB 設計
mond のメンバーシップ情報を格納するテーブルなど一部省略していますが、Discord 連携に必要なのはざっと下記のテーブルたちです。
テーブル名 | 概要 |
---|---|
user |
mond のユーザー情報 |
discord_user |
メンバーシップ参加者の Discord ユーザー情報 |
discord_guild |
メンバーシップ開設者の Discord サーバー情報 |
discord_guild_member |
Discord サーバーへの参加情報を格納する中間テーブル |
Discord サーバーのデータを保持するテーブル名は下記を参考にして discord_guild
としています。
Discord内では、いわゆるグループのことをサーバーと呼ぶが、APIを使ってボットを作るときはGuildと呼ぶことが多い
メンバーシップ開設者側
まずは、メンバーシップ開設者側の Dicord 連携です。メンバーシップ開設者が保有する Discord サーバーと mond を連携させるための処理になります。
全体像
アクセストークンに必要なスコープ
スコープ名 | 説明 | 認可画面に表示される文言 |
---|---|---|
identify |
allows /users/@me without email | ユーザー名、アバター画像、バナーにアクセス |
guilds |
allows /users/@me/guilds to return basic information about all of a user's guilds | あなたがどのサーバーに入っているか確認します |
bot |
for oauth2 bots, this puts the bot in the user's selected guild by default | Bot をサーバーに追加 |
Bot に与える必要がある権限
権限名 | 説明 | 認可画面に表示される文言 |
---|---|---|
CREATE_INSTANT_INVITE |
Allows creation of instant invites | 招待を作成 |
KICK_MEMBERS |
Allows kicking members | メンバーをキック |
MANAGE_CHANNELS |
Allows management and editing of channels | チャンネルの管理 |
MANAGE_GUILD |
Allows management and editing of the guild | サーバー管理 |
MANAGE_ROLES |
Allows management and editing of roles | ロールの管理 |
MANAGE_WEBHOOKS |
Allows management and editing of webhooks | ウェブフックの管理 |
実際の流れ
1. mond の設定画面から連携を開始する | 2. Discord サーバー情報へのアクセスを mond に許可する | 3. mond の Bot に与える権限を許可する | 4. Bot が Discord サーバーに追加される |
---|---|---|---|
メンバーシップ参加者側
次に、メンバーシップ参加者側の Dicord 連携です。こちらはメンバーシップ参加者の Discord アカウントと mond を連携させるための処理になります。
全体像
アクセストークンに必要なスコープ
スコープ名 | 説明 | 認可画面に表示される文言 |
---|---|---|
identify |
allows /users/@me without email | ユーザー名、アバター画像、バナーにアクセス |
guilds.join |
allows /guilds/{guild.id}/members/{user.id} to be used for joining users to a guild | サーバーに参加します |
実際の流れ
1. mond のメンバーシップを購読開始する | 2. Discord アカウント情報へのアクセスを mond に許可する | 3. Bot によってDiscord サーバーに追加される |
---|---|---|
おわりに
今回は mond における Discord 連携の設計に関する記事を書いてみました。
だいぶ端折っているので、年末年始に余裕があれば設計の続きと実装編も書こうと思います。
弊社のアドベントカレンダーで mond に関する記事が他にも公開されていますので、ご興味があれば覗いてみてください。