feat: add Workshop behavior settings UI + fix billing period_start migration

Agent-Logs-Url: https://github.com/GameServerPanel/GSP/sessions/ee35e671-8ff2-43fb-a365-f7a4f9263ca7

Co-authored-by: iaretechnician <2749183+iaretechnician@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2026-05-07 00:22:45 +00:00 committed by GitHub
parent 3a2ed00778
commit bf44b618e4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 358 additions and 4 deletions

View file

@ -342,6 +342,82 @@ function sw_generate_launch_params(array $mods, array $profile)
);
}
// ── Server behavior settings helpers ─────────────────────────────────────
/**
* Return the workshop behavior settings row for a home, or an array of
* safe defaults when no row exists yet.
*
* @param OGPDatabase $db
* @param int $home_id
* @return array
*/
function sw_get_server_settings($db, $home_id)
{
$home_id = (int)$home_id;
$rows = $db->resultQuery(
"SELECT * FROM " . sw_table('steam_workshop_server_settings') . "
WHERE `home_id` = $home_id LIMIT 1"
);
if ($rows && isset($rows[0])) {
return $rows[0];
}
// Safe defaults manual only, no automatic restarts, hot-load off
return array(
'home_id' => $home_id,
'update_mode' => 'manual',
'restart_behavior' => 'none',
'hot_load' => 'disabled',
'warning_minutes' => 10,
'schedule_interval' => 'daily',
);
}
/**
* Upsert the workshop behavior settings for a server home.
*
* @param OGPDatabase $db
* @param int $home_id
* @param array $data keys: update_mode, restart_behavior, hot_load,
* warning_minutes, schedule_interval
* @return bool
*/
function sw_save_server_settings($db, $home_id, array $data)
{
$home_id = (int)$home_id;
$valid_update_modes = array('manual', 'on_restart', 'before_start', 'scheduled');
$valid_restart_behaviors = array('none', 'if_empty', 'immediate', 'next_restart');
$valid_hot_load = array('disabled', 'attempt');
$valid_intervals = array('hourly', 'daily', 'weekly');
$update_mode = in_array($data['update_mode'] ?? '', $valid_update_modes, true) ? $data['update_mode'] : 'manual';
$restart_behavior = in_array($data['restart_behavior'] ?? '', $valid_restart_behaviors, true) ? $data['restart_behavior'] : 'none';
$hot_load = in_array($data['hot_load'] ?? '', $valid_hot_load, true) ? $data['hot_load'] : 'disabled';
$warning_minutes = max(1, min(120, (int)($data['warning_minutes'] ?? 10)));
$schedule_interval = in_array($data['schedule_interval'] ?? '', $valid_intervals, true) ? $data['schedule_interval'] : 'daily';
$safe_um = $db->realEscapeSingle($update_mode);
$safe_rb = $db->realEscapeSingle($restart_behavior);
$safe_hl = $db->realEscapeSingle($hot_load);
$safe_si = $db->realEscapeSingle($schedule_interval);
return (bool)$db->query(
"INSERT INTO " . sw_table('steam_workshop_server_settings') . "
(`home_id`, `update_mode`, `restart_behavior`, `hot_load`,
`warning_minutes`, `schedule_interval`, `created_at`, `updated_at`)
VALUES ($home_id, '$safe_um', '$safe_rb', '$safe_hl',
$warning_minutes, '$safe_si', NOW(), NOW())
ON DUPLICATE KEY UPDATE
`update_mode` = '$safe_um',
`restart_behavior` = '$safe_rb',
`hot_load` = '$safe_hl',
`warning_minutes` = $warning_minutes,
`schedule_interval` = '$safe_si',
`updated_at` = NOW()"
);
}
// ── Output helpers ────────────────────────────────────────────────────────
/**