Options¶
Now that you’ve managed to make a basic command and have your bot respond to the users, it would probably be useful to take some form of input. For slash commands, this is done using options.
Note that context menu commands cannot have options - see the context menu section for more on how they work.
Adding an Option¶
Options are defined as class variables in your command class. Lightbulb provides various methods to help you create options of different types. For now we will just focus on string options - other types will be mentioned later.
All options must have a name and description, other parameters are optional and specific to each type of option.
A simple command with a string option would look like this:
class YourCommand(
lightbulb.SlashCommand,
...
):
# Simple string option.
text = lightbulb.string("text", "text option")
@lightbulb.invoke
async def invoke(self, ctx: lightbulb.Context) -> None:
...
Note
Options are added to commands in the order they are defined in the class. Any options that are not required (i.e. have a default value) must appear after required options.
Using an Option¶
You should understand how to add options to commands now - it would probably be useful to get the value the user
supplied from within the command invocation function. This is simply done by accessing the option variable through
self
. I.e. in the above example, self.text
.
A simple ‘echo’ command to repeat the given text using a string option could look like this:
class Echo(
lightbulb.SlashCommand,
name="echo",
description="echo",
):
text = lightbulb.string("text", "the text to repeat")
@lightbulb.invoke
async def invoke(self, ctx: lightbulb.Context) -> None:
await ctx.respond(self.text)
Option Types¶
Lightbulb supports the same option types natively supported by discord. These are:
string
integer
boolean
number (float)
user
channel
role
mentionable
attachment
Usage of each of the supported option types are the same as shown above using the string option.
class YourCommand(
lightbulb.SlashCommand,
...
):
string = lightbulb.string(...)
integer = lightbulb.integer(...)
boolean = lightbulb.boolean(...)
number = lightbulb.number(...)
user = lightbulb.user(...)
channel = lightbulb.channel(...)
role = lightbulb.role(...)
mentionable = lightbulb.mentionable(...)
attachment = lightbulb.attachment(...)
@lightbulb.invoke
async def invoke(self, ctx: lightbulb.Context) -> None:
...
Common Pitfalls¶
Due to JavaScript quirks, an
integer
option cannot be used if you wish to take a discord ID. You should use astring
option instead - assuming none of the other option types are more suitable.Commands can have a maximum of 25 options. Any more than that and discord will error when Lightbulb tries to sync the commands with Discord.