🐷

discord.py入門 その2

2023/04/22に公開

おさらい

前回はbotの準備とイベントについて解説しました。今回はいよいよbotのコマンドを実装していきます。

前回のコード(再掲)

from discord.ext import commands
import discord

intents = discord.Intents.default()
intents.members = True # メンバー管理の権限
intents.message_content = True # メッセージの内容を取得する権限

bot = commands.Bot(
    command_prefix="$", # $コマンド名 でコマンドを実行できるようになる
    case_insensitive=True, # 大文字小文字を区別しない ($hello も $Hello も同じ!)
    intents=intents # 権限を設定
)

@bot.event
async def on_ready():
    print("Bot is ready!")


@bot.event
async def on_message(message: discord.Message):
    """メッセージをおうむ返しにする処理"""

    if message.author.bot: # ボットのメッセージは無視
        return

    await message.reply(message.content)

bot.run("TOKEN")

Step3. コマンドを実装してみよう

Section1. 挨拶するコマンドを作ってみよう

始めに、on_messageを削除して、以下のコードを書きます。on_messageを削除する理由は後で述べます。

@bot.command()
async def hello(ctx: commands.Context) -> None:
    """helloと返すコマンド"""
    await ctx.send(f"Hello {ctx.author.name}")

commands.Contextクラスのオブジェクトであるctxは、コマンドを実行した人やメッセージ、チャンネルなどの情報を持っています。ctx.sendでメッセージを送信できます。author属性がコマンドを実行した人の情報が入っています。name属性で名前を取得できます。(ちなみに、str(author)とするとname#1234のような文字列になります。)

実行結果

コマンドを実行するにあたってコマンドを呼び出すためのキーワードを複数追加することができます。@bot.command()の引数のaliasesに渡してあげましょう。

@bot.command(
    name="hello", # コマンドの名前。設定しない場合は関数名
    aliases=["hi", "hey"] # $hiでも $heyでも反応するようになる
)
async def hello(ctx: commands.Context):
    ...

Section2. ユーザーから引数を受け取ってみよう

今まではあらかじめ返答する内容が決まっていましたが、次はユーザーから引数を受け取ってみましょう。
以下のコードをhelloコマンドの下に追加してください。on_messageイベントはしばらく不要なので削除してください。

@bot.command()
async def add(ctx: commands.Context, a: int, b: int) -> None:
    """足し算をするコマンド"""
    await ctx.send(a+b)

以下のようになれば成功です。

まとめ

今回はコマンドの基本的な実装方法について学びました。discord.pyはコマンドに関するサポートが豊富で、様々な複雑な処理を簡単に実装できるようになっています。本botの制作を通じ、その一部を知ってもらえれば幸いです。次回はいよいよコマンドで特定のチャンネルのメッセージをファイルにまとめて送信する機能を実装していきます。お疲れ様でした。

前回 | 次回

GitHubで編集を提案

Discussion