diff --git a/jarvis/cogs/rolegiver.py b/jarvis/cogs/rolegiver.py new file mode 100644 index 0000000..2e8bfb2 --- /dev/null +++ b/jarvis/cogs/rolegiver.py @@ -0,0 +1,288 @@ +from discord import Role +from discord.ext import commands +from discord_slash import SlashContext, cog_ext +from discord_slash.utils.manage_commands import create_option + +from jarvis.db.types import Setting +from jarvis.utils import build_embed +from jarvis.utils.field import Field + +guild_ids = [862402786116763668] + + +class RolegiverCog(commands.Cog): + def __init__(self, bot): + self.bot = bot + + @cog_ext.cog_subcommand( + base="rolegiver", + name="add", + description="Add a role to rolegiver", + guild_ids=guild_ids, + options=[ + create_option( + name="role", + description="Role to add", + option_type=8, + required=True, + ) + ], + ) + @commands.has_permissions(administrator=True) + async def _rolegiver_add(self, ctx: SlashContext, role: Role): + setting = Setting.get(guild=ctx.guild.id, setting="rolegiver") + if setting and role.id in setting.value: + await ctx.send("Role already in rolegiver", hidden=True) + return + + if not setting: + setting = Setting( + guild=ctx.guild.id, setting="rolegiver", value=[] + ) + + roles = [] + for role_id in setting.value: + e_role = ctx.guild.get_role(role_id) + roles.append(e_role) + + value = "\n".join([r.mention for r in roles]) if roles else "None" + fields = [ + Field(name="New Role", value=f"{role.mention}"), + Field(name="Existing Role(s)", value=value), + ] + setting.value.append(role.id) + setting.update() + + embed = build_embed( + title="Rolegiver Updated", + description="New role added to rolegiver", + fields=fields, + ) + + embed.set_thumbnail(url=ctx.guild.icon_url) + embed.set_author( + name=ctx.author.nick if ctx.author.nick else ctx.author.name, + icon_url=ctx.author.avatar_url, + ) + + embed.set_footer( + text=f"{ctx.author.name}#{ctx.author.discriminator} " + + f"| {ctx.author.id}" + ) + + await ctx.send(embed=embed) + + @cog_ext.cog_subcommand( + base="rolegiver", + name="remove", + description="Remove a role from rolegiver", + guild_ids=guild_ids, + options=[ + create_option( + name="role", + description="Role to add", + option_type=8, + required=True, + ) + ], + ) + @commands.has_permissions(administrator=True) + async def _rolegiver_remove(self, ctx: SlashContext, role: Role): + setting = Setting.get(guild=ctx.guild.id, setting="rolegiver") + if not setting or (setting and not setting.value): + await ctx.send("Rolegiver has no roles", hidden=True) + return + elif role.id not in setting.value: + await ctx.send("Role not in rolegiver", hidden=True) + return + + setting.value.remove(role.id) + setting.update() + + roles = [] + for role_id in setting.value: + e_role = ctx.guild.get_role(role_id) + roles.append(e_role) + + value = "\n".join([r.mention for r in roles]) if roles else "None" + fields = [ + Field(name="Removed Role", value=f"{role.mention}"), + Field(name="Remaining Role(s)", value=value), + ] + + embed = build_embed( + title="Rolegiver Updated", + description="Role removed from rolegiver", + fields=fields, + ) + + embed.set_thumbnail(url=ctx.guild.icon_url) + embed.set_author( + name=ctx.author.nick if ctx.author.nick else ctx.author.name, + icon_url=ctx.author.avatar_url, + ) + + embed.set_footer( + text=f"{ctx.author.name}#{ctx.author.discriminator} " + + f"| {ctx.author.id}" + ) + + await ctx.send(embed=embed) + + @cog_ext.cog_subcommand( + base="rolegiver", + name="list", + description="List roles rolegiver", + guild_ids=guild_ids, + ) + async def _rolegiver_list(self, ctx: SlashContext): + setting = Setting.get(guild=ctx.guild.id, setting="rolegiver") + if not setting or (setting and not setting.value): + await ctx.send("Rolegiver has no roles", hidden=True) + return + + roles = [] + for role_id in setting.value: + e_role = ctx.guild.get_role(role_id) + roles.append(e_role) + + value = "\n".join([r.mention for r in roles]) if roles else "None" + + embed = build_embed( + title="Rolegiver Updated", + description=f"Available roles:\n{value}", + fields=[], + ) + + embed.set_thumbnail(url=ctx.guild.icon_url) + embed.set_author( + name=ctx.author.nick if ctx.author.nick else ctx.author.name, + icon_url=ctx.author.avatar_url, + ) + + embed.set_footer( + text=f"{ctx.author.name}#{ctx.author.discriminator} " + + f"| {ctx.author.id}" + ) + + await ctx.send(embed=embed) + + @cog_ext.cog_subcommand( + base="role", + name="get", + description="Get a role from rolegiver", + guild_ids=guild_ids, + options=[ + create_option( + name="role", + description="Role to add", + option_type=8, + required=True, + ) + ], + ) + @commands.cooldown(1, 10, commands.BucketType.user) + async def _role_get(self, ctx: SlashContext, role: Role): + setting = Setting.get(guild=ctx.guild.id, setting="rolegiver") + if not setting or (setting and not setting.value): + await ctx.send("Rolegiver has no roles", hidden=True) + return + elif role.id not in setting.value: + await ctx.send("Role not in rolegiver", hidden=True) + return + elif role in ctx.author.roles: + await ctx.send("You already have that role", hidden=True) + return + + await ctx.author.add_roles(role, reason="Rolegiver") + + value = ( + "\n".join([r.mention for r in ctx.author.roles]) + if ctx.author.roles + else "None" + ) + fields = [ + Field(name="Added Role", value=f"{role.mention}"), + Field(name="Prior Role(s)", value=value), + ] + + embed = build_embed( + title="User Given Role", + description=f"{role.mention} given to {ctx.author.mention}", + fields=fields, + ) + + embed.set_thumbnail(url=ctx.guild.icon_url) + embed.set_author( + name=ctx.author.nick if ctx.author.nick else ctx.author.name, + icon_url=ctx.author.avatar_url, + ) + + embed.set_footer( + text=f"{ctx.author.name}#{ctx.author.discriminator} " + + f"| {ctx.author.id}" + ) + + await ctx.send(embed=embed) + + @cog_ext.cog_subcommand( + base="role", + name="forfeit", + description="Have rolegiver take away role", + guild_ids=guild_ids, + options=[ + create_option( + name="role", + description="Role to remove", + option_type=8, + required=True, + ) + ], + ) + @commands.cooldown(1, 10, commands.BucketType.user) + async def _role_forfeit(self, ctx: SlashContext, role: Role): + setting = Setting.get(guild=ctx.guild.id, setting="rolegiver") + if not setting or (setting and not setting.value): + await ctx.send("Rolegiver has no roles", hidden=True) + return + elif role.id not in setting.value: + await ctx.send("Role not in rolegiver", hidden=True) + return + elif role not in ctx.author.roles: + await ctx.send("You do not have that role", hidden=True) + return + + await ctx.author.remove_roles(role, reason="Rolegiver") + + value = ( + "\n".join([r.mention for r in ctx.author.roles if r.id != role.id]) + if ctx.author.roles + else "None" + ) + fields = [ + Field(name="Taken Role", value=f"{role.mention}"), + Field(name="Remaining Role(s)", value=value), + ] + + embed = build_embed( + title="User Forfeited Role", + description=f"{role.mention} taken from {ctx.author.mention}", + fields=fields, + ) + + embed.set_thumbnail(url=ctx.guild.icon_url) + embed.set_author( + name=ctx.author.nick if ctx.author.nick else ctx.author.name, + icon_url=ctx.author.avatar_url, + ) + + embed.set_footer( + text=f"{ctx.author.name}#{ctx.author.discriminator} " + + f"| {ctx.author.id}" + ) + + await ctx.send(embed=embed) + + +def setup(bot): + bot.add_cog(RolegiverCog(bot))