mirror of
https://github.com/Paillat-dev/pycord-reactive-views.git
synced 2026-01-02 01:06:18 +00:00
Finally fixed
This commit is contained in:
95
examples/color_select.py
Normal file
95
examples/color_select.py
Normal file
@@ -0,0 +1,95 @@
|
||||
# ruff: noqa: INP001
|
||||
import os
|
||||
|
||||
import discord
|
||||
from dotenv import load_dotenv
|
||||
from pycord_reactive_views import ReactiveSelect, ReactiveValue, ReactiveView
|
||||
|
||||
load_dotenv()
|
||||
|
||||
bot = discord.Bot()
|
||||
|
||||
colors: dict[str, list[discord.Colour]] = {
|
||||
"red": [discord.Colour.red(), discord.Colour.dark_red(), discord.Colour.brand_red()],
|
||||
"green": [discord.Colour.green(), discord.Colour.dark_green(), discord.Colour.brand_green()],
|
||||
"blue": [discord.Colour.blue(), discord.Colour.dark_blue()],
|
||||
"yellow": [discord.Colour.gold(), discord.Colour.dark_gold()],
|
||||
"purple": [
|
||||
discord.Colour.purple(),
|
||||
discord.Colour.dark_purple(),
|
||||
discord.Colour.blurple(),
|
||||
discord.Colour.og_blurple(),
|
||||
],
|
||||
"gray": [discord.Colour.greyple(), discord.Colour.dark_grey(), discord.Colour.light_grey()],
|
||||
"teal": [discord.Colour.teal(), discord.Colour.dark_teal()],
|
||||
"magenta": [discord.Colour.magenta(), discord.Colour.dark_magenta()],
|
||||
"orange": [discord.Colour.orange(), discord.Colour.dark_orange()],
|
||||
}
|
||||
|
||||
|
||||
class ColourSelector(ReactiveView):
|
||||
"""A simple view that allows you to select a colour and shade and updates the embed based on the selection."""
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.colour: str = "red"
|
||||
self.shade: discord.Colour = discord.Colour.red()
|
||||
self.colour_select = discord.ui.Select(
|
||||
options=[
|
||||
discord.SelectOption(
|
||||
label=colour.capitalize(),
|
||||
value=colour,
|
||||
)
|
||||
for colour in colors
|
||||
],
|
||||
placeholder="Select a colour",
|
||||
custom_id="colour_select",
|
||||
)
|
||||
self.shade_select = ReactiveSelect(
|
||||
custom_id="shade_select",
|
||||
placeholder="Select a shade",
|
||||
options=ReactiveValue(
|
||||
lambda: [
|
||||
discord.SelectOption(
|
||||
label=str(shade.value),
|
||||
)
|
||||
for shade in colors[self.colour]
|
||||
],
|
||||
[
|
||||
discord.SelectOption(
|
||||
label=str(shade.value),
|
||||
)
|
||||
for shade in colors[self.colour]
|
||||
],
|
||||
),
|
||||
)
|
||||
self.colour_select.callback = self._colour_select_callback
|
||||
self.shade_select.callback = self._shade_select_callback
|
||||
self.add_item(self.colour_select)
|
||||
self.add_item(self.shade_select)
|
||||
|
||||
async def _colour_select_callback(self, interaction: discord.Interaction) -> None:
|
||||
await interaction.response.defer()
|
||||
self.colour = self.colour_select.values[0] # pyright: ignore[reportAttributeAccessIssue]
|
||||
await self.update()
|
||||
|
||||
async def _shade_select_callback(self, interaction: discord.Interaction) -> None:
|
||||
await interaction.response.defer()
|
||||
selected_shade = int(self.shade_select.values[0]) # pyright: ignore[reportArgumentType]
|
||||
self.shade = discord.Colour(selected_shade)
|
||||
await self.update()
|
||||
|
||||
async def _get_embed(self) -> discord.Embed | None:
|
||||
return discord.Embed(
|
||||
title=f"{self.colour.capitalize()} {self.shade}",
|
||||
colour=self.shade,
|
||||
)
|
||||
|
||||
|
||||
@bot.slash_command()
|
||||
async def colours(ctx: discord.ApplicationContext) -> None:
|
||||
"""Send the colour selector view."""
|
||||
await ColourSelector().send(ctx)
|
||||
|
||||
|
||||
bot.run(os.getenv("TOKEN"))
|
||||
@@ -17,7 +17,7 @@ classifiers = [
|
||||
"Programming Language :: Python :: 3.11",
|
||||
"Programming Language :: Python :: 3.12"
|
||||
]
|
||||
requires-python = "<3.12.0,>=3.11"
|
||||
requires-python = ">=3.11"
|
||||
dependencies = [
|
||||
"py-cord>=2.6.0",
|
||||
]
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
from .components import ReactiveButton
|
||||
from .components import ReactiveButton, ReactiveSelect
|
||||
from .utils import ReactiveValue
|
||||
from .view import ReactiveView
|
||||
|
||||
__all__ = ["ReactiveButton", "ReactiveView", "ReactiveValue"]
|
||||
__all__ = ["ReactiveButton", "ReactiveSelect", "ReactiveValue", "ReactiveView"]
|
||||
|
||||
@@ -51,3 +51,36 @@ class ReactiveButton(discord.ui.Button, Reactive): # pyright: ignore[reportUnsa
|
||||
self.add_reactive("url", url)
|
||||
self.add_reactive("emoji", emoji)
|
||||
self.add_reactive("row", row)
|
||||
self.custom_id = custom_id
|
||||
self.sku_id = sku_id
|
||||
|
||||
|
||||
class ReactiveSelect(discord.ui.Select, Reactive): # pyright: ignore[reportUnsafeMultipleInheritance,reportMissingTypeArgument]
|
||||
"""A select menu that can be used with reactive values."""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
select_type: discord.ComponentType = discord.ComponentType.string_select,
|
||||
*,
|
||||
custom_id: str | None = None,
|
||||
placeholder: MaybeReactiveValue[str | None] = None,
|
||||
min_values: MaybeReactiveValue[int] = 1,
|
||||
max_values: MaybeReactiveValue[int] = 1,
|
||||
options: MaybeReactiveValue[list[discord.SelectOption] | None] = None,
|
||||
channel_types: MaybeReactiveValue[list[discord.ChannelType] | None] = None,
|
||||
disabled: MaybeReactiveValue[bool] = False,
|
||||
row: MaybeReactiveValue[int | None] = None,
|
||||
):
|
||||
discord.ui.Select.__init__(self)
|
||||
Reactive.__init__(self)
|
||||
self.add_reactive("placeholder", placeholder)
|
||||
self.add_reactive("min_values", min_values)
|
||||
self.add_reactive("max_values", max_values)
|
||||
self.add_reactive("options", options)
|
||||
if select_type == discord.ComponentType.channel_select:
|
||||
self.add_reactive("channel_types", channel_types)
|
||||
self.add_reactive("disabled", disabled)
|
||||
self.add_reactive("row", row)
|
||||
if custom_id:
|
||||
self.custom_id = custom_id
|
||||
self.select_type = select_type
|
||||
|
||||
@@ -28,6 +28,8 @@ class ReactiveView(discord.ui.View):
|
||||
|
||||
async def _get_embeds(self) -> list[discord.Embed]:
|
||||
"""Get the discord embeds to be displayed in the message."""
|
||||
if embed := await self._get_embed():
|
||||
return [embed]
|
||||
return []
|
||||
|
||||
async def _get_content(self) -> str | None:
|
||||
|
||||
Reference in New Issue
Block a user