legomaheggo's picture
feat: Add config, database, realtime, and UI layers with full multiplayer gameplay
a9b6601
"""
Devil's Dozen - Player Manager
CRUD operations for the `players` table.
"""
from supabase import Client
from src.database.models import Player
class PlayerManager:
"""Manages player records in Supabase."""
def __init__(self, client: Client) -> None:
self.client = client
self.table = client.table("players")
def join(self, lobby_id: str, username: str, turn_order: int) -> Player:
"""Add a player to a lobby."""
data = (
self.table
.insert({
"lobby_id": lobby_id,
"username": username,
"turn_order": turn_order,
})
.execute()
)
return Player.model_validate(data.data[0])
def get(self, player_id: str) -> Player | None:
"""Get a single player by ID."""
data = (
self.table
.select("*")
.eq("id", player_id)
.execute()
)
if data.data:
return Player.model_validate(data.data[0])
return None
def list_by_lobby(self, lobby_id: str) -> list[Player]:
"""Get all players in a lobby, ordered by turn."""
data = (
self.table
.select("*")
.eq("lobby_id", lobby_id)
.order("turn_order")
.execute()
)
return [Player.model_validate(row) for row in data.data]
def update_score(self, player_id: str, new_total: int) -> Player:
"""Update a player's total score."""
data = (
self.table
.update({"total_score": new_total})
.eq("id", player_id)
.execute()
)
return Player.model_validate(data.data[0])
def set_connected(self, player_id: str, is_connected: bool) -> Player:
"""Update a player's connection status."""
data = (
self.table
.update({"is_connected": is_connected})
.eq("id", player_id)
.execute()
)
return Player.model_validate(data.data[0])
def count_in_lobby(self, lobby_id: str) -> int:
"""Count players currently in a lobby."""
data = (
self.table
.select("id", count="exact")
.eq("lobby_id", lobby_id)
.execute()
)
return data.count or 0