首页 > 解决方案 > Discord Python Bot:清除命令 If 语句

问题描述

我目前正在尝试在 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.")

标签: pythondiscord

解决方案


您需要学习如何正确检查对象的类型。在你的情况下,如果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它的作用完全相同。(删除冗余)


推荐阅读