Skip to main content

A discordpy extension for using user-interface components

Project description


discord-ui

A discord.py user-interface extension
pip packageread the docsexamples

Downloads

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 (we got dpy2 supported if you want to keep using our libary)

Our libary overrides some of the functions in dpy, so this lib is easier to use. The Messageable.send function and the Webhook.send are both overriden with our own custom method. discord.ext.commands.Bot is overriden too, but only if you use dpy 2 in order for our lib to work, so if you (somewhy) wanna check the type of the client, you need to use isinstance(your_client, discord.ext.commands.Bot), because type(your_client) will be of type OverridenV2Bot

For more information about overriding, take a look at the override module

Installation

# windows
py -m install discord-ui

# linux
python3 -m pip install discord-ui

Docs

You can read the docs here

The docs can include some typos or issues, if so, plz let me know

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))

await 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))

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("custom_id", "press me", color="green"), LinkButton("https://discord.com", emoji="😁")],
            Button("my_custom_id")
        ])
        try:
            btn = await msg.wait_for(client, "button", 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("custom_id", options=[
            SelectOption("my_value", label="test", description="this is a test"),
            SelectOption("my_other_value", emoji="🤗", description="this is a test too")
        ], max_values=2)])
        try:
            sel = await msg.wait_for(client, "select", timeout=20)
            await sel.respond("you selected `" + str([x.content for x in sel.selected_values]) + "`")
        except TimeoutError:
            await msg.delete()

client.run("your_token_here")

You can find more (and better) examples here

Changelog

  • 3.2.8

    Fixed

    • hidden responding

    When a hidden response was about to be send without defering the interaction it would thrown an error

  • 3.2.7

    Added

    • 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 SlashPermission it 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 function

    Changed

    • 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._deferred is not Interaction.deferred and Interaction.defer() doesn't throw an exception anymore, it will just log the error with logging.error()

    Fixed

    • try

    There was a try/catch in the Interaction.respond function 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

  • 3.2.6

    Added

    • auto ninja_mode

    If you use .respond(), the function will try to use ninja_mode automatically

    Changed

    • 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.5

    Fixed

    • #89 (thanks for reporting)
  • 3.2.4
    • Fixed version issues with the package
  • 3.2.2

    Fixed

    • #85: AttributeError: module 'discord' has no attribute '_Components__version'
  • 3.2.0

    Fixed

    I'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

    • SelectedMenu

    .values is not .selected_values

    Added

    • Interaction

    Buttons and SelectMenus have a .message property for the message where their interaction was creted ResponseMessages have a .interaction property for the received interaction

    • Events

    We added a interaction_received event for all interactions that are received

  • 3.1.0

    Added

    • 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 interaction error in discord after starting the bot If only permissions were changed, just the permissions will be edited and not the whole command like before

    Fixed

    • 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.1

    Fixed

    • small project issues
  • 3.0.0

    Added

    • context commands

    Context commands are now available

    Changed

    • Project name

    The project's name was changed from discord-message-components to discord-ui

    • Extension is now UI
  • 2.1.0

    Added

    • 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_webhook function. The standart webhook function is also overriden with the new component function

    • Float type

    You can now use float as 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" char

    Changed

    • 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.2

    Fixed

    • SelectOption

    Select option threw an exception if it was smaller than 1 or higher than 100

  • 2.0.0

    Added

    • Slashcomamnd support

      • Slash class for slash commands
      • Slash.command, Slash.subcommand and Slash.subcommand_groups are available for creating slash commands
      • SlashedCommand and SlashedSubCommand are 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

    • overrides

      • Messageable.send returns Message instead of discord.Message and takes components parameter
      • override_client function 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.2

    Fixed

    • Docs fixed
  • 1.2.1

    Fixed

    • Small code fixes
  • 1.2.0

    Added

  • 1.1.2

    Fixed

    • Small code fixes
  • 1.1.1

    Added

    • Message.edit()

      You can now edit messages with button support

  • 1.1.0

    Changed

    • 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.5

    Fixed

    • 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.4

    Added

    • 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 None

      respond() now returns the sent message or None if ninja_mode is true

  • 1.0.3

    Added

    • Button.hash

      Buttons have now a custom hash property, generated by the discord api

Contact

You can contact us on discord

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

discord-ui-3.2.8.tar.gz (42.0 kB view hashes)

Uploaded Source

Built Distribution

discord_ui-3.2.8-py3-none-any.whl (41.8 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page