Discord Python Bot:清除命令If语句

时间:2018-06-21 01:39:40

标签: python discord

我目前正打算用python做一个不和谐的机器人。自从我开始学习以来已经有大约1周的时间了,我认为我应该去尝试一下。我正在尝试清除功能,以清除聊天记录。我想让机器人说“请输入一个有效的数字”。如果键入除int外的其他任何内容。一些字符。

例如,当我输入“ .clear t”时,它什么也不会做,并且在终端中很生气。当我输入“ .clear 3”之类的有效参数时,它将抛出“请输入有效数字”。清除所有内容后。

我尝试了if语句的不同变体,包括放置。无法解决。我觉得这应该放在if语句的位置。感谢您抽出宝贵的时间阅读。

@client.command(pass_context = True)
async def clear(ctx, number = 5):
     number = int(number) 
     counter = 0
     channel = ctx.message.channel
     async for x in client.logs_from(ctx.message.channel, limit = number):
         if counter < number:
             await client.delete_message(x)
             counter += 1
             await asyncio.sleep(0.5) 
     if number != int():
             await client.send_message(channel, "Please enter a valid number.")

1 个答案:

答案 0 :(得分:1)

您需要学习如何正确检查对象的类型。在您的情况下,如果number = 5并且您执行if number != int():,则由于int()返回0,因此您基本上是在说if 5 != 0:,总是这样。

要克服上述问题,请使用isinstance(obj, type)。但是,这并不重要,因为number始终是字符串(除非使用默认值)。


如果number无法转换为整数,则具有以下行将引发错误。

number = int(number)

在引发ValueError时,您需要抓住该错误才能发送错误消息。

@client.command(pass_context=True)
async def clear(ctx, number=5):
    channel = ctx.message.channel
    try:
        number = int(number) 
    except ValueError:
        return await client.send_message(channel, "Please enter a valid number.")

    async for x in client.logs_from(channel, limit=number):
        await client.delete_message(x)
        await asyncio.sleep(0.5) 

但是,使用discord.py,有一种更简单的方法,可以通过使用类型注释语法来进行类型对话:

@client.command(pass_context=True)
async def clear(ctx, number: int=5):
    channel = ctx.message.channel
    async for x in client.logs_from(channel, limit=number):     
        await client.delete_message(x)            
        await asyncio.sleep(0.5) 

如果您迫切需要将该错误消息发送到频道,则可以通过on_command_error事件来执行。 (搜索他们的文档)


您可能已经注意到,我删除了counter部分,因为limit的作用完全相同。 (已删除冗余)