Загрузка...

Возникла проблема с Select Menu | Discord Bot

Тема в разделе Python создана пользователем mlavr 28 янв 2025. 105 просмотров

  1. mlavr
    mlavr Автор темы 28 янв 2025 0 28 янв 2025
    Нашел вот такой модуль для бота в дискорд: используется команда, которое создает Embed с выбором 3 должностей с помощью SelectMenu. При выборе должности создается форма для записи ответов на соответствующие вопросы. Но при подачи этой формы возникает ошибка: "Что-то пошло не так. повторите попытку." Ниже прикреплю скрины и скрипт команды.

    [IMG][IMG][IMG]

    Python
    import discord
    from discord import ui
    from discord.ext import commands


    class Select(discord.ui.Select):
    def __init__(self):
    options = [
    discord.SelectOption(label='Worker [F]', description='Подать заявку.'),
    discord.SelectOption(label='Worker [M]', description='Подать заявку.'),
    discord.SelectOption(label='Referee', description='Подать заявку.')
    ]
    super().__init__(placeholder='Выбери должность', max_values=1, min_values=1, options=options)

    async def callback(self, interaction: discord.Interaction):
    try:
    if self.values[0] == "Worker [F]":
    await interaction.response.send_modal(WorkerfModal())
    elif self.values[0] == "Worker [M]":
    await interaction.response.send_modal(WorkermModal())
    elif self.values[0] == "Referee":
    await interaction.response.send_modal(RefereeModal())
    else:
    await interaction.response.send_message('Error!', ephemeral=True)
    except Exception as e:
    await interaction.response.send_message(f"Ошибка в Select: {e}", ephemeral=True)
    print(f"Select callback error: {e}")

    class SelectView(discord.ui.View):
    def __init__(self):
    super().__init__(timeout=None)
    self.add_item(Select())


    class WorkerfModal(discord.ui.Modal):
    def __init__(self):
    super().__init__(title='Заявка на Worker [F]') # Передача заголовка через __init__

    # Поля ввода
    self.add_item(discord.ui.InputText(label='Ваше имя и возраст', required=True, max_length=40))
    self.add_item(discord.ui.InputText(label='Был ли опыт на других серверах?', required=True,
    placeholder='Не забудь оставить ссылочки', max_length=100))
    self.add_item(discord.ui.InputText(label='Почему именно ты?', required=True, max_length=500))
    self.add_item(discord.ui.InputText(label='Сколько часов готов уделять серверу в день?',
    required=True, placeholder='Также укажи свой часовой пояс', max_length=50))

    async def on_submit(self, interaction: discord.Interaction):
    try:
    log_channel = discord.utils.get(interaction.guild.channels, id=1310291077156044920)
    if log_channel is None:
    await interaction.response.send_message('Не удалось найти лог-канал. Сообщите администратору.', ephemeral=True)
    return

    user = interaction.user
    emb = discord.Embed(
    title='**Заявка на Worker [F]**',
    description=f'Имя и возраст: {self.children[0].value} \nОпыт: {self.children[1].value} \nО себе: {self.children[2].value} \nВремя и часовой пояс: {self.children[3].value} \n {user.mention}',
    color=0xa33bff
    )
    await interaction.response.send_message('Ваша заявка будет рассмотрена в ближайшее время', ephemeral=True)
    await log_channel.send(embed=emb)
    except Exception as e:
    await interaction.response.send_message(f"Произошла ошибка при отправке заявки: {e}", ephemeral=True)
    print(f"Error in WorkerfModal on_submit: {e}")


    class WorkermModal(discord.ui.Modal):
    def __init__(self):
    super().__init__(title='Заявка на Worker [M]')
    self.add_item(discord.ui.InputText(label='Ваше имя и возраст', required=True, max_length=40))
    self.add_item(discord.ui.InputText(label='Был ли опыт на других серверах?', required=True,
    placeholder='Не забудь оставить ссылочки', max_length=100))
    self.add_item(discord.ui.InputText(label='Почему именно ты?', required=True, max_length=500))
    self.add_item(discord.ui.InputText(label='Сколько часов готов уделять серверу в день?',
    required=True, placeholder='Также укажи свой часовой пояс', max_length=50))

    async def on_submit(self, interaction: discord.Interaction):
    log_channel = discord.utils.get(interaction.guild.channels, id=1310291077156044920)
    if log_channel is None:
    await interaction.response.send_message('Не удалось найти лог-канал. Сообщите администратору.', ephemeral=True)
    return

    user = interaction.user
    emb = discord.Embed(
    title='**Заявка на Worker [M]**',
    description=f'Имя и возраст: {self.children[0].value} \nОпыт: {self.children[1].value} \nО себе: {self.children[2].value} \nВремя и часовой пояс: {self.children[3].value} \n {user.mention}',
    color=0xa33bff
    )
    await interaction.response.send_message('Ваша заявка будет рассмотрена в ближайшее время', ephemeral=True)
    await log_channel.send(embed=emb)


    class RefereeModal(discord.ui.Modal):
    def __init__(self):
    super().__init__(title='Заявка на Referee')
    self.add_item(discord.ui.InputText(label='Ваше имя и возраст', required=True, max_length=40))
    self.add_item(discord.ui.InputText(label='Был ли опыт на других серверах?', required=True,
    placeholder='Не забудь оставить ссылочки', max_length=100))
    self.add_item(discord.ui.InputText(label='Почему именно ты?', required=True, max_length=500))
    self.add_item(discord.ui.InputText(label='Сколько часов готов уделять серверу в день?',
    required=True, placeholder='Также укажи свой часовой пояс', max_length=50))

    async def on_submit(self, interaction: discord.Interaction):
    log_channel = discord.utils.get(interaction.guild.channels, id=1310291077156044920)
    if log_channel is None:
    await interaction.response.send_message('Не удалось найти лог-канал. Сообщите администратору.', ephemeral=True)
    return

    user = interaction.user
    emb = discord.Embed(
    title='**Заявка на Referee**',
    description=f'Имя и возраст: {self.children[0].value} \n'
    f'Опыт: {self.children[1].value} \n'
    f'О себе: {self.children[2].value} \n'
    f'Время и часовой пояс: {self.children[3].value} \n'
    f'{user.mention}',
    color=0xa33bff
    )
    await interaction.response.send_message('Ваша заявка будет рассмотрена в ближайшее время', ephemeral=True)
    await log_channel.send(embed=emb)



    class StaffModal(commands.Cog):
    def __init__(self, bot: commands.Bot):
    self.bot = bot

    @commands.slash_command(
    name='staff',
    description='Регистрация на персонал')
    @commands.has_permissions(administrator=True)
    async def create_staff_modal(self, ctx):
    emb = discord.Embed(
    title='**Подача заявки на вступление в Стафф**',
    description="Здесь вы можете подать свою заявку на вступление в Стафф.\nУбедительная просьба не менять никнейм после подачи заявки, так как в данном случае у нас не будет возможности связаться с вами.",
    color=0xA33BFF
    )
    await ctx.send(embed=emb, view=SelectView())


    def setup(bot: commands.Bot) -> None:
    bot.add_cog(StaffModal(bot))
     
  2. mlavr
    mlavr Автор темы 24 фев 2025 0 28 янв 2025
    если кому-то нужно исправленный вариант, пишите
     
    1. richmen1222
      mlavr, ну ты вкратце обрисуй, с подключением напутал? Просто по коду, я не нашел у тебя ошибок
    2. mlavr Автор темы
      richmen1222, если честно, щас смотрю на код и не могу точно сказать из-за чего все таки заработало. Но я изменил функцию callback в модуле Select и модуль SelectView переместил ниже модулей с ролями (прибег к помощи нейросети).
      Исправленный вариант callback:

      async def callback(self, interaction: discord.Interaction):
      role = self.values[0]
      if role == "Worker [F]":
      await interaction.response.send_modal(WorkerfForm("Worker [F]"))
      elif role == "Worker [M]":
      await interaction.response.send_modal(WorkermForm("Worker [M]"))
      else:
      await interaction.response.send_message("Неизвестная роль.", ephemeral=True).

      Так же убрал приписку discord в скобках модуля, и там где она в них используется.
      Точно не знаю что из этого помогло избавится от ошибки, думаю ты лучше поймешь (может быть что-то еще пропустил, но вроде бы все остальное осталось то же)
Top
Загрузка...