尝试列出带有特定反应表情符号的“投票最多”的消息

时间:2018-11-15 20:49:15

标签: python discord.py

尝试执行以下操作:在其中输入命令并获得带有响应表情符号:goldmedal:的前5条消息的列表。当进入bot时,一切都很好,但是当执行命令时,它会开始对它可以找到的每条消息进行无限循环的响应。并且不显示“金牌”值,而是显示对该特定邮件的所有反应。 https://cdn.discordapp.com/attachments/511938736594878478/512733361819746314/unknown.png

import discord
from discord import Game
from discord.ext.commands import Bot
from discord import Channel
from discord.utils import get
from discord.ext import commands

bot = Bot(command_prefix='!')


    def num_reactions(message):
        return sum(react_count for react in message.reactions)

    @bot.command(pass_context=True)
    async def most_reacted(ctx, channel: Channel):
        most_reactions = most_reactions_message = None
        goldmedal_emoji = get(ctx.message.server.emojis, name="goldmedal_emoji")
        async for message in bot.logs_from(channel):
            num_reactions_message = ([goldmedal_emoji])
            num_reactions_message = num_reactions(message)
            if not most_reactions or num_reactions_message > most_reactions:
                most_reactions = num_reactions_message
                most_reactions_message = message
                await bot.say(f"{most_reactions_message.content} has the most Gold Medals with {most_reactions}")

1 个答案:

答案 0 :(得分:0)

此处的功能:

def num_reactions(message):
    return sum(react_count for react in message.reactions)

仅获取消息的不同反应次数,而不是与金牌表情符号反应的次数。您可能想要这样的东西:

def num_reactions(message):
    for react in message.reactions:
        if react.emoji.name === "goldmedal_emoji":
            return react.count

您的方法还存在很多长期问题:

  1. 它仅从日志中获取最后100条消息,因为logs_from()的默认限制是100(除非这正是您想要的)
  2. 机器人必须在每次运行命令时搜索频道,这将是缓慢的

我可以建议一种不同的方法,在内存中存储最高的5个(希望是不是RAM,而是数据库,或者其他持久性存储,如文本文件,以防您的机器人崩溃),当一条新消息包含一个“ goldmedal_emoji”反应的计数更高。