質問編集履歴

3

質問内容から試したことを分離

2021/07/24 06:24

投稿

hoge_fuga
hoge_fuga

スコア22

test CHANGED
@@ -1 +1 @@
1
- [discord]slashコマンドのguild_ids
1
+ [discord]slashコマンドのを利用側で決める
test CHANGED
@@ -1,16 +1,12 @@
1
1
  ## 問題
2
2
 
3
- `discord-py-slash-command`を用いてslash commandを扱うcogの開発をしています.
3
+ `discord-py-slash-command`を用いてスラッシュコマンドを扱うcogの開発をしています.
4
4
 
5
- サンプルコードを参考にcogを作成したのすが,`guild_ids`をcogのファイルに書かなければけないことが気になりました.
5
+ cogのサンプルコードを見ると,cogで`guild_ids`を指定していました.
6
6
 
7
- こで,`guild_ids`をcog利用側(`main.py`)移そうと考えました.
7
+ のためライブラリとしてcogを作成すると,利用側からはギルドコマンドするか,グローバルコマンドにするか選択できせんでした.
8
8
 
9
- そのために,下記「プログラム例」のように`hoge`コマンドを定義しました.
10
-
11
- しかし実際に`hoge`コマンドを用いると,エラーが発生してしまいました.
12
-
13
- `guild_ids`をcogの利用側でにはどうればいいでしょうか?
9
+ どのようにすれば利用側で`guild_ids`をことができますか?
14
10
 
15
11
 
16
12
 
@@ -24,7 +20,15 @@
24
20
 
25
21
 
26
22
 
27
- ## プログラム例
23
+ ## 試したこと
24
+
25
+
26
+
27
+ 通常コマンドは`ping`のようにデコレータで登録されます.
28
+
29
+ そこで,`hoge`のように`@`を用いずに直接デコレータを適用すればいいのではないかと考えました.
30
+
31
+ しかし実際に`hoge`コマンドを用いると,エラーが発生してしまいました.
28
32
 
29
33
 
30
34
 
@@ -110,11 +114,9 @@
110
114
 
111
115
 
112
116
 
113
- ----
114
117
 
115
118
 
116
-
117
- ## 動作とエラー
119
+ ### 動作とエラー
118
120
 
119
121
 
120
122
 

2

タイトルの編集とコメントの追加

2021/07/24 06:24

投稿

hoge_fuga
hoge_fuga

スコア22

test CHANGED
@@ -1 +1 @@
1
- [discord]利用側でslashコマンドのguild_ids
1
+ [discord]slashコマンドのguild_ids
test CHANGED
@@ -52,6 +52,8 @@
52
52
 
53
53
  self.bot = bot
54
54
 
55
+ # 関数でコマンドを登録(NG)
56
+
55
57
  self.hoge = cog_ext.cog_slash(name='hoge', description='hoge fuga', guild_ids=g_ids)(self.hoge)
56
58
 
57
59
 
@@ -61,6 +63,8 @@
61
63
  await ctx.send('fuga')
62
64
 
63
65
 
66
+
67
+ # デコレータでコマンドを登録(OK)
64
68
 
65
69
  @cog_ext.cog_slash(name='ping', description='ping pong', guild_ids=guild_ids)
66
70
 

1

サンプルを簡略化して書き直した

2021/07/12 08:57

投稿

hoge_fuga
hoge_fuga

スコア22

test CHANGED
@@ -1 +1 @@
1
- [discord]利用側でslashコマンドを使用するサーバを指定する
1
+ [discord]利用側でslashコマンドのguild_ids
test CHANGED
@@ -2,29 +2,15 @@
2
2
 
3
3
  `discord-py-slash-command`を用いてslash commandを扱うcogの開発をしています.
4
4
 
5
- cogの多いため,cogを別々ライブラリして開発し,それらを利用側(`main.py`)でインポートするようにしています
5
+ サンプルコードを参考にcogを作成したですが,`guild_ids`をcogのファイル書かなければいけないこが気なりま
6
6
 
7
- guild commandとするには`guild_ids`が必要なため,以下「プログラム例」のよになってい
7
+ そこで,`guild_ids`をcog利用側(`main.py`)に移そと考えした
8
8
 
9
+ そのために,下記「プログラム例」のように`hoge`コマンドを定義しました.
9
10
 
11
+ しかし実際に`hoge`コマンドを用いると,エラーが発生してしまいました.
10
12
 
11
- このままでもきちんと
12
-
13
- 動作はしますが,cogの数だけ`guild_ids`が存在してしまいます.
14
-
15
- ~~`main.py`側で`guild_ids`を定義するにはどうすればいいでしょうか?~~
13
+ `guild_ids`をcogの利用側でるにはどうすればいいでしょうか?
16
-
17
-
18
-
19
- ## 問題[更新]
20
-
21
-
22
-
23
- 下記の「成功例」のように,クラスの定義を関数内に入れることで,利用側による`guild_ids`の変更が反映されるようになりました.
24
-
25
- ですが,実行時までクラスが分からなくなるなど,欠点が大きいです.
26
-
27
- より良い解決策はありませんか?
28
14
 
