Commit
This commit is contained in:
102
scripts/backfill_unique_stats.py
Normal file
102
scripts/backfill_unique_stats.py
Normal 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())
|
||||
Reference in New Issue
Block a user