Skip to content
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

退会時に分報チャンネルを自動で削除する #6626

Merged
merged 13 commits into from
Oct 1, 2023

Conversation

ogawa-tomo
Copy link
Contributor

@ogawa-tomo ogawa-tomo commented Jun 10, 2023

Issue

概要

退会時に分報チャンネルを自動で削除します。

変更確認方法

ブランチをfeature/delete-times-chennel-when-retireに切り替えておく。
下記の通り、準備としてテスト用Discordサーバーの作成、Discord Botの作成、環境変数の設定とサーバーの起動を行い、以下の3パターンの退会動線で動作確認をする。

  • ユーザーが自ら退会するとき
  • 休会6ヵ月後に自動退会するとき
  • 管理ページから退会させるとき

準備

テスト用Discordサーバーの作成

Discordのホーム画面左下の「ユーザー設定」から「詳細設定」へ遷移し、「 開発者モード」をONにしておく
image
image

Discordのホーム画面で「+」ボタンをクリックしてテスト用のDiscordサーバーを追加する
image

作成したサーバーのアイコンを右クリックし、コンテキストメニュー「サーバーIDをコピー」をクリックして控える
image

Discord サーバー名の右側にあるボタン「∨」をクリックし、作成メニューから「カテゴリーを作成」を選択し、適当な名前(「分報」など)でカテゴリーを作成する
image

カテゴリーを右クリックし、「チャンネルIDをコピー」をクリックしてカテゴリーIDを控える(画面表示は「カテゴリーIDをコピー」の誤りだと思われる)
image

Discord Botの作成

https://discord.com/developers/applications にアクセスして右上のボタン「New Application」からアプリケーションを登録し、ボットを使えるように設定する。

  1. 次の項目を入力・チェックしてアプリケーションを作成する
    • NAME: Bootcamp
    • By clicking Create, you agree to the Discord Developer Terms of Service and Developer Policy(利用規約や開発者ポリシーへの同意): チェックを入れる
  2. 左のメニューからBotをクリックし、ボタン「Add Bot」からボットを追加する
  3. Bot のトークン情報の更新と各種設定をします
    • ボタン「Copy」をクリックし、トークンをコピーして控える
    • Authorization Flow > PUBLIC BOT のトグルボタンを OFF にする
    • Privileged Gateway Intents > SERVER MEMBERS INTENT のトグルボタンを ON にする
    • ボタン「Save Changes」をクリックする

discord_002

  1. OAuth2 > URL Generator をクリックし、Discord サーバーへ参加させるためのリンクを発行する
    • SCOPES
      • bot: チェックを入れる
    • BOT PERMISSIONS
      • Manage Channels: チェックを入れる
      • Kick Members: チェックを入れる
    • GENERATED URL
      • ボタン「Copy」をクリックし、コピーして控える

discord_003

  1. 4でコピーしたリンクを開いて Bot を Discord サーバーへ参加させる

ボタン「認証」をクリックして画面の指示に従えばOK

Bot を 参加させる Discord サーバーを選ぶ チャンネルの管理とメンバーをキックにチェックが入っていることを確認する
discord_004 discord_005

環境変数の設定とサーバーの起動

前述の手順で発行された各キーを環境変数として設定する

  1. DISCORD_GUILD_ID
    • 前述のサーバーIDの値(Discord の開発者向けドキュメントでは guild をサーバーと呼んでいる)
  2. DISCORD_TIMES_CHANNEL_CATEGORY_ID
    • 前述のカテゴリーIDの値
  3. DISCORD_BOT_TOKEN
    • 前述の「Discord Bot のトークン情報を取得する」の3.で控えた値

開発環境での例として、次のコマンドをターミナルで実行する

export DISCORD_GUILD_ID=nnnnnnnnnnnnnnnnnnn
export DISCORD_TIMES_CHANNEL_CATEGORY_ID=mmmmmmmmmmmmmmmmmmm
export DISCORD_BOT_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

