見出し画像

【dislash.py】スラッシュコマンド対応日記#1


6/16 追記
dislash.py は開発・サポートを終了しております。





来年の4月以降、Discordのbotにはスラッシュコマンドに対応することが求められています。

また、discord.py は開発は停止している状況であり、スラッシュコマンド対応はdiscord.py単独で行おうとすると、とんでもなく難易度が上がります。


そのため、楽な形でスラッシュコマンド対応していく形を残していき、同じように考えている人の手助けになればと思います。


dislash.py の利用

前述の通り、discord.pyがスラッシュコマンドに直接対応する形はなくなりました。そのため、スラッシュコマンド対応するためには、

1. pythonで、スラッシュコマンドの登録Interaction の受け渡しを行うフレームワークを構築する。
2. discord.js への移行。
3. 別パッケージを利用して、discord.py との併存利用

のいずれかになります。

ここで、わたしは一番負担が軽いであろう3番の選択肢を取りました。


スラッシュコマンド対応のものでオーソドックスなものは、
discord-py-interactionsになりますが、ドキュメントの情報量の少なさから途中で頓挫。
そのため、まだ一般的でない dislash.py を利用することにしました。

こちらは、ドキュメントがしっかりしており、ウェブ上に紹介ページなどがないながらもドキュメントを読んで、今の所なんとかなっています。


スラッシュコマンドでコード上変わったこと。

・ctx.message.send~はもう使わない。

これはそのままです。コマンドにmessage属性がないため、そもそも通らなくなります。

・コマンドで関数を実行させ、正常に動いても discord上に何かしらの形で返さないとdiscord 上で「インタラクションに失敗しました」とでてしまう。

これは、私のbot のコマンドの中に単純にコマンドを入力したテキストチャンネルの中身をすべて削除するものがあります。簡単に言えば

@bot.command()
async def clntext(ctx):
   """テキストチャンネルのログ消し"""
   await ctx.message.channel.purge()

といったもので、普通にbot.commandで実行した際、何も支障なく終わりますが、スラッシュコマンドだとテキストをすべて消したあとに、botがdiscord 上で「インタラクションに失敗しました」とエラーを吐き出します。

await ctx.send("ログを消します")
await ctx.channel.purge()

回避方法として、この場合はテキストをすべて消すので、適当に「消します」とメッセージを返して、それを含めたすべてのテキストを消す形にしました。


ルールとして、スラッシュコマンドを受けてから、3秒以内にctx.send などを行うことを推奨しており、3秒を超えるとdiscord 上で「インタラクションに失敗しました」とエラーを吐き出します。

ctx.send 以外に猶予時間を作るctx.defer() というものがありますが、残念ながら、使っているdislash.pyには実装されていないために、最終的には"実行開始"など返すようにしました。


変わらない点

・bot.eventなどevent系はそのまま利用可

event系といっているのは、botがログインした際に自動で実行する"on ready"などのことで、これについては、sendの件以外は特段変更せずに動きます。

・discord.pyで使っていたものは、ほぼ利用可能



今のところは、上の通りです。
また、自分のペースで対応させていくため、わかったことがあり次第、#2へと続きます。

----------
Shiftkeyについて


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