如果我想为我的机器人实现一个命令(使用 Discord.py),它会从服务器检索随机消息(然后该命令会提示用户猜测原始消息作者是谁),我该怎么做关于这样做?我可以获得一个随机频道,但我不确定一旦我知道我想从哪个频道拉取信息,我将如何从该频道获取随机消息。我必须从该频道的整个历史记录中检索每条消息的列表,每次使用该命令时都会非常耗时。我想我可以将来自整个服务器的所有消息 ID 存储在代码的列表中,并且我可以每 15 或 30 分钟左右更新一个新线程上的列表,但我觉得这仍然是一个低效的选择,并且我不知道在每个频道检索潜在的数十万条消息需要多长时间。这里有没有更好的选择,或者就这样?
答案 0 :(得分:0)
有两种方法可以做到这一点:
第一种是使用某种数据库,您可以在其中存储发送的每条消息。第二个是通过 Guild.text_channels 和 TextChannel.history()
获取每个通道中的每条消息我假设您不想使用数据库。
基本上,您需要遍历公会的所有 text_channel,然后为每个频道调用 .history(limit=None) 。 (请注意,这可能需要非常、非常、非常长的时间来完成。)然后您可以在结果消息列表上调用 random.choice(),然后发送该消息。
这是一个例子:
all_messages = []
for channel in ctx.guild.text_channels:
async for message in channel.history(limit=None):
all_messages.append(message)
message_to_send = random.choice(all_messages)
await ctx.send(message_to_send.system_content) # see note below
注意:我总是使用 message.system_content 而不是 message.content,因为 system_content 也适用于加入消息。不过,两者都很好。
这行得通,但需要很长的时间才能实现。我建议将限制保持在 500 以下,或者甚至可以使用 around
kwargs of history()。你可以这样做:
事实上,如果我要发出这样的命令,这是我唯一做的方式。