discord-ui
                                
                                 discord-ui copied to clipboard
                                
                                    discord-ui copied to clipboard
                            
                            
                            
                        A discord.py extension for sending, receiving and handling ui interactions in discord
discord-ui
        A discord.py extension for using discord ui/interaction features
        
        pip package
        ▪ 
        read the docs 
        ▪ 
        examples
    
Introduction
This is a discord.py ui extension made by 404kuso and RedstoneZockt for using discord's newest ui features like buttons, slash commands and context commands.
Installation
Windows
py -m pip install discord-ui
Linux
python3 -m pip install discord-ui
License
This project is under MIT License
Issues
If you find any issues, please report them
https://github.com/discord-py-ui/discord-ui/issues
Note
If you want to use slash commands, in the oauth2 invite link generation,
you have to check both bot and application.commands fields

Example
Example for creating a simple slash command
import discord
from discord.ext import commands
from discord_ui import UI, SlashOption
client = commands.Bot(" ")
ui = UI(client)
@ui.slash.command("hello_world", options=[SlashOption(bool, "cool", "whether this libary is cool", required=False)], guild_ids=[785567635802816595])
async def command(ctx, cool=True):
    """This is a simple slash command"""
    # you can use docstrings for the slash command description too
    await ctx.respond("You said this libary is " + str(cool))
client.run("your_token")
Example for creating a user-context command
import discord
from discord.ext import commands
from discurd_ui import UI
client = commands.Bot(" ")
ui = UI(client)
@ui.slash.user_command("avatar", guild_ids=[785567635802816595])
async def avatar(ctx, user: discord.Member):
    """Sends the avatar of a user"""
    await ctx.respond(embed=discord.Embed(description=user.display_name).set_image(url=user.avatar_url))
client.run("your_token")
Example for autocompletion of choices
import discord
from discord_ui import UI, SlashOption, AutocompleteInteraction
async def generator(ctx: AutocompleteInteraction):
    available_choices = ["hmm", "this", "is", "a", "an", "test", "testing"]
    return [(x, x) for x in available_choices if x.startswith(ctx.value_query)]
@ui.slash.command("search_word", options=[SlashOption(str, "query", choice_generator=generator)])
async def search_word(ctx, query):
    await ctx.send("got " + query + " for query")
client.run("your_token")
Example for sending a button and receiving it
import discord
from discord.ext import commands
from discord_ui import UI, LinkButton, Button
from asyncio import TimeoutError
client = commands.Bot(" ")
ui = UI(client)
@client.listen("on_message")
async def on_message(message: discord.Message):
    if message.content == "!btn":
        msg = await message.channel.send("you", components=[
            [Button("press me", color="green"), LinkButton("https://discord.com", emoji="😁")],
            Button(custom_id="my_custom_id")
        ])
        try:
            btn = await msg.wait_for("button", client, by=message.author, timeout=20)
            await btn.respond("you pressed `" + btn.content + "`")
        except TimeoutError:
            await msg.delete()
client.run("your_token_here")
Example for sending Selectmenus and receiving them
import discord
from discord.ext import commands
from discord_ui import UI, SelectMenu, SelectOption
from asyncio import TimeoutError
client = commands.Bot(" ")
ui = UI(client)
@client.listen("on_message")
async def on_message(message: discord.Message):
    if message.content == "!sel":
        msg = await message.channel.send("you", components=[SelectMenu(options=[
            SelectOption("my_value", label="test", description="this is a test"),
            SelectOption("my_other_value", emoji="🤗", description="this is a test too")
        ], "custom_id", max_values=2)])
        try:
            sel = await msg.wait_for("select", client, by=message.author, timeout=20)
            await sel.respond("you selected `" + str([x.content for x in sel.selected_options]) + "`")
        except TimeoutError:
            await msg.delete()
