Discord Python Rewrite - 帮助命令错误(自定义)

Discord Python Rewrite - help command error (custom)

所以,我提供了一个有效的帮助,但我希望它在用户输入的类别无效时显示一些信息。如果类别无效,我会得到一个没有错误的工作代码。代码:

@client.command()
async def help(ctx, *, category = None):

    if category is not None:
        if category == 'mod' or 'moderation' or 'Mod' or 'Moderation':
            modhelpembed = discord.Embed(
                title="Moderation Help",
                timestamp=datetime.datetime.now(),
                colour=discord.Color.green()
                )

            modhelpembed.add_field(name='kick', value="Kicks a member from the server", inline=False)
            modhelpembed.add_field(name='ban', value='bans a member from the server', inline=False)
            modhelpembed.add_field(name='unban', value='unbans a member from the server', inline=False)
            modhelpembed.add_field(name="nuke", value="Nukes a channel :>", inline=False)
            modhelpembed.add_field(name='mute', value="Mute a member", inline=False)
            modhelpembed.add_field(name="purge", value='purges (deletes) a certain number of messages', inline=False)

            await ctx.send(f'{ctx.author.mention}')
            await ctx.send(embed=modhelpembed)

        elif category == 'fun' or 'Fun':
            funembed = discord.Embed(
                title="Fun Help",
                timestamp=datetime.datetime.now(),
                colour=discord.Color.green()
                )
            
            funembed.add_field(name='meme', value='shows a meme from r/memes', inline=False)
            funembed.add_field(name='waifu', value='shows a waifu (pic or link) from r/waifu', inline=False)
            funembed.add_field(name='anime', value='shows a anime (image or link) from r/anime', inline=False)
            funembed.add_field(name='spotify', value='Tells you the targeted user listening on', inline=False)
            funembed.add_field(name="song", value="Tells you the whats the targeted user listening in Spotify", inline=False)
            funembed.add_field(name="album", value="Tells you whats the targeted user album", inline=False)
            funembed.add_field(name="timer", value="Sets a Timer for you.", inline=False)

            await ctx.send(f'{ctx.author.mention}')
            await ctx.send(embed=funembed)

    else:
        nonembed = discord.Embed(
            title="Help list",
            timestamp=datetime.datetime.now(),
            colour=discord.Color.green(),
            description='Category:\nmod\nfun'
            )
        
        await ctx.send(f'{ctx.author.mention}')
        await ctx.send(embed=nonembed)

有效,但当我尝试输入无效类别时,它会发送审核。

你的错误来自你的第二个 if 陈述。您只需将其替换为:

  • if category == ('mod' or 'moderation' or 'Mod' or 'Moderation'):
    
  • if category in ['mod', 'moderation', 'Mod', 'Moderation']:
    

以下是当您输入无效类别时触发您的语句的原因:

  • 一个空字符串returnsFalse(例如"")和一个字符串returnsTrue(例如"TEST").

  • 如果不加括号,会把每个or分开作为条件(if category == 'mod' / if 'mod' / if 'moderation' / if 'Mod' / if 'Moderation').

  • 因为非空字符串 returns 是的,当您输入无效类别时,您的第二个 if 语句将被触发,它会为您提供审核帮助消息。

您还可以使用 commands.Command 属性进行一些重构:

@client.command(description='Say hi to the bot')
async def hello(ctx):
    await ctx.send(f'Hi {ctx.author.mention}')

@client.command(description='Test command')
async def test(ctx):
    await ctx.send('TEST')

@client.command()
async def help(ctx, *, category = None):
    categories = {
        'fun': ['hello',],
        'testing': ['test',],
    }
    if category is None:
       desc = '\n'.join(categories.keys())
       embed = discord.Embed(
            title="Help list",
            timestamp=datetime.datetime.now(),
            colour=discord.Color.green(),
            description=f'Categories:\n{desc}'
        )
    else:
        category = category.lower()
        if not category in categories.keys():
            await ctx.send('Category name is invalid!')
            return
        
        embed = discord.Embed(
            title=f"{category.capitalize()} Help",
            timestamp=datetime.datetime.now(),
            colour=discord.Color.green()
        )

        for cmd in categories[category]:
            cmd = client.get_command(cmd)
            embed.add_field(name=cmd.name, value=cmd.description)

        await ctx.send(ctx.author.mention, embed=embed)