feat: Enhance custom color role management by removing preset roles when a custom color is set
This commit is contained in:
parent
14696c131d
commit
f6038cbc37
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user