openvk/Web/Themes/Themepacks.php
Alexander Minkin e813549602
fix: solve some warnings
Notifications.php: make $count parameter explicit as it is placed before
another explicit parameter
OpenVKPresenter.php: add additional null checks
Themepacks.php: add return type to offsetGet
2023-12-11 13:15:01 +03:00

111 lines
3.2 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php declare(strict_types=1);
namespace openvk\Web\Themes;
use Nette\InvalidStateException as ISE;
use Chandler\Session\Session;
use Chandler\Patterns\TSimpleSingleton;
class Themepacks implements \ArrayAccess
{
const THEMPACK_ENGINE_VERSION = 1;
const DEFAULT_THEME_ID = "ovk"; # блин было бы смешно если было бы Fore, потому что Лунка, а Luna это название дефолт темы винхп
private $loadedThemepacks = [];
function __construct()
{
foreach(glob(OPENVK_ROOT . "/themepacks/*", GLOB_ONLYDIR) as $themeDir) {
try {
$theme = Themepack::themepackFromDir($themeDir);
$tid = $theme->getId();
if(isset($this->loadedThemepacks[$tid]))
trigger_error("Duplicate theme $tid found at $themeDir, skipping...", E_USER_WARNING);
else
$this->loadedThemepacks[$tid] = $theme;
} catch(\Exception $e) {
trigger_error("Could not load theme at $themeDir. Exception: $e", E_USER_WARNING);
}
}
}
private function installUnpacked(string $path): bool
{
try {
$theme = Themepack::themepackFromDir($path);
$tid = $theme->getId();
if(isset($this->loadedThemepacks[$tid]))
return false;
rename($path, OPENVK_ROOT . "/themepacks/$tid");
$this->loadedThemepacks[$tid] = $theme;
return true;
} catch(\Exception $e) {
return false;
}
}
function getThemeList(): \Traversable
{
foreach($this->loadedThemepacks as $id => $theme)
if($theme->isEnabled())
yield $id => ($theme->getName(Session::i()->get("lang", "ru")));
}
function getAllThemes(): array
{
return $this->loadedThemepacks;
}
/* ArrayAccess */
function offsetExists($offset): bool
{
return $offset === Themepacks::DEFAULT_THEME_ID ? false : isset($this->loadedThemepacks[$offset]);
}
function offsetGet($offset) : mixed
{
return $this->loadedThemepacks[$offset];
}
function offsetSet($offset, $value): void
{
throw new ISE("Theme substitution in runtime is prohbited");
}
function offsetUnset($offset): void
{
$this->uninstall($offset);
}
/* /ArrayAccess */
function install(string $archivePath): bool
{
if(!file_exists($archivePath))
return false;
$tmpDir = mkdir(tempnam(OPENVK_ROOT . "/tmp/themepack_artifacts/", "themex_"));
try {
$archive = new \CabArchive($archivePath);
$archive->extract($tmpDir);
return $this->installUnpacked($tmpDir);
} catch (\Exception $e) {
return false;
} finally {
rmdir($tmpDir);
}
}
function uninstall(string $id): bool
{
if(!isset($loadedThemepacks[$id]))
return false;
rmdir(OPENVK_ROOT . "/themepacks/$id");
unset($loadedThemepacks[$id]);
return true;
}
use TSimpleSingleton;
}