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

Commit 2aa36ce

Browse files
committed
Improved roles_clone command
1 parent 30fbb98 commit 2aa36ce

File tree

2 files changed

+28
-22
lines changed

2 files changed

+28
-22
lines changed

administration/roles/cog.py

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

3-
import discord.ext.commands
43
from discord import Role, Embed, Member, Status, Guild, NotFound, User, Forbidden, Permissions
54
from discord.ext import commands
65
from discord.ext.commands import CommandError, Context, guild_only, UserInputError, Group
@@ -243,35 +242,41 @@ async def roles_add(self, ctx: Context, member: Member, *, role: Role):
243242
await member.add_roles(role)
244243
await ctx.message.add_reaction(name_to_emoji["white_check_mark"])
245244

246-
@roles.command(name="clone", aliases=["cl", "%"])
245+
@roles.command(name="clone", aliases=["cl"])
247246
@RolesPermission.roles_clone.check
248247
@docs(t.commands.roles_clone)
249-
async def roles_clone(self, ctx: Context, role: Role):
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)
250251

251-
missing_perms = []
252+
cloned_permissions = role.permissions.value & ctx.me.guild_permissions.value
252253

253-
params = discord.Permissions()
254-
bot_member_object = ctx.guild.me
255-
256-
for permission, _ in Permissions.all():
257-
if (
258-
getattr(bot_member_object.guild_permissions,
259-
permission
260-
) == getattr(role.permissions, permission)
261-
is True
262-
):
263-
params.update(**{permission: True})
264-
else:
265-
missing_perms.append(permission)
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+
)
266259

267260
await ctx.guild.create_role(
268-
name=role.name, color=role.color, permissions=params, hoist=role.hoist, mentionable=role.mentionable,
261+
name=role.name,
262+
color=role.color,
263+
permissions=Permissions(cloned_permissions),
264+
hoist=role.hoist,
265+
mentionable=role.mentionable,
269266
)
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+
270279
await ctx.message.add_reaction(name_to_emoji["white_check_mark"])
271-
if missing_perms:
272-
descrip = "`" + "`\n`".join(missing_perms) + "`"
273-
em = Embed(title=t.failed_to_clone_role_permissions, description=descrip, color=Colors.MissingPermissions)
274-
await send_long_embed(ctx, em, paginate=True)
275280

276281
@roles.command(name="remove", aliases=["r", "del", "d", "-"])
277282
@optional_permissions(RolesPermission.auth_write)

administration/roles/translations/en.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,5 @@ perma_reassigned: Perma role {} has been reassigned to {} ({}). If you want to r
5454
no_perma_roles: No permanent role assignments.
5555
perma_roles: Permanent Role Assignments
5656
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.
5758
failed_to_clone_role_permissions: ":warning: Could not clone following permissions:"

0 commit comments

Comments
 (0)