Conversation
86b14e0 to
41ed47e
Compare
| end | ||
|
|
||
| def initialize(attributes = {}) | ||
| user = attributes[:user] |
There was a problem hiding this comment.
📝 attributes には次の内容が渡されます。
{
"avatar": null,
"communication_disabled_until": null,
"deaf": false,
"flags": 1,
"joined_at": "2023-01-25T01:22:03.389250+00:00",
"mute": false,
"nick": null,
"pending": false,
"premium_since": null,
"roles": [
"ロールのIDが入ります",
"ロールのIDが入ります"
],
"user": {
"avatar": "xxxxxxxxxxxxx",
"avatar_decoration": null,
"bot": false,
"discriminator": "NNNN",
"id": "Discord アカウントのIDが入ります",
"public_flags": 0,
"username": "maeda-m"
}
}|
|
||
| result = JSON.parse(response.body, symbolize_names: true) | ||
| discord_members = result.map { |attrs| DiscordMember.new(attrs) } | ||
| discord_members.find { |member| account_name == member.account_name } |
There was a problem hiding this comment.
📝 find_by の戻り値は Discord のアカウント名(#付き)が完全に一致するものに限定しています。
これは Search Guild Members の仕様としてユーザー名だけでなくニックネームも検索対象になっているためです。
| discord_account = user.discord_account | ||
| return if discord_account.blank? | ||
|
|
||
| discord_member = DiscordMember.find_by(account_name: discord_account) |
There was a problem hiding this comment.
📝 Discord サーバーから退出させるには Discord アカウントの ID が必要になるため、
Discord アカウント名を Web API で検索し、 Discord アカウントの ID を求めています。
| return | ||
| end | ||
|
|
||
| if discord_member.destroy |
There was a problem hiding this comment.
📝 Discord サーバーから退出させる処理は、メンバーのリソースを削除する Web API で実行しています。
| return false if @bot | ||
| return false unless @role_ids.empty? |
There was a problem hiding this comment.
📝 プルリクエストの概要で記載した懸念点1への対応に加えて、ボットの退出も回避しています。
これはボットは現役生ではない判断としているためです。
| notify_to_admins | ||
| notify_to_mentors | ||
| logout | ||
| kick_from_discord(user) |
There was a problem hiding this comment.
📝 Newspaper 経由でもいいのかなと思いつつも、愚直に処理を実行しています。
|
📝 ふりかえり・計画ミーティング2023年01月25日 より |
Issue
概要
ブートキャンプ退会時に Discord アカウント情報があれば Web API を利用して自動で Discord サーバーから退出させる機能を実装しました。
ただし、次の懸念点があります。
/current_user/editから変更できるが Discord アカウント情報の入力は必須ではないこと上記の懸念点への対応としては次の通りとしました。
管理者・メンター・顧問・研修生などのロールが付与されている Discord アカウントの退出を回避します
Discord サーバーから退出させずに、試みたことをエラーログとして記録します
変更確認方法
feature/kick-from-discord-when-bootcamp-retiredをローカルに取り込みますbundle exec rails db:dropを実行しますbin/setupを実行しますbin/rails log:clearを実行しますbin/rails sでサーバーを立ち上げますkimuraでログインします管理者であれば
サーバー設定 > ユーザー管理のメンバーから確認できますlog/development.logに[Discord API] <Discord アカウント(#付き)が入ります> を退出させました。と出力されていることを確認しますScreenshot
画面上の変更はありません。
注意・伝達事項
Discord Bot を参加させる Discord サーバーのIDを取得する
アイコンを右クリックして、コンテキストメニュー「IDをコピー」をクリックして控えます。
Discord Bot のトークン情報を取得する
https://discord.com/developers/applications にアクセスして右上のボタン「New Application」からアプリケーションを登録し、ボットを使えるように設定します。
Authorization Flow > PUBLIC BOTのトグルボタンを OFF にしますPrivileged Gateway Intents > SERVER MEMBERS INTENTのトグルボタンを ON にしますボタン「認証」をクリックして画面の指示に従えばOKです。
追加する2の環境変数を設定する
前述の手順で発行された各キーを環境変数を設定する必要があります。
DISCORD_GUILD_IDDISCORD_BOT_TOKEN開発環境での例として次のコマンドをターミナルで実行します:
参考情報
kickを追放と呼んでいますguildをサーバーと呼んでいます