Подкоманды цепочки Discord.py - PullRequest
0 голосов
/ 10 июля 2020

У меня есть команда 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.

Будет ли это лучший способ сделать это, или есть более правильный способ связать необязательные подкоманды?

1 Ответ

1 голос
/ 10 июля 2020

Ниже предполагается, что convert_to_timedelta вызовет какое-то исключение в случае сбоя. Здесь мы определяем два класса преобразователей, которые определяют, является ли слово началом и концом соответственно. Используя их, мы можем уместить все лог c в одну команду:

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}')
...