29
15
 
30
16
 
@@ -48,39 +34,39 @@
48
34
 
49
35
  ```python
50
36
 
37
+ from typing import List
38
+
51
39
  from discord.ext import commands
52
40
 
53
41
  from discord_slash import cog_ext, SlashContext
54
42
 
55
43
 
56
44
 
57
- guild_ids = [11111111111111111111] # <-- cogの数だけ存在してしまう
45
+ guild_ids = [11111111111111111111]
58
-
59
-
60
46
 
61
47
 
62
48
 
63
49
  class PingCog(commands.Cog):
64
50
 
65
- def __init__(self, bot: commands.Bot):
51
+ def __init__(self, bot: commands.Bot, g_ids: List[int] = None):
66
52
 
67
53
  self.bot = bot
54
+
55
+ self.hoge = cog_ext.cog_slash(name='hoge', description='hoge fuga', guild_ids=g_ids)(self.hoge)
56
+
57
+
58
+
59
+ async def hoge(self, ctx: SlashContext):
60
+
61
+ await ctx.send('fuga')
68
62
 
69
63
 
70
64
 
71
65
  @cog_ext.cog_slash(name='ping', description='ping pong', guild_ids=guild_ids)
72
66
 
73
- async def embed(self, ctx: SlashContext):
67
+ async def ping(self, ctx: SlashContext):
74
68
 
75
69
  await ctx.send('pong')
76
-
77
-
78
-
79
-
80
-
81
- def setup(bot):
82
-
83
- return bot.add_cog(PingCog(bot))
84
70
 
85
71
  ```
86
72
 
@@ -100,11 +86,11 @@
100
86
 
101
87
  from discord_slash import SlashCommand
102
88
 
89
+ import ping
90
+
103
91
 
104
92
 
105
93
  bot_token = 'xxxxxxxxxxxxxxxxxxxxxxxxx'
106
-
107
- # guild_ids = [11111111111111111111] # <-- 固有の値はmain.pyでまとめて管理したい
108
94
 
109
95
 
110
96
 
@@ -112,84 +98,42 @@
112
98
 
113
99
  slash = SlashCommand(bot, sync_commands=True)
114
100
 
115
- bot.load_extension('ping.cog')
101
+ guild_ids = [11111111111111111111]
116
102
 
117
- bot.run(bot_token)
103
+ bot.add_cog(ping.PingCog(bot, guild_ids))
118
104
 
119
105
  ```
120
106
 
121
107
 
122
108
 
123
- ## 失敗例
109
+ ----
124
-
125
- * `main.py`で`guild_ids`を書き換える
126
110
 
127
111
 
128
112
 
129
- `main.py`
113
+ ## 動作とエラー
130
-
131
- ```python
132
-
133
- from ping.cog import guild_ids # <-- この時点でguild_idsを用いてPingCogが定義されてしまう
134
-
135
- guild_ids = [11111111111111111111] # <-- この値は使われない
136
114
 
137
115
 
138
116
 
139
- ...
117
+ `/ping` → `pong`が投稿される(OK)
140
118
 
141
- bot.load_extension('ping.cog')
119
+ `/hoge` → `インタラクションに失敗しました`が表示される(NG)
142
120
 
143
- bot.run(bot_token)
121
+
144
122
 
145
123
  ```
146
124
 
125
+ An exception has occurred while executing command `hoge`:
147
126
 
127
+ Traceback (most recent call last):
148
128
 
149
- ## 成功例
129
+ File "X:XXXXX\venv\lib\site-packages\discord_slash\client.py", line 1185, in invoke_command
150
130
 
151
- * クラスの定義を関数内で行う
131
+ await func.invoke(ctx, **args)
152
132
 
133
+ File "X:XXXXX\venv\lib\site-packages\discord_slash\model.py", line 208, in invoke
153
134
 
135
+ return await self.func(self.cog, *args, **kwargs)
154
136
 
155
- `ping/cog.py`
156
-
157
- ```python
158
-
159
- def define_cog():
160
-
161
- class PingCog(commands.Cog): # <-- 実行時までPingCongの存在すら分からない
137
+ TypeError: hoge() takes 2 positional arguments but 3 were given
162
-
163
- ...
164
-
165
- return PingCog
166
-
167
-
168
-
169
- def setup(bot):
170
-
171
- PingCog = define_cog() # <-- ここでクラスを定義
172
-
173
- return bot.add_cog(PingCog(bot))
174
138
 
175
139
  ```
176
-
177
-
178
-
179
- `main.py`
180
-
181
- ```python
182
-
183
- from ping.cog import guild_ids # <-- ここではまだPingCogは定義されていない
184
-
185
- guild_ids = [11111111111111111111]
186
-
187
-
188
-
189
- ...
190
-
191
- bot.load_extension('ping.cog') # <-- この中のsetupでPingCogが定義される
192
-
193
- bot.run(bot_token)
194
-
195
- ```