import discord
from bot.weakauras_bot import WeakAurasBot
from utils.logging import get_logger, log_command
logger = get_logger(__name__)
[docs]
async def send_embed_response(
interaction: discord.Interaction,
embed: discord.Embed,
logo_file: discord.File | None,
ephemeral: bool = True,
):
"""Helper function to send embed response with optional file attachment"""
kwargs = {"embed": embed, "ephemeral": ephemeral}
if logo_file:
kwargs["file"] = logo_file
await interaction.response.send_message(**kwargs)
[docs]
def setup_config_commands(bot: WeakAurasBot):
"""Setup configuration-related commands"""
@bot.tree.command(
name="config", description="Configure WeakAuras bot settings (Admin only)"
)
@log_command
async def config_command(interaction: discord.Interaction):
"""Main configuration command"""
if not interaction.guild:
logger.warning("config command used outside of server")
await interaction.response.send_message(
"This command can only be used in a server!", ephemeral=True
)
return
# Check if user has admin access
if not isinstance(interaction.user, discord.Member) or not bot.has_admin_access(
interaction.user
):
permissions_config = bot.config.get("bot", {}).get("permissions", {})
admin_roles = permissions_config.get("admin_roles", ["admin"])
admin_permissions = permissions_config.get("admin_permissions", [])
roles_text = ", ".join(f"'{role}'" for role in admin_roles)
perms_text = ", ".join(admin_permissions)
description = (
f"You need either:\n• Role: {roles_text}\n• Permission: {perms_text}"
)
embed, logo_file = bot.create_embed(
title="❌ Permission Denied",
description=description,
footer_text=f"Server: {interaction.guild.name}",
)
await send_embed_response(interaction, embed, logo_file)
logger.warning("config command denied - insufficient permissions")
return
# Load current server configuration
guild_id = interaction.guild.id
guild_name = interaction.guild.name
server_config = bot.load_server_config(guild_id, guild_name)
logger.info(f"config command authorized for guild {guild_name} ({guild_id})")
# Create configuration view with buttons
view = ConfigView(bot, guild_id, guild_name, server_config)
embed, logo_file = bot.create_embed(
title="⚙️ WeakAuras Bot Configuration",
description=view.get_config_status(server_config),
footer_text=f"Server: {guild_name}",
)
if logo_file:
await interaction.response.send_message(
embed=embed, file=logo_file, view=view, ephemeral=True
)
else:
await interaction.response.send_message(
embed=embed, view=view, ephemeral=True
)
[docs]
class ConfigView(discord.ui.View):
[docs]
def __init__(self, bot: WeakAurasBot, guild_id: int, guild_name: str, config: dict):
super().__init__(timeout=300)
self.bot = bot
self.guild_id = guild_id
self.guild_name = guild_name
self.config = config
[docs]
def get_config_status(self, config: dict) -> str:
"""Generate configuration status text"""
temp_config = config.get("events", {}).get("temperature", {})
temp_enabled = temp_config.get("enabled", True)
status_lines = [
"**Event Configuration:**",
f"🌡️ Temperature Conversion: {'✅ Enabled' if temp_enabled else '❌ Disabled'}",
"",
"Use the button below to toggle settings:",
]
return "\n".join(status_lines)
[docs]
@discord.ui.button(
label="Toggle Temperature Event", style=discord.ButtonStyle.primary, emoji="🌡️"
)
async def toggle_temperature(
self, interaction: discord.Interaction, _button: discord.ui.Button
):
"""Toggle temperature conversion event"""
events_config = self.config.setdefault("events", {})
temp_config = events_config.setdefault("temperature", {"enabled": True})
old_state = temp_config.get("enabled", True)
temp_config["enabled"] = not old_state
new_state = temp_config["enabled"]
self.bot.save_server_config(self.guild_id, self.guild_name, self.config)
logger.info(
f"Temperature event toggled in guild {self.guild_name} ({self.guild_id}): {old_state} -> {new_state}"
)
# Update embed
embed, _logo_file = self.bot.create_embed(
title="⚙️ WeakAuras Bot Configuration",
description=self.get_config_status(self.config),
footer_text=f"Server: {self.guild_name}",
)
await interaction.response.edit_message(embed=embed, view=self)