Add role parameters to support new gradient and holographic roles

Co-authored-by: dolfies <jeyalfie47@gmail.com>
Co-authored-by: DA344 <108473820+DA-344@users.noreply.github.com>
Co-authored-by: Danny <1695103+Rapptz@users.noreply.github.com>
This commit is contained in:
Mak
2025-07-08 04:07:56 +01:00
committed by GitHub
parent 2502a783cb
commit cb7300990f
5 changed files with 132 additions and 8 deletions

View File

@ -222,6 +222,8 @@ class Role(Hashable):
'tags',
'_flags',
'_state',
'_secondary_colour',
'_tertiary_colour',
)
def __init__(self, *, guild: Guild, state: ConnectionState, data: RolePayload):
@ -273,10 +275,11 @@ class Role(Hashable):
return not r
def _update(self, data: RolePayload):
colors = data.get('colors', {})
self.name: str = data['name']
self._permissions: int = int(data.get('permissions', 0))
self.position: int = data.get('position', 0)
self._colour: int = data.get('color', 0)
self._colour: int = colors.get('primary_color', 0)
self.hoist: bool = data.get('hoist', False)
self._icon: Optional[str] = data.get('icon')
self.unicode_emoji: Optional[str] = data.get('unicode_emoji')
@ -284,6 +287,8 @@ class Role(Hashable):
self.mentionable: bool = data.get('mentionable', False)
self.tags: Optional[RoleTags]
self._flags: int = data.get('flags', 0)
self._secondary_colour = colors.get('secondary_color', None)
self._tertiary_colour = colors.get('tertiary_color', None)
try:
self.tags = RoleTags(data['tags']) # pyright: ignore[reportTypedDictNotRequiredAccess]
@ -323,6 +328,34 @@ class Role(Hashable):
me = self.guild.me
return not self.is_default() and not self.managed and (me.top_role > self or me.id == self.guild.owner_id)
@property
def secondary_colour(self) -> Optional[Colour]:
"""Optional[:class:`Colour`]: The role's secondary colour.
.. versionadded:: 2.6
"""
return Colour(self._secondary_colour) if self._secondary_colour is not None else None
@property
def secondary_color(self) -> Optional[Colour]:
"""Optional[:class:`Colour`]: Alias for :attr:`secondary_colour`.
.. versionadded:: 2.6
"""
return self.secondary_colour
@property
def tertiary_colour(self) -> Optional[Colour]:
"""Optional[:class:`Colour`]: The role's tertiary colour.
.. versionadded:: 2.6
"""
return Colour(self._tertiary_colour) if self._tertiary_colour is not None else None
@property
def tertiary_color(self) -> Optional[Colour]:
"""Optional[:class:`Colour`]: Alias for :attr:`tertiary_colour`.
.. versionadded:: 2.6
"""
return self.tertiary_colour
@property
def permissions(self) -> Permissions:
""":class:`Permissions`: Returns the role's permissions."""
@ -330,12 +363,12 @@ class Role(Hashable):
@property
def colour(self) -> Colour:
""":class:`Colour`: Returns the role colour. An alias exists under ``color``."""
""":class:`Colour`: Returns the role's primary colour. An alias exists under ``color``."""
return Colour(self._colour)
@property
def color(self) -> Colour:
""":class:`Colour`: Returns the role color. An alias exists under ``colour``."""
""":class:`Colour`: Returns the role's primary colour. An alias exists under ``colour``."""
return self.colour
@property
@ -425,6 +458,10 @@ class Role(Hashable):
mentionable: bool = MISSING,
position: int = MISSING,
reason: Optional[str] = MISSING,
secondary_color: Optional[Union[Colour, int]] = MISSING,
tertiary_color: Optional[Union[Colour, int]] = MISSING,
secondary_colour: Optional[Union[Colour, int]] = MISSING,
tertiary_colour: Optional[Union[Colour, int]] = MISSING,
) -> Optional[Role]:
"""|coro|
@ -447,6 +484,9 @@ class Role(Hashable):
This function will now raise :exc:`ValueError` instead of
``InvalidArgument``.
.. versionchanged:: 2.6
The ``colour`` and ``color`` parameters now set the role's primary color.
Parameters
-----------
name: :class:`str`
@ -455,6 +495,15 @@ class Role(Hashable):
The new permissions to change to.
colour: Union[:class:`Colour`, :class:`int`]
The new colour to change to. (aliased to color as well)
secondary_colour: Optional[Union[:class:`Colour`, :class:`int`]]
The new secondary colour for the role.
.. versionadded:: 2.6
tertiary_colour: Optional[Union[:class:`Colour`, :class:`int`]]
The new tertiary colour for the role. Can only be used for the holographic role preset,
which is ``(11127295, 16759788, 16761760)``
.. versionadded:: 2.6
hoist: :class:`bool`
Indicates if the role should be shown separately in the member list.
display_icon: Optional[Union[:class:`bytes`, :class:`str`]]
@ -490,14 +539,17 @@ class Role(Hashable):
await self._move(position, reason=reason)
payload: Dict[str, Any] = {}
colours: Dict[str, Any] = {}
if color is not MISSING:
colour = color
if colour is not MISSING:
if isinstance(colour, int):
payload['color'] = colour
colours['primary_color'] = colour
else:
payload['color'] = colour.value
colours['primary_color'] = colour.value
if name is not MISSING:
payload['name'] = name
@ -519,6 +571,26 @@ class Role(Hashable):
if mentionable is not MISSING:
payload['mentionable'] = mentionable
actual_secondary_colour = secondary_colour or secondary_color
actual_tertiary_colour = tertiary_colour or tertiary_color
if actual_secondary_colour is not MISSING:
if actual_secondary_colour is None:
colours['secondary_color'] = None
elif isinstance(actual_secondary_colour, int):
colours['secondary_color'] = actual_secondary_colour
else:
colours['secondary_color'] = actual_secondary_colour.value
if actual_tertiary_colour is not MISSING:
if actual_tertiary_colour is None:
colours['tertiary_color'] = None
elif isinstance(actual_tertiary_colour, int):
colours['tertiary_color'] = actual_tertiary_colour
else:
colours['tertiary_color'] = actual_tertiary_colour.value
if colours:
payload['colors'] = colours
data = await self._state.http.edit_role(self.guild.id, self.id, reason=reason, **payload)
return Role(guild=self.guild, data=data, state=self._state)