feat: Add command to add all global role presets as categories to the guild with feedback on creation
This commit is contained in:
parent
478b6709d3
commit
f61731c96f
@ -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):
|
||||
|
Loading…
x
Reference in New Issue
Block a user