feat: Add command to add all global role presets as categories to the guild with feedback on creation

This commit is contained in:
Slipstream 2025-05-30 18:44:34 -06:00
parent 478b6709d3
commit f61731c96f
Signed by: slipstream
GPG Key ID: 13E498CE010AC6FD

View File

@ -822,6 +822,80 @@ class RoleSelectorCog(commands.Cog):
else:
await interaction.response.send_message(f"Role matching '{role_id_or_name}' not found in preset '{preset.name}'.", ephemeral=True)
@rolepreset_group.command(name="add_all_to_guild", description="Adds all available global presets as categories to this guild.")
@app_commands.checks.has_permissions(manage_guild=True)
async def rolepreset_add_all_to_guild(self, interaction: discord.Interaction):
if not interaction.guild:
await interaction.response.send_message("This command can only be used in a server.", ephemeral=True)
return
if not interaction.guild.me.guild_permissions.manage_roles:
await interaction.response.send_message("I need 'Manage Roles' permission to create roles from presets.", ephemeral=True)
return
await interaction.response.defer(ephemeral=True, thinking=True)
guild_id_str = str(interaction.guild_id)
all_presets = db.get_all_role_category_presets()
added_count = 0
skipped_count = 0
feedback_messages = []
color_map_for_creation = {
"Red": discord.Color.red(), "Blue": discord.Color.blue(), "Green": discord.Color.green(),
"Yellow": discord.Color.gold(), "Purple": discord.Color.purple(), "Orange": discord.Color.orange(),
"Pink": discord.Color.fuchsia(), "Black": discord.Color(0x010101), "White": discord.Color(0xFEFEFE)
}
for preset in all_presets:
# Check if a category based on this preset already exists in the guild
if self._get_guild_category_config(interaction.guild_id, preset.name):
feedback_messages.append(f"Skipped '{preset.name}': A category with this name already exists.")
skipped_count += 1
continue
roles_to_add: List[GuildRole] = []
for preset_role_option in preset.roles:
existing_role_in_guild = discord.utils.get(interaction.guild.roles, name=preset_role_option.name)
if existing_role_in_guild:
roles_to_add.append(GuildRole(role_id=str(existing_role_in_guild.id), name=existing_role_in_guild.name, emoji=preset_role_option.emoji))
else:
role_color = discord.Color.default()
if preset.name.lower() == "colors" and preset_role_option.name in color_map_for_creation:
role_color = color_map_for_creation[preset_role_option.name]
try:
newly_created_role = await interaction.guild.create_role(
name=preset_role_option.name,
color=role_color,
permissions=discord.Permissions.none(),
reason=f"Auto-created for preset '{preset.name}' by {interaction.user}"
)
roles_to_add.append(GuildRole(role_id=str(newly_created_role.id), name=newly_created_role.name, emoji=preset_role_option.emoji))
except discord.Forbidden:
feedback_messages.append(f"Warning: Couldn't create role '{preset_role_option.name}' for preset '{preset.name}' due to permissions.")
continue
except discord.HTTPException as e:
feedback_messages.append(f"Warning: Failed to create role '{preset_role_option.name}' for preset '{preset.name}': {e}.")
continue
new_config = GuildRoleCategoryConfig(
guild_id=guild_id_str,
name=preset.name,
description=preset.description,
roles=roles_to_add,
max_selectable=preset.max_selectable,
is_preset=True,
preset_id=preset.id
)
db.save_guild_role_category_config(new_config)
feedback_messages.append(f"Added '{preset.name}' as a new category.")
added_count += 1
final_message = f"Attempted to add {len(all_presets)} presets.\nAdded: {added_count}\nSkipped: {skipped_count}\n\nDetails:\n" + "\n".join(feedback_messages)
await interaction.followup.send(final_message, ephemeral=True)
@rolepreset_group.command(name="init_defaults", description="Initializes default global presets based on role_creator_cog structure.")
@app_commands.check(is_owner_check)
async def rolepreset_init_defaults(self, interaction: discord.Interaction):