Как можно считать кол-во реакций на сообщении, и сравнить их
Есть бот для голосований. Голосование он начинает, а вот не выходит сделать подсчёт реакций. Вот пример как должно было работать:
Всё робит, кроме подсчёта, никто не знает как можно посчитать реакции? Мой нерабочий код:
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
Ответы (1 шт):
Автор решения: Smoliarick
→ Ссылка
Можно создать в классе переменную message_id и в ней сохранить id сообщения для голосования. Далее найти это сообщения и просто взять количество реакций с этого сообщения (не будет необходимости считать самому). Минимальный пример:
client = commands.Bot(command_prefix='!')
message_id = 0 # Переменная для сообщения голосования
@client.command(pass_context=True)
@commands.has_permissions(administrator=True)
async def startvote(ctx, content):
channel = ctx.channel
emb = discord.Embed(title=f'Голосование.', description='Голосуем за ' + str(content),
colour=discord.Color.purple())
message = await ctx.send(embed=emb)
await message.add_reaction('✅')
await message.add_reaction('❌')
global message_id # Если используется класс, то необходимо создать в классе переменную
message_id = message.id # Сохраняем id сообщения для голосования
@client.command(pass_context=True)
@commands.has_permissions(administrator=True)
async def endvote(ctx):
channel = ctx.channel
message = await channel.fetch_message(message_id) # Ищем сообщение
# Фильтруем реакции, чтобы остались только нужные
resactions = [reaction for reaction in message.reactions if reaction.emoji in ['✅', '❌']]
# Превращаем результат голосования в строку (вычитаем 1 из количества, значение по умолчанию)
result = ''
for reaction in resactions:
result += reaction.emoji + ": " + str(reaction.count - 1)
emb = discord.Embed(title=f'Результат.', description='Итог голосования: ' + str(result),
colour=discord.Color.purple())
await ctx.send(embed=emb)
Результат:
Если необходимо просто получить количество реакций, то можно воспользоваться таким способом (пример из кода выше):
# Функция endvote
reactions = {'✅': 0, '❌': 0}
for reaction in resactions:
reactions[reaction.emoji] = reaction.count - 1
В итоге получим словарь, где количество реакций можно найти по emoji: reactions['✅'].

