Discord.py:我该如何从服务器获得随机消息



如果我想为我的机器人实现一个命令(使用Discord.py(,该命令将从服务器检索一条随机消息(然后该命令将提示用户猜测谁是原始消息作者(,我该怎么做?我可以得到一个随机的频道,但我不确定一旦我知道我想从哪个频道提取,我会如何从该频道获取随机消息。我必须从该通道的整个历史记录中检索每条消息的列表,每次使用该命令都会非常耗时。我想我可以将来自整个服务器的所有消息ID存储在代码中的列表中,并且我可以每15或30分钟左右在一个新线程上更新一次列表,但我觉得这仍然是一个效率低下的选项,我不知道每个通道可能需要多长时间才能检索到数十万条消息。这里还有更好的选择吗?还是仅此而已?

有两种方法可以做到这一点:

第一种是使用某种类型的数据库,在其中存储发送的每条消息。第二种是通过Guild.text_channels和TextChannel.history((获取每个通道中的每个消息

我假设你不想使用数据库。

基本上,你需要迭代公会的每个text_channel,然后为每个信道调用它上的.history(limit=None(。(请注意,这可能需要非常、非常、非常长的时间。(然后你可以在生成的消息列表上调用random.cochoice((,然后发送该消息。

这里有一个例子:

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以下,甚至可以使用history((的aroundkwargs。你可以这样做:

  1. 选择从现在到创建此服务器之间的随机日期
  2. 使用around=the_random_date调用.history((
  3. 将限制保持在100

事实上,如果我做出这样的命令,这是我唯一的方式。

最新更新