@F1azy

Как мне добавить команду по которой будет вызываться class MyModal?

У меня есть код:
import disnake
from disnake.ext import commands
from disnake import TextInputStyle

intents = disnake.Intents.default()
intents.message_content = True
intents.guilds = True
intents.members = True

bot = commands.Bot(command_prefix="!", intents=intents)

TARGET_CHANNEL_ID = 1241843585632964629  # Замените на ваш канал
ROLE_ID = 1241850021914214531  # Замените на ID вашей роли
EMBED_MESSAGE_ID = None  # Переменная для хранения ID эмбед-сообщения


@bot.slash_command()
async def tags(inter: disnake.AppCmdInter):
    await inter.response.send_modal(modal=MyModal(inter.user.id))
    """Sends a Modal to create a tag."""


class AcceptRejectView(disnake.ui.View):
    def __init__(self, user_id):
        super().__init__(timeout=None)
        self.user_id = user_id

    @disnake.ui.button(label="Принять", style=disnake.ButtonStyle.green)
    async def accept_button(self, button: disnake.ui.Button, interaction: disnake.MessageInteraction):
        guild = interaction.guild
        member = guild.get_member(self.user_id)
        role = guild.get_role(ROLE_ID)
        if member and role:
            await member.add_roles(role)
            await interaction.response.send_message(f"Вы приняли предложение! Роль {role.name} выдана пользователю.",
                                                    ephemeral=True)
        else:
            await interaction.response.send_message("Не удалось выдать роль. Пользователь или роль не найдены.",
                                                    ephemeral=True)

    @disnake.ui.button(label="Отклонить", style=disnake.ButtonStyle.red)
    async def reject_button(self, button: disnake.ui.Button, interaction: disnake.MessageInteraction):
        guild = interaction.guild
        member = guild.get_member(self.user_id)
        if member:
            await member.send("Ваша заявка была отклонена.")
            await interaction.response.send_message("Вы отклонили предложение! Пользователю отправлено уведомление.",
                                                    ephemeral=True)
        else:
            await interaction.response.send_message("Не удалось отправить уведомление. Пользователь не найден.",
                                                    ephemeral=True)


class MyModal(disnake.ui.Modal):
    def __init__(self, user_id):
        self.user_id = user_id
        components = [
            disnake.ui.TextInput(
                label="Ваша ссылка",
                placeholder="",
                custom_id="description",
                style=TextInputStyle.paragraph,
            ),
        ]
        super().__init__(title="Регистрация", components=components)

    async def callback(self, interaction: disnake.ModalInteraction):
        user_input = interaction.text_values["description"]

        embed = disnake.Embed(
            title="Регистрация",
            description=f"Ваша ссылка: {user_input}",
            color=disnake.Color.blurple()
        )

        target_channel = bot.get_channel(TARGET_CHANNEL_ID)
        if target_channel:
            view = AcceptRejectView(self.user_id)
            await target_channel.send(embed=embed, view=view)
            await interaction.response.send_message("Сообщение отправлено в целевой канал!", ephemeral=True)
        else:
            await interaction.response.send_message("Целевой канал не найден.", ephemeral=True)


@bot.event
async def on_ready():
    global EMBED_MESSAGE_ID
    print(f'Logged in as {bot.user}!')

    # Отправка эмбед-сообщения и добавление реакции
    target_channel = bot.get_channel(TARGET_CHANNEL_ID)
    if target_channel:
        embed = disnake.Embed(
            title="Нажмите на реакцию",
            description="Добавьте реакцию на это сообщение для регистрации",
            color=disnake.Color.blurple()
        )
        message = await target_channel.send(embed=embed)
        EMBED_MESSAGE_ID = message.id
        await message.add_reaction("✅")

@bot.event
async def on_reaction_add(reaction, user):
    if user.bot:
        return

    if reaction.message.id == EMBED_MESSAGE_ID and str(reaction.emoji) == "✅":
        ("тут должна быть строчка которая вызывает MyModal")


И мне нужно чтобы после ивента
if reaction.message.id == EMBED_MESSAGE_ID and str(reaction.emoji) == "✅":

была команда которая вызывала бы class MyModal
  • Вопрос задан
  • 44 просмотра
Решения вопроса 1
fenrir1121
@fenrir1121 Куратор тега discord.py
Начни с документации
Никак. Модальное окно можно выдать только в ответ на взаимодействие, коими реакции не являются.
Чтобы использовать модальные окна переписывайте на использование кнопок, вместо реакций.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы