【问题标题】:for_log generator returns no messagesfor_log 生成器不返回任何消息
【发布时间】:2019-02-19 21:13:27
【问题描述】:

我试图让这个 for_log 协程工作,我想做的是删除特定月份的所有消息,在这种情况下是 8 月,我浏览了 Internet 和文档,并在另一个问题的帮助下我张贴在这里并想出了这个:

@Client.command(pass_context = True)
async def clear(ctx, number: int, month, year):
    def around_month(month, year):
        begin = datetime.strptime(f'1 {month} {year}', '%d %b %Y')
        if begin.month == 12:
            end = datetime(begin.year+1, 1, 1)
        else:
            end = datetime(begin.year, begin.month, 1)
        return begin, end

    if ctx.message.author.id not in AdminIDs:
        await Client.send_message(ctx.message.channel, 'You do not have permission to use this command')
        return

    counter = 0
    begin, end = around_month(month, year)
    tmsg = await Client.send_message(ctx.message.channel, 'Progress: 0/' + str(number))

    async for x in Client.logs_from(ctx.message.channel, limit = number, after=begin, before=end):
        counter += 1
        print(counter)
        await Client.edit_message(tmsg, 'Progress:' + counter + '/' + str(number))
        await Client.delete_messages(x)
        await asyncio.sleep(1.5)
    await Client.send_message(ctx.message.channel, 'Operation completed! ' + 'Cleared: ' + str(counter) + ' items')

然后使用!fclear 100 AUG 2018

这乍一看还不错,但不知为何,它并没有删除任何消息,我插入了一个计数器,看看 for 循环是否真的通过了计数器,它什么也没得到,它仍然是零,很有趣,我试图在 for 循环内打印计数器,但它没有将它打印到控制台,我认为发生这种情况的唯一原因是它根本没有进入 for 循环,这可能是因为它没有找到任何消息吗?我不知道。控制台或其他任何地方都没有错误

【问题讨论】:

    标签: python-3.x discord.py


    【解决方案1】:

    一无所获

    这是一个正确的推论。回过头来,您会发现around_month 返回一个相同日期的元组。

    begin, end = around_month(month, year)
    begin == end    # True
    

    取自 Discord 文档 1

    before、after 和 around 键是互斥的,一次只能传递一个。

    鉴于您需要删除特定月份的消息,您需要获取该月的消息,直到用完该月创建的消息列表。

    您还需要使用雪花时间调用Client.logs_from。有一个方便的实用函数可以将datetime 对象转换为时间雪花。 2

    from discord.utils import time_snowflake
    from datetime import time delta
    
    # ...
    def before_time(messages, before):
        return [
            message for message in messages
            if message.id < before
        ]
    
    after_dt = datetime.strptime(f'1 {month} {year}', '%d %b %Y')
    before_dt = (after_dt + timedelta(days=31)).replace(day=1)
    after = time_snowflake(after_dt)
    before = time_snowflake(before_dt)
    
    messages = await Client.logs_from(
        ctx.message.channel, limit=number, after=after
    )
    marked_for_deletion = before_time(messages, before)
    
    while marked_for_deletion:
        await Client.delete_messages(marked_for_deletion)
        messages = await Client.logs_from(
            ctx.message.channel, limit=number, after=after
        )
        marked_for_deletion = before_time(messages, before)
        await asyncio.sleep(1.5)
    

    【讨论】:

    • timedelta 是什么?它没有根据 Python 定义,我错过了什么吗?
    猜你喜欢
    • 1970-01-01
    • 2011-10-19
    • 2021-10-15
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多