- module.php: bump db_version to 2; full v2 schema in install_queries[0]; ALTER TABLE migration in install_queries[2] adding 11 new profile columns plus server_workshop_settings table
- WorkshopRepository: expand saveProfile() with all new fields (steam_app_id, steamcmd_login_mode, steamcmd_path, mod_separator, copy_keys, key paths, pre/post scripts, validation_notes); add nullOrStr helper; add server settings CRUD (getServerSettings, saveServerSettings, recordUpdateResult, setUpdateQueued, listQueuedUpdateHomes); update insertOrUpdateMod with custom_folder; update listAllEnabledMods to select new columns
- WorkshopProfileController: full extractProfileData() with all new fields; validateProfileData with folder template check
- views/admin/profile_form.php: full rewrite – all required fields (steam_app_id, workshop_app_id, login mode, SteamCMD path, OS, cache path, install path, folder naming dropdown, launch params, mod separator, copy method, copy keys with JS show/hide, key paths, pre/per-mod/post bash scripts with DayZ example, validation notes, config file template)
- views/admin/profiles.php: updated list view columns (App IDs, Login, Method)
- WorkshopInstaller.php: full rewrite with %var% template support (+ legacy {var} compat); buildTemplateVars() resolves all 14 variables; pre/post script execution; triggerSteamCmdDownload uses new profile fields; copyKeys helper
- WorkshopModController: add save_settings and queue_update POST actions; handleModsPage loads serverSettings + allProfiles
- views/user_workshop_mods.php: full rewrite – server settings form (enable, profile selector, update mode, restart behavior), update status grid (status/error/time/success time), queue update button, mod table with custom_folder column and toggle/order auto-submit
- lang/en_US.php: ~80 new string keys for all v2 fields
- steam_workshop.css: new v2 styles (3-col grid, script textarea, status grid, server settings card, badges)"
Agent-Logs-Url: https://github.com/GameServerPanel/GSP/sessions/e7f0d80d-f775-4794-adbd-cf48b55bc9c1
Co-authored-by: iaretechnician <2749183+iaretechnician@users.noreply.github.com>
300 lines
21 KiB
PHP
300 lines
21 KiB
PHP
<?php
|
||
return [
|
||
'heading_overview' => 'Steam Workshop automation (preview)',
|
||
'heading_edit_home' => 'Edit Workshop settings for %s',
|
||
'button_edit' => 'Configure',
|
||
'button_create_config' => 'Create config',
|
||
'button_save' => 'Save settings',
|
||
'button_cancel' => 'Back to list',
|
||
'label_feature_flag' => 'Enable scheduled Workshop updates for this server',
|
||
'label_adapter' => 'Game adapter',
|
||
'label_interval' => 'Update interval (minutes)',
|
||
'label_interval_hint' => 'Runs on the agent scheduler. Allowed range: 15–360 minutes.',
|
||
'label_staging_dir' => 'Staging directory (optional)',
|
||
'label_install_strategy' => 'Install strategy',
|
||
'label_on_update_action' => 'On update action',
|
||
'label_post_install_script' => 'Post-install script (absolute path)',
|
||
'label_mod_import' => 'Workshop IDs list (one "id,@ModName" per line)',
|
||
'hint_mod_import' => 'Paste from Modlist.txt or import from a collection. IDs are sanitized automatically.',
|
||
'hint_admin_only' => 'Managed by your administrator.',
|
||
'adapter_locked_note' => 'This adapter is enforced for the current game type by your administrator.',
|
||
'admin_heading_game_mapping' => 'Adapter mapping by game type',
|
||
'admin_subheading_game_mapping' => 'Pick which adapter becomes the default whenever a server of that game opens the Workshop UI.',
|
||
'admin_col_game_key' => 'Game key',
|
||
'admin_col_adapter' => 'Adapter',
|
||
'admin_no_game_keys' => 'No server configuration XML files were detected.',
|
||
'admin_heading_adapters' => 'Available adapters',
|
||
'admin_col_key' => 'Key',
|
||
'admin_col_mods_dir' => 'Mods directory',
|
||
'admin_col_notes' => 'Notes',
|
||
'admin_heading_per_game' => 'Per-game adapters',
|
||
'admin_subheading_per_game' => 'Each game should have its own adapter XML for Steam Workshop automation.',
|
||
'admin_col_status' => 'Status',
|
||
'admin_col_updated' => 'Last updated',
|
||
'admin_col_actions' => 'Actions',
|
||
'admin_heading_edit_adapter' => 'Editing adapter for %s',
|
||
'admin_hint_select_game' => 'Select a game in the table above to edit or create its adapter.',
|
||
'status_no_adapter' => 'No adapter defined',
|
||
'status_enabled' => 'Enabled',
|
||
'status_disabled' => 'Disabled',
|
||
'status_hot_reload' => 'Hot reload ready',
|
||
'status_restart_required' => 'Restart required',
|
||
'empty_state_admin' => 'No game homes are assigned yet. Use "Assign Game Homes" to continue.',
|
||
'empty_state_user' => 'No servers available. Ask an administrator to assign a game home.',
|
||
'message_config_saved' => 'Workshop settings saved.',
|
||
'error_missing_home' => 'Select a server before editing Workshop settings.',
|
||
'error_home_not_found' => 'Unable to locate that server or you do not have permission.',
|
||
'mods_table_heading' => 'Parsed Workshop entries',
|
||
'mods_table_empty' => 'No Workshop IDs have been added yet.',
|
||
'mods_header_id' => 'Workshop ID',
|
||
'mods_header_label' => 'Label',
|
||
'mods_header_source' => 'Source',
|
||
'mods_header_enabled' => 'Enabled',
|
||
'install_copy' => 'Copy files into the server directory',
|
||
'install_symlink' => 'Symlink from Steam workshop content',
|
||
'install_staging' => 'Download to staging only (manual apply)',
|
||
'action_queue_for_restart' => 'Queue for restart',
|
||
'action_hot_reload_if_supported' => 'Hot reload if the adapter allows it',
|
||
'summary_adapter' => 'Adapter',
|
||
'summary_interval' => 'Interval',
|
||
'summary_mods' => 'Mods',
|
||
'summary_last_saved' => 'Last saved',
|
||
'summary_hot_reload' => 'Hot reload',
|
||
'raw_definition_label' => 'Raw Workshop list',
|
||
'message_mappings_saved' => 'Adapter mappings saved.',
|
||
'message_adapter_saved' => 'Adapter saved.',
|
||
'message_adapter_deleted' => 'Adapter deleted.',
|
||
'error_admin_only' => 'Administrator access required.',
|
||
'mod_picker_heading' => 'Workshop library',
|
||
'mod_picker_hint' => 'Search Steam Workshop and add mods to keep them synced automatically.',
|
||
'mod_picker_search_label' => 'Search Steam Workshop',
|
||
'mod_picker_search_placeholder' => 'Example: 221100 or QoL tweaks',
|
||
'mod_picker_search_button' => 'Search',
|
||
'mod_picker_selected_heading' => 'Selected mods',
|
||
'mod_picker_selected_hint' => 'Enable syncing to pull each mod before game server restarts.',
|
||
'mod_picker_selected_empty' => 'No mods selected yet. Use the search above to add your first entry.',
|
||
'mod_picker_results_heading' => 'Search results',
|
||
'mod_picker_results_select' => 'Select',
|
||
'mod_picker_results_title' => 'Title',
|
||
'mod_picker_results_author' => 'Author',
|
||
'mod_picker_action_add' => 'Add',
|
||
'mod_picker_action_remove' => 'Remove',
|
||
'mod_picker_status_loading' => 'Searching Steam Workshop…',
|
||
'mod_picker_status_error' => 'Unable to contact the Steam Workshop. Try again in a moment.',
|
||
'mod_picker_results_empty' => 'No workshop items matched that search.',
|
||
'mod_picker_status_need_query' => 'Enter a Workshop ID or keyword before searching.',
|
||
'mod_picker_toggle_label' => 'Sync',
|
||
'mod_picker_request_label' => 'Submitting request',
|
||
'mod_picker_request_hint' => 'Exact Steam URL preview. The input shows the text that will be submitted.',
|
||
'mod_picker_request_input_label' => 'Workshop query preview',
|
||
'error_game_key_required' => 'Select a valid game key before editing the adapter.',
|
||
'error_adapter_delete_failed' => 'Adapter could not be deleted.',
|
||
'button_edit_adapter' => 'Edit',
|
||
'button_create_adapter' => 'Create',
|
||
'button_delete_adapter' => 'Delete',
|
||
'button_save_adapter' => 'Save adapter',
|
||
'confirm_delete_adapter' => 'Delete this adapter? Servers mapped to it will fall back to defaults.',
|
||
'label_game_key' => 'Game key',
|
||
'label_adapter_name' => 'Adapter display name',
|
||
'label_adapter_app_id' => 'Steam App ID',
|
||
'label_adapter_mods_dir' => 'Mods directory',
|
||
'label_adapter_keys_dir' => 'Keys directory (optional)',
|
||
'label_adapter_hot_reload' => 'Supports hot reload',
|
||
'label_adapter_activation' => 'Activation template',
|
||
'label_adapter_notes' => 'Notes',
|
||
'error_missing_query' => 'Enter a search term before querying the Workshop.',
|
||
|
||
// -------------------------------------------------------
|
||
// Workshop game configuration admin (WorkshopProfileController)
|
||
// -------------------------------------------------------
|
||
'config_heading_list' => 'Workshop Game Configurations',
|
||
'config_intro' => 'One configuration per supported game. Each configuration controls how SteamCMD downloads and installs Workshop mods for servers of that game type.',
|
||
'config_btn_create' => 'Add Game Configuration',
|
||
'config_list_empty' => 'No Workshop configurations defined yet. Add one for each game that supports Steam Workshop mods.',
|
||
'config_confirm_delete' => 'Delete this Workshop configuration? Servers using it will no longer have Workshop mod support.',
|
||
'config_back_list' => 'Back to configurations',
|
||
'config_heading_edit' => 'Edit Workshop Configuration: %s',
|
||
'config_heading_create' => 'Add Workshop Game Configuration',
|
||
'config_steamcmd_heading' => 'How mods are downloaded',
|
||
'config_steamcmd_note' => 'Workshop mods are downloaded using SteamCMD with the command: +workshop_download_item {app_id} {mod_id}. The cache path below is where SteamCMD stores downloaded mod files on the agent machine. The install path below is where those files are copied into the game server directory.',
|
||
'config_label_app_id' => 'Steam App ID',
|
||
'config_hint_app_id' => 'The Steam App ID used with +workshop_download_item, e.g. 107410 for Arma 3',
|
||
'config_hint_game_key' => 'Short identifier matching the game XML key, e.g. arma3_linux',
|
||
'config_section_copy' => 'Copy / sync method',
|
||
'config_hint_launch_tpl' => 'Extra launch parameters added when this game has Workshop mods enabled. E.g. -mod=@{mod_id}',
|
||
'config_label_enabled' => 'Configuration enabled (allows servers to use Workshop mods for this game)',
|
||
'profile_col_game' => 'Game',
|
||
'profile_col_key' => 'Game Key',
|
||
'profile_col_method' => 'Install Method',
|
||
'profile_col_restart' => 'Restart?',
|
||
'profile_col_status' => 'Status',
|
||
'profile_section_basic' => 'Basic info',
|
||
'profile_section_paths' => 'Paths & templates',
|
||
'profile_section_config' => 'Config & launch parameters',
|
||
'profile_section_flags' => 'Flags',
|
||
'profile_label_game_name' => 'Game name',
|
||
'profile_label_os' => 'Supported OS',
|
||
'profile_label_cache_path' => 'SteamCMD cache path template',
|
||
'profile_hint_cache_path' => 'Where SteamCMD downloads mods on the agent. E.g. {steamcmd_path}/steamapps/workshop/content/{workshop_app_id}/{mod_id}',
|
||
'profile_label_install_path' => 'Server install path template',
|
||
'profile_hint_install_path' => 'Where mod files are placed inside the game server directory. E.g. {server_path}/mods/{mod_folder}',
|
||
'profile_label_folder_name' => 'Mod folder name template',
|
||
'profile_hint_folder_name' => 'Folder name for each mod inside the install path. Default: @{mod_id}',
|
||
'profile_label_copy_method' => 'Method used to copy mod files from SteamCMD cache to the server',
|
||
'profile_label_install_script'=> 'Custom install script (optional, admin-defined)',
|
||
'profile_hint_install_script' => 'Only used when copy method is custom_script. Template variables are replaced before execution.',
|
||
'profile_label_config_tpl' => 'Config file template (optional)',
|
||
'profile_label_launch_tpl' => 'Launch parameter template (optional)',
|
||
'profile_label_requires_restart' => 'Server restart required after mod install or update',
|
||
'profile_template_vars' => 'Available: {home_id} {agent_id} {workshop_app_id} {mod_id} {mod_title} {mod_folder} {steamcmd_path} {server_path} {install_path} {cache_path}',
|
||
'profile_saved' => 'Workshop configuration saved.',
|
||
'profile_save_error' => 'Failed to save Workshop configuration.',
|
||
'profile_deleted' => 'Workshop configuration deleted.',
|
||
'profile_delete_error' => 'Failed to delete Workshop configuration.',
|
||
'profile_not_found' => 'Configuration not found.',
|
||
'button_delete' => 'Delete',
|
||
'error_game_key_invalid' => 'Game key may only contain letters, digits, underscores, dots, and hyphens.',
|
||
'error_game_name_required' => 'Game name is required.',
|
||
'error_app_id_required' => 'Workshop App ID is required (numeric).',
|
||
'error_cache_path_required' => 'SteamCMD cache path template is required.',
|
||
'error_install_path_required' => 'Server install path template is required.',
|
||
|
||
// -------------------------------------------------------
|
||
// User mod management (WorkshopModController)
|
||
// -------------------------------------------------------
|
||
'user_workshop_heading' => 'Steam Workshop',
|
||
'user_workshop_server_heading' => 'Workshop Mods – %s',
|
||
'col_server' => 'Server',
|
||
'col_game' => 'Game',
|
||
'col_mods_count' => 'Installed mods',
|
||
'col_profile' => 'Profile',
|
||
'col_mod_id' => 'Workshop ID',
|
||
'col_mod_title' => 'Title',
|
||
'col_load_order' => 'Load order',
|
||
'col_cache_status' => 'Cache status',
|
||
'no_profile' => 'No profile',
|
||
'hint_no_profile' => 'Ask an admin to create a Workshop profile for this game.',
|
||
'btn_manage_mods' => 'Manage Mods',
|
||
'no_profile_notice' => 'No Workshop profile is configured for this game. An administrator needs to create one first.',
|
||
'heading_installed_mods' => 'Installed Mods',
|
||
'no_installed_mods' => 'No mods installed yet.',
|
||
'heading_cached_mods' => 'Available Cached Mods (this agent)',
|
||
'heading_install_mod' => 'Install Mod by Workshop ID',
|
||
'label_workshop_id_input' => 'Workshop ID',
|
||
'placeholder_workshop_id' => 'e.g. 1234567890',
|
||
'btn_install_mod' => 'Install',
|
||
'btn_remove_mod' => 'Remove',
|
||
'btn_sync_now' => 'Sync now',
|
||
'confirm_remove_mod' => 'Remove this mod from this server? (Files on disk are not deleted.)',
|
||
'mod_installed' => 'Mod installed successfully.',
|
||
'mod_install_error' => 'Install failed: ',
|
||
'restart_required' => 'A server restart is required to activate this mod.',
|
||
'mod_removed' => 'Mod removed from this server.',
|
||
'mod_remove_error' => 'Failed to remove mod.',
|
||
'sync_success' => 'Mod synced successfully.',
|
||
'sync_no_change' => 'Mod is already up to date.',
|
||
'sync_error' => 'Sync failed: ',
|
||
'error_missing_params' => 'Missing required parameters.',
|
||
'error_no_profile' => 'No Workshop profile configured for this game.',
|
||
'error_mod_not_found' => 'Mod or profile not found.',
|
||
'error_toggle_failed' => 'Failed to update mod status.',
|
||
'error_order_failed' => 'Failed to update load order.',
|
||
|
||
// -------------------------------------------------------
|
||
// New v2 labels
|
||
// -------------------------------------------------------
|
||
|
||
// Admin profile form – new fields
|
||
'config_steamcmd_note' => 'Workshop mods are downloaded using SteamCMD: +workshop_download_item <App ID> <Mod ID>. Configure the paths and scripts below to control how mods are installed for servers of this game type.',
|
||
'config_label_enabled' => 'Profile enabled',
|
||
'config_hint_game_key' => 'Short identifier matching the game XML key, e.g. dayz_linux',
|
||
'config_hint_app_id' => 'The App ID used with +workshop_download_item, e.g. 221100 for DayZ',
|
||
'config_hint_launch_tpl' => 'Complete launch parameter string appended to server start. Each mod folder is joined with the separator above.',
|
||
'profile_section_basic' => 'Basic identification',
|
||
'profile_section_steam' => 'Steam & SteamCMD settings',
|
||
'profile_section_paths' => 'Download & install paths',
|
||
'profile_section_folder' => 'Mod folder naming',
|
||
'profile_section_launch' => 'Launch parameters',
|
||
'profile_section_scripts' => 'Bash scripts',
|
||
'profile_section_flags' => 'Options & validation',
|
||
'profile_label_game_name' => 'Game display name',
|
||
'profile_label_steam_app_id' => 'Steam App ID',
|
||
'profile_hint_steam_app_id' => 'The Steam game App ID (e.g. 221100 for DayZ). Used when Steam login is required.',
|
||
'config_label_app_id' => 'Workshop App ID',
|
||
'config_hint_app_id' => 'The App ID used with +workshop_download_item, e.g. 221100 for DayZ',
|
||
'profile_label_steamcmd_path' => 'SteamCMD path on agent',
|
||
'profile_hint_steamcmd_path' => 'Full path to steamcmd.sh on the remote agent. Leave blank to use the agent default (/home/gameserver/steamcmd/steamcmd.sh).',
|
||
'profile_label_steam_login_required'=> 'Steam login required (game is not free / requires ownership)',
|
||
'profile_label_steamcmd_login_mode' => 'SteamCMD login mode',
|
||
'profile_hint_steamcmd_login_mode' => 'Use anonymous for free Workshop mods. Use configured account for games requiring ownership.',
|
||
'profile_label_os' => 'Supported OS',
|
||
'profile_label_cache_path' => 'Workshop download/cache path',
|
||
'profile_hint_cache_path' => 'Where SteamCMD stores downloaded mod content on the agent. E.g. /home/gameserver/steamcmd/steamapps/workshop/content/%workshop_app_id%/%workshop_id%',
|
||
'profile_label_install_path' => 'Server mod install root',
|
||
'profile_hint_install_path' => 'Base directory inside the server where mods are installed. E.g. %server_path%/mods/%install_name%',
|
||
'profile_label_folder_format' => 'Folder naming format',
|
||
'profile_hint_folder_format' => 'How each mod folder is named inside the install root.',
|
||
'profile_label_folder_name' => 'Custom folder name template',
|
||
'profile_hint_folder_name' => 'Use %workshop_id% or %mod_name%. E.g. @%workshop_id%',
|
||
'profile_label_mod_launch_param' => 'Mod launch parameter format',
|
||
'profile_hint_mod_launch_param' => 'How the full mod list is passed to the server start command. E.g. -mod=%mods%',
|
||
'profile_label_mod_separator' => 'Mod separator',
|
||
'profile_hint_mod_separator' => 'Character used to join multiple mod folder names in the launch parameter.',
|
||
'profile_label_launch_tpl' => 'Full launch parameter template (optional)',
|
||
'profile_label_copy_method' => 'Copy method',
|
||
'profile_label_copy_keys' => 'Copy mod keys (*.bikey) to server keys directory',
|
||
'profile_label_key_source' => 'Key source path',
|
||
'profile_hint_key_source' => 'Path inside the mod cache where key files live. E.g. %source_path%/keys',
|
||
'profile_label_key_dest' => 'Key destination path',
|
||
'profile_hint_key_dest' => 'Where keys are copied on the server. E.g. %server_path%/keys',
|
||
'profile_label_pre_script' => 'Pre-update bash script',
|
||
'profile_hint_pre_script' => 'Runs once before any mod is downloaded/installed. Variables: %home_id% %server_path% %workshop_app_id%',
|
||
'profile_label_install_script' => 'Per-mod install bash script',
|
||
'profile_hint_install_script' => 'Runs once for each mod. All template variables listed above are available.',
|
||
'profile_label_post_script' => 'Post-update bash script',
|
||
'profile_hint_post_script' => 'Runs once after all mods have been installed. Variables: %home_id% %server_path% %workshop_app_id%',
|
||
'profile_label_requires_restart' => 'Server restart required after mod install or update',
|
||
'profile_label_validation_notes' => 'Validation notes / help text (shown to server owners)',
|
||
'profile_label_config_tpl' => 'Config file template (optional)',
|
||
'profile_template_vars' => 'Variables: %home_id% %server_path% %steam_app_id% %workshop_app_id% %workshop_id% %mod_name% %install_name% %download_path% %source_path% %target_path% %keys_source_path% %keys_target_path% %steamcmd_path%',
|
||
'profile_template_vars_heading' => 'Template variables:',
|
||
'profile_scripts_order' => 'Execution order:',
|
||
'profile_scripts_per_mod' => 'repeated for each mod',
|
||
'profile_script_example_toggle' => 'Show DayZ-style example',
|
||
'profile_col_app_ids' => 'App IDs',
|
||
'profile_col_login' => 'Login',
|
||
'profile_col_steam' => 'Steam',
|
||
'profile_col_workshop' => 'Workshop',
|
||
'profile_badge_login_required' => 'Login req.',
|
||
'profile_col_game' => 'Game',
|
||
'profile_col_key' => 'Game Key',
|
||
'profile_col_method' => 'Install Method',
|
||
'profile_col_restart' => 'Restart?',
|
||
'profile_col_status' => 'Status',
|
||
'error_folder_template_required' => 'Custom folder name template is required when format is set to custom.',
|
||
|
||
// Server-level settings (user/server page)
|
||
'heading_server_settings' => 'Workshop Settings for this server',
|
||
'label_workshop_enabled' => 'Enable Workshop for this server',
|
||
'label_select_profile' => 'Workshop game profile',
|
||
'label_auto_detect' => 'Auto-detect from game type',
|
||
'label_update_mode' => 'Update mode',
|
||
'label_restart_behavior' => 'Restart behavior',
|
||
'update_mode_manual' => 'Manual only',
|
||
'update_mode_scheduled' => 'Scheduled',
|
||
'update_mode_on_restart' => 'Before server restart',
|
||
'restart_behavior_none' => 'No restart',
|
||
'restart_behavior_queue' => 'Queue restart',
|
||
'restart_behavior_stop' => 'Stop / Update / Start',
|
||
'btn_queue_update' => 'Queue manual update',
|
||
'label_last_update_status' => 'Last update status',
|
||
'label_last_update_time' => 'Last update time',
|
||
'label_last_success_time' => 'Last successful update',
|
||
'label_last_update_error' => 'Last error',
|
||
'update_queued_notice' => 'A manual update is queued and will run on the next scheduler cycle.',
|
||
'settings_saved' => 'Workshop settings saved.',
|
||
'update_queued' => 'Manual update queued. It will run on the next scheduler cycle.',
|
||
'col_mod_folder' => 'Install folder',
|
||
'label_admin_notes' => 'Admin notes:',
|
||
];
|
||
|