shurup77
@shurup77

Как лучше сделать одобрение/отклонение заявок через pycord (discord.py)?

Есть идея сделать систему заявок. Все сделал, кроме одобрения/отклонения по реакции. То есть в спец канал отправилось сообщение, бот поставил реакции: галка, крестик. На галку юзеру летит сообщение о том, что ему одобрили заявку. На крест летит сообщение отказа. Пока сделано криво косо, но так:
код
class ModalTicket(Modal):
    def __init__ (self, *args, **kwargs) -> None:
        super().__init__(
            InputText(
                label="Вы", 
                placeholder="Реальное имя - возраст"),
            InputText(
                label="ФИО"),
            InputText(
                label="стим"),
            InputText(
                label="аывп", 
                style=discord.InputTextStyle.long),
            InputText(
                label="ссылка ютуб", 
                placeholder="Ссылка...", 
                style=discord.InputTextStyle.long),
            *args,
            **kwargs,
        )

    async def callback(self, interaction: discord.Interaction):
        member = interaction.user
        channel = Bot.get_channel(helperschannel)
        embed = discord.Embed(title="Заявка", color=discord.Color.random())
        embed.add_field(name="Имя - Возраст", value=self.children[0].value, inline=False)
        embed.add_field(name="ФИО", value=self.children[1].value, inline=False)
        embed.add_field(name="Steam", value=self.children[2].value, inline=False)
        embed.add_field(name="фыва", value=self.children[3].value, inline=False)
        embed.add_field(name="Ссылка на канал", value=self.children[4].value, inline=False)
        await interaction.response.send_message("Ваша заявка отправлена на рассмотрение команде проекта. Ожидайте!",
                                                ephemeral=True)
        message = await channel.send(member.mention, embed=embed)
        await message.add_reaction("✅")
        await message.add_reaction("❌")
        role1 = discord.utils.get(member.guild.roles, id=sended)
        await member.add_roles(role1)
        emb = discord.Embed()
        emb.add_field(name="Успешно!", value="Ваша заявка отправлена на рассмотрение хелперам проекта.", inline=False)
        await member.send(embed=emb)

        
        def check(arg):
            if helperschannel == arg.channel_id and arg.user_id != bot_id:
                return str(arg.emoji) == '✅' or str(arg.emoji) == '❌'

        payload = await Bot.wait_for('raw_reaction_add', check=check)
        if str(payload.emoji) == '✅':
            role = discord.utils.get(member.guild.roles, id=approved)
            role1 = discord.utils.get(member.guild.roles, id=sended)
            await member.add_roles(role)
            await member.remove_roles(role1)
            emb = discord.Embed()
            emb.add_field(name="Поздравляю!", value="Ваша заявка одобрено, вас ждет собеседование", inline=False)
            await member.send(embed=emb)
        elif str(payload.emoji) == '❌':
            try:
                message = await Bot.wait_for('message', timeout=10)
            except asyncio.TimeoutError:
                emb1 = discord.Embed()
                emb1.add_field(name="Отказано!", value=f"Ваша заявка отклонена. Перепроверьте ее и подайте заново.", inline=False)
                await member.send(embed=emb1)
                return await channel.send(embed=discord.Embed(description=f"Причина отказа не указана."))
            role1 = discord.utils.get(member.guild.roles, id=sended)
            await member.remove_roles(role1)
            emb = discord.Embed()
            emb.add_field(name="Отказано!", value=f"Ваша заявка отклонена. Причина: {message.content}", inline=False)
            await member.send(embed=emb)

проблема в том, что при активных нескольких заявках и одобрении/отклонении одной из активных - одобряются/отклянются все. Как сделать привязку реакции к одному сообщению и как вообще лучше и нормально это написать?
  • Вопрос задан
  • 110 просмотров
Решения вопроса 1
fenrir1121
@fenrir1121 Куратор тега discord.py
Начни с документации
Потому что Bot.wait_for это гигантский костыль. С тех пор как появились взаимодействия его не следует использовать в принципе. В вашем случае у вас все открытые заявки ждут события raw_reaction_add, а check не проверяет на каком сообщении реакция поставлена.
Путей исправления 3:

1 (оптимальный). Разобраться как работают события. В идеале создавать сообщение с 2 кнопками, которые хранят данные от кого они были созданы.

2 (простой). Не использовать события. Создать отдельную команду для подтверждения, куда передается пользователь и статус.

3 (кривой). Оставить все как есть. В сообщении наверняка есть строка от кого оно. Парсить текст сообщения, добавить в check проверку по конкретному пользователю.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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