はじめに
久しぶりにDiscordのBOTを作成しようと触ってたら、色々変わっていたので自分のメモがてらテンプレートを作成。簡単なスラッシュコマンドを実装しています。
私が使用しているdiscord.py
のバージョンは2.4.0
です。
1.テンプレートの方針
- メイン・リスナー・コマンドはCogを利用して分ける。
- 環境変数は.envファイルを作成して外だしする。
2.ファイル構成
方針を踏まえてファイル構成は下記の通り。
ファイル構成
.
┣━ main.py
┣━ .env
┗━ cogs
┣━ commands.py
┗━ listenner.py
3.各ファイルの内容
まずはmain.py。ここではBOT本体を記述しています。
load_extension関数
を使用して、各cogを記載しているファイルを読み込んでいます。
main.py
import os,discord
from dotenv import load_dotenv
from discord import Intents
from discord.ext import commands
# 外部変数の読込
load_dotenv()
# DiscrodBOTのトークンを取得
TOKEN = os.getenv('DISCORD_TOKEN')
GUILD_ID = os.getenv('GUILD_ID')
class DiscordBOT(commands.Bot):
def __init__(self) -> None:
super().__init__(command_prefix='!',intents=Intents.all())
# 読み込むcogを指定
self.initial_extensions = [
"cogs.listener",
"cogs.commands"
]
#セットアップ時にソースファイルを読み込み
async def setup_hook(self) -> None:
for source in self.initial_extensions:
await self.load_extension(source)
await self.tree.sync(guild=discord.Object(id=GUILD_ID))
#BOTの起動
bot = DiscordBOT()
bot.run(TOKEN)
続いてlistener.py。
listener.py
from discord.ext import commands
class listener(commands.Cog):
def __init__(self, bot):
self.bot = bot
@commands.Cog.listener()
async def on_ready(self):
print(f'We have logged in as {self.bot.user}')
# BOTにcogを登録
async def setup(bot: commands.Bot):
await bot.add_cog(listener(bot))
最後にコマンド。
add_cog
でギルドを登録しているのはギルドコマンドとしているためです。
ギルドコマンドの場合、対象のギルド(サーバ)へ即時反映されます。
グローバルコマンド(ギルド指定をしない)の場合、BOTを導入したサーバすべてに反映されますが、反映までに1時間程度かかるため注意が必要です。
commnds.py
import os,discord
from discord.ext import commands
from discord import app_commands
# DiscordサーバのIDを取得
GUILD_ID = os.getenv('GUILD_ID')
class MyCommands(commands.Cog):
def __init__(self, bot):
self.bot = bot
# スラッシュコマンドを追加するデコレータ
@app_commands.command(name='hello', description='挨拶をしましょう')
async def hello(self,interaction: discord.Interaction):
await interaction.response.send_message('hello!')
# BOTにcogを登録 ギルドコマンドとして登録
async def setup(bot: commands.Bot):
await bot.add_cog(MyCommands(bot), guild=discord.Object(id=GUILD_ID))
4.まとめ
簡単なスラッシュコマンドを作成するDiscordBOTのテンプレートを作成しました。
Cogを利用することで、それぞれの機能を本体から分離して記述しています。小規模であれば直接記述しても問題ないですが、機能やプログラムの量が多くなる場合は管理しにくくなるので、分けてしまったほうが管理しやすいかと思います。不要な機能も1行コメントアウトするだけで無効化が可能です。
参考リンク