Как я могу изменить параметры команды косой черты?

Я использую discord.py. Например, если есть команда с именем «/food». Если пользователь использует «/food asian», существует новый параметр. Новый параметр включает «корейский», «японский», «китайский». И если пользователь использует «/food european». Существует новый параметр, который включает «немецкий», «французский», «английский». Как я могу изменить параметры команды косой черты ?

🤔 А знаете ли вы, что...
Python обладает обширной документацией и активным сообществом разработчиков.


50
1

Ответ:

Решено

То, что вы пытаетесь сделать, невозможно. Способ регистрации слэш-команд в Discord не позволяет изменять параметры на ходу. Однако мы можем сделать что-то немного другое, что позволит нам сделать что-то очень похожее.

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

Вот пример:

# --- Imports ---
import discord
import os
from discord import app_commands
from discord.ui import Select

intents = discord.Intents.default()
bot = discord.Client(intents=intents)
tree = app_commands.CommandTree(bot)

# --- Sync Commands ---
@bot.event
async def on_ready():
    await tree.sync()
    print('tree synced')

# --- View used later to select the food's country or something ---
class View(discord.ui.View):
    @discord.ui.select(cls=Select, options=[discord.SelectOption(label=x, value=x) for x in ['France', 'other_country', 'other_other_country']])
    async def select_country(self, interaction: discord.Interaction, select):
        return await interaction.response.send_message(f'You selected {select.values[0]}')

# --- Command to select food ---
@tree.command()
@app_commands.choices(food=[
    app_commands.Choice(name = "Choice_one", value = "1"),
    app_commands.Choice(name = "Choice_two", value = "2")
])
async def testing_options(ctx, food: app_commands.Choice[str]):
    # Return view
    if food == "1":  # If the food selected is the first choice
        await ctx.response.send_message('Hello', view=View())
    else:  # If the food is the second choice
        await ctx.response.send_message('Hello2', view=View())  # I used the same view twice, but if you want a different select menu, use another view

Вот что получается:

При запуске команды:

При вводе чего-то нет:

Когда вы вводите что-то действительное:

Когда вы выбираете что-то в меню выбора представления:

Используемая документация