|
1 | 1 | from typing import Optional, Union, Dict, List |
2 | 2 |
|
3 | | -import discord.ext.commands |
4 | 3 | from discord import Role, Embed, Member, Status, Guild, NotFound, User, Forbidden, Permissions |
5 | 4 | from discord.ext import commands |
6 | 5 | 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): |
243 | 242 | await member.add_roles(role) |
244 | 243 | await ctx.message.add_reaction(name_to_emoji["white_check_mark"]) |
245 | 244 |
|
246 | | - @roles.command(name="clone", aliases=["cl", "%"]) |
| 245 | + @roles.command(name="clone", aliases=["cl"]) |
247 | 246 | @RolesPermission.roles_clone.check |
248 | 247 | @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) |
250 | 251 |
|
251 | | - missing_perms = [] |
| 252 | + cloned_permissions = role.permissions.value & ctx.me.guild_permissions.value |
252 | 253 |
|
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 | + ) |
266 | 259 |
|
267 | 260 | 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, |
269 | 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 | + |
270 | 279 | 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) |
275 | 280 |
|
276 | 281 | @roles.command(name="remove", aliases=["r", "del", "d", "-"]) |
277 | 282 | @optional_permissions(RolesPermission.auth_write) |
|
0 commit comments