Как добавить динамические аргументы в слеш-команды [discord.py]

Вопрос

Я пытаюсь сделать команду, которая показывает вам расписание вашего класса, для этого пользователь сначала вводит в качестве аргумента его степень, а затем класс, но каждая степень имеет разное количество классов, поэтому я не могу показать общий список для всех степеней.

Фактический код:

class Ciclos(enum.Enum):
    ASIX = 1
    DAM = 2


class ASIX(enum.Enum):
    _1A = 1
    _1B = 2
    _1C = 3
    _2A = 4
    _2B = 5


class DAM(enum.Enum):
    _1A = 1
    _2A = 2
    _2B = 3

@bot.tree.command(name = "schedule", description = "Shows the schedule of the selected class")
@app_commands.describe(ciclo = "Choose your degree")
@app_commands.describe(clase = "Choose your class")
async def schedule(interaction: discord.Interaction, ciclo: Ciclos, clase: Ciclos.name):
await interaction.response.send_message(file=discord.File(f'Media/schedules/schedule{ciclo.name}{clase.name}.png'))

Этот код не работает, но я надеюсь, что он служит для иллюстрации того, что я пытаюсь сделать. Проблемная часть связана с параметрами функции, особенно с clase: Ciclos.name, я не знаю, как сделать так, чтобы это зависело от того, что пользователь выбирает на ciclo: Ciclos.

Что я пробовал

Я попытался поставить эти выражения:

clase: {Ciclos.name} Я получаю -> AtributeError: имя

clase: Ciclos.name Я получаю -> AtributeError: имя

clase: ciclo Я получаю -> NameError: имя «цикло» не определено. Возможно, вы имели в виду: 'Ciclos'?
Нет, я не это имел в виду.

Ожидаемое поведение

Ожидаемый результат таков:
пример класса ASIX
Пример класса DAM

Чтобы отправить изображение расписания, соответствующее каждому классу:

await interaction.response.send_message(file=discord.File(f'Media/schedules/schedule{ciclo.name}{clase.name}.png'))

Итак, я получаю имена файлов, например: "расписание ASIX_1A" "расписаниеDAM_2A"

Это невозможно со стороны Discord. Выбор должен быть известен заранее и не может динамически изменяться на основе других значений (также - вы можете заполнять их в любом порядке, так что это даже не сработает). Вам придется поступить иначе. Вы не можете ссылаться на текущее значение этого аргумента как на тип выбора.

stijndcl 01.12.2022 22:16

Спасибо за разъяснение, поэтому я не смог найти ни одного примера этого, потому что это невозможно. Я попробую найти другой способ сделать это. Я бы отметил ваш ответ как самый правильный, но это комментарий.

Nebian 01.12.2022 23:36

Я добавлю это как ответ.

stijndcl 02.12.2022 16:03
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
355
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Извините, я не думаю, что динамические варианты встроены в API разногласий, но я обычно использую следующее, чтобы добавить варианты в команду Slash, может быть, это может вам помочь.

@app_commands.choices(
ciclo=[
    app_commands.Choice(name = "ASIX", value = "ASIX"),
    app_commands.Choice(name = "DAM", value = "DAM")
    ],
clase=[app_commands.Choice(name = "A1", value = "A1")]) 

Я немного изменил его, чтобы он соответствовал вашему примеру, чтобы он соответствовал вашему примеру, но, как я уже сказал, насколько я знаю, нет никакого способа сделать динамический выбор с помощью команд с косой чертой.

Спасибо за ваш ответ, ваш пример добавляет в команду более одного аргумента, а не динамический аргумент, но ваш первый абзац ответил на мой вопрос. Невозможно сделать динамический выбор. Я отмечу ваш ответ как тот, который решил проблему.

Nebian 01.12.2022 23:43
Ответ принят как подходящий

Это невозможно со стороны Discord. Варианты должны быть известны заранее и синхронизированы, чтобы они не могли динамически изменяться в зависимости от других значений (также — вы можете заполнять их в любом порядке, так что это даже не сработает).

Вам придется поступить иначе. Вы не можете ссылаться на текущее значение этого аргумента как на тип выбора.

Одним из вариантов может быть, например, использование представлений с меню выбора. Более гибридный подход может состоять в том, чтобы иметь команду косой черты с вариантами выбора и позволить этому ответу с помощью меню «Выбор» для конкретных параметров, которые они могут выбрать в зависимости от своего аргумента. Вот пример меню выбора: https://github.com/Rapptz/discord.py/blob/master/examples/views/dropdown.py

Другие вопросы по теме