302 lines
9.1 KiB
Python
302 lines
9.1 KiB
Python
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.models import Setting
|
|
from jarvis.utils import build_embed
|
|
from jarvis.utils.field import Field
|
|
from jarvis.utils.permissions import admin_or_permissions
|
|
|
|
|
|
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",
|
|
options=[
|
|
create_option(
|
|
name="role",
|
|
description="Role to add",
|
|
option_type=8,
|
|
required=True,
|
|
)
|
|
],
|
|
)
|
|
@admin_or_permissions(manage_guild=True)
|
|
async def _rolegiver_add(self, ctx: SlashContext, role: Role):
|
|
setting = Setting.objects(
|
|
guild=ctx.guild.id, setting="rolegiver"
|
|
).first()
|
|
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)
|
|
if roles:
|
|
roles.sort(lambda x: -x.position)
|
|
|
|
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.save()
|
|
|
|
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",
|
|
options=[
|
|
create_option(
|
|
name="role",
|
|
description="Role to add",
|
|
option_type=8,
|
|
required=True,
|
|
)
|
|
],
|
|
)
|
|
@admin_or_permissions(manage_guild=True)
|
|
async def _rolegiver_remove(self, ctx: SlashContext, role: Role):
|
|
setting = Setting.objects(
|
|
guild=ctx.guild.id, setting="rolegiver"
|
|
).first()
|
|
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.save()
|
|
|
|
roles = []
|
|
for role_id in setting.value:
|
|
e_role = ctx.guild.get_role(role_id)
|
|
roles.append(e_role)
|
|
|
|
if roles:
|
|
roles.sort(lambda x: -x.position)
|
|
|
|
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",
|
|
)
|
|
async def _rolegiver_list(self, ctx: SlashContext):
|
|
setting = Setting.objects(
|
|
guild=ctx.guild.id, setting="rolegiver"
|
|
).first()
|
|
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)
|
|
|
|
if roles:
|
|
roles.sort(lambda x: -x.position)
|
|
|
|
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",
|
|
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.objects(
|
|
guild=ctx.guild.id, setting="rolegiver"
|
|
).first()
|
|
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")
|
|
|
|
roles = ctx.author.roles
|
|
if roles:
|
|
roles.sort(lambda x: -x.position)
|
|
_ = roles.pop(-1)
|
|
|
|
value = "\n".join([r.mention for r in roles]) if 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",
|
|
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.objects(
|
|
guild=ctx.guild.id, setting="rolegiver"
|
|
).first()
|
|
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")
|
|
|
|
roles = ctx.author.roles
|
|
if roles:
|
|
roles.sort(lambda x: -x.position)
|
|
_ = roles.pop(-1)
|
|
|
|
value = "\n".join([r.mention for r in roles]) if 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))
|