144 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
require_once "vendor/autoload.php";
 | 
						|
 | 
						|
require_once "AutoStoring.php";
 | 
						|
 | 
						|
require_once "Game.php";
 | 
						|
 | 
						|
class GameMgr
 | 
						|
{
 | 
						|
    private \SleekDB\Store $db; // game database
 | 
						|
 | 
						|
    // --------
 | 
						|
 | 
						|
    function __construct()
 | 
						|
    {
 | 
						|
        $this->db = new \SleekDB\Store(GAMEDB, DATADIR, ["timeout" => false]);
 | 
						|
    }
 | 
						|
 | 
						|
    // Get game by ID.
 | 
						|
    function getGame(string $gameid): Game|null
 | 
						|
    {
 | 
						|
        $game_data_array = $this->db->findById($gameid);
 | 
						|
        return count($game_data_array) != 0 ? Game::fromArray($this, $game_data_array) : null;
 | 
						|
    }
 | 
						|
 | 
						|
    // Get public game. FIXME!!!
 | 
						|
    function getPublicGame(string $public_id): Game|null
 | 
						|
    {
 | 
						|
        $game_data_array = $this->db->findBy([["public", "=", "true"], "AND", ["public_id", "=", $public_id]]);
 | 
						|
        return count($game_data_array) != 0 ? Game::fromArray($this, $game_data_array[0]) : null;
 | 
						|
    }
 | 
						|
 | 
						|
    // Update game.
 | 
						|
    function updateGame(Game $game): void
 | 
						|
    {
 | 
						|
        $a = $game->toArray();
 | 
						|
        $this->db->update($a);
 | 
						|
    }
 | 
						|
 | 
						|
    function addGame(string $name, string $owner, string $description, array $properties = Game::DEFAULT_GAME_PROPERTIES,
 | 
						|
                     array  $contributors = [], array $tasks = []): bool
 | 
						|
    {
 | 
						|
        $game_data = [
 | 
						|
            "name" => $name,
 | 
						|
            "owner" => $owner,
 | 
						|
            "contributors" => $contributors,
 | 
						|
            "description" => $description,
 | 
						|
            "game_file_present" => false,
 | 
						|
            "properties" => $properties,
 | 
						|
            "public" => false,
 | 
						|
            "public_id" => Game::genPublicId(),
 | 
						|
            "version" => Game::CURRENT_GAME_VERSION
 | 
						|
        ];
 | 
						|
 | 
						|
        $game_data = $this->db->insert($game_data);
 | 
						|
 | 
						|
        // prepare game context
 | 
						|
        $game = Game::fromArray($this, $game_data);
 | 
						|
        $current_game_media_dir = $game->getGameDir();
 | 
						|
        mkdir($current_game_media_dir);
 | 
						|
        $game->saveTasks();
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    // Delete game by ID.
 | 
						|
    function deleteGame(string $gameid): void
 | 
						|
    {
 | 
						|
        $this->db->deleteById($gameid);
 | 
						|
    }
 | 
						|
 | 
						|
    // Get all game data by contributor nickname.
 | 
						|
    function getAllGameDataByContributor(string $nickname): array {
 | 
						|
        $games = [];
 | 
						|
        if ($nickname !== "*") {
 | 
						|
            $game_data_array = $this->db->findBy([["owner", "=", $nickname], "OR", ["contributors", "CONTAINS", $nickname]]);
 | 
						|
        } else {
 | 
						|
            $game_data_array = $this->db->findAll();
 | 
						|
        }
 | 
						|
        foreach ($game_data_array as $game_data) {
 | 
						|
            $games[] = Game::fromArray($this, $game_data);
 | 
						|
        }
 | 
						|
        return $games;
 | 
						|
    }
 | 
						|
 | 
						|
    // Get all games.
 | 
						|
    function getAllGames() : array {
 | 
						|
        $gamesa = $this->db->findAll();
 | 
						|
        $games = [];
 | 
						|
        foreach ($gamesa as $a) {
 | 
						|
            $games[] = new Game($this, $a);
 | 
						|
        }
 | 
						|
        return $games;
 | 
						|
    }
 | 
						|
 | 
						|
    // Sanitize games and return game IDs.
 | 
						|
    function sanitizeGames(array $games) : array {
 | 
						|
        $sanitized = [];
 | 
						|
        foreach ($games as $game) {
 | 
						|
            // explode game identifier
 | 
						|
            [$name, $id] = explode("#", $game);
 | 
						|
 | 
						|
            // fetch game
 | 
						|
            if ($id !== null) {
 | 
						|
                $records = $this->db->findBy([["name", "=", $name], "AND", ["_id", "=", (int)$id]]);
 | 
						|
            } else {
 | 
						|
                $records = $this->db->findBy(["name", "=", $name]);
 | 
						|
            }
 | 
						|
 | 
						|
            // put game ID into sanitized list only if identifier is not ambiguous
 | 
						|
            if (count($records) === 1) {
 | 
						|
                $sanitized[] = $records[0]["_id"];
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return $sanitized;
 | 
						|
    }
 | 
						|
 | 
						|
    // Resolve group IDs to full group identifiers.
 | 
						|
    function resolveGames(array &$gameIds): void {
 | 
						|
        $a = $this->db->findBy([["_id", "IN", $gameIds]]); // no caching here...
 | 
						|
        $gameIds = array_map(fn($r) => $r["name"] . "#" . $r["_id"] ,$a);
 | 
						|
    }
 | 
						|
 | 
						|
    function upgradeGames(array $ids = []): void
 | 
						|
    {
 | 
						|
        $a = [];
 | 
						|
        if ($ids === []) {
 | 
						|
            $a = $this->db->findAll();
 | 
						|
        } else {
 | 
						|
            $a = $this->db->findBy(["_id", "IN", $ids]);
 | 
						|
        }
 | 
						|
 | 
						|
        foreach ($a as $g) {
 | 
						|
            $game = Game::fromArray($this, $g);
 | 
						|
            $game->loadTasks();
 | 
						|
            $game->saveTasks();
 | 
						|
            $game->storeMods();
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    // -------
 | 
						|
}
 |