This commit is contained in:
Joan
2025-11-27 16:27:01 +01:00
parent 33cc9586c2
commit 81f8912059
304 changed files with 56149 additions and 10122 deletions

View File

@@ -0,0 +1,102 @@
import asyncio
import os
import sys
import json
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
from sqlalchemy import text
# Add parent directory to path to allow imports
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from api.items import ItemsManager
# Database connection
DB_USER = os.getenv("POSTGRES_USER", "postgres")
DB_PASS = os.getenv("POSTGRES_PASSWORD", "postgres")
DB_NAME = os.getenv("POSTGRES_DB", "echoes_of_the_ashes")
DB_HOST = os.getenv("POSTGRES_HOST", "localhost")
DB_PORT = os.getenv("POSTGRES_PORT", "5432")
DATABASE_URL = f"postgresql+psycopg://{DB_USER}:{DB_PASS}@{DB_HOST}:{DB_PORT}/{DB_NAME}"
async def backfill_unique_stats():
print(f"Connecting to database at {DB_HOST}...")
engine = create_async_engine(DATABASE_URL, echo=False)
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
# Load items
print("Loading item definitions...")
items_manager = ItemsManager(gamedata_path="gamedata")
async with async_session() as session:
# Get all unique items
print("Fetching unique items...")
result = await session.execute(text("SELECT id, item_id, unique_stats, durability, max_durability, tier FROM unique_items"))
unique_items = result.fetchall()
print(f"Found {len(unique_items)} unique items.")
updated_count = 0
for row in unique_items:
uid, item_id, stats, durability, max_durability, tier = row
item_def = items_manager.get_item(item_id)
if not item_def:
print(f"⚠️ Unknown item ID: {item_id} (ID: {uid})")
continue
needs_update = False
new_stats = stats if stats else {}
new_durability = durability
new_max_durability = max_durability
new_tier = tier
# Check if stats are missing or empty
if not stats:
if item_def.stats:
new_stats = item_def.stats.copy()
needs_update = True
# Check for missing durability/tier
if durability is None and item_def.durability is not None:
new_durability = item_def.durability
needs_update = True
if max_durability is None and item_def.durability is not None:
new_max_durability = item_def.durability
needs_update = True
if tier is None:
new_tier = item_def.tier
needs_update = True
if needs_update:
# Update the record
await session.execute(
text("""
UPDATE unique_items
SET unique_stats = :stats,
durability = :durability,
max_durability = :max_durability,
tier = :tier
WHERE id = :id
"""),
{
"stats": json.dumps(new_stats) if new_stats else None,
"durability": new_durability,
"max_durability": new_max_durability,
"tier": new_tier,
"id": uid
}
)
updated_count += 1
if updated_count % 100 == 0:
print(f"Updated {updated_count} items...")
await session.commit()
print(f"✅ Backfill complete. Updated {updated_count} items.")
if __name__ == "__main__":
asyncio.run(backfill_unique_stats())