如果我想为我的机器人实现一个命令(使用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((的around
kwargs。你可以这样做:
- 选择从现在到创建此服务器之间的随机日期
- 使用around=the_random_date调用.history((
- 将限制保持在100
事实上,如果我做出这样的命令,这是我唯一的方式。