10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Discord Botを作ってみよう #02 - スラッシュコマンドを使ってみよう

Last updated at Posted at 2022-12-04

まえがき

ひとりアドベントカレンダーという狂気の企画、3日目記事です。

はじめに

この記事(群)は、PythonとPycordを利用してDiscord Botを開発しようとする方に向けたものです。

本記事群では、以下の流れでPycordの機能を紹介していきます。

  1. #01 - Hello, Pycord!
  2. #02 - スラッシュコマンドを使ってみよう(本記事)
  3. #03 - イベントリスナを使ってみよう
  4. #04 - インタラクティブなGUIを作ってみよう
  5. #05 - Cogを導入しよう
  6. #06 - (番外編)デプロイ環境のはなし

この記事は、対象読者をPythonの記法に関する基礎知識はあるが、公式ドキュメントだけで実装できるほど慣れても居ない方としています。

もしこの記事を読んでもコードの意味がわからない場合は、基礎知識が不足している可能性があります。Paizaなどの入門サイトや技術書を参照しながら、足りない知識を補完していくことを推奨します。

  • 動作確認日: 2022/12/3
  • 各種バージョン
    • Python: 3.10.7
    • Pycord: 2.3.1

スラッシュコマンドを導入する

今回は、前回作ったBotにスラッシュコマンドを導入してみます。

スラッシュコマンドとは?

普段Discordを使っている方は、/を使った時に画像のような選択画面が出るようになっていることにお気づきかもしれません。

image.png

これは、「スラッシュコマンド」という機能です。

かつてDiscord Botでコマンドを利用するときは、メッセージをBotが確認して、コマンドの文字列が含まれているかを確認し、含まれていたら対応するメソッドを実行するという流れでした。
つまり、普通のメッセージとコマンドの区別は「prefix(コマンドの前につける文字 /とか!とかが多かった)があるかないか」などの曖昧なものだったのです。

長らく続いたその時代を終わらせたのが「スラッシュコマンド」の実装でした。
これによって、コマンドをコマンドとして送信できるようになって利便性が向上し、また開発も(ある程度)しやすくなったのです。

使ってみよう

前回のコードに、以下のようなコードを追加します。

# Botが見える場所でメッセージが投稿された時に動くメソッド
@bot.event
async def on_message(message: discord.Message):
    # メッセージ送信者がBot(自分を含む)だった場合は無視する
    if message.author.bot:
        return

    # メッセージが"hello"だった場合、"Hello!"と返信する
    if message.content == 'hello':
        await message.reply("Hello!")


+ # pingコマンドを実装
+ @bot.command(name="ping", description="pingを返します")
+ async def ping(ctx: discord.ApplicationContext):
+     await ctx.respond("pong")


# Botを起動
bot.run(TOKEN)

これを実装したあとのコードは以下の通りです。

コードを表示
# Pycordを読み込む
import discord

# アクセストークンを設定
TOKEN = "YOUR_ACCESS_TOKEN"  # 自分のアクセストークンと置換してください

# Botの大元となるオブジェクトを生成する
bot = discord.Bot(
        intents=discord.Intents.all(),  # 全てのインテンツを利用できるようにする
        activity=discord.Game("Discord Bot入門"),  # "〇〇をプレイ中"の"〇〇"を設定,
)


# 起動時に自動的に動くメソッド
# #03で詳しく説明します
@bot.event
async def on_ready():
    # 起動すると、実行したターミナルに"Hello!"と表示される
    print("Hello!")


# Botが見える場所でメッセージが投稿された時に動くメソッド
@bot.event
async def on_message(message: discord.Message):
    # メッセージ送信者がBot(自分を含む)だった場合は無視する
    if message.author.bot:
        return

    # メッセージが"hello"だった場合、"Hello!"と返信する
    if message.content == 'hello':
        await message.reply("Hello!")


# pingコマンドを実装
@bot.command(name="ping", description="pingを返します")
async def ping(ctx: discord.ApplicationContext):
    await ctx.respond("pong")


# Botを起動
bot.run(TOKEN)

追加したら、Botを再起動してください。

再起動したあと、Botを参加させたサーバーのメッセージ入力欄に/と入力すると、画像のようにpingコマンドが増えているはずです。
image.png

これを選択して送信すると、画像のようにBotからpongと返ってきます。
image.png

これでスラッシュコマンドの実装ができました!

いろいろな使い方

コマンドを実行したユーザの情報にアクセスする

先程のpingコマンドを少し変えてみましょう。

# pingコマンドを実装
@bot.command(name="ping", description="pingを返します")
async def ping(ctx: discord.ApplicationContext):
    await ctx.respond(f"pong to {ctx.author.mention}")

このように変えて再起動したあと、もう一度pingコマンドを利用すると、画像のようにメンションがつきました。
image.png

pingメソッドの引数になっているctxdiscord.ApplicationContextクラスのインスタンスなのですが、ここにはコマンドの実行者authorや実行された場所channel/guildなど、様々な情報が含まれています。

もし他の情報を使ってみたい場合は、以下の公式リファレンスを参考にしてください。

引数をとってみる

以下のように、ctxのあとに引数をとることもできます。

@bot.command(name="greeting", description="挨拶を行います")
async def greeting(ctx: discord.ApplicationContext, name: str):
    await ctx.respond(f"Hi, {name}!")

image.png
image.png

また、先程のgreetingメソッドを以下のように変更すると、discord.Userクラスのインスタンスとして引数を受け取れます。

@bot.command(name="greeting", description="挨拶を行います")
async def greeting(ctx: discord.ApplicationContext, user: discord.Option(discord.User, "対象のユーザー")):
    await ctx.respond(f"Hi, {user.mention}!")

image.png
image.png

今日はここまで!

このシリーズの他の記事

10
8
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
10
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?