forked from retoor/devplacepy
refactor: split game store.py into subpackage (ref.md 3.11)
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
|
||||
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"])
|
||||
Reference in New Issue
Block a user