質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3130閲覧

[discord]slashコマンドのを利用側で決める

kiritsukiR

総合スコア22

Discord

Discordは、ゲーマー向けのボイスチャットアプリです。チャット・通話がブラウザ上で利用可能で、個人専用サーバーも開設できます。通話中でも音楽を流したり、PC画面を共有できるなど多機能な点が特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/07/07 12:21

編集2021/07/24 06:24

問題

discord-py-slash-commandを用いてスラッシュコマンドを扱うcogの開発をしています.
cogのサンプルコードを見ると,cog側でguild_idsを指定していました.
そのためライブラリとしてcogを作成すると,利用側からはギルドコマンドにするか,グローバルコマンドにするか選択できませんでした.
どのようにすれば利用側でguild_idsを指定することができますか?

環境

  • python 3.7
  • discord.py 1.7.3
  • discord-py-slash-command 2.3.1

試したこと

通常コマンドはpingのようにデコレータで登録されます.
そこで,hogeのように@を用いずに直接デコレータを適用すればいいのではないかと考えました.
しかし実際にhogeコマンドを用いると,エラーが発生してしまいました.

ping/cog.py (pingライブラリとして定義)

python

1from typing import List 2from discord.ext import commands 3from discord_slash import cog_ext, SlashContext 4 5guild_ids = [11111111111111111111] 6 7class PingCog(commands.Cog): 8 def __init__(self, bot: commands.Bot, g_ids: List[int] = None): 9 self.bot = bot 10 # 関数でコマンドを登録(NG) 11 self.hoge = cog_ext.cog_slash(name='hoge', description='hoge fuga', guild_ids=g_ids)(self.hoge) 12 13 async def hoge(self, ctx: SlashContext): 14 await ctx.send('fuga') 15 16 # デコレータでコマンドを登録(OK) 17 @cog_ext.cog_slash(name='ping', description='ping pong', guild_ids=guild_ids) 18 async def ping(self, ctx: SlashContext): 19 await ctx.send('pong')

main.py (pip install -e /path/to/libraryで上記ライブラリを導入)

python

1from discord.ext import commands 2from discord_slash import SlashCommand 3import ping 4 5bot_token = 'xxxxxxxxxxxxxxxxxxxxxxxxx' 6 7bot = commands.Bot(command_prefix='!') 8slash = SlashCommand(bot, sync_commands=True) 9guild_ids = [11111111111111111111] 10bot.add_cog(ping.PingCog(bot, guild_ids))

動作とエラー

/pingpongが投稿される(OK)
/hogeインタラクションに失敗しましたが表示される(NG)

An exception has occurred while executing command `hoge`: Traceback (most recent call last): File "X:XXXXX\venv\lib\site-packages\discord_slash\client.py", line 1185, in invoke_command await func.invoke(ctx, **args) File "X:XXXXX\venv\lib\site-packages\discord_slash\model.py", line 208, in invoke return await self.func(self.cog, *args, **kwargs) TypeError: hoge() takes 2 positional arguments but 3 were given

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

以下のように環境変数から読み込むことで,グローバルコマンドとギルドコマンドを切り替えられました.

python

1import os 2 3# 環境変数からguild_idsを取得(=ギルドコマンド) 4# なければNone(=グローバルコマンド) 5guild_ids = os.environ.get('guild_ids') 6if guild_ids is not None: 7 guild_ids = list(map(lambda x: int(x), guild_ids.split(','))) 8 9 10class PingCog(commands.Cog): 11 ... 12 13 @cog_ext.cog_slash(name='ping', description='ping pong', guild_ids=guild_ids) 14 async def ping(self, ctx: SlashContext): 15 await ctx.send('pong')

投稿2021/07/24 06:08

kiritsukiR

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問