我正在尝试使用我找到的这个代码片段来检查用户在Discord服务器中的任何频道上发送消息的最后一次。我找到的源代码是最旧的消息,但看起来做了我需要的事情-但我在channel.history(). find上得到了一个错误。错误是:
AtrributeError: async_generator object has no attribute "find"
Can .find不能和channel.history一起使用,还是我用错了?
#for a given user, check channel history for posts made by that user.
@bot.command()
async def lastMessage(ctx):
users_id = ctx.author.id
oldestMessage = None
for channel in ctx.guild.text_channels
fetchMessage = await channel.history().find(lambda m: m.author.id == users_id)
if fetchMessage is None:
continue
if oldestMessage is None:
oldestMessage = fetchMessage
else:
if fetchMessage.created_at > oldestMessage.created_at:
oldestMessage = fetchMessage
if (oldestMessage is not None):
await ctx.send(f"Oldest message is {oldestMessage.content}")
else:
await ctx.send("No message found.")
然后我通过循环消息来完成它。这将花费大量的时间(比如24小时)。我想我可以通过反向循环消息来保存一点时间,也许可以将所有消息保存到列表中,而不是在循环中重新获取。有没有更好/更快的方法来使用lambda完成这一点?
for channel in ctx.guild.text_channels:
fetchMessage = None
async for message in ctx.channel.history(limit=2000):
if message.author == member:
fetchMessage = message
if newestMessage is None:
newestMessage = fetchMessage
else:
if fetchMessage.created_at < newestMessage.created_at:
newestMessage = fetchMessage
print(newestMessage)
2条答案
按热度按时间xnifntxz1#
获取的历史记录是按顺序的。因此,如果您发现第一个事件,您发现的是该频道中最新的事件,您可以继续下一个。其次,您可以指定一个after命令,例如6个月,以防止脚本爬回到频道开始的所有方式。
此外,你也可以为所有用户做一次,并将他们存储在字典,csv文件等,并运行它每周左右,你会有一个查找,最坏的情况下只需要几秒钟。
m1m5dgzv2#
您尝试使用的find也可以是
discord.utils.find
(可能更快的是get):而另一个答案应该要慢得多--想想dict的想法,它将比任何实时查找方法都要快,但初始成本很高。