From 8b00cba3b118ce930e0b0ef21038bf5e979f1127 Mon Sep 17 00:00:00 2001 From: AlbertUnruh <73029826+AlbertUnruh@users.noreply.github.com> Date: Sun, 8 Jan 2023 15:37:40 +0100 Subject: [PATCH 1/4] first code for #731 issue mentioned: https://github.com/NAFTeam/NAFF/issues/731 --- naff/models/discord/role.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/naff/models/discord/role.py b/naff/models/discord/role.py index 7c3b498b7..02c604ebf 100644 --- a/naff/models/discord/role.py +++ b/naff/models/discord/role.py @@ -220,3 +220,29 @@ async def move(self, position: int, reason: str | Missing = MISSING) -> "Role": self._guild_id, [{"id": self.id, "position": position}], reason ) return self + + # START: fail if not all permissions are manageable + async def clone(self) -> "Role": + return await self.guild.create_role(**self.to_dict()) + # END: fail if not all permissions are manageable + + # START: only set manageable permissions + async def clone(self) -> "ClonedRole": + cloneable_permissions = Permissions(self.permissions.value & self.guild.me.guild_permissions.value) + missing_permissions = Permissions(self.permissions.value & ~self.guild.me.guild_permissions.value) + + role = await self.guild.create_role( + name=self.name, + permissions=cloneable_permissions, + color=self.color, + hoist=self.hoist, + mentionable=self.mentionable, + icon=self.icon, + ) + return ClonedRole.from_dict(data=role.to_dict() | {"missing_permissions": missing_permissions}, client=self._client) + + +@attrs.define(eq=False, order=False, hash=False, kw_only=True) +class ClonedRole(Role): + missing_permissions: "Permissions" = attrs.field(repr=False, converter=Permissions) + # END: only set manageable permissions From 63b492b6f693bab06c75453cfb6e7afdc6ca18a7 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 8 Jan 2023 14:43:50 +0000 Subject: [PATCH 2/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- naff/models/discord/role.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/naff/models/discord/role.py b/naff/models/discord/role.py index 02c604ebf..929ab376e 100644 --- a/naff/models/discord/role.py +++ b/naff/models/discord/role.py @@ -224,6 +224,7 @@ async def move(self, position: int, reason: str | Missing = MISSING) -> "Role": # START: fail if not all permissions are manageable async def clone(self) -> "Role": return await self.guild.create_role(**self.to_dict()) + # END: fail if not all permissions are manageable # START: only set manageable permissions @@ -239,7 +240,9 @@ async def clone(self) -> "ClonedRole": mentionable=self.mentionable, icon=self.icon, ) - return ClonedRole.from_dict(data=role.to_dict() | {"missing_permissions": missing_permissions}, client=self._client) + return ClonedRole.from_dict( + data=role.to_dict() | {"missing_permissions": missing_permissions}, client=self._client + ) @attrs.define(eq=False, order=False, hash=False, kw_only=True) From 0b53afffda94c7687e58197ca2a85956d99f3150 Mon Sep 17 00:00:00 2001 From: AlbertUnruh Date: Sun, 12 Feb 2023 14:54:53 +0100 Subject: [PATCH 3/4] merge both ways to clone a role --- naff/models/discord/role.py | 58 ++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/naff/models/discord/role.py b/naff/models/discord/role.py index 929ab376e..5e674f934 100644 --- a/naff/models/discord/role.py +++ b/naff/models/discord/role.py @@ -221,31 +221,43 @@ async def move(self, position: int, reason: str | Missing = MISSING) -> "Role": ) return self - # START: fail if not all permissions are manageable - async def clone(self) -> "Role": - return await self.guild.create_role(**self.to_dict()) - - # END: fail if not all permissions are manageable - - # START: only set manageable permissions - async def clone(self) -> "ClonedRole": - cloneable_permissions = Permissions(self.permissions.value & self.guild.me.guild_permissions.value) - missing_permissions = Permissions(self.permissions.value & ~self.guild.me.guild_permissions.value) - - role = await self.guild.create_role( - name=self.name, - permissions=cloneable_permissions, - color=self.color, - hoist=self.hoist, - mentionable=self.mentionable, - icon=self.icon, - ) - return ClonedRole.from_dict( - data=role.to_dict() | {"missing_permissions": missing_permissions}, client=self._client - ) + async def clone(self, *, force: bool = True) -> "Role | ClonedRole": + """ + Clone an existing role. + + Args: + force: Whether all permissions should be forced or not + + Returns: + A role object if force is set to `True`, otherwise a ClonedRole object + + """ + kwargs = { + "name": self.name, + "color": self.color, + "hoist": self.hoist, + "mentionable": self.mentionable, + "icon": self.icon, + } + if force: + return await self.guild.create_role( + permissions=self.permissions, + **kwargs, + ) + + else: + cloneable_permissions = Permissions(self.permissions.value & self.guild.me.guild_permissions.value) + missing_permissions = Permissions(self.permissions.value & ~self.guild.me.guild_permissions.value) + + role = await self.guild.create_role( + permissions=cloneable_permissions, + **kwargs, + ) + return ClonedRole.from_dict( + data=role.to_dict() | {"missing_permissions": missing_permissions, "guild_id": self._guild_id, "color": self.color.value}, client=self._client + ) @attrs.define(eq=False, order=False, hash=False, kw_only=True) class ClonedRole(Role): missing_permissions: "Permissions" = attrs.field(repr=False, converter=Permissions) - # END: only set manageable permissions From 2f760b008d35345045d6e76a2e77bb5b7ca116ca Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 12 Feb 2023 13:55:49 +0000 Subject: [PATCH 4/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- naff/models/discord/role.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/naff/models/discord/role.py b/naff/models/discord/role.py index 5e674f934..3df98ffb6 100644 --- a/naff/models/discord/role.py +++ b/naff/models/discord/role.py @@ -254,7 +254,9 @@ async def clone(self, *, force: bool = True) -> "Role | ClonedRole": **kwargs, ) return ClonedRole.from_dict( - data=role.to_dict() | {"missing_permissions": missing_permissions, "guild_id": self._guild_id, "color": self.color.value}, client=self._client + data=role.to_dict() + | {"missing_permissions": missing_permissions, "guild_id": self._guild_id, "color": self.color.value}, + client=self._client, )