Add Rolegiver, closes #32

This commit is contained in:
Zeva Rose 2021-07-25 01:24:57 -06:00
parent 0c2be54bcd
commit 433563d52d

288
jarvis/cogs/rolegiver.py Normal file
View file

@ -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))