この記事は 42tokyo Advent Calendar 2020 の4日目の記事です。
Discord Botを通じて42Tokyoというエンジニア養成機関に存在する課題を解決しようとした話です。
そもそも42Tokyoとは
フランス発のエンジニア養成機関です。今年から開校しました。
学費無料、教師不在、生徒同士が教え合うP2Pラーニング、課題解決型学習が特徴です。
42Tokyoは生徒主体の組織なため、カリキュラムで与えられた課題だけではなく組織に存在する課題も、基本的に生徒たちによる解決が求められます(少なくとも私自身はそう感じています)。
この記事では、Discord Botを使って組織に存在する課題を解決しようとした事例を紹介します。
Discord Bot作成の経緯
42Tokyoは、コロナウィルスの影響により、現在オンラインでカリキュラムを実施しています。Discordがメインの学習の場です。
学習にあたり、Discordでは不便なことがありました。
イベントの登録呼びかけが手動
42Tokyoでは時々イベントが開催されます。登録しないとイベントには参加できません。その登録を手動で呼びかけていました。手動だとたまに忘れてしまうので自動化したいと思いました。
メッセージのブックマーク機能がない
Discordにはメッセージのブックマーク機能がありません。このため、ブックマークの代わりに、有益なメッセージのURLを自分専用のテキストチャンネルに貼っておく習慣がありました。クリックしないと内容が分からず不便でした。
現在のチャンネル数を知る手段がない
Discordのチャンネル数上限は500。上限に達するとチャンネルを新規作成できなくなります。
42TokyoのDiscordサーバは生徒が自由にテキスト・ボイスチャンネルを作れるため、チャンネル数が多くなっていました。現状を把握するために、チャンネル数を知る必要がありました。
欲しいコマンドがない
猫画像を貼って癒されたいのにコマンドがありませんでした。
42TokyoのDiscordサーバでは、申請すれば自分の作ったBotを動かせます。そこでBotを作ってみることにしました。
技術構成
言語はPython、ライブラリは discord.py を使い、Heroku 上でBotを動かしています。
言語をPythonにしたのは、使ったことがある言語だったため。デプロイ先をHerokuにしたのは、参考となる記事が多かったためです。
機能紹介
スクリーンショットはテスト用のサーバで撮ったものです。
イベント通知機能
毎日決まった時刻に、翌日開催されるイベントを通知する機能です。
メッセージのブックマーク機能
メッセージに特定のスタンプ(🌟)を押すと、スタンプを押したユーザ宛にメッセージの内容をDMする機能です。
R. Danny というBotのstarboard(サーバ全体のブックマーク機能)を参考に作成しました。 R. Dannyはdiscord.pyの作者が作っており、他の機能やモジュール構成など参考になります。オススメです。
メッセージ送信先をDMにしたのは、他のDiscordサーバでstarboardが面白ネタの共有として使われていることが多かったからです。
ブックマークに使うスタンプの選定基準は以下としました。
- 普段から使われなさそうなもの(誤って押されない)
- プレミアム感のあるもの(押されて嬉しい)
チャンネル数を表示するコマンド
チャンネル数上限の問題を知った時、まず類似の問題が他のサーバで発生していないか見て回りました。そして他のDiscordサーバではどうやって解決しようとしているかを探しました。探す中、Discord Bot Portal JPというDiscordサーバを見つけました。
Discord Bot Portal JPは、Discord Botの開発者・利用者が集まるDiscordサーバです。質問ごとにテキストチャンネルを自動生成するシステムがあります。そのシステム故にチャンネル数が多いです。
そのサーバにあるBot、Echidnaにチャンネル数を表示するコマンドがあり、それを参考に作成しました。
お遊び的コマンド
猫画像を投稿するコマンド。TheCatAPI から画像のURLを取得しています。
Discord Botを導入した効果
イベントの登録呼びかけが手動
→ Discord Botにより、自動でイベント登録を呼びかけるようになり、呼びかけの手間が無くなりました。
メッセージのブックマーク機能がない
→ ブックマーク機能により、気になるメッセージのURLを貼ることなく、DMへ保存できるようになりました。この機能は1日平均16.9回使われているようです。
現在のチャンネル数を知る手段がない
→ チャンネル数を把握できるようになり、現在のチャンネル数から今後どのようなチャンネル構成にするか話し合いが行われるようになりました。
欲しいコマンドがない
→ 猫画像が貼れるようになり、手軽に癒しが得られるようになりました。このコマンドは1日平均2.7回使われているようです。
学んだこと
- API, ライブラリ(discord.py)の更新情報をキャッチアップすることの大切さ。
- エラー通知の大切さ。
- 問題解決の楽しさ。
- 生徒からダイレクトに反応が得られるので、やりがいがあります。
参考になった書籍・サイト
Discord Bot作成にあたり、以下の書籍・サイトが参考になりました。
- DISCORD BOT運営実践入門
- ソフトウェア構成、jishakuを使ったテスト自動化など参考になりました。とてもオススメの本です。
- discord.pyのドキュメント
- 特に 拡張機能 の項目が参考になりました。R. Dannyの
?rtfm
コマンドでもドキュメントの検索ができます。
- 特に 拡張機能 の項目が参考になりました。R. Dannyの
- Pythonで実用Discord Bot(discordpy解説) - Qiita
- Discord Botの初期設定、プログラムの例、Herokuへのデプロイ手順が書かれており参考になりました。
- [Python]Discordで指定時間に発言させるBOT - Qiita
- イベント通知機能を実装する際、参考になりました。コメントにある
asyncio.sleep
を使った方法にしています。
- イベント通知機能を実装する際、参考になりました。コメントにある
- aiohttpのドキュメント
- discord.pyは非同期処理を行っています。HTTPリクエストに非同期対応していないライブラリ(requestsなど)を使うと処理をブロックしてしまうため、非同期対応したaiohttpを使っています。
今後の展望
- イベント通知の強化
- イベント開始1日前だけでなく、開始前・終了後にも通知するように。
- ブックマークの週間ランキング
- 1週間にどんなメッセージがブックマークされたかをランキングにします。
- ブックマーク数が可視化されると楽しいし、モチベが上がるはず。
- メッセージのコピー機能
- チャンネル数が増えたときチャンネルを統合したり、メッセージを共有しやすくしたいです。
- テストを書く
- お恥ずかしながらテストをあまり書けていないので、ちゃんと書きたいです。
終わりに
Discord Botで42Tokyoの学習環境が少し便利になったかなと思います。
これからも何か課題を見つけたら、Discord Botや他の方法を使って解決していきたいです。