要点
-
discord.py を使って python で開発する。
- discord.ext.tasks でバックグラウンドループを実現する。Code
- croniter で各ループ(タイミング)におけるジョブの発火要否判定を実現する。Code
- Command.invoke() でBotによるBotコマンドの実行を実現する。Code
やってみた
discord.py を使って、オンラインゲームのクエストや対戦マッチング相手を募集する時に使える Bot を作り、1か月ほど実際に使ってみましたので、記事にしてみます。
概略仕様
コード一式
論よりコードの方はこちら。
https://github.com/coleyon/discord-partypoll
機能
ざっくり言えば、以下2つの機能から成るBotです。
-
PartyPoll
- SimplePoll に似た、イベントの周知と参加者募集ができる機能。 -
Cron
- PartyPoll のコマンドをBot自身に、 cron ライクな設定書式でスケジューリング・定時実行させる機能
環境
PythonプログラムとしてのBotが、Dockerコンテナ上で実行される構成です。
環境構築
サーバとOSを用意する
例えばEC2上に、Ubuntu 18.04 LTS x86-64
を立てます。無料利用枠内で十分です。
Dockerサーバ環境をインストールする
docker と compose をインストールします。
Dockerサーバ環境をインストールする
こんな風になったと思います。
$ docker --version
Docker version 19.03.12, build 48a66213fe
$ docker-compose --version
docker-compose version 1.27.2, build 18f557f9
$ id
uid=1000(ubuntu) gid=1000(ubuntu),
# 中略...
,999(docker)
$
Dockerコンテナをビルドする
$ git clone https://github.com/coleyon/discord-partypoll.git
Cloning into 'discord-partypoll'...
...
Resolving deltas: 100% (136/136), done.
$ cd discord-partypoll/
$ docker-compose build
$ docker images | grep partypoll
discord-partypoll_discord-bot latest ...
$
BotをDiscordサーバに誘う
Discordアプリを作る
Developer Portal 上でアプリケーションを作成します。
BotのOAuth2 TokenをBotプログラムにセットする
アプリの General Information
メニューから Client Secret
を得て、docker-compose.yml
の DISCORD_BOT_TOKEN
にセットします。
version: "3"
services:
discord-bot:
restart: always
build: .
environment:
DISCORD_BOT_TOKEN: "yourtoken"
BotをDiscordサーバに誘う
アプリの OAuth2
メニューから Scopes が BOT となる OAuth2 URL を得ますPermissions は Send Messages
, Manage Messages
, Attach Files
, Mention Everyone
, Add Reactions
を与えてください。
BotをDiscordサーバに誘う
OAuth2 URL にブラウザでアクセスし、Bot を Discord サーバに招きます。
Botプログラムを起動する
Botプログラムの依存ライブラリを生成する
Pipfile
から requirements.yml
を生成します。
$ pipenv lock -r > requirements.txt
Botプログラムを起動する
Bot プログラム(の実行環境としての Docker コンテナ)を起動します。
$ docker-compose up -d
$ docker-compose logs -f
Attaching to discord-partypoll_discord-bot_1
discord-bot_1 | -----Logged in info-----
discord-bot_1 | {BOT_NAME}
discord-bot_1 | {BOT_ID}
discord-bot_1 | {DISCORDPY_VERSION}
discord-bot_1 | ------------------------
discord-bot_1 | Poll Extension Enabled.
discord-bot_1 | Cron Extension Enabled.
^CERROR: Aborting.
$
Bot プログラムを起動すると、Discord上の Bot がオンラインとなり、使用可能な状態になります。
パーティ募集コマンド ppoll を使ってみる
募集全体の人数制限が可能な募集
チーム全体で計20名までを上限とするパーティの募集をするコマンドです。 /ppoll total 全20名3チーム 20 TeamA TeamB TeamC
個々の募集項目毎に人数制限が可能な募集
個々のチームで計4名までを上限とするパーティの募集をするコマンドです。 /ppoll each 各4名3チーム [4]TeamA [4]TeamB [4]TeamC
ヘルプコマンド
詳しくは /ppoll help
コマンドの説明か、Gitリポジトリの readme.md をご覧ください。
定時実行コマンド cron を使ってみる
実行タイムゾーン指定
実行Timezoneを設定できます。デフォルトは日本時間(Asia/Tokyo)ですが、米国東部時間(EST)などに設定することもできます。
ジョブの定義と有効化
- Jobを定義します。
/cron add "Job A" */1 * * * mon-fri /ppoll each 各4名3チームパーティ({{1.days}}開催!) [4]TeamA [4]TeamB [4]TeamC
- cron を稼働状態にします(2020/10/30 23:11 に実行したとします)
/cron enable
ジョブの稼働例
こうなります。詳しくは /cron help
コマンドの説明か、Gitリポジトリの readme.md をご覧ください。
参考資料
基本的に公式Docsがバイブルですが、作っている途中でオンラインゲームのメンバーさんより、以下の本をご紹介頂きました。
読んだところとても分かりやすく公式マニュアルでは把握できなかった内容が多々あったりして有用でしたので、DiscordのBot作りに興味がある方にはオススメです。
- Pythonで作る Discord Bot開発実践入門