You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
3.4 KiB
75 lines
3.4 KiB
import discord
|
|
import hrochobot.utils.data as data
|
|
from discord.ext import commands
|
|
from discord.utils import get
|
|
|
|
ROLES_JSON = "roles"
|
|
|
|
def role_mention(role):
|
|
return role.mention if role else "@deleted-role"
|
|
|
|
class Roles(commands.Cog):
|
|
def __init__(self, bot):
|
|
self.bot = bot
|
|
|
|
secret_roles = discord.SlashCommandGroup(
|
|
"secretroles",
|
|
"Commands for management of secret roles.",
|
|
guild_only=True,
|
|
checks=[commands.has_permissions(manage_roles=True)]
|
|
)
|
|
|
|
@secret_roles.command(description="Adds a new secret role.")
|
|
@discord.option("role", discord.role.Role, description="Role locked behind a password.")
|
|
@discord.option("password", str, description="Password for given role.")
|
|
async def add(self, ctx, role, password):
|
|
roles = data.load_guild_data(ctx.author.guild.id, ROLES_JSON)
|
|
if password in roles["secret_roles"]:
|
|
return await ctx.respond(f"Password ``{password}`` is already used.", ephemeral=True)
|
|
|
|
roles["secret_roles"][password] = role.id
|
|
data.dump_guild_data(ctx.author.guild.id, ROLES_JSON, roles)
|
|
return await ctx.respond(f"Secret role {role.mention} added with password {password}.", ephemeral=True)
|
|
|
|
@secret_roles.command(description="Lists all passwords and their secret roles.")
|
|
async def list(self, ctx):
|
|
roles = data.load_guild_data(ctx.author.guild.id, ROLES_JSON)
|
|
if len(roles["secret_roles"]) == 0:
|
|
return await ctx.respond(f"No current secret roles.", ephemeral=True)
|
|
msg = ""
|
|
for passwd, role in roles["secret_roles"].items():
|
|
role = get(ctx.author.guild.roles, id=role)
|
|
msg += f"``{passwd}``: {role_mention(role)}\n"
|
|
return await ctx.respond(msg, ephemeral=True)
|
|
|
|
@secret_roles.command(description="Deletes given password and its secret role.")
|
|
@discord.option("password", str, description="Password to be deleted.")
|
|
async def delete(self, ctx, password):
|
|
roles = data.load_guild_data(ctx.author.guild.id, ROLES_JSON)
|
|
if password not in roles["secret_roles"]:
|
|
return await ctx.respond(f"Role with passowrd {password} does not exist.", ephemeral=True)
|
|
|
|
role = get(ctx.author.guild.roles, id=roles["secret_roles"][password])
|
|
del roles["secret_roles"][password]
|
|
data.dump_guild_data(ctx.author.guild.id, ROLES_JSON, roles)
|
|
return await ctx.respond(
|
|
f"Secret role {role_mention(role)} no longer obtainable with password {password}.",
|
|
ephemeral=True
|
|
)
|
|
|
|
@discord.slash_command(description="Gives a secret role locked by a password.", guild_only=True)
|
|
@discord.option("password", str, description="Password for secret role.")
|
|
async def secretrole(self, ctx, password):
|
|
roles = data.load_guild_data(ctx.author.guild.id, ROLES_JSON)
|
|
if password in roles["secret_roles"]:
|
|
author = ctx.author
|
|
role = get(author.guild.roles, id=roles["secret_roles"][password])
|
|
if role is None:
|
|
return await ctx.respond(f"Role for this password was deleted.", ephemeral=True)
|
|
await author.add_roles(role, reason="Role assigned for password knowledge.")
|
|
return await ctx.respond(f"You now have role {role.mention}.", ephemeral=True)
|
|
else:
|
|
return await ctx.respond("Incorrect password.", ephemeral=True)
|
|
|
|
def setup(bot):
|
|
bot.add_cog(Roles(bot))
|
|
|