Adding conditional fields to Slash command

ghz 2days ago ⋅ 5 views

how can I add some fields that will show if the user chooses an option from discord.Option() list? I mean if user chooses 'Option a1' he/she will see field 'a1' and if he chooses 'Option b2' he/she will see field 'a2'. this is my code for option list:

@warn_command_group.command(name='remove',description='حذف اخطار')
    async def remove_warn(self, ctx:discord.ApplicationContext,
                          mode:discord.Option(str,'حالت حذف',choices=[
                              'حذف کل اخطار های سرور', # delete all warns
                              'حذف کل اخطار های یک ممبر', # delete all warns from a member
                              'حذف یک اخظار خاص(با استفاده از آیدی اون اخطار)' # delete a specific warn (with that warn's id)
                          ])
                          ):

I mean if they choose the first option, they will not see any forced field if they choose the second option, they will see a field named "member" with the type of discord.Member and if they choose the third option, they'll see a field named "id" with the type of int

Answer

To achieve the functionality you're asking for with discord.Option() in a slash command, you can dynamically display certain fields based on the selected option by conditionally adding parameters depending on the choice.

In discord.py's application commands (slash commands), the command options can be defined to show additional fields based on the user's selection. However, as of my knowledge cutoff, discord.py does not support dynamically showing additional options directly after a choice is made in a single command definition.

A workaround is to use a subcommand for each choice you want to present. Each subcommand can have its own set of required fields. Below is how you can structure it:

Example using Subcommands

This method splits each option into its own subcommand, each of which will only show the appropriate fields when chosen.

import discord
from discord.ext import commands

bot = commands.Bot(command_prefix='!')

@bot.slash_command(name="remove", description="حذف اخطار")
async def remove_warn(ctx: discord.ApplicationContext):
    pass

@remove_warn.subcommand(name="all", description="حذف کل اخطار های سرور")
async def remove_all_warns(ctx: discord.ApplicationContext):
    # This will be called if the user chooses "حذف کل اخطار های سرور"
    await ctx.respond("All server warnings will be removed.")

@remove_warn.subcommand(name="member", description="حذف کل اخطار های یک ممبر")
async def remove_member_warns(ctx: discord.ApplicationContext, member: discord.Member):
    # This will be called if the user chooses "حذف کل اخطار های یک ممبر"
    await ctx.respond(f"All warnings for {member.name} will be removed.")

@remove_warn.subcommand(name="specific", description="حذف یک اخطار خاص")
async def remove_specific_warn(ctx: discord.ApplicationContext, warn_id: int):
    # This will be called if the user chooses "حذف یک اخطار خاص"
    await ctx.respond(f"Warning with ID {warn_id} will be removed.")

bot.run("your_token")

Explanation:

  • remove_warn: This is the main slash command that offers three subcommands.
  • Subcommands:
    • remove_warn.all: If the user chooses حذف کل اخطار های سرور, no additional fields are required.
    • remove_warn.member: If the user chooses حذف کل اخطار های یک ممبر, a discord.Member field is required, which allows the user to select a member.
    • remove_warn.specific: If the user chooses حذف یک اخطار خاص, an int field for the warn ID is required.

Advantages:

  • Flexibility: Each subcommand has its own set of fields, so you don't need to deal with conditional logic within a single function.
  • Clear Structure: It is clear for users to know which option they are selecting because each option is a subcommand with its own description.
  • User Experience: It allows Discord's auto-complete feature to help the user choose the correct input type (e.g., selecting a discord.Member or an int for the warning ID).

User Flow:

  1. When the user runs /remove, they will be presented with three options: all, member, and specific.
  2. If they select member, they will be prompted to select a discord.Member from the server.
  3. If they select specific, they will be asked to enter the warn_id (an integer).

This approach is clear, user-friendly, and provides the desired functionality without the complexity of dynamically adding options based on previous choices in a single command.