そのままbin/rails sでサーバーを立ち上げる

ユーザーが自ら退会するときの動作確認

  1. ログアウトした状態で参加登録ページから適当な名前で参加登録する
  2. テスト用のDiscordサーバーに分報チャンネルが作られていることを確認する
  3. 先ほど登録したユーザーでログインし、画面右上のユーザーメニューから「退会手続き」を選択して退会する
  4. Discordから分報チャンネルが削除されていることを確認する

休会6ヵ月後に自動退会するときの動作確認

  1. ログアウトした状態で参加登録ページから適当な名前で参加登録する
  2. テスト用のDiscordサーバーに分報チャンネルが作られていることを確認する
  3. 登録したユーザーでログイン
  4. 画面右上の休会手続きページから休会する
  5. Railsコンソールで操作し、ユーザーの退会日を6ヵ月前にする
> user = User.find_by(login_name: 'jidoutaikaihunhousakujo')
> user.update!(hibernated_at: 6.months.ago)
  1. komagataでログイン
  2. 管理ページの休会ユーザー一覧ページ(/admin/users?target=hibernatedに遷移し、そこに先ほど登録したユーザーとkyuukai(Kyu Kai)ユーザーがいるのを確認(kyuukaiユーザーがいなければ次のステップに進んでOK)
    image
  3. Railsコンソールを操作し、kyuukai(Kyu Kai)ユーザーを削除しておく
    • ※このユーザーにはダミーのサブスクリプション番号が登録されており、このユーザーを退会させようとすると定期支払い削除処理でエラーになるため
> user = User.find_by(login_name: 'kyuukai')
> user.destroy!
  1. ブラウザでhttp://localhost:3000/scheduler/daily/auto_retireにアクセス(画面は表示されないが、処理が走る)
  2. 管理ページをリロードし、先ほどのユーザーが休会ユーザー一覧に表示されておらず、退会ユーザー一覧に表示されることを確認
  3. Discordから分報チャンネルが削除されていることを確認

管理ページから退会させるときの動作確認

  1. ログアウトした状態で参加登録ページから適当な名前で参加登録する
  2. テスト用のDiscordサーバーに分報チャンネルが作られていることを確認する
  3. komagata(管理者)でログインしなおす
  4. 右上のユーザーメニューから管理ページに遷移し、ユーザー一覧ページから先ほど作成したユーザーを探し、表右端の「操作」からユーザー登録情報変更画面に遷移する
  5. ユーザーステータスを「退会済」に変更して「更新する」
    image
  6. Discordから分報チャンネルが削除されていることを確認する

次にやりたいこと

退会の導線は複数あるため、下記のイシューで処理を共通化したい

関連PR

@ogawa-tomo ogawa-tomo force-pushed the feature/delete-times-chennel-when-retire branch from 31dff7e to 0ccc7be Compare June 10, 2023 02:38
@@ -2,8 +2,6 @@

class UnfinishedDataDestroyer
def call(user)
return unless user.saved_change_to_retired_on?
Copy link
Contributor Author

@ogawa-tomo ogawa-tomo Jun 10, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

今回、チャンネル削除処理をNewspaper経由で呼ぶことにしましたが、その際に一緒に呼ばれるのがこのクラスです。ユーザーの未確認提出物の削除・WIP日報の削除・就職活動フラグOFFの操作をしています。
この箇所では「ユーザーの退会フラグに変更があったか」を判断しそのときのみ処理を実行するようになっていますが、その判断は呼び出し側で行うべき(このクラスの責務ではない)と考え、処理を移しています。

この処理を呼んでいるのは以下の3箇所であり、いずれも退会処理を行うときに呼んでいます。(ユーザーが自ら退会するとき、管理画面から退会させるとき、休会六ヶ月で自動退会するとき)

Newspaper.publish(:retirement_create, user)

Newspaper.publish(:retirement_create, @user) if @user.saved_change_to_retired_on?

Newspaper.publish(:retirement_create, user)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご説明ありがとうございます〜
そうですね、確かにUnfinishedDataDestroyerではなく呼び出し側でフラグOFFの操作を行った方が良いと思います。

@ogawa-tomo ogawa-tomo force-pushed the feature/delete-times-chennel-when-retire branch from d7932e3 to d1760f1 Compare June 11, 2023 08:19
@ogawa-tomo ogawa-tomo changed the base branch from main to feature/update-user-status-to-retired-after-3months-hibernation June 11, 2023 08:19
@ogawa-tomo ogawa-tomo force-pushed the feature/delete-times-chennel-when-retire branch from d1760f1 to a5c7566 Compare June 11, 2023 08:26
@ogawa-tomo ogawa-tomo force-pushed the feature/update-user-status-to-retired-after-3months-hibernation branch 4 times, most recently from 386d0ae to a38be14 Compare June 30, 2023 23:45
@ogawa-tomo ogawa-tomo force-pushed the feature/update-user-status-to-retired-after-3months-hibernation branch from f8f8c54 to c084005 Compare August 4, 2023 11:50
@ogawa-tomo ogawa-tomo force-pushed the feature/update-user-status-to-retired-after-3months-hibernation branch 3 times, most recently from c9058d9 to b4a06b3 Compare August 30, 2023 12:34
Base automatically changed from feature/update-user-status-to-retired-after-3months-hibernation to main September 4, 2023 11:40
@ogawa-tomo ogawa-tomo force-pushed the feature/delete-times-chennel-when-retire branch from a5c7566 to 6659fdd Compare September 5, 2023 12:11
@ogawa-tomo ogawa-tomo force-pushed the feature/delete-times-chennel-when-retire branch from 1724804 to 3a31a33 Compare September 16, 2023 11:21
@ogawa-tomo ogawa-tomo force-pushed the feature/delete-times-chennel-when-retire branch from 2353c10 to 756d208 Compare September 17, 2023 12:27
@ogawa-tomo ogawa-tomo force-pushed the feature/delete-times-chennel-when-retire branch from 756d208 to 1bcded6 Compare September 17, 2023 12:30
@ogawa-tomo
Copy link
Contributor Author

@fuwa-syugyo こちら、よろしければレビューお願いできますでしょうか?

@ogawa-tomo ogawa-tomo marked this pull request as ready for review September 17, 2023 13:04
@fuwa-syugyo
Copy link
Contributor

@ogawa-tomo
お疲れ様です!
レビュー依頼ありがとうございます〜対応させていただきます!
水曜日を目処に対応させていただけたらと思います。
(遅かったら遠慮なくつついていただけると!)

@fuwa-syugyo
Copy link
Contributor

@ogawa-tomo
お疲れ様です。
チェックのためDiscord botを作成したいのですが、Discord Botの作成の2にて「Add Bot」ボタンが見当たりません。
image
お手数ですが、どこにあるか教えていただけますでしょうか🙇‍♀️
(調べたところBuild-A-Bot の右あたりにボタンがある画像を発見したのですが、私の環境では表示されていません)

@ogawa-tomo
Copy link
Contributor Author

@fuwa-syugyo 私の環境でももう一度試してみましたが無いですね…。ちょっと画面が変わったのかも…。「Build-A-Bot」と書いてあるので、おそらく正しい画面に遷移していそうな気がします。いったん無視してそのまま3以降の手順に進んでいただけますでしょうか?

@fuwa-syugyo
Copy link
Contributor

@ogawa-tomo
Bot作れました!ご確認いただきありがとうございます。

一連の動作確認が終わりましたので、コードの方を見ていこうかと思います。
Discord周り触るの初めてでして申し訳ありませんが少し時間をいただくかもしれません🙇‍♀️

@fuwa-syugyo
Copy link
Contributor

@ogawa-tomo
お疲れ様です。
すみませんが、所用などありましてレビューに着手できるのが週末あたりになりそうです。
もしお急ぎでしたら他の方にレビュー依頼をお願いできますでしょうか…?
申し訳ございません🙏

@ogawa-tomo
Copy link
Contributor Author

@fuwa-syugyo ご連絡ありがとうございます。とくに急ぎではありませんので、ほかに問題なければ引き続きレビューお願いできますでしょうか?(来週末くらいまでにコメント返ってくるといいかな、くらいのイメージです)

Copy link
Contributor

@fuwa-syugyo fuwa-syugyo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ogawa-tomo
遅くなり申し訳ございません。
確認させていただきました。
内容について問題ないと思いますが、念の為1点だけ確認させてください。

退会の動線は3パターンのみ、というのはどこかで確認できますでしょうか?
(気になっただけなのですが、たとえばお金の引き落としができなくなったケースでは管理者が手動で退会させるのでしょうか?3パターン以外思いつかないですが念の為、という感じです)
他に動線がなく3パターンのみということでしたらApproveさせていただきます〜
お手数ですがよろしくお願いいたします。

@@ -2,8 +2,6 @@

class UnfinishedDataDestroyer
def call(user)
return unless user.saved_change_to_retired_on?
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご説明ありがとうございます〜
そうですね、確かにUnfinishedDataDestroyerではなく呼び出し側でフラグOFFの操作を行った方が良いと思います。

@ogawa-tomo
Copy link
Contributor Author

@fuwa-syugyo

退会の動線は3パターンのみ、というのはどこかで確認できますでしょうか?

退会にまつわるIssueをたくさん担当したので自然とそういうものだと思いこんでいたのですが、コード上で確認するとすれば、Newspaperの:retirement_createコールバックが呼ばれている箇所を探すのが一番分かりやすいと思います。このコールバックは名前の通り、退会が行われるときに必ず呼び出されると推測することができます(中身としては、未確認提出物の削除などの処理と、今回の分報削除の処理を呼び出しています)。
grepで検索すると以下の3箇所で、今回挙げたパターンと一致します。

❯ git grep 'Newspaper.publish(:retirement_create'
app/controllers/admin/users_controller.rb:      Newspaper.publish(:retirement_create, @user) if @user.saved_change_to_retired_on?
app/controllers/retirement_controller.rb:      Newspaper.publish(:retirement_create, user)
app/controllers/scheduler/daily/auto_retire_controller.rb:      Newspaper.publish(:retirement_create, user)

たとえばお金の引き落としができなくなったケースでは管理者が手動で退会させるのでしょうか?

気になったのでざっと調べてみましたが、お金の引き落としができなくなったことを検知して何らかの処理を行うコードは見つかりませんでした。一応、カードが無効になったときは管理ページのユーザー一覧で表示されるみたいです。

image

td.admin-table__item-value.is-text-align-center
- if user.subscription_id?
= link_to user.subscription_url,
class: 'subscription-status',
target: '_blank',
rel: 'noopener',
data: { 'subscription-id': user.subscription_id } do
i.fa-solid.fa-spinner.fa-pulse

ログイン時にカードの情報を見るメソッドも用意されているようですが、現在はどこからも呼ばれていないようです。

def paid_login?
logged_in? && current_user.paid?
end

いずれにせよ、支払いができなくなったからといって即退会ということはないとは思います。引き落としができなくなった場合は、おそらくですが手動で対応しているのではないかと思います。

Copy link
Contributor

@fuwa-syugyo fuwa-syugyo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ogawa-tomo
ご確認いただきありがとうございます!
退会の動線が3つ、ということで承知いたしました。
Approveさせていただきます〜

@ogawa-tomo
Copy link
Contributor Author

@fuwa-syugyo レビューありがとうございました!

@komagata メンバーのレビューが通りましたので、レビューをお願いします:bow:

@ogawa-tomo ogawa-tomo requested a review from komagata September 30, 2023 09:25
Copy link
Member

@komagata komagata left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

確認させて頂きました。OKです〜🙆‍♂️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants