updated steam

This commit is contained in:
Frank Harris 2026-01-17 10:18:59 -06:00
parent 8857f441e7
commit b2b46b23db
4 changed files with 426 additions and 163 deletions

View file

@ -9,6 +9,7 @@ class AdminWorkshopController
private array $lang;
private ?array $adapterFormOverride = null;
private ?string $adapterFormGameKey = null;
private array $gameGroups = [];
public function __construct(OGPDatabase $db)
{
@ -28,29 +29,25 @@ class AdminWorkshopController
echo '<link rel="stylesheet" type="text/css" href="modules/steam_workshop/steam_workshop.css" />';
$this->gameGroups = $this->service->listWorkshopGameGroups();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$this->processPost();
}
$gameKeys = $this->service->listAvailableGameKeys();
$mappings = $this->service->getAdapterMappings();
$adapters = $this->service->loadAdapters();
$adapterOptions = $this->service->getAdapterOptions();
$gameRows = $this->buildGameRows($gameKeys);
$activeGame = $this->resolveActiveGameKey();
$adapterForm = $activeGame !== ''
? $this->service->getAdapterFormData($activeGame, $this->adapterFormOverride)
: null;
$gameRows = $this->buildGameRows($mappings);
$requestedGame = $this->sanitizeGameKeyInput($_GET['adapter_game'] ?? '');
$activeGame = $this->adapterFormGameKey !== null ? $this->adapterFormGameKey : $requestedGame;
$this->render('admin/index', [
'lang' => $this->lang,
'gameKeys' => $gameKeys,
'mappings' => $mappings,
'adapters' => $adapters,
'adapterOptions' => $adapterOptions,
'gameRows' => $gameRows,
'adapterForm' => $adapterForm,
'activeGameKey' => $activeGame,
]);
}
@ -78,7 +75,22 @@ class AdminWorkshopController
if (!is_array($payload)) {
$payload = [];
}
$this->service->saveAdapterMappings($payload);
$fanOut = [];
$groupIndex = $this->indexGameGroups();
foreach ($payload as $groupKey => $adapterKey) {
$groupKey = (string)$groupKey;
$adapterKey = (string)$adapterKey;
if (!isset($groupIndex[$groupKey])) {
continue;
}
foreach ($groupIndex[$groupKey] as $gameKey) {
$fanOut[$gameKey] = $adapterKey;
}
}
$this->service->saveAdapterMappings($fanOut);
print_success($this->lang['message_mappings_saved'] ?? 'Adapter mappings saved.');
}
@ -97,7 +109,7 @@ class AdminWorkshopController
try {
$this->service->saveGameAdapter($gameKey, $payload);
$this->service->upsertAdapterMapping($gameKey, $gameKey);
$this->propagateAdapterMapping($gameKey);
print_success($this->lang['message_adapter_saved'] ?? 'Adapter saved.');
$this->adapterFormOverride = null;
$this->adapterFormGameKey = null;
@ -125,36 +137,85 @@ class AdminWorkshopController
}
if ($this->service->deleteGameAdapter($gameKey)) {
$this->service->removeAdapterMapping($gameKey, $gameKey);
$this->clearGroupMappings($gameKey);
print_success($this->lang['message_adapter_deleted'] ?? 'Adapter deleted.');
} else {
print_failure($this->lang['error_adapter_delete_failed'] ?? 'Unable to delete adapter.');
}
}
private function buildGameRows(array $gameKeys): array
private function buildGameRows(array $mappings): array
{
$rows = [];
foreach ($gameKeys as $gameKey) {
foreach ($this->gameGroups as $group) {
$primaryKey = $group['primary_game_key'];
$override = ($this->adapterFormGameKey === $primaryKey) ? $this->adapterFormOverride : null;
$mappingValues = [];
foreach ($group['game_keys'] as $gameKey) {
if (isset($mappings[$gameKey]) && $mappings[$gameKey] !== '') {
$mappingValues[$mappings[$gameKey]] = true;
}
}
$rows[] = [
'game_key' => $gameKey,
'exists' => $this->service->gameAdapterExists($gameKey),
'adapter' => $this->service->getGameAdapter($gameKey),
'updated_at' => $this->service->getGameAdapterUpdatedAt($gameKey),
'group_key' => $group['group_key'],
'app_id' => $group['app_id'],
'game_name' => $group['game_name'],
'game_keys' => $group['game_keys'],
'primary_game_key' => $primaryKey,
'mixed_mapping' => count($mappingValues) > 1,
'selected_adapter' => count($mappingValues) === 1 ? array_key_first($mappingValues) : '',
'exists' => $this->service->gameAdapterExists($primaryKey),
'adapter' => $this->service->getGameAdapter($primaryKey),
'updated_at' => $this->service->getGameAdapterUpdatedAt($primaryKey),
'form' => $this->service->getAdapterFormData($primaryKey, $override),
];
}
return $rows;
}
private function resolveActiveGameKey(): string
private function indexGameGroups(): array
{
if ($this->adapterFormGameKey !== null) {
return $this->adapterFormGameKey;
$index = [];
foreach ($this->gameGroups as $group) {
$index[$group['group_key']] = $group['game_keys'];
}
$queryKey = $_GET['adapter_game'] ?? '';
return $this->sanitizeGameKeyInput($queryKey);
return $index;
}
private function propagateAdapterMapping(string $primaryGameKey): void
{
foreach ($this->gameGroups as $group) {
if (!in_array($primaryGameKey, $group['game_keys'], true)) {
continue;
}
foreach ($group['game_keys'] as $gameKey) {
$this->service->upsertAdapterMapping($gameKey, $primaryGameKey);
}
return;
}
$this->service->upsertAdapterMapping($primaryGameKey, $primaryGameKey);
}
private function clearGroupMappings(string $primaryGameKey): void
{
foreach ($this->gameGroups as $group) {
if (!in_array($primaryGameKey, $group['game_keys'], true)) {
continue;
}
foreach ($group['game_keys'] as $gameKey) {
$this->service->removeAdapterMapping($gameKey, $primaryGameKey);
}
return;
}
$this->service->removeAdapterMapping($primaryGameKey, $primaryGameKey);
}
private function sanitizeGameKeyInput($value): string