# retoor from __future__ import annotations from datetime import datetime, timezone from devplacepy.database import get_table from .. import economy class GameError(Exception): pass def _now() -> datetime: return datetime.now(timezone.utc) def _iso(value: datetime) -> str: return value.isoformat() def _parse(value: str) -> datetime | None: if not value: return None try: return datetime.fromisoformat(value) except ValueError: return None def _today() -> str: return _now().date().isoformat() def _parse_date(value: str): parsed = _parse(value) return parsed.date() if parsed else None def _farms(): return get_table("game_farms") def _plots(): return get_table("game_plots") def _quests(): return get_table("game_quests") def _steals(): return get_table("game_steals") def last_steal_at(thief_uid: str, owner_uid: str) -> datetime | None: latest = None for row in _steals().find(thief_uid=thief_uid, owner_uid=owner_uid): stamp = _parse(row.get("stolen_at", "")) if stamp and (latest is None or stamp > latest): latest = stamp return latest def steal_cooldown_remaining(thief_uid: str, owner_uid: str, now: datetime) -> int: latest = last_steal_at(thief_uid, owner_uid) if not latest: return 0 elapsed = (now - latest).total_seconds() return max(0, int(economy.STEAL_COOLDOWN_SECONDS - elapsed)) def _lvl(farm: dict, key: str) -> int: return int(farm.get(key) or 0) PERK_COLUMN = {perk.key: f"perk_{perk.key}" for perk in economy.PERKS} def _update_farm(farm_uid: str, fields: dict) -> None: fields = {**fields, "uid": farm_uid, "updated_at": _iso(_now())} _farms().update(fields, ["uid"])