Discord.py链子命令

克洛伊德

我有一个vote可以接受2个子命令start或的命令end想法是,如果未指定,它将使用我可以设置的默认值。否则,它将使用函数start和进行解析end

因此,例如,这样做$vote new start 5m将使用默认的结束时间,并解析开始时间。

这样做$vote new end 5m将使用默认的开始时间并解析结束时间。

这样做$vote new start 5m end 10m会解析开始时间和结束时间。

@vote.group(pass_context=True, invoke_without_command=True)
async def new(ctx):
    log.debug('New')
    # Do logic for default values here


@new.command()
async def start(ctx, start_time):
    # Parse start time
    delta = convert_to_timedelta(start_time)
    vote_date = datetime.today() + delta

@new.command()
async def end(ctx, end_time):
    # Parse end time
    delta = convert_to_timedelta(end_time)

但是,有没有适当的方法来链接此链接?我当前的解决方案仅使用1条命令,new并且我使用解析了参数if 'start' in args

这将是最好的方法,还是有一个更适当的方法来链接可选子命令?

帕特里克·豪

下面假设convert_to_timedelta如果失败将引发某种异常。在这里,我们定义了两个转换器类,分别确定一个单词是开始还是结束。使用这些,我们可以将所有逻辑放入一个命令中:

from discord.ext.commands import Converter, BadArgument
from typing import Optional

class IsStart(Converter):
    async def convert(self, ctx, argument):
        if argument.lower() == 'start':
            return argument
        raise BadArgument(argument)

class IsEnd(Converter):
    async def convert(self, ctx, argument):
        if argument.lower() == 'end':
            return argument
        raise BadArgument(argument)

@bot.command()
async def comm(ctx, start: Optional[IsStart], starttime: Optional[convert_to_timedelta], 
                    end: Optional[IsEnd], endtime: Optional[convert_to_timedelta]):
    print(start, starttime, end, endtime)
    starttime = starttime if start else 'default_start'
    endtime = endtime if end else 'default_end'
    await ctx.send(f'{starttime} {endtime}')

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章