Bot pro KSP Discord
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

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