fix sticker local_hash error

This commit is contained in:
rambros 2026-03-30 02:21:11 +05:30
parent 73d52d2183
commit 514a2e551c
3 changed files with 17 additions and 9 deletions

View file

@ -530,12 +530,13 @@ class BackupEmoji:
class BackupSticker: class BackupSticker:
"""Minimal stand-in for discord.GuildSticker.""" """Minimal stand-in for discord.GuildSticker."""
__slots__ = ("id", "name", "url", "format", "_backup_root", "_file_path") __slots__ = ("id", "name", "url", "format", "_backup_root", "_file_path", "local_hash")
def __init__(self, data: dict, backup_root: Path | None = None, media_pool: dict | None = None): def __init__(self, data: dict, backup_root: Path | None = None, media_pool: dict | None = None):
if not isinstance(data, dict): if not isinstance(data, dict):
self.id = 0 self.id = 0
self.name = "Sticker" self.name = "Sticker"
self.local_hash = None
return return
self.id = parse_snowflake(data.get("id") or data.get("sticker_id", 0)) or 0 self.id = parse_snowflake(data.get("id") or data.get("sticker_id", 0)) or 0
self.name = data.get("name", "Sticker") self.name = data.get("name", "Sticker")
@ -550,14 +551,14 @@ class BackupSticker:
self._backup_root = backup_root self._backup_root = backup_root
# 1. Check if it's a CAS-based sticker (from message_stickers table) # 1. Check if it's a CAS-based sticker (from message_stickers table)
local_hash = data.get("local_hash") self.local_hash = data.get("local_hash")
if local_hash and backup_root: if self.local_hash and backup_root:
ext = ".png" ext = ".png"
if self.format == StickerFormatType.lottie: ext = ".json" if self.format == StickerFormatType.lottie: ext = ".json"
elif self.format == StickerFormatType.apng: ext = ".png" elif self.format == StickerFormatType.apng: ext = ".png"
elif self.format == StickerFormatType.gif: ext = ".gif" elif self.format == StickerFormatType.gif: ext = ".gif"
self._file_path = backup_root / "attachments" / f"{local_hash}{ext}" self._file_path = backup_root / "attachments" / f"{self.local_hash}{ext}"
# 2. Check if it's a server asset sticker (legacy or manual save) # 2. Check if it's a server asset sticker (legacy or manual save)
elif data.get("filename") and backup_root: elif data.get("filename") and backup_root:
self._file_path = backup_root / "server_assets" / data["filename"] self._file_path = backup_root / "server_assets" / data["filename"]

View file

@ -842,7 +842,7 @@ async def migrate_global_messages(
sticker_url = sticker.url sticker_url = sticker.url
# Check for uploaded media pool logic first # Check for uploaded media pool logic first
s_hash = sticker.local_hash s_hash = getattr(sticker, "local_hash", None)
sticker_file = None sticker_file = None
s_media = db_media.get(s_hash) if db_media and s_hash else None s_media = db_media.get(s_hash) if db_media and s_hash else None
if s_media: if s_media:

View file

@ -826,8 +826,8 @@ async def migrate_global_messages(
content = msg.content or "" content = msg.content or ""
for sticker in msg.stickers: for sticker in msg.stickers:
sticker_name = sticker.name sticker_name = getattr(sticker, "name", "unknown")
s_hash = sticker.local_hash s_hash = getattr(sticker, "local_hash", None)
sticker_file = None sticker_file = None
s_media = db_media.get(s_hash) if db_media and s_hash else None s_media = db_media.get(s_hash) if db_media and s_hash else None
if s_media: if s_media:
@ -837,8 +837,15 @@ async def migrate_global_messages(
content += f"\n[Sticker: {sticker_name}]" content += f"\n[Sticker: {sticker_name}]"
if sticker_file: if sticker_file:
files.append(sticker_file) try:
file_names.append(f"sticker_{sticker_name}.png") with open(sticker_file, "rb") as f:
files.append({
"filename": f"sticker_{sticker_name}.png",
"data": f.read(),
"content_type": "image/png"
})
except Exception as e:
logger.error(f"Failed to read sticker file {sticker_file}: {e}")
content = clean_mentions( content = clean_mentions(
content=content, content=content,