63 lines
2.8 KiB
Python
63 lines
2.8 KiB
Python
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
|