-
Notifications
You must be signed in to change notification settings - Fork 71
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
受講生(現役生または研修生)が入会したときに分報チャンネルを自動で作成する #6185
受講生(現役生または研修生)が入会したときに分報チャンネルを自動で作成する #6185
Conversation
514c017
to
0dbc389
Compare
4f4e0f9
to
07bb779
Compare
Gemfile
Outdated
@@ -28,6 +28,7 @@ gem 'commonmarker' | |||
gem 'data_migrate' | |||
gem 'diffy' | |||
gem 'discord-notifier' | |||
gem 'discordrb', github: 'shardlab/discordrb' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
discordrb の最新リリースは v3.4.0 です。しかし、使用している Discord Web API の Version が古いです。
Discord としては v9 または v10 が利用可能となっていますが、discordrb の v3.4.0 は Discord Web API v6 が使われています。
しかしながら、GitHub の main では Discord Web API v9 が使われているため、開発版ではありますが使用しています。
@@ -83,6 +83,7 @@ def create_free_user! | |||
UserMailer.welcome(@user).deliver_now | |||
notify_to_mentors(@user) | |||
notify_to_chat(@user) | |||
Newspaper.publish(:student_or_trainee_create, @user) if @user.trainee? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
#6103 (comment) にて現役生と研修生が対象となりました。
app/models/discord/server.rb
Outdated
module Discord | ||
class Server | ||
class << self | ||
class_attribute :guild_id, :authorize_token, instance_reader: false |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
テストがしやすいように外部から値を設定できるようにしています。
class_attribute :guild_id, :authorize_token, instance_reader: false | ||
|
||
def create_text_channel(name:, parent: nil) | ||
guild = Discord::Server.find_by(id: guild_id, token: authorize_token) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
名前が紛らわしいのですが、内部的にサーバーのことをギルドと呼んでいます。
これは Discord の開発者向けドキュメントでギルドと呼ばれているためです。
|
||
class << self | ||
def to_channel_name(username) | ||
username.downcase |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
テキストチャンネル名には大文字の英字が使えないため、小文字に変換しています。
app/models/discord/times_channel.rb
Outdated
end | ||
|
||
def category_id | ||
@category_id || ENV['DISCORD_TIMES_CHANNEL_CATEGORY_ID'].presence |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
テキストチャンネルのカテゴリを指定する際に、空文字を指定すると shardlab/discordrb にて 0
に変換されるため
環境変数においては presence を使用しています。
config/boot.rb
Outdated
|
||
# NOTE: ボイス機能を使用しない設定です。 | ||
# https://github.com/shardlab/discordrb/wiki/Installing-libopus | ||
ENV['DISCORDRB_NONACL'] = 'true' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
環境変数を設定しないと メッセージ が表示されるため、あらかじめ設定しています。
なお boot.rb
に記述している理由は bin/rails コマンドや config/application.rb で読み込まれ、必ず Bundler.require
の前に環境変数を設定するためです。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@maeda-m これって他に困っている人いないんですかね?
その辺りちょっと調べてみるといい気がしました。
@@ -0,0 +1,6 @@ | |||
class AddTimesIdToUsers < ActiveRecord::Migration[6.1] | |||
def change | |||
# NOTE: Snowflake ID |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Snowflakes という書式の ID になります。
整数のオーバーフローを防止するために、HTTP API では常に文字列で扱われるため、DBにおいても文字列で扱うようにしています。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
migrationからでもDBのカラムのコメントを付けられた気がするのでそれを利用するといいかもと思いました〜
db/schema.rb
Outdated
@@ -655,6 +655,7 @@ | |||
t.string "profile_job" | |||
t.text "profile_text" | |||
t.string "feed_url" | |||
t.string "times_id" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
usersテーブルにあるDiscord関連のカラムを移動する提案は別議題( #6215 )として作成しています。
require 'test_helper' | ||
|
||
module Discord | ||
class UsersControllerTest < ActionDispatch::IntegrationTest |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
test/system/sign_up_test.rb ではクレジットカード決済等の動作があるため
stub を使って機能的なテストをしやすい IntegrationTest で分報チャンネルの自動生成の挙動を確認しています。
Note
コントローラーに関するテストなのでtest/controllers
の配下がふさわしいかと思いましたが、
意図としてはコントローラー経由でTimesChannelCreator > Discord::TimesChannel
の結合を確認しているため
test/integration/discord
配下にファイルを作成しています。
07bb779
to
e8b26dc
Compare
# - Maximum number of server channels reached (500) | ||
# - Maximum number of channels in category reached (50) | ||
# - The bot doesn't have the required permission to do this! | ||
Rails.logger.error "[Discord API] #{exception.full_message.chomp}" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Discord API のエラーは致命的でブートキャンプアプリ側では回復できないため、エラーログを出力しています。
e8b26dc
to
7d253bb
Compare
@siso25 こちらのプルリクエストのレビューをお願いしたいのですが、ご都合いかがでしょうか~? 不明点や疑問点あれば遠慮なくコメントください😀 |
@maeda-m |
@siso25 はい🙏 急ぎませんのでよろしくお願いします~ |
@maeda-m discordrbについて、どなたか(komagataさんやmachidaさんなど)に相談された結果、開発中のバージョンを使うことになったのでしょうか?リリースされていないバージョンのgemを、稼働中のアプリケーションに入れることに不安を覚えたのでお聞きしました。 もし、相談の結果「gemに問題があったらその都度解決しよう」ということになったのであれば問題ないと思います! |
@siso25 質問ありがとうございます🙏
別の調査 issue( #1996 (comment) ) で Discord については Gem や npm を使った方がいいという方針になったのですが 本日のふりかえり・計画ミーティングにて確認してみますね💡 |
@maeda-m |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@maeda-m
お手数おかけしました。承知しました!
動作とコードを確認しました。問題ないと思いますので、Approveさせていただきます。
@siso25 確認ありがとうございました🙏 |
@komagata メンバーレビューで Approve いただきました~ |
app/models/discord/server.rb
Outdated
end | ||
|
||
def guild_id | ||
@guild_id || ENV['DISCORD_GUILD_ID'].presence |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
この辺りも環境変数は極力外部から注入するようにした方がいいかもです〜
@@ -0,0 +1,6 @@ | |||
class AddTimesIdToUsers < ActiveRecord::Migration[6.1] | |||
def change | |||
# NOTE: Snowflake ID |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
migrationからでもDBのカラムのコメントを付けられた気がするのでそれを利用するといいかもと思いました〜
245bf8f
to
44c4c9e
Compare
@@ -0,0 +1,9 @@ | |||
Rails.application.reloader.to_prepare do |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Rails.application.reloader.to_prepare
のブロックを記述しないと
DEPRECATION WARNING: Initialization autoloaded the constants Discord::Server and Discord::TimesChannel.
と非推奨である旨のメッセージと Rails.application.reloader.to_prepare
のブロック内に記述するようにメッセージが出力されます。
@komagata コメントありがとうございます🙏
$ psql -d bootcamp_development
psql (14.7 (Debian 14.7-1.pgdg110+1))
Type "help" for help.
bootcamp_development=# \d+ users
Table "public.users"
Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description
---------------------------------+-----------------------------+-----------+----------+-----------------------------------+----------+-------------+--------------+--------------
id | integer | | not null | nextval('users_id_seq'::regclass) | plain | | |
login_name | character varying(255) | | not null | | extended | | |
### 省略
feed_url | character varying | | | | extended | | |
times_id | character varying | | | | extended | | | Snowflake ID |
module Discord | ||
class Server | ||
include ActiveSupport::Configurable | ||
config_accessor :guild_id, :authorize_token, instance_accessor: false |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
便利ですね!
config/boot.rb
Outdated
|
||
# NOTE: ボイス機能を使用しない設定です。 | ||
# https://github.com/shardlab/discordrb/wiki/Installing-libopus | ||
ENV['DISCORDRB_NONACL'] = 'true' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@maeda-m これって他に困っている人いないんですかね?
その辺りちょっと調べてみるといい気がしました。
b122e61
to
47ca9b2
Compare
@@ -0,0 +1,14 @@ | |||
# NOTE: ボイス機能を使用しない設定です。 | |||
# https://github.com/shardlab/discordrb/wiki/Installing-libopus | |||
ENV['DISCORDRB_NONACL'] = 'true' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Gemfileの宣言に require: false
を追記することで Bundler.require
にて読み込み対象外とした。
@komagata コメントいただいていた件 、次のように修正しましたので再度レビューをお願いします🙏
|
47ca9b2
to
18db80d
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
確認させて頂きました。OKです〜🙆♂️
# NOTE: ボイス機能を使用しない設定です。 | ||
# https://github.com/shardlab/discordrb/wiki/Installing-libopus | ||
ENV['DISCORDRB_NONACL'] = 'true' | ||
require 'discordrb' |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
確認ありがとうございました🙏 |
Issue
概要
Discord周りで最終的にやりたい状態としては下記があります。
このプルリクエストでは 1 の入会時に自動で分報チャンネルを作成し、
2 の動作に向けて分報チャンネルのIDをDB(
users.times_id
)に保存するまでの範囲となります。つまり、2から3の動作はこのプルリクエストの範囲外です。
また分報チャンネルの作成方針としては次の規則があります。
変更確認方法
feature/auto-create-of-times-channel-when-joined
をローカルに取り込みますbundle exec rails db:drop
を実行しますbin/setup
を実行しますbin/rails s
でサーバーを立ち上げますScreenshot
画面上の変更はありません。
注意・伝達事項
Discord Bot を参加させる Discord サーバーのIDを取得する
アイコンを右クリックして、コンテキストメニュー「IDをコピー」をクリックして控えます。
分報チャンネルのカテゴリーのIDを取得する
ユーザー設定 > 詳細設定 > 開発者モード
をONにしてからカテゴリーを右クリックして、コンテキストメニュー「IDをコピー」をクリックして控えます。
Discord Bot のトークン情報を取得する
https://discord.com/developers/applications にアクセスして右上のボタン「New Application」からアプリケーションを登録し、ボットを使えるように設定します。
Authorization Flow > PUBLIC BOT
のトグルボタンを OFF にしますPrivileged Gateway Intents > SERVER MEMBERS INTENT
のトグルボタンを ON にしますボタン「認証」をクリックして画面の指示に従えばOKです。
3つの環境変数を設定する
前述の手順で発行された各キーを環境変数を設定する必要があります。
DISCORD_GUILD_ID
DISCORD_TIMES_CHANNEL_CATEGORY_ID
DISCORD_BOT_TOKEN
開発環境での例として次のコマンドをターミナルで実行します:
参考情報
guild
をサーバーと呼んでいます