Как определить кол-во различный реакций, которые находятся на последнем сообщении бота?

Пытался написать бота для голосований и застрял на этапе посчёта голосов. Вот так должно было быть:

5ef06f7f7d552137784749.png

Но при 2 Да и 1 Нет, он отвечает также. Никто не знает как сделать код рабочим?
Вот мой код:
@Bot.event
async def on_raw_reaction_add(self, payload):
    channel = Bot.get_channel(payload.channel_id) # получаем объект канала
    message = await channel.fetch_message(payload.message_id) # получаем объект сообщения
    for emoji in message:
        emoji = payload.emoji
        if emoji == '✅':
            global Y
            Y += 1
        elif emoji == '❌':
            global N
            N += 1
async def on_raw_reaction_remove(self, payload):
    channel = Bot.get_channel(payload.channel_id) # получаем объект канала
    message = await channel.fetch_message(payload.message_id) # получаем объект сообщения
    for emoji in message:
        emoji = payload.emoji # реакция пользователя
        if emoji == '✅':
            global Y
            Y -= 1
        elif emoji == '❌':
            global N
            N -= 1
if Y > N:
    Result = 'Принято'
elif Y == N:
    Result = 'Отказано(Да = Нет)'
else:
    Result = 'Отказано'
@Bot.command(pass_context= True)
@commands.has_permissions(administrator=True)
async def endvote(ctx):
    emb = discord.Embed(title=f'Окончено голосование.', description = 'Результат: ' + str(Result), colour=discord.Color.purple())
    message = await ctx.send(embed=emb) # Возвращаем сообщение после отправки
Y = 0
N = 0
  • Вопрос задан
  • 67 просмотров
Решения вопроса 1
Всё что в данном коде неверно:
  1. @Bot.event только у события добавления реакции. Декоратор события должен быть у всех событий.
  2. Аргумент self у событий есть только в модулях (cogs). И представляет собой сам модуль
  3. if Y > N: ... выполняется только один раз - при запуске файла. Необходимо сделать чтобы оно либо менялось при обновлении (получении/удалении реакции), либо непосредственно перед выводом результата
  4. Ключевой (kwarg) аргумент pass_context не существует в текущей версии discord.py. Контекст передаётся в функцию команды первым аргументом всегда (за исключением момента с нахождением команды в вышеупомянутом "модуле")
  5. Объект "сообщение" не итерируемый
  6. PEP8 Naming Conventions: "CamelCase" названия переменных обозначают classы.


Один из вариантов решения:
voting_message = None
@Bot.command()
@commands.has_permissions(administrator=True)
async def startvote(ctx):
    embed = discord.Embed(...)  # embed goes here
    voting_message = await ctx.send(embed=embed)

@Bot.command()
@commands.has_permissions(administrator=True)
async def endvote(ctx):
    msg = await bot.get_channel(voting_message.channel.id).fetch_message(voting_message.id)
    y = discord.utils.get(msg.reactions, emoji="\N{WHITE HEAVY CHECK MARK}").count
    n = discord.utils.get(msg.reactions, emoji="\N{CROSS MARK}").count
    if y>n:
        result = "Принято"
    elif y==n:
        result = "Отказано (да = нет)"
    else:
        result = "Отказано"
    emb = discord.Embed(title=f'Окончено голосование.', description = 'Результат: ' + result, colour=discord.Color.purple())
    return await ctx.send(embed=emb) # **Возвращаем** сообщение после отправки.
    y, n = 0, 0
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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