python 不一致PY使用Lambda与channel.history().find(),可能吗?尝试查找所有用户的最新消息(活动检查)

93ze6v8z  于 2023-01-29  发布在  Python
关注(0)|答案(2)|浏览(88)

我正在尝试使用我找到的这个代码片段来检查用户在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)
xnifntxz

xnifntxz1#

获取的历史记录是按顺序的。因此,如果您发现第一个事件,您发现的是该频道中最新的事件,您可以继续下一个。其次,您可以指定一个after命令,例如6个月,以防止脚本爬回到频道开始的所有方式。

newestMessage = None
      for channel in ctx.guild.text_channels: # theoretically you could parallise these too
            async for message in ctx.channel.history(limit=2000, after=...):
           
                if message.author == member:
                    if newestMessage is None:
                        newestMessage = message
                    else:
                        if message.created_at < newestMessage.created_at:
                            newestMessage = message
                    break # User was found no need to continue looking in this channel
 
      if newest Message is None:
          # user never talked
      else:
          # was found

此外,你也可以为所有用户做一次,并将他们存储在字典,csv文件等,并运行它每周左右,你会有一个查找,最坏的情况下只需要几秒钟。

m1m5dgzv

m1m5dgzv2#

您尝试使用的find也可以是discord.utils.find(可能更快的是get):

msg = await discord.utils.get(channel.history(), author__name='Dave')

而另一个答案应该要慢得多--想想dict的想法,它将比任何实时查找方法都要快,但初始成本很高。

相关问题