PR(記事内にアフィリエイト広告が含まれています)
スポンサーリンク
ツール

DiscordとOFUSEの連動システム

ツール

概要

以前は OFUSE のファンクラブ会員に、Discord の会員ロールを手作業で付けていました。

Google フォームで「OFUSE でのお名前」と「Discord の名前」を書いてもらい、OFUSE の会員一覧と見比べて、該当する人にロールを付ける、という流れです。しかしこの方法だと、管理人が対応するまで会員が待たされます。そこで会員自身に Discord でログインしてもらい、その場でロールが付く仕組みを作りました。

それが今回公開する「Guild Bridge」です。

会員がすることは、登録画面で Discord ログインし、OFUSE での名前を入力するだけです。

申告した内容が正しいかどうかは、その場では確かめません。先にロールを付けてしまって、あとから管理人が OFUSE の会員一覧(CSV)と突き合わせて確かめます。

会員情報の突き合わせは月に1回、管理画面にCSVを読み込ませるだけです。合わない人はその場で分かります。

PHP と MySQL が使えるレンタルサーバーに設置して使います。常駐プロセスも Cron も使いません。

主な機能

・Discord アカウントによるログイン(OAuth2)
・申告した会員ランクに応じた Discord ロールの自動付与
・認証した会員を Discord サーバーへ自動で参加させる(オン/オフ切替可)
・ランクごとに登録 URL を分ける(URL に ?role= を付けると、そのランクで登録される)
・OFUSE の会員一覧 CSV を読み込ませての月次同期(確認・退会・ランク変更の反映)
・実行前の確認画面(何がどう変わるかを見てから実行する)
・名前が合わない会員の「要確認」扱い(ロールは外さない)
・確認画面での手動の結び付け(名前の近い順に候補が出る)
・既存会員の移行(Discord のメンバー一覧とフォームの回答 CSV から、一括で取り込む)
・会員一覧(未確認/確認済み/要確認/退会のタブ、個別の編集・退会・復帰・削除)
・Discord メンバー一覧の確認画面(会員ロールを持っている人と、登録状況の突き合わせ)
・データベースのバックアップのダウンロード
・管理人への通知メール(会員の登録時、月次同期の結果)
・管理画面のログイン試行の制限(回数・ロック時間は設定可能)
・操作ログ
・画面の配色を5種類から選択(アクセント色だけの変更も可)

動作環境

・PHP 8.0 以上(構文確認は 8.3 で実施しています)
・PHP 拡張:curl / mbstring / PDO_MySQL
・mail() 関数が使えること
・MySQL 5.7 以上(utf8mb4 対応)
・HTTPS で運用できること
・Cron は不要です
・エックスサーバー スタンダードプランでの動作確認済み

Discord 側には、対象サーバーの管理権限と、会員ランクごとのロールがあらかじめ必要です。

ロールの付け外しは Bot が行うので、Bot の作成と招待も必要になります。

同梱の手順書はエックスサーバーを前提とした記載です。他のレンタルサーバーをご利用の場合は、フォルダのパスやパーミッションの設定などを、ご利用環境に合わせて読み替えてください。

配布について

ソース一式を zip で配布します。サーバーへのアップロード、データベースの作成、Discord 側の準備、設定ファイルの編集が必要になるため、設置にはある程度の技術的知識が必要です。

同梱の README.md に、Discord アプリケーションの作成からロールの並び順、データベースの作成、パーミッション、動作確認、トラブルシューティングまで手順を書いてあります。設置後の使い方は、別冊の 運用ガイド.md にまとめました。

GuildBridge_v1.0.zip

システムの仕様

会員による登録作業

会員登録画面では、URL末尾にロールIDをパラメータと付与することで、対応するロールを自動選択できます。

このようにOFUSEの記事で各会員ロールしか読めない記事を用意し、それぞれURL末尾に異なるロールIDを付与しましょう。

会員がロールに応じた専用の申請画面から Discord ログインすると、すでに会員ロールは選択済になってるので、OFUSE での名前を入力するだけで即座にロールが付きます。

Discordログインされたら管理人にメール送付されてくるので、あとで OFUSE の名前が一致してるか確認してダブルチェックするといいでしょう。

毎月の同期

退会した人が誰なのか、OFUSEの管理画面だけでは容易に判断できません。

そこで当システムの管理画面を用いて、月に一度くらいの頻度で確認していきます。

まずはOFUSEの管理画面でChrome(Edge)の拡張機能を使い、会員情報をCSVとしてダウンロードします。

