我想创建一个命令,这样当我使用它时,会弹出一个表格供我填写,我的回复将通过 DM 发送给我,然后发布在另一个频道中。下面是我在名为
modal
的小组中使用的代码(我参考了多个 YouTube 教程);由于隐私和其他原因,姓名和号码略有更改。
我能够正常运行机器人,没有任何错误,并且所有其他齿轮和命令都正常工作。但是,当我使用模态表单命令时,机器人根本没有响应,尽管控制台中没有打印任何错误。
启动机器人时,在控制台中会打印数字
2
、3
、4
、5
、6
、7
和 8
(为什么会发生这种情况??? ),并且当我使用模态形式命令时,控制台中仅打印数字0
,这可能意味着await interaction.response.send_modal(myModal())
由于某种原因无法工作。
我期望发生什么当我
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
15
15
15
15
16
17
Discord 向我展示了一个模态表单,其中包含 5 个问题需要完成(均为必填,段落,1000 个字符限制),并且在我完成模态表单后,包含我的回复的嵌入内容将发送到文本通道和我的私信在我完成模态表单后,机器人会使用包含我的用户名和用户 ID 的消息来响应命令
到底发生了什么
18
19
20
2
3
4
5
(为什么???)当我使用命令时,控制台打印
6
(为什么???)机器人不响应命令(几秒钟后显示“应用程序未响应”)文件:
7
8
文件:
0
commands/slash_commands_modal.py
编辑我尝试从头开始并制作一个包含三个问题的测试模式,如下面的代码所示。这次机器人命令和
模式按预期工作。但是,控制台
(我希望控制台打印对问题的回答,而控制台打印问题本身)。 请注意,与上面的代码不同,我根本没有更改下面的代码。 我预期会发生什么:
当我使用命令时,控制台打印 import discord
from discord import app_commands, ui
from discord.ext import commands
from misc.dicts import DICT
class myModal(ui.Modal, title="Why not working"):
print("2") # debug no.2
a1 = ui.TextInput(
label=DICT["a"][0],
placeholder=DICT["ax"][0],
style=discord.TextStyle.paragraph,
max_length=1000,
required=True
)
print("3") # debug no.3
a2 = ui.TextInput(
label=DICT["a"][1],
placeholder=DICT["ax"][1],
style=discord.TextStyle.paragraph,
max_length=1000,
required=True
)
print("4") # debug no.4
a3 = ui.TextInput(
label=DICT["a"][2],
placeholder=DICT["ax"][2],
style=discord.TextStyle.paragraph,
max_length=1000,
required=True
)
print("5") # debug no.5
a4 = ui.TextInput(
label=DICT["a"][3],
placeholder=DICT["ax"][3],
style=discord.TextStyle.paragraph,
max_length=1000,
required=True
)
print("6") # debug no.6
a5 = ui.TextInput(
label=DICT["a"][4],
placeholder=DICT["ax"][4],
style=discord.TextStyle.paragraph,
max_length=1000,
required=True
)
print("7") # debug no.7
a = [a1,a2,a3,a4,a5]
print("8") # debug no.8
async def on_submit(self, interaction: discord.Interaction):
print("9") # debug no.9
channel = self.bot.get_channel(9999999999999999999)
print("10") # debug no.10
d = f"- Username: **{interaction.user.name}**\n- User ID: ||**`{interaction.user.id}`**||"
print("11") # debug no.11
e = discord.Embed(title=f"Form", description=d, colour=0xe74c3c)
print("12") # debug no.12
e.set_footer(text="Form Response")
print("13") # debug no.13
q = DICT["a"]
print("14") # debug no.14
for i, j in zip(q, self.a):
e.add_field(name=i, value=j, inline=False)
print("15") # debug no.15
await channel.send(embed=e)
print("16") # debug no.16
await interaction.response.send_message(f"- Username: **{interaction.user.name}**\n- User ID: ||**`{interaction.user.id}`**||\n\nThe form is done yay", ephemeral=True)
print("17") # debug no.17
user = self.bot.get_user(interaction.user.id)
print("18") # debug no.18
await user.create_dm()
print("19") # debug no.19
await user.dm_channel.send(embed=e)
print("20") # debug no.20
class SlashCmd_Modal(commands.GroupCog, group_name="modal"):
def __init__(self, bot):
self.bot = bot
@app_commands.command(name="form", description="a description")
@app_commands.describe(role="another description")
@app_commands.choices(role = [
app_commands.Choice(name="A", value="a"),
app_commands.Choice(name="B", value="b"),
app_commands.Choice(name="C", value="c"),
app_commands.Choice(name="D", value="d")
])
async def form(self, interaction: discord.Interaction, role: str):
if role == "a":
print("0") # debug no.0
await interaction.response.send_modal(myModal())
print("1") # debug no.1
elif role == "b":
... # similar kind of form but different class
elif role == "c":
... # similar kind of form but different class
elif role == "d":
... # similar kind of form but different class
async def setup(bot):
await bot.add_cog(SlashCmd_Modal(bot))
misc/dict.py
DICT = {
"a": [ # questions
"Q1",
"Q2",
"Q3",
"Q4",
"Q5"
],
"ax": [ # placeholders
"P1",
"P2",
"P3",
"P4",
"P5"
]
}
mt0
mt1
mt2
mt3
mt4
mt5
mt6
mt7
实际发生了什么:当我
启动机器人时,控制台打印
[<response to q1>, <response to q2>, <response to q3>]
mt8
mt9
mt2
(为什么???)当我使用命令时,控制台打印
mt3
mt4
mt5
mt0
mt1
mt6
mt7
我之前哪里做错了?为什么控制台在机器人启动时打印这些内容?如何让控制台打印我的回答而不是问题?
控制台(当我使用命令时)
[<details of q1>, <details of q2>, <details of q3>]
mt8
mt9
为了更快地沟通,请随时在 Discord 上给我发私信 (@ajgoh)。
当我启动机器人时,控制台打印 mt2 mt3 mt4 mt5 (为什么???) 所有这些打印都直接在您的班级中,并将在您启动程序时调用。
mt0
mt1
mt6
mt7
[<TextInput label='first question' placeholder=None required=True>, <TextInput label='second question' placeholder='a placeholder' required=True>, <TextInput label='third question' placeholder='another placeholder' required=True>]
mt8
mt9
commands/slash_commands_modaltest.py
和及以上内容包含在函数内,因此仅在调用这些函数时才会执行。
import discord from discord import app_commands, ui from discord.ext import commands class myModal(ui.Modal, title="test modal"): print("mt2") a1 = ui.TextInput( label="first question" ) print("mt3") a2 = ui.TextInput( label="second question", placeholder="a placeholder" ) print("mt4") a3 = ui.TextInput( label="third question", placeholder="another placeholder", style=discord.TextStyle.paragraph, max_length=1000, required=True ) print("mt5") async def on_submit(self, interaction: discord.Interaction): print("mt6") a = [self.a1, self.a2, self.a3] print("mt7") print(a) print("mt8") await interaction.response.send_message("modal successful") print("mt9") class SlashCmd_Modal(commands.GroupCog, group_name="modal"): def __init__(self, bot): self.bot = bot @app_commands.command(name="test", description="A Discord modal test command.") async def application(self, interaction: discord.Interaction): print("mt0") await interaction.response.send_modal(myModal()) print("mt1") async def setup(bot): await bot.add_cog(SlashCmd_Modal(bot))
关于您的回复,您直接打印您的 TextInputs,您应该打印每个输入的值:
mt0
如果您在使用模态时遇到困难,这里有一个基本模态的好例子。它还实现了
mt1
,您可以用它来通过 5 个问题模式解决您的初始问题。