0
1

Discord BOTのPythonテンプレート

Last updated at Posted at 2024-08-12

はじめに

久しぶりに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行コメントアウトするだけで無効化が可能です。

参考リンク

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1