|
1 | 1 | from typing import Optional, Union, Dict, List |
2 | 2 |
|
| 3 | +import discord.ext.commands |
3 | 4 | from discord import Role, Embed, Member, Status, Guild, NotFound, User, Forbidden |
4 | 5 | from discord.ext import commands |
5 | 6 | from discord.ext.commands import CommandError, Context, guild_only, UserInputError, Group |
6 | 7 |
|
7 | 8 | from PyDrocsid.cog import Cog |
8 | 9 | from PyDrocsid.command import reply, docs, optional_permissions |
9 | | -from PyDrocsid.config import Contributor, Config |
| 10 | +from PyDrocsid.config import Config |
| 11 | +from ...contributor import Contributor |
10 | 12 | from PyDrocsid.converter import UserMemberConverter |
11 | 13 | from PyDrocsid.database import db, select, filter_by |
12 | 14 | from PyDrocsid.embeds import send_long_embed |
@@ -90,7 +92,7 @@ async def inner(_, ctx: Context, *, role: Role): |
90 | 92 |
|
91 | 93 |
|
92 | 94 | class RolesCog(Cog, name="Roles"): |
93 | | - CONTRIBUTORS = [Contributor.Defelo] |
| 95 | + CONTRIBUTORS = [Contributor.Defelo, Contributor.NekoFanatic] |
94 | 96 |
|
95 | 97 | def __init__(self): |
96 | 98 | super().__init__() |
@@ -241,6 +243,52 @@ async def roles_add(self, ctx: Context, member: Member, *, role: Role): |
241 | 243 | await member.add_roles(role) |
242 | 244 | await ctx.message.add_reaction(name_to_emoji["white_check_mark"]) |
243 | 245 |
|
| 246 | + @roles.command(name="clone", aliases=["cl", "%"]) |
| 247 | + @RolesPermission.roles_clone.check |
| 248 | + @docs(t.commands.roles_clone) |
| 249 | + async def roles_clone(self, ctx: Context, role: Role): |
| 250 | + if not await is_authorized(ctx.author, role, perma=False): |
| 251 | + raise CommandError(t.role_not_authorized) |
| 252 | + |
| 253 | + permission_list = ["add_reactions", "administrator", "attach_files", "ban_members", "change_nickname", |
| 254 | + "connect", "create_instant_invite", "deafen_members", "embed_links", "external_emojis", |
| 255 | + "kick_members", "manage_channels", "manage_emojis", "manage_guild", "manage_messages", |
| 256 | + "manage_nicknames", "manage_permissions", "manage_roles", "manage_webhooks", |
| 257 | + "mention_everyone", "move_members", "mute_members", "priority_speaker", |
| 258 | + "read_message_history", "read_messages", "request_to_speak", "send_messages", |
| 259 | + "send_tts_messages", "speak", "stream", "use_external_emojis", "use_slash_commands", |
| 260 | + "use_voice_activation", "value", "view_audit_log", "view_channel", "view_guild_insights"] |
| 261 | + |
| 262 | + missing_perms = [] |
| 263 | + params = discord.Permissions() |
| 264 | + bot_member_object = ctx.guild.get_member(self.bot.user.id) |
| 265 | + |
| 266 | + for permission in permission_list: |
| 267 | + if getattr(bot_member_object.guild_permissions, permission) == getattr(role.permissions, |
| 268 | + permission) is True: |
| 269 | + params.update(**{permission: True}) |
| 270 | + else: |
| 271 | + missing_perms.append(permission) |
| 272 | + |
| 273 | + await ctx.guild.create_role( |
| 274 | + name=role.name, |
| 275 | + color=role.color, |
| 276 | + permissions=params, |
| 277 | + hoist=role.hoist, |
| 278 | + mentionable=role.mentionable |
| 279 | + ) |
| 280 | + await ctx.message.add_reaction(name_to_emoji["white_check_mark"]) |
| 281 | + if missing_perms: |
| 282 | + descrip = "" |
| 283 | + for mis in missing_perms: |
| 284 | + descrip += f"`{mis}`\n" |
| 285 | + em = Embed( |
| 286 | + title=t.failed_to_clone_role_permissions, |
| 287 | + description=descrip, |
| 288 | + color=Colors.MissingPermissions |
| 289 | + ) |
| 290 | + await send_long_embed(ctx, em, paginate=True) |
| 291 | + |
244 | 292 | @roles.command(name="remove", aliases=["r", "del", "d", "-"]) |
245 | 293 | @optional_permissions(RolesPermission.auth_write) |
246 | 294 | @docs(t.commands.roles_remove) |
|
0 commit comments