4
2

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.

【22日目】スラッシュコマンドを使おう【PythonでDiscordBOTを作ろう!】

Last updated at Posted at 2022-12-21

便利なアイツ

スラッシュコマンドです。
これって便利ですよね。

これ、便利ですよね。ユーザーとしては本当に便利です。

これからは、Cogにコマンドを追加していく前提でやっていきます。
一部のデコレーターやコマンド引数が通常とは異なりますので、ご留意ください。
また、nextcord前提で記載してます。

書いてみよう

dog.py
+ import nextcord
  from nextcord.ext import commands

  class Dog(commands.Cog):
      def __init__(self, bot: commands.Bot):
          self.bot = bot

+     @nextcord.slash_command()
+     async def inu(self, interaction: nextcord.Interaction):
+         await interaction.send("イヌゥU^ェ^U")

      @commands.command()
      async def dog(self, ctx: commands.Context):
          await ctx.reply("わおーん!")

  def setup(bot):
     bot.add_cog(Dog(bot))

さて、interactionとかいう知らないものが出てきましたね。
一応これで実行してみましょう。

...と、スラッシュコマンドには注意点があります。

スラッシュコマンドの種類

スラッシュコマンドには2種類あって、グローバルコマンドギルドコマンドがあります。
グローバルコマンドは、BOTが加入しているサーバー全てで使えるスラッシュコマンド。
ギルドコマンドは、指定したサーバーでのみ使えるスラッシュコマンド。

詳しくは、下記の方の記事が参考になると思います。

さて、デバッグしている最中なのでコマンドは即時反映して欲しいものです。
なので、Guild Commandにしましょう。

まずは、サーバーID(GuildID)を取得しなければなりません。

これについては、Discordの記事を見た方が早いです。

ユーザー/サーバー/メッセージIDはどこで見つけられる? - Discord Support

dog.py
  import nextcord
  from nextcord.ext import commands

  class Dog(commands.Cog):
      def __init__(self, bot: commands.Bot):
          self.bot = bot

-     @nextcord.slash_command()
+     @nextcord.slash_command(guild_ids=[サーバーID])
      async def inu(self, interaction: nextcord.Interaction):
          await interaction.send("イヌゥU^ェ^U")

      @commands.command()
      async def dog(self, ctx: commands.Context):
          await ctx.reply("わおーん!")

  def setup(bot):
     bot.add_cog(Dog(bot))

さて、このままではスラッシュコマンドは使えません。(多分)
12/6に、流れのままbotにだけチェックを入れたからです。

Discord Developer Portalから、Applications→自分のBOT→OAuth2URL Generatorから、botapplications.commandsにチェックを入れて、出てきたURLで再度認証してください。

47475E60-5AB2-4C71-A1C1-4FFF0E94A14C.jpeg

これでBOTを起動してみましょう。
そして、指定したサーバーで/と打つと/inuのコマンドが表示されると思います。
実行すると犬がやってきますね。

4430B87D-8D92-4C98-8471-45870BA04342.jpeg

interactionは、コンテキストコマンドで言うところのctxです。
メッセージを送信したりできます。

スラッシュコマンドの時間制限

さて、今はコマンドが実行されたらすぐに返信していますが、何か沢山処理があったら実はとあることが発生します。
それはこれです。

Discordは、スラッシュコマンドを送信してから(インタラクションを送信してから)3秒経過までにデータが送られなかった場合は、このように「アプリケーションが応答しませんでした」と表示されます。
これがちょっとめんどくさいんです。

対策はもちろんあります。
3秒以内にawait interaction.response.defer()を実行すると、3秒の猶予が長くなります。
具体的にどれぐらい長くなるかというと、2分か3分か15分です(私の記憶が定かではない(まぁ早いに越したことはない))。

スラッシュコマンドのオプション

スラッシュコマンドでは文字を入力したり、ユーザーを選択したりロールを選択することができるSlashOptionという機能があります。

dog.py
  import nextcord
  from nextcord import commands

  class Dog(commands.Cog):
      def __init__(self, bot: commands.Bot):
          self.bot = bot

      @nextcord.slash_command(guild_ids=[サーバーID])
-     async def inu(self, interaction: nextcord.Interaction):
+     async def inu(
+         self,
+         interaction: nextcord.Interaction,
+         dogtype: str = nextcord.SlashOption(
+             description="Type of dog",
+             required=True
+         )
+     ):
+         if dogtype == "annoy":
+             await interaction.send("しろい こいぬ。 ぐっすり ねむっている…")
+         else:
+             await interaction.send("イヌゥU^ェ^U")
-         await interaction.send("イヌゥU^ェ^U")

  @commands.command()
  async def dog(self, ctx: commands.Context):
      await ctx.reply("わおーん!")

  def setup(bot):
     bot.add_cog(Dog(bot))

これで実行してみましょう。
F591C7FA-BA8E-4539-B818-7A79B57D2A9C.jpeg

すると、dogtypeという選択肢が現れます。
ここにannoyと入れると、うざいイヌが現れます。
他の文字を入れると普通の犬が現れます。

C588B0A8-F5BA-40BD-985B-1C6EB061353D.jpeg

(上はnormalと入力。下はannoyと入力。)

以上がスラッシュコマンド!!

年末商戦に向けて頑張ってる方々、頑張ってください!
私は、アドベンドカレンダー書いてて2回目の絶賛体調不良です!

では次回の記事は「非同期処理で書こう。」です!
よろしくね!!!

4
2
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
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?