import logging from typing import Callable, Awaitable, List from src.core.base import MigrationContext logger = logging.getLogger(__name__) async def sync_server_metadata(context: MigrationContext, progress_callback: Callable[[str, str], Awaitable[None]], components: List[str] = ["name", "icon", "banner"]) -> dict: """Syncs the server name, logo and banner. Returns a dict of cloned attributes.""" metadata = await context.discord_reader.get_server_metadata() cloned_data = {} # 1. Sync Name if "name" in components: try: name = metadata.get("name") logger.info(f"Syncing server name: {name}") await context.writer.update_guild_metadata(name=name) cloned_data["name"] = name await progress_callback("Server Name", "DONE") except Exception as e: logger.error(f"Failed to sync server name: {e}") await progress_callback("Server Name", "ERROR") # 2. Sync Icon if "icon" in components: try: icon_bytes = None if context.discord_reader.guild and context.discord_reader.guild.icon: icon_bytes = await context.discord_reader.download_asset(context.discord_reader.guild.icon) if icon_bytes: logger.info(f"Uploading server icon ({len(icon_bytes)} bytes)...") await context.writer.update_guild_metadata(icon=icon_bytes) cloned_data["icon"] = icon_bytes await progress_callback("Server Icon", "DONE") else: logger.info("No server icon found to sync.") await progress_callback("Server Icon", "SKIP") except Exception as e: logger.error(f"Failed to sync server icon: {e}") await progress_callback("Server Icon", "ERROR") # 3. Sync Banner if "banner" in components: try: banner_bytes = None if context.discord_reader.guild and context.discord_reader.guild.banner: banner_bytes = await context.discord_reader.download_asset(context.discord_reader.guild.banner) if banner_bytes: logger.info(f"Uploading server banner ({len(banner_bytes)} bytes)...") await context.writer.update_guild_metadata(banner=banner_bytes) cloned_data["banner"] = banner_bytes await progress_callback("Server Banner", "DONE") else: logger.info("No server banner found to sync.") await progress_callback("Server Banner", "SKIP") except Exception as e: logger.error(f"Failed to sync server banner: {e}") await progress_callback("Server Banner", "ERROR") return cloned_data