feat: Enhance custom color role management by removing preset roles when a custom color is set

This commit is contained in:
Slipstream 2025-05-31 20:05:20 -06:00
parent 14696c131d
commit f6038cbc37
Signed by: slipstream
GPG Key ID: 13E498CE010AC6FD

View File

@ -195,7 +195,39 @@ class CustomColorModal(Modal, title="Set Your Custom Role Color"):
)
db.save_user_custom_color_role(user_color_role_data)
await interaction.followup.send(f"Your custom role color has been set to {user_color_role_data.hex_color}!", ephemeral=True)
# New logic: Remove roles from "Colors" preset if custom color is set
removed_preset_color_roles_names = []
# Ensure guild is not None, though it should be from earlier checks (line 103)
if guild and isinstance(member, discord.Member): # member check for safety
guild_role_categories = db.get_guild_role_category_configs(str(guild.id))
colors_preset_role_ids_to_remove = set()
for cat_config in guild_role_categories:
# "Colors" preset ID is 'default_colors'
if cat_config.is_preset and cat_config.preset_id == "default_colors":
for role_option in cat_config.roles:
colors_preset_role_ids_to_remove.add(int(role_option.role_id))
break # Found the Colors preset for this guild
if colors_preset_role_ids_to_remove:
roles_to_actually_remove_from_member = []
for member_role in member.roles:
if member_role.id in colors_preset_role_ids_to_remove:
roles_to_actually_remove_from_member.append(member_role)
if roles_to_actually_remove_from_member:
try:
await member.remove_roles(*roles_to_actually_remove_from_member, reason="User set a custom color, removing preset color role(s).")
removed_preset_color_roles_names = [r.name for r in roles_to_actually_remove_from_member]
except discord.Forbidden:
await interaction.followup.send("I tried to remove your preset color role(s) but lack permissions.", ephemeral=True)
except discord.HTTPException as e:
await interaction.followup.send(f"Failed to remove your preset color role(s): {e}", ephemeral=True)
feedback_message = f"Your custom role color has been set to {user_color_role_data.hex_color}!"
if removed_preset_color_roles_names:
feedback_message += f"\nRemoved preset color role(s): {', '.join(removed_preset_color_roles_names)}."
await interaction.followup.send(feedback_message, ephemeral=True)
async def on_error(self, interaction: discord.Interaction, error: Exception):
await interaction.followup.send(f"An error occurred: {error}", ephemeral=True)
@ -296,6 +328,31 @@ class RoleSelectorView(View):
roles_to_add = {guild.get_role(role_id) for role_id in roles_to_add_ids if guild.get_role(role_id)}
roles_to_remove = {guild.get_role(role_id) for role_id in roles_to_remove_ids if guild.get_role(role_id)}
added_names, removed_names, error_messages = [], [], []
removed_custom_color_feedback = "" # Initialize here
# New logic: If adding a "Colors" preset role, remove custom color role
# The preset_id for "Colors" is 'default_colors'
is_colors_preset_category = self.category_config.is_preset and self.category_config.preset_id == "default_colors"
# A color from the "Colors" preset is being added (roles_to_add is not empty)
if is_colors_preset_category and roles_to_add:
# Ensure member and guild are valid (they should be from earlier checks in lines 262-267)
if isinstance(member, discord.Member) and guild:
existing_user_custom_color_db = db.get_user_custom_color_role(str(guild.id), str(member.id))
if existing_user_custom_color_db:
custom_color_role_to_remove = guild.get_role(int(existing_user_custom_color_db.role_id))
if custom_color_role_to_remove:
try:
await member.remove_roles(custom_color_role_to_remove, reason="User selected a preset color, removing custom color role.")
db.delete_user_custom_color_role(str(guild.id), str(member.id)) # Delete from DB
removed_custom_color_feedback = f"\n- Removed custom color role '{custom_color_role_to_remove.name}'."
except discord.Forbidden:
error_messages.append("Could not remove your custom color role (permissions).")
except discord.HTTPException as e:
error_messages.append(f"Error removing custom color role: {e}")
else: # Role not found in guild, but was in DB. Clean up DB.
db.delete_user_custom_color_role(str(guild.id), str(member.id))
removed_custom_color_feedback = "\n- Your previous custom color role was not found in the server and has been cleared from my records."
try:
if roles_to_remove:
@ -308,7 +365,11 @@ class RoleSelectorView(View):
feedback = "Your roles have been updated!"
if added_names: feedback += f"\n+ Added: {', '.join(added_names)}"
if removed_names: feedback += f"\n- Removed: {', '.join(removed_names)}"
if not added_names and not removed_names:
feedback += removed_custom_color_feedback # Add the custom color removal feedback here
# Adjusted condition for "no changes" message
# Ensure removed_custom_color_feedback is considered. If it has content, changes were made.
if not added_names and not removed_names and not removed_custom_color_feedback.strip():
if selected_values: feedback = "No changes needed for the roles selected in this dropdown."
else: feedback = "No roles selected in this dropdown." if not member_roles_in_interacted_chunk else "Roles deselected from this dropdown."
await interaction.followup.send(feedback, ephemeral=True)