当システムの月次同期画面にてダウンロードしたCSVを選択すると、まず確認画面が出て会員情報の変化一覧が表示されます。この時点でシステム的に解決できない場合は「要確認」となってるので、管理人が確認して判断することになります。

この作業で退会した人のロールを外すことが簡単にできます。

既存会員の移行

すでにGoogleフォームとHTMLツールで管理している場合、データ移行機能を使って下さい。

OFUSE の会員一覧 CSV と、Discord のメンバー一覧を突き合わせ、名前が一致する人を自動で組にします。Google フォームの回答 CSV(OFUSE 名と Discord 名の列)があれば、それも手がかりに使います。自動で決まらなかった人は、管理人が候補から選びます。会員ロールを持っている人には印が付き、名前の近い順に並びます。

一度移行をしてしまえば、今後は拡張機能でOFUSE会員情報CSVをダウンロードし、当システムで反映、だけを行うだけでよいです。

入会者のたびに手動でロールを付ける作業は不要になります。

バックアップ

管理画面から、会員の記録とランク対応表を SQL としてダウンロードできます。月次同期や移行の前に取っておくと、結果がおかしかったときに戻せます。管理者アカウントと操作ログは含めていません。自動では取りません(Cron を使わないため)。

戻すときは phpMyAdmin から SQL を流します。会員の記録は戻りますが、Discord のロールは戻りません。記録とロールがずれた状態は、会員がログインし直すか、次の同期を実行すれば揃います。

ログと通知

Discord との通信エラー、データベース接続の失敗、メール送信の失敗などが、システム内のログファイルに記録されます。PHP 標準のエラー出力はサーバーによって出先が分かりにくいので、出力先を固定してあります。

会員が登録したときと、月次同期を実行したときには、管理人あてに通知メールが届きます。登録時の通知は設定で止められます。

エックスサーバ以外での使用

PHP と MySQL が使えるレンタルサーバーであれば、エックスサーバー以外でも動作すると思います。さくらのレンタルサーバ、ConoHa WING、ロリポップ、カラフルボックスあたりは、いずれも PHP と MySQL が使えるので候補になるはずです。ただしフォルダのパスやパーミッションの考え方はサービスごとに違うので、その部分は読み替えが必要です。

Cron は使いません。月次同期は管理画面から手動で実行する作りなので、定期実行の仕組みが無いサーバーでも動きます。

外せない前提は HTTPS です。Discord の認証から戻ってくるコールバック URL を Developer Portal に登録する必要があり、そこに登録した文字列と設定ファイルに書く文字列が一字一句一致していないと認証が通りません。設置で最もつまずきやすいのはこの部分です。

設定は環境変数からも読めるようにしてあります。エックスサーバーのように環境変数を使わない環境では設定ファイルを書き換え、Railway のような環境変数で設定する環境ではファイルを書き換えずに動かせます。

AWS で動かす場合

PHP の実行環境として Lightsail や EC2 を使い、データベースは RDS に置く形が一般的です。このシステムはファイルのアップロードを扱わないので、S3 との連携は不要です。Cron も使わないため、EventBridge や Lambda を組み合わせる必要もありません。

メール送信については検討が必要です。EC2 などから直接送ると届きにくいことがあるため、SES のようなサービスを経由する形になります。その場合は mail() を使っている部分を書き換えることになります。

Railway などの PaaS で動かす場合

PHP を動かすコンテナと MySQL のデータベースサービスを用意し、両者を接続する形が基本になります。ディスクに保存するのはログファイルだけなので、コンテナの再デプロイでデータが消える心配はほとんどありません。設定を環境変数で渡せるので、設定ファイルを書き換えずに動かせます。

こちらもメール送信は別途考える必要があります。無料枠の範囲や制限はサービスごとに異なるので、事前に利用規約や料金体系をご確認ください。

なお、AWS と PaaS のいずれについても、私自身は今回検証していません。構成の考え方として書いているだけですので、その点はご承知おきください。

おわりに

このシステムは、会員の Discord ユーザー ID・Discord の表示名・申告された OFUSE のお名前と会員ランクを保存します。操作ログとして、ログインや登録の際の IP アドレスも記録します。メールアドレスは取得していません。会員に案内するときは、こうした情報を保存していることを伝えておくことをおすすめします。

このシステムは個人で使う分には十分な作りにしていますが、無料・無保証での公開となります。導入や利用によって生じたトラブル・データの損失・その他不利益について、責任は負いかねますので、あらかじめご了承ください。動作環境や仕様は今後変更される可能性もあります。

不具合の報告や改善のご提案などがあれば、コメント等でお知らせいただけると嬉しいです。

コメント

タイトルとURLをコピーしました