- サーバー参加時に参加時刻をDBへ保存
- Web上でDiscord OAuth2ログイン
- 選択式クイズ(全問正解が必須、出題数は
.envで調整可) - 全問正解後に Cloudflare Turnstile 検証 → 成功で認証ロール付与
- 不正解時は1分間のクールタイム(
.envで調整可) - 3回連続不正解で非認証ロールを自動付与(
.envで調整可) - 参加から24時間以内に認証ロールがつかなければ自動で非認証ロールを付与(5分おきにチェック、
.envで調整可) - クイズ突入時に非認証ロールの有無をチェックし、ついていればクイズをブロック。 再挑戦するにはサーバーを一度抜けて入り直す必要がある (Discordはメンバーがサーバーを抜けるとロールを自動的に失うため、再参加時に自動でクイズ挑戦可能な状態にリセットされます)
- Discord Developer Portal で新規Applicationを作成
- Bot タブでBotを作成し、TOKENを控える(
DISCORD_TOKEN)Privileged Gateway Intentsの SERVER MEMBERS INTENT を必ずONにする
- OAuth2 → General で
CLIENT ID/CLIENT SECRETを控える - OAuth2 → Redirects に、Webサーバーの
/auth/discord/callbackのURLを登録 (例:http://localhost:3000/auth/discord/callbackや本番URL).envのDISCORD_REDIRECT_URIと完全一致させること - OAuth2 → URL Generator で
botスコープ、権限は「メンバーの管理(Manage Roles)」等を選択し、生成されたURLでBotをサーバーに招待する- Botのロールは、付与したい「認証ロール」「非認証ロール」より 上位 に配置すること
- 「認証済みロール」「非認証ロール」を作成し、それぞれのロールIDを控える (Discordの開発者モードをON → ロール右クリック → IDをコピー)
- 未認証ユーザーがサーバーの主要チャンネルを見えないように、
@everyoneのチャンネル閲覧権限をOFFにし、認証ロールに対してのみ閲覧権限を付与する運用を推奨
- Cloudflare ダッシュボードで「Turnstile」を登録
- サイトキー・シークレットキーを取得し、Webサーバーを公開するドメイン(
localhostも可)を登録
.env.example を .env にコピーして値を埋めてください。
cp .env.example .env