disnake-ext-components is currently undergoing a rewrite. While it is not yet entirely stable, it is recommended to use the rewrite version as opposed to this one, as syntax has changed, and this current version will not be updated (it will still receive bug fixes, though). Please see the Rewrite branch for further information.
An extension for disnake aimed at making component interactions with listeners somewhat less cumbersome.
Requires disnake version 2.5.0 or above.
- Smoothly integrates with disnake,
- Uses an intuitive disnake slash-command-like syntax to create stateful persistent components,
custom_id
matching, conversion, and creation are automated for you,- Allows you to implement custom RegEx for your listeners if you need more customized behavior.
Python 3.8 or higher is required
To install the extension, run the following command in your command prompt/shell:
# Linux/macOS
python3 -m pip install -U git+https://github.com/DisnakeCommunity/disnake-ext-components
# Windows
py -3 -m pip install -U git+https://github.com/DisnakeCommunity/disnake-ext-components
I will hopefully get it on PyPI soon-ish, but for now you'll have to install it from GitHub (which requires git to be installed on your PC).
It will be installed to your existing disnake installation as an extension. From there, it can be imported as:
from disnake.ext import components
import disnake
from disnake.ext import commands, components
class MyCog(commands.Cog):
def __init__(self, bot: commands.Bot):
self.bot = bot
@components.button_listener()
async def secret_listener(self, inter: disnake.MessageInteraction, *, secret: str, author: disnake.Member):
await inter.response.send_message(f"You found {author.mention}'s secret message: '{secret}'!")
@commands.slash_command()
async def make_secret(self, inter: disnake.CommandInteraction, secret: str):
"""Store a secret message in a button!"""
await inter.response.send_message(
"Press this button to reveal the secret!",
components=disnake.ui.Button(
label="Reveal secret...",
custom_id=self.secret_listener.build_custom_id(secret=secret, author=inter.author),
# e.g. "secret_listener:extreme secrecy right here:872576125384147005"
)
)
def setup(bot: commands.Bot):
bot.add_cog(MyCog(bot))
This example is complete and should run as-is when loaded into a bot.
import disnake
from disnake.ext import commands, components
bot = commands.Bot(commands.when_mentioned)
@components.button_listener(bot=bot)
async def secret_listener(inter: disnake.MessageInteraction, *, secret: str, author: disnake.Member):
await inter.response.send_message(f"You found {author.mention}'s secret message: '{secret}'!")
@commands.slash_command()
async def make_secret(inter: disnake.CommandInteraction, secret: str):
"""Store a secret message in a button!"""
await inter.response.send_message(
"Press this button to reveal the secret!",
components=disnake.ui.Button(
label="Reveal secret...",
custom_id=secret_listener.build_custom_id(secret=secret, author=inter.author),
)
)
This example is complete and should run as-is.
For more examples, see the examples folder.
- PyPI release,
- Contribution guidelines,
- Support some sort of dependency injection.
Any contributions are welcome, feel free to open an issue or submit a pull request if you'd like to see something added. Contribution guidelines will come soon.