Fixed RPG

This commit is contained in:
2026-05-29 08:52:33 +03:00
parent e5c0df308f
commit 600ad78f05
24 changed files with 2804 additions and 144 deletions
+18 -3
View File
@@ -1,6 +1,7 @@
import json
import base64
import uuid
from pathlib import Path
import aiosqlite
from database.db import DB_PATH
@@ -110,8 +111,8 @@ async def save_character(card: dict, lora_name: str = "", lora_weight: float = 0
await db.execute(
"""INSERT OR REPLACE INTO characters
(card_id, name, description, personality, scenario, first_mes,
mes_example, raw_json, lora_name, lora_weight, appearance_tags, lorebook_json)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
mes_example, raw_json, lora_name, lora_weight, appearance_tags, lorebook_json, avatar_path)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
(
card_id,
card["name"],
@@ -125,6 +126,7 @@ async def save_character(card: dict, lora_name: str = "", lora_weight: float = 0
lora_weight,
card.get("appearance_tags", ""),
card["lorebook_json"],
card.get("avatar_path", ""),
),
)
await db.commit()
@@ -171,7 +173,7 @@ async def update_appearance_tags(card_id: str, appearance_tags: str):
async def update_character(card_id: str, fields: dict) -> bool:
allowed = {"name", "description", "personality", "scenario", "first_mes",
"mes_example", "appearance_tags", "lora_name", "lora_weight"}
"mes_example", "appearance_tags", "lora_name", "lora_weight", "avatar_path"}
updates = {k: v for k, v in fields.items() if k in allowed}
if not updates:
return False
@@ -190,6 +192,9 @@ async def import_card_file(content: bytes, filename: str, lora_name: str = "", l
card = parse_png_card(content)
if not card:
raise ValueError("PNG does not contain character card metadata")
# Use the PNG itself as avatar
avatar_rel = _save_avatar_bytes(content, f"card_{card['card_id']}")
card["avatar_path"] = avatar_rel
else:
card = parse_card_v2(json.loads(content.decode("utf-8")))
@@ -210,5 +215,15 @@ async def import_card_file(content: bytes, filename: str, lora_name: str = "", l
lora_name=lora_name,
lora_weight=lora_weight,
appearance_tags=saved.get("appearance_tags", ""),
avatar_path=saved.get("avatar_path", ""),
)
return saved
def _save_avatar_bytes(png_bytes: bytes, prefix: str) -> str:
avatars_dir = Path("static/avatars")
avatars_dir.mkdir(parents=True, exist_ok=True)
fname = f"{prefix}_{uuid.uuid4().hex[:8]}.png"
path = avatars_dir / fname
path.write_bytes(png_bytes)
return f"avatars/{fname}"