Я хочу создать команду, чтобы при ее использовании у меня появлялась форма для заполнения, и мои ответы отправлялись мне в DM и впоследствии размещались в другом канале. Ниже приведен код, который я использовал (я ссылался на несколько руководств на YouTube) в группе с именем modal
; имена и номера немного изменены из соображений конфиденциальности и прочего.
Я могу нормально запускать бота без каких-либо ошибок, и все мои остальные процессоры и команды работают как обычно. Однако, когда я использую команду модальной формы, бот вообще не отвечает, несмотря на то, что в консоли не выводится никаких ошибок.
Числа 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
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
Где я ошибся раньше? Почему консоль печатает их при запуске бота? И как мне заставить консоль печатать вместо вопросов мои ответы?
Консоль (когда я использовал команду)
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))
Когда запускаю бота, консоль печатает mt2 mt3 mt4 mt5 (почему???)
Все эти отпечатки находятся непосредственно в вашем классе и будут вызываться при запуске программы. mt0
, mt1
, mt6
и выше содержатся внутри функций и поэтому будут выполняться только при вызове этих функций.
Что касается ваших ответов, вы печатаете непосредственно свои TextInputs, вместо этого вам следует распечатать значение для каждого из них:
print([t.value for t in a])
Если у вас возникли проблемы с модальными окнами, вот хороший пример базового модального окна. Он также реализует on_error
, который вы можете использовать для решения первоначальной проблемы с помощью модального окна из 5 вопросов.
реализован on_error и попробуйте... кроме; оказывается, что модальные окна не работали из-за неверных меток запросов длиной не более 45 символов и заполнителей не более 100 символов; я еще раз проверил словарь, которым пользовался, и обнаружил, что превысил этот предел примерно в 3 раза, лол
насколько я знаю, Discord может выявлять ошибки (чтобы сервер продолжал работать, даже если они есть) и скрывать их. Возможно, потребуется изменить настройки в
logging
, чтобы увидеть ошибки. Настройка ведения журнала