|
1 | 1 | from typing import Optional, Union, Dict, List |
2 | 2 |
|
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 |
4 | 4 | from discord.ext import commands |
5 | 5 | from discord.ext.commands import CommandError, Context, guild_only, UserInputError, Group |
6 | 6 |
|
7 | 7 | from PyDrocsid.cog import Cog |
8 | 8 | from PyDrocsid.command import reply, docs, optional_permissions |
9 | | -from PyDrocsid.config import Contributor, Config |
| 9 | +from PyDrocsid.config import Config |
10 | 10 | from PyDrocsid.converter import UserMemberConverter |
11 | 11 | from PyDrocsid.database import db, select, filter_by |
12 | 12 | from PyDrocsid.embeds import send_long_embed |
|
18 | 18 | from .colors import Colors |
19 | 19 | from .models import RoleAuth, PermaRole |
20 | 20 | from .permissions import RolesPermission |
| 21 | +from ...contributor import Contributor |
21 | 22 | from ...pubsub import send_to_changelog, send_alert |
22 | 23 |
|
23 | 24 | tg = t.g |
@@ -90,7 +91,7 @@ async def inner(_, ctx: Context, *, role: Role): |
90 | 91 |
|
91 | 92 |
|
92 | 93 | class RolesCog(Cog, name="Roles"): |
93 | | - CONTRIBUTORS = [Contributor.Defelo] |
| 94 | + CONTRIBUTORS = [Contributor.Defelo, Contributor.NekoFanatic] |
94 | 95 |
|
95 | 96 | def __init__(self): |
96 | 97 | super().__init__() |
@@ -241,6 +242,42 @@ async def roles_add(self, ctx: Context, member: Member, *, role: Role): |
241 | 242 | await member.add_roles(role) |
242 | 243 | await ctx.message.add_reaction(name_to_emoji["white_check_mark"]) |
243 | 244 |
|
| 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 | + |
244 | 281 | @roles.command(name="remove", aliases=["r", "del", "d", "-"]) |
245 | 282 | @optional_permissions(RolesPermission.auth_write) |
246 | 283 | @docs(t.commands.roles_remove) |
@@ -361,7 +398,7 @@ async def roles_list(self, ctx: Context, *, role: Role): |
361 | 398 | out.append(f":grey_question: <@{member_id}> (@{member_name}) :shield:") |
362 | 399 |
|
363 | 400 | if out: |
364 | | - embed = Embed(title=t.member_list_cnt(len(out)), colour=0x256BE6, description="\n".join(out)) |
| 401 | + embed = Embed(title=t.member_list_cnt(role.name, cnt=len(out)), colour=0x256BE6, description="\n".join(out)) |
365 | 402 | else: |
366 | 403 | embed = Embed(title=t.member_list, colour=0xCF0606, description=t.no_members) |
367 | 404 | await send_long_embed(ctx, embed, paginate=True) |
|
0 commit comments