見出し画像

【備忘録】discord.py v.2.0関係 その2 スラッシュコマンド 

discord.py v.2.0の備忘録その1から非常に間があいてしまいました。

 今回はスラッシュコマンドの内容を書いていきます。

(有料記事設定ですが、投げ銭用の措置です。無料ですべての内容が読めます)


一応、スラッシュコマンドとは、bot に対して指示するコマンドになります。認証bot などはこのスラッシュコマンドへの対応が必須となります。

スラッシュコマンドには
どのサーバーでも利用できる グローバルコマンド

限られたサーバーのみ利用できるギルドコマンドがあります。


今回の内容は、リファレンスベースの話です。


基本形

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


    @app_commands.command(name="~~~~~~~", description="~~~~~~~")
    async def pingpong_bot(self, ctx: discord.Interaction):

前回、書き忘れていましたが、def ~~部分は、おまじないレベルで、必須です。

デコレータの app_commands.command をつけることで、スラッシュコマンドと登録されることになります。

そして、パラメータのname は文字通り、
スラッシュコマンドの名前( /giphy  )
descriptionはその説明(GIFアニメ~~~~) になります。

nameはそのまま、スラッシュコマンドになりますので、使用できる文字に制限があります。

+α

キーワード引数の設定

スラッシュコマンド 以外に追加の入力(何かしらのキーワード)を求める場合、シンプルに関数に、引数を設定することで追加できます。

@app_commands.command(name="~~~~~~~", description="~~~~~~~")
async def pingpong_bot(self, ctx: discord.Interaction, x: str):

そして、このキーワード引数についての説明を入れたい場合は

@app_commands.command(name="~~~~~~~", description="~~~~~~~")
@app_commands.describe(x='*********')
async def pingpong_bot(self, ctx: discord.Interaction, x: str):

デコレータにapp_commands.describe  を追加することで利用できます。 

パラメータの説明は、追加したい分だけ基準できます。
そして、x = '*******' で基準する内容は、引数の説明(ここでは、”GIFを検索”)になります。

ただ、x = と定義した場合、以降の関数内で使用するパラメータも x とする必要があります。


任意の変数

上の変数設定の場合、スラッシュコマンドを実行するには、変数入力は必須となる。
これを任意にするには

@app_commands.command(name="~~~~~~~", description="~~~~~~~")
async def pingpong_bot(self, ctx: discord.Interaction, x: str = None):

のように、 = None を追加することで、変数入力を任意することができる。

管理者のみ可能

管理者権限をもつユーザーのみにスラッシュコマンドの実行を許可する場合は

    @app_commands.command(name="~~~~~~~", description="~~~~~~~")
    @checks.has_permissions(administrator=True)
    async def pingpong_bot(self, ctx: discord.Interaction):

@checks.has_permissions 自体は、ユーザーの権限についてチェックするデコレータです。
そのため、管理者権限であれば、上のようにすることで制限でき、

レファレンスの例のように
manage_messages=True であれば、メッセージ管理 の権限があるユーザーであれば、スラッシュコマンドを利用できるということになります。

これに似たような形で、

@app_commands.checks.has_any_role 

では、ロールをもっているかで、チェックがされます。


ただ、注意点としては、チェックをクリアできない場合は、
例えば管理者権限がないのにも関わらず、そのスラッシュコマンドを実行した場合、プログラム内でエラーを返すだけであり、

実行した、Discord側でエラーが返されるだけになります。
つまり、管理者権限がないからエラーになったとは返してくれません。


また、チェックするだけであるため、スラッシュコマンドの一覧表示では、権限がないユーザーにもそのコマンドは表示されます。


ギルドコマンド化

ギルドコマンドにする方法として、

MY_GUILD_ID = discord.Object(...)  # Guild ID here

@app_commands.command()
@app_commands.guilds(MY_GUILD_ID)

のようにする方法と

async def setup(bot: commands.Bot):
    await bot.add_cog(aaa(bot), guilds=MY_GUILD_ID)

の方法があります。

デコレータの方は実際に試していません。

add_cogでギルドを追加する方が、Cogごとの管理という意味でもメリットは多いように思えます。


Syncは必須!!!

そして、スラッシュコマンドを上のような形で、コーディングすることで追加できますが、

ただ、そのままプログラムを実行してもスラッシュコマンドの一覧には出てきません。

Sync(同期)が必須となります。

https://gist.github.com/AbstractUmbra/a9c188797ae194e592efe05fa129c57f

基本的には、スラッシュコマンドの追加や削除、引数の追加などをした場合必要になってきます。

Syncのために、

await bot.tree.sync()

ギルドコマンドであれば、

await bot.tree.sync(guild=MY_GUILD_ID)

が必要です。

これを、

@bot.event
async def on_ready():

の中に入れておくことで再起動時に毎回実行されるため、スラッシュコマンドを新規で追加したのに、表示されないことで困ることはなくなります。

新規で追加されるスラッシュコマンドがなくても、エラーになることはありませんので、on_ready内に記述しておくことがベストです。


以上になります。

次に書く際は、セレクトメニューになるかと思います。



Shiftkeyについて


役に立ったという方は、投げ銭代わりの有料記事購入をお願いいたします。
感謝のコメントを有料記事部分に記載しておきます。


ここから先は

23字

¥ 100

noteの内容に共感していただければ、ぜひともサポートを宜しくお願いします。今後の記事投稿の励みになります。