Fixed RPG
This commit is contained in:
@@ -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}"
|
||||
|
||||
Reference in New Issue
Block a user