Skip to content
This repository was archived by the owner on Oct 2, 2023. It is now read-only.

Commit 004d410

Browse files
authored
Merge pull request #157 from NekoFanatic/features/role-clone
Added role-clone command to clone a role
2 parents 544dc55 + 2aa36ce commit 004d410

File tree

5 files changed

+47
-3
lines changed

5 files changed

+47
-3
lines changed

administration/roles/cog.py

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
from typing import Optional, Union, Dict, List
22

3-
from discord import Role, Embed, Member, Status, Guild, NotFound, User, Forbidden
3+
from discord import Role, Embed, Member, Status, Guild, NotFound, User, Forbidden, Permissions
44
from discord.ext import commands
55
from discord.ext.commands import CommandError, Context, guild_only, UserInputError, Group
66

77
from PyDrocsid.cog import Cog
88
from PyDrocsid.command import reply, docs, optional_permissions
9-
from PyDrocsid.config import Contributor, Config
9+
from PyDrocsid.config import Config
1010
from PyDrocsid.converter import UserMemberConverter
1111
from PyDrocsid.database import db, select, filter_by
1212
from PyDrocsid.embeds import send_long_embed
@@ -18,6 +18,7 @@
1818
from .colors import Colors
1919
from .models import RoleAuth, PermaRole
2020
from .permissions import RolesPermission
21+
from ...contributor import Contributor
2122
from ...pubsub import send_to_changelog, send_alert
2223

2324
tg = t.g
@@ -90,7 +91,7 @@ async def inner(_, ctx: Context, *, role: Role):
9091

9192

9293
class RolesCog(Cog, name="Roles"):
93-
CONTRIBUTORS = [Contributor.Defelo]
94+
CONTRIBUTORS = [Contributor.Defelo, Contributor.NekoFanatic]
9495

9596
def __init__(self):
9697
super().__init__()
@@ -241,6 +242,42 @@ async def roles_add(self, ctx: Context, member: Member, *, role: Role):
241242
await member.add_roles(role)
242243
await ctx.message.add_reaction(name_to_emoji["white_check_mark"])
243244

245+
@roles.command(name="clone", aliases=["cl"])
246+
@RolesPermission.roles_clone.check
247+
@docs(t.commands.roles_clone)
248+
async def roles_clone(self, ctx: Context, *, role: Role):
249+
if not ctx.me.guild_permissions.manage_roles:
250+
raise CommandError(t.clone_no_permission)
251+
252+
cloned_permissions = role.permissions.value & ctx.me.guild_permissions.value
253+
254+
missing_permissions = "\n".join(
255+
f":small_blue_diamond: `{permission}`"
256+
for permission, value in Permissions(role.permissions.value & ~ctx.me.guild_permissions.value)
257+
if value
258+
)
259+
260+
await ctx.guild.create_role(
261+
name=role.name,
262+
color=role.color,
263+
permissions=Permissions(cloned_permissions),
264+
hoist=role.hoist,
265+
mentionable=role.mentionable,
266+
)
267+
268+
if missing_permissions:
269+
await send_long_embed(
270+
ctx,
271+
Embed(
272+
title=t.failed_to_clone_role_permissions,
273+
description=missing_permissions,
274+
color=Colors.MissingPermissions,
275+
),
276+
paginate=True,
277+
)
278+
279+
await ctx.message.add_reaction(name_to_emoji["white_check_mark"])
280+
244281
@roles.command(name="remove", aliases=["r", "del", "d", "-"])
245282
@optional_permissions(RolesPermission.auth_write)
246283
@docs(t.commands.roles_remove)

administration/roles/colors.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33

44
class Colors(MaterialColors):
55
Roles = MaterialColors.blue["a700"]
6+
MissingPermissions = MaterialColors.yellow["a700"]

administration/roles/permissions.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ def description(self) -> str:
1414
auth_read = auto()
1515
auth_write = auto()
1616
list_members = auto()
17+
roles_clone = auto()

administration/roles/translations/en.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ permissions:
44
auth_read: read role assignment permissions
55
auth_write: write role assignment permissions
66
list_members: list role members
7+
roles_clone: clones existing roles
78

89
commands:
910
roles: manage roles
@@ -12,6 +13,7 @@ commands:
1213
roles_auth_add: add a new role assignment authorization
1314
roles_auth_remove: remove a role assignment authorization
1415
roles_add: assign a role to a member
16+
roles_clone: clone an existing role
1517
roles_remove: remove a role from a member
1618
roles_perma_add: assign a role permanently to a member
1719
roles_perma_unset: remove the perma flag from a member role
@@ -52,3 +54,5 @@ perma_reassigned: Perma role {} has been reassigned to {} ({}). If you want to r
5254
no_perma_roles: No permanent role assignments.
5355
perma_roles: Permanent Role Assignments
5456
could_not_reassign: Could not reassign perma role {} to {} ({}).
57+
clone_no_permission: I cannot clone this role because I don't have `manage_roles` permission on this server.
58+
failed_to_clone_role_permissions: ":warning: Could not clone following permissions:"

contributor.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ class Contributor(ContributorBase):
1111
Tristan = (277069925678317568, "MDQ6VXNlcjQ1MzMwNjY3")
1212
Tert0 = (621330363167539210, "MDQ6VXNlcjYyMDM2NDY0")
1313
MarcelCoding = (398895973490884608, "MDQ6VXNlcjM0ODE5NTI0")
14+
NekoFanatic = (544956941643022356, "MDQ6VXNlcjgzODgzODQ5")

0 commit comments

Comments
 (0)