103 lines
3.8 KiB
Python
103 lines
3.8 KiB
Python
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())
|