client.run("your_token_here")
Example for cogs
from discord.ext import commands
from discord_ui import UI
from discord_ui.cogs import slash_command, subslash_command, listening_component
bot = commands.Bot(" ")
ui = UI(bot)
class Example(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
    
    @slash_command(name="example", guild_ids=[785567635802816595])
    async def example(self, ctx):
        await ctx.respond("gotchu")
    @subslash_command(base_names="example", name="command"):
    async def example_command(self, ctx):
        await ctx.respond("okayy")
    
bot.add_cog(Example(bot))
bot.run("your token")
You can find more (and better) examples here
Contact
You can contact us on discord
Changelog
This will be moved to https://discord-py-ui.github.io/discord-ui/
- 
5.1.2Fixed- commands.nuke
- nextcord import issue (#112)
 
- 
5.1.0Breaking changes- Component custom ids are now optional, if no custom id is passed, a 100 characters long random string will be used and because of that the order of Component init params changed
- The order of SelectMenus init params changed, custom_idcomes now afteroptions
 SelectMenu("my_custom_id", [options...here]) # is now SelectMenu([options...here], "my_custom_id")- Same for Buttons
 Button("my_custom_id", "label") # is now Button("label", "my_custom_id")- ButtonStyles is now ButtonStyle
- renamed cog decorators, the old ones still work but they will show a deprecation warning: slash_command->slash_command,subslash_command->subslash_command,context_cog->context_command,listening_component->listening_component
- Removed Slash.edit_commandandSlash.edit_subcommand, "moved" toCommand.edit
- SlashedCommandis now- SlashInteraction,- SlashedSubCommandis now- SubSlashInteractionand- SlashedContextis now- ContextInteraction
- The command attributes of CommandInteractions (SlashedCommand, ...) are now moved to Interaction.command.(the.commandattribute is a reference to the real command, if you change properties of the command they will be updated)
- The component attributes of an interaction are now moved to .component
- ContextCommands .paramattribute is now.target
 Changed- argument_typein SlashOption is now- type
- ButtonStylevalue names changed: color names are now capitalized and- Dangeris now- Destructive
- Listener.target_useris now- Listener.target_usersand can take users, members and ids as the value
- BaseCommand.optionsand- SlashOption.optionsis now of type- SlashOptionCollection, which allows you to acces options by index and name
 my_command.options["option name"] # or my_command.options[0]You can also use some methods like .get,.set(which will return itself after it set something, soSlashOption.set(key, value).set(key, value)would work) andSlashOption.options + SlashOption.optionwill add both SlashOptions together- If an invalid guild id was passed to a slashcommand, no exception will be raised anymore, it will just be printed into the console and ignored logging.error()
- Moved the discord_ui.ext.pymodule into a folder
- on_button_pressand- on_menu_selectis now- on_buttonand- on_select. The old event names will still work but will be removed in the next release
 Fixed- disable_action_row
- ActionRow.disable
- no interaction events being dispatched because subclasses of dpy2 commands.Botinstances wouldn't get overriden which lead to not enabling needed debug events
- when no matching component listener in Listenercould be found, the events for components events wouldn't be dispatched
- delete_afterkeyword in message send override not working
- mentionable type in slashoptions not being parsed to objects
- @discord.ext.commands.Cooldownnot working on cog slashcommands
 Added- **fieldsto all functions that edit the message components (like- .disable_components,- .disable_component, ...). The- **fieldsparameter can be used to edit other properties of the message without using- .editagain and send a "useless" request
- @Lister.on_errorand- @Listener.wrong_userdecorators for handling Exceptions in Listeners
- When no keyword was passed to @Listener.buttonor@Listener.select, the function will be called on every button/slect
- channel_typeto SlashOption, list of- discord.ChannelType. This will restrict the shown channels for channel slash options to this list.
- support for nextcord. Other libs should work too, but they are not tested.
- Mentionabletype for SlashOptions
- description for short slashoptions. If you set the options for a slash command via callback params, you can add a description (and a type) to them with your docstring. There are 3 different styles you can use:
 # style 1 @ui.slash.command() async def my_command(ctx, my_option, my_other_option): """This is my command description my_option: `int`: This is the description for the my_option parameter my_other_option: `str`: This is the description for another option """ ... # style 2 @ui.slash.command() async def my_command(ctx, my_option: int, my_other_option: str): """This is my command description my_option: This is the description for the my_option parameter my_other_option: This is the description for another option """ ... # style 3 @ui.slash.command() async def my_command(ctx, my_option, my_other_option: str): """This is my command description `int`: This is the description for the my_option parameter This is the description for another option """ ...Note: You don't have to use `type`, you can just usetype- Empty descriptions for slashcommands and slashoptions. The default description value is now \u200bwhich is an "empty" char
- Modifying slashcommand options is now WWAAYYYY easier. You can just do .options[name or index].name = "new name"and the option will be updated
- You can set the autocomplete choice generator with a decorator now
 ui.slash.command(options=[SlashOption(str, "my_option")]) async def my_command(ctx, my_option): ... @my_command.options["my_option"].autocomplete_function async def my_generator(ctx): ... # or @my_command.options[0].autocomplete_function async def my_generator(ctx): ...- All apllication command decorators will now return the created Command
 @ui.slash.command(...) async my_command(ctx): ... type(my_command) # SlashCommand- Added edit and delete method to slashcommand. You can use this for editing or deleting the command later
 # edit await my_command.edit(name="test") # delete await my_command.delete()- idto SlashCommand
- commands_syncedevent which will be dispatched when all commands where synced with the api (- UI.Slash.sync_commands)
- BaseCommmand.updatemethod which updates the api command with the lcoal changes
- SlashSubCommand.base, which will be shared among all subslashcommands with the same base
 Removed- discord.ext.commands.Botoverride for enabling the debug event, this will be enabled when creating a UI instance from the bot
 
- 
5.0.1Fixed- Choices not working
 
- 
5.0.0Fixed- Roles not being parsed correctly
 Changed- default_permission
 default_permission can now be of type discord.Permissionsbut the api doesn't support that yet.- slash http
 some code changes to slash-http features Added- ChoiceGeneratorContext
 Context class for choice generation - SlashOption
 choice_generatorkeyword andautocompletekeyword.autocompleteis not needed if you pass choice_generator- File sending
 You are now able to send hidden files 
- 
4.3.8Fixed- Issue with SlashOptions
 required is now false by default again 
- 
4.3.7Changed- SlashOption
 Required is now Trueby defaultFixed- AttributeError: 'LinkButton' object has no attribute 'component_type'
 Removed- decompressing
 The lib now doesn't decompress byte data anymore, which means everything before the dpy commit 848d752doesn't work with this lib.message reference in discordpy discord server 
- 
4.3.6Fixed- Slashcommand comparing
- Ephemeralmessage keyerror exception
 
- 
4.3.5Fixed- send function issues
 
- 
4.3.4Fixed- SlashOption not accepting tuple
 
- 
4.3.3Fixed- fixed TypeError: 'NoneType' object is not iterable
 
- fixed 
- 
4.3.2Fixed- Could not find a matching option type for parameter '<class 'NoneType'>'
 
- 
4.3.1Removed- unused parameter
 
- 
4.3.0Fixed- Message.wait_for
 by keyword doesn't work properly Removed- Hash
 Removed the hash property from Buttons and SelectMenus due to the removal of it from the api Added- discord_ui.ext
 A module with useful tools and decorators to use more information - BaseCommand
 BaseCommand (the superclass for all applicationcommands) has now some extra properties: - is_chat_input > Whether this command is a slash command - is_message_context > Whether this command is a message context command - is_user_context > Whether this command is a user context command- SlashedCommand
 Added properties: - is_alias > Whether the invoked command is an alias or not - aliases > All the available aliases for the command- Listeners
 Listeners are something that you can use for a better processing of received components. You could see them as a cog to the message components more information Changed- SelectInteraction
 SelectInteraction.selected_valuesare not the raw values that were selected,SelectMenu.selected_optionsare the options of typeSlashOptionthat were selected- MISSING => None
 All instance values that were MISSINGby default are nowNone
- 
4.2.15Fixed- #97
 
- 
4.2.14Fixed- small SelectOption issues
- context commands
 Changed- allow context commands to have names with spaces
 
- 
4.2.13Fixed- TypeError: 'EMPTY' is not a callable objectin context commands
 
- 
4.2.12Fixed- context commands
 
- 
4.2.11Fixed- cog context commands returned wrong type
 
- 
4.2.10Fixed- cog context commands typo with guild_permissionkeyword
 
- cog context commands typo with 
- 
4.2.8Added- edit_subcomand
 Fixed- print statements
 Fixed- #94 (again 💀)
- received subcommands
 The base_names and the name will be now set to the right value 
- 
4.2.7Added- on_component
 There is now an event with the name componentthat will be dispatched whenever a component was received If you useMessage.wait_for, there is now a new event choice with the namecomponent(message.wait_for("component", client))Fixed- #94
 DM issue with deleting messages Changed- edit
 Edit now takes "content" as not positional ( .edit("the content")works now)- component lenght
 You are now able to set component values with the right max lenght 
- 
4.2.6Fixed- emebds
 there was an issue with sending embeds 
- 
4.2.5Fixed- listening_components
 There was an issue with listening components that they needed two parameters but only one was passed Another issue was TypeError: __init__() missing 1 required positional argument: 'custom_id'?- emebds
 there was an issue with sending embeds 
- 
4.2.2Changed- sync_commands
 the delete_unusedkeyword is now optional, if you don't pass a parameter,slash.delete_unusedwill be used (from the__init__function)
- 
4.2.1Fixed- cannot import name 'InteractionResponseType' from 'discord.enums'
 
- 
4.2.0Added- cog_remove sync
 when you remove a cog the slash commands will now get deleted if you set delete_unusedto True and setsync_on_cogto True- alternativ slash options
 you don't have to specify options in one of the slash decorators anymore. Instead, you can set them in your callback function Example @ui.slash.command() async def greet(ctx, user): # This will add an required option with the name "user" of type "user" """Greets a user You can use multiline docstrings, because only the first line will be used for the description """ ... @ui.slash.command() async def tag(ctx, target: discord.User = None): # This will add an optional option with the name "target" of type "user" # Note: you could also use target: "user" = None or anything else you would use in SlashOption for the type ...Fixed- sync_commands
 if you would sync the commands after the first sync, it threw an error 
- 
4.1.4Fixed- slashcommands in forbidden guilds
 when trying to get slash commands in a guild with no appication.commandspermission, it won't throw an exepction anymore
- 
4.1.2Fixed- Subcommands editing
 subcommand checks were wrong and this would result in errors like In options.0.options.2: Option name 'name' is already used in these options
- 
4.1.1Fixed- Interaction.author.voice
 For some reason the voice property of the creator or the interaction would be set - Global slashcommands
 They wouldn't be registered to the api 
- 
4.1.0Added- py 3.6 < support
 You should be able to use this package with python 3.6 or newer FixedForgot to remove print statements💀 
- 
4.0.4Fixed- slashcommand
 when a user was passed in an option, its guild was always None - context commands
 if no name passed, the context command wouldn't take the callback name as the name of the command 
- 
4.0.3Fixed- Message.wait_for
 
- 
4.0.2Fixed- Issue with receiving context commands
 
- 
4.0.1Fixed- discord.ext import error
 
- 
4.0.0AddedYou now have much more control over your slash commands! - Permissions
 You can update your permissions with the Slash.update_permissionsfunction- Creating commands
 You can now create slash commands without the decorator in a much more eaisier way! Check out the Slash.add_commandfunction- Edit commands
 You can edit commands in code with the Slash.edit_commandfunction- Listening components
 You can add and remove listening components now with the Components.add_listening_component,Components.remove_listening_componentandComponents.remove_listening_componentsfunctions- Cogs
 You can now use cog decorators like slash_command,subslash_commandandlistening_componentFixed- SlashCommand
 Slash commands wouldn't be updated if only default_permissionwas changedChanged- wait_for
 Message.wait_for now takes byandcheckas parameters andevent_nameandclientswitched place (wait_for(client, "event_name")is nowwait_for("event_name", client))- listening components
 You can specify listening_components now more presicely, you can add messages, users, and a check to filter - Interaction.member
 Interaction.memberis nowInteraction.author- listening comonents
 Listening component callback functions now only take one parameter, the used component - on_button_pressand- on_menu_select
 These events now take a sole parameter, the used component. If you want to acces to message, use passed_component.messageRemoved- ResponseMessage
 Removed ResponseMessage 
- 
3.3.5Fixed- SelectMenu
 SelectMenu issue when creating it from data 
- 
3.3.4Changed- edit
 Message.editnow takes aembedparameterFixedForgot to remove some printstatements
- 
3.3.3Added- class representation
 classes have now a __repr__function- UI(override_dpy)
 You can now choose whether you want to override some of dpy objects and functions (default is True) (see the override module for more information) This also appeals to the Componentsclass (Components(override_dpy)) note: if you don't want to create aUIobject, you can instead override dpy with theoverride_dpymethodfrom discord_ui import override_dpy override_dpy()Fixed- dpy2
 discord.py v2 now auto-decompresses socket data and passes a string instead of the uncompressed data. - override dpy message
 when overriding dpy message object, the components would mix 
- 
3.3.2Added- EphemeralResponseMessage
 You can now edit a ephemeral message which was created from an interaction (ex. when a button in a hidden message was pressed) 
- 
3.3.1Added- interaction
 Interaction.channelandInteraction.guild
- 
3.3.0Fixed- interaction usage in dms
 
- 
3.2.9Added- ratelimit fix
 The lib will now retry after the ratelimit reset and doesn't throw an HTTPException anymore Fixed- sync_commands
 Got KeyErrorexception while syncing commands
- 
3.2.8Fixed- hidden responding
 When a hidden response was about to be send without defering the interaction it would thrown an error 
- 
3.2.7Added- warnings
- When a guild_permission with an invalid guild id is passed, it will throw an exception when syncing the commands
- When the value of a guild_permission is not of type SlashPermissionit will throw an exception
 
- context-commands
 You can now have context commands with the same name as a normal slash command - slashcommand description
 You can use docstrings """docstring"""for setting the description of a slash commmand by setting the dosctring for the callback functionChanged- auto_defer
 auto_defer is now disabled by default - slash sync
 You can now disable auto_sync for slash commmands and sync them by yourself with Slash.sync_commands(delete_unused)- Interacion.defer
 Interaction._deferredis notInteraction.deferredandInteraction.defer()doesn't throw an exception anymore, it will just log the error withlogging.error()Fixed- try
 There was a try/catch in the Interaction.respondfunction that would allow the code to continue when an exception occured while responding with ninja_mode- context commands
 There was an issue adding context-commands - Command checking
 Now, the libary only edits commands when changes were made 
- warnings
- 
3.2.6Added- auto ninja_mode
 If you use .respond(), the function will try to use ninja_mode automaticallyChanged- project
 Moved git-project to https://github.com/discord-py-ui/discord-ui Fixed- ninja_mode response
 responding with ninja_mode would end up in an exception - file sending
 fixed another file sending issue with slash commands 
- 
3.2.5Fixed- #89 (thanks for reporting)
 
- 
3.2.4- Fixed version issues with the package
 
- 
3.2.2Fixed- #85: AttributeError: module 'discord' has no attribute '_Components__version'
 
- #85: 
- 
3.2.0FixedI'm really sorry for all the issues this libary got, if you still find issues, please report them in https://github.com/discord-py-ui/discord-ui/issues - SelectOpion
 There was an issue with emojis not being set in SelectOptions - LinkButton
 There was an issue with setting the url not being set - SlashCommands
 There was an issue with creating commands that don't already exist Changed- SelectInteraction
 .valuesis not.selected_valuesAdded- Interaction
 Buttons and SelectMenus have a .messageproperty for the message where their interaction was creted ResponseMessages have a.interactionproperty for the received interaction- Events
 We added a interaction_receivedevent for all interactions that are received
- 
3.1.0Added- discordpy 2 support
 We added support for discord.py v2, so you can stay loyal to our libary and use it together with discord.py v2! - Exceptions
 Added own Exceptions for errors - ParseMethod
 You can change the way the extension parses interaction data. You can choose between different Methods - Auto-defer
 The libary will autodefer all interactions public. If you want to change that, take a look at the documentation for this feature - slashcommand edit check
 Slash commands will only be edited if there were some changes, so you won't get a invalid interactionerror in discord after starting the bot If only permissions were changed, just the permissions will be edited and not the whole command like beforeFixed- slash commands
 I finally fixed the damn slashcommand system, it should work now - Parsing
 The resolving, fetching and pulling from the cache methods should all work 
- 
3.0.1Fixed- small project issues
 
- 
3.0.0Added- context commands
 Context commands are now available Changed- Project name
 The project's name was changed from discord-message-componentstodiscord-ui- Extensionis now- UI
 
- 
2.1.0Added- Webhook support
 You are now able to use webhooks together with message components, to send a webhook message with the components, use the Components.send_webhookfunction. The standart webhook function is also overriden with the new component function- Float type
 You can now use floatas the argument type for a slash command option- Auto empty names
 Buttons, LinkButtons and SelectOptions labels are now by default \u200b, which is an "empty" charChanged- Code documentation to more be more informative
 Fixed- 
Fixed small code issues (they were already fixed in previous versions, but I just wanna list this here) 
- 
Docs are now working 
 
- 
2.0.2Fixed- SelectOption
 Select option threw an exception if it was smaller than 1 or higher than 100 
- 
2.0.0Added- 
Slashcomamnd support - Slashclass for slash commands
- Slash.command,- Slash.subcommandand- Slash.subcommand_groupsare available for creating slash commands
- SlashedCommandand- SlashedSubCommandare there for used slash commands
 
- 
Message- disable_action_row(row_numbers: int|range, disable:bool)
 disables (enables) component row(s) in the message - disable_components(disable: bool)
 disables (enables) all componentss 
- disable_action_row(row_numbers: 
- 
overrides - Messageable.sendreturns Message instead of discord.Message and takes components parameter
- override_clientfunction added
 
- 
interaction.send, creates followup messages which can be hidden
- 
Component.listening_component
 A listening component with a callback function that will always be executed whenever a component with the specified custom_id was used Changed- 
Message - All Message objects don't use the client object anymore
- Message.wait_for now needs the client as the first parameter
 
 Fixed- Interaction
 All interaction responses work now - A lot of issues I fogor💀
 
- 
- 
1.2.2Fixed- Docs fixed
 
- 
1.2.1Fixed- Small code fixes
 
- 
1.1.2Fixed- Small code fixes
 
- 
1.1.1Added- Message.edit()
You can now edit messages with button support 
 
- Message.edit()
- 
1.1.0Changed- Major changes to request code, now using the client's request
- ResponseMessage.acknowledge()->- ResponseMessage.defer()- Changed the name of the function + changed - ResponseMessage.acknowledged->- ResponseMessage.deferred
- ResponseMessage.defer()=>- await ResponseMessage.defer()- defer(- acknowledge) is now async and needs to be awaited
 Added- hidden responses
You can now send responses only visible to the user 
 Fixed- ResponseMessage.respond()- Now doesn't show a failed interaction 
 
- 
1.0.5Fixed- ResponseMessage.respond()- responding now doesn't fail after sending the message, it will now defer the interaction by it self if not already deferred and then send the message 
 
- 
1.0.4Added- ResponseMessage.acknowledged- Whether the message was acknowledged with the - ResponseMessage.acknowledged()function
 Changed- 
ResponseMessage.respond()=>await ResponseMessage.respond()respond() function is now async and needs to be awaited 
- 
ResponseMessage.respond() -> None=>ResponseMessage.respond() -> Message or Nonerespond() now returns the sent message or None if ninja_mode is true 
 
- 
1.0.3Added- Button.hash- Buttons have now a custom hash property, generated by the discord api