Команда модальной формы Discord.py не дает ответа, несмотря на отсутствие ошибок в консоли

Я хочу создать команду, чтобы при ее использовании у меня появлялась форма для заполнения, и мои ответы отправлялись мне в DM и впоследствии размещались в другом канале. Ниже приведен код, который я использовал (я ссылался на несколько руководств на YouTube) в группе с именем modal; имена и номера немного изменены из соображений конфиденциальности и прочего.

Я могу нормально запускать бота без каких-либо ошибок, и все мои остальные процессоры и команды работают как обычно. Однако, когда я использую команду модальной формы, бот вообще не отвечает, несмотря на то, что в консоли не выводится никаких ошибок.

Числа 2, 3, 4, 5, 6, 7 и 8 печатаются в консоли при запуске бота (почему это происходит???), а когда я использовал команду модальной формы, в консоли печатается только число 0 консоль, что может означать, что await interaction.response.send_modal(myModal()) по какой-то причине не работает.


Чего я ожидал

  • Когда я использую команду, консоль печатает 0123456789101112131415151515151617181920
  • Discord показывает мне модальную форму с 5 вопросами для заполнения (все обязательные, абзац, ограничение в 1000 символов), а встраивание, содержащее мои ответы, отправляется в текстовый канал и в мои личные сообщения после того, как я заполню модальную форму.
  • После заполнения модальной формы бот отвечает на команду сообщением, содержащим мое имя пользователя и идентификатор пользователя.

Что на самом деле произошло

  • Когда я запускаю бота, консоль печатает 2345678 (почему???)
  • Когда я использую команду, консоль печатает 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"
]
}

РЕДАКТИРОВАТЬ Я попытался начать с нуля и создать тестовое окно с тремя вопросами, как показано в коде ниже. На этот раз команда бота и модальные окна работают как положено. Однако консоль не печатает так, как я ожидал (я ожидал, что консоль напечатает ответы на вопросы, в то время как консоль напечатает сами вопросы).

Обратите внимание: в отличие от приведенного выше кода, я вообще не менял код ниже.

Чего я ожидал:

  • Когда я использую команду, консоль печатает mt0mt1mt2mt3mt4mt5mt6mt7[<response to q1>, <response to q2>, <response to q3>]mt8mt9

Что произошло на самом деле:

  • Когда я запускаю бота, консоль печатает mt2mt3mt4mt5 (почему???)
  • Когда я использую команду, консоль печатает mt0mt1mt6mt7[<details of q1>, <details of q2>, <details of q3>]mt8mt9

Где я ошибся раньше? Почему консоль печатает их при запуске бота? И как мне заставить консоль печатать вместо вопросов мои ответы?


Консоль (когда я использовал команду)

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))

насколько я знаю, Discord может выявлять ошибки (чтобы сервер продолжал работать, даже если они есть) и скрывать их. Возможно, потребуется изменить настройки в logging, чтобы увидеть ошибки. Настройка ведения журнала

furas 10.06.2024 22:37
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда запускаю бота, консоль печатает mt2 mt3 mt4 mt5 (почему???)

Все эти отпечатки находятся непосредственно в вашем классе и будут вызываться при запуске программы. mt0, mt1, mt6 и выше содержатся внутри функций и поэтому будут выполняться только при вызове этих функций.

Что касается ваших ответов, вы печатаете непосредственно свои TextInputs, вместо этого вам следует распечатать значение для каждого из них:

print([t.value for t in a])

Если у вас возникли проблемы с модальными окнами, вот хороший пример базового модального окна. Он также реализует on_error, который вы можете использовать для решения первоначальной проблемы с помощью модального окна из 5 вопросов.

реализован on_error и попробуйте... кроме; оказывается, что модальные окна не работали из-за неверных меток запросов длиной не более 45 символов и заполнителей не более 100 символов; я еще раз проверил словарь, которым пользовался, и обнаружил, что превысил этот предел примерно в 3 раза, лол

AJ Goh 11.06.2024 07:15

Другие вопросы по теме