first commit
This commit is contained in:
204
godot_client/scripts/services/settings.gd
Normal file
204
godot_client/scripts/services/settings.gd
Normal file
@@ -0,0 +1,204 @@
|
||||
extends Node
|
||||
## Settings Service
|
||||
##
|
||||
## Singleton service for application configuration.
|
||||
## Stores URLs, feature flags, and other runtime settings.
|
||||
##
|
||||
## Usage:
|
||||
## Settings.get_api_url()
|
||||
## Settings.get_web_url()
|
||||
## Settings.set_environment("production")
|
||||
|
||||
# Environment types
|
||||
enum Env {
|
||||
DEVELOPMENT,
|
||||
STAGING,
|
||||
PRODUCTION
|
||||
}
|
||||
|
||||
# Current environment
|
||||
var _current_environment: int = Env.DEVELOPMENT
|
||||
|
||||
# URL Configuration
|
||||
var _api_urls := {
|
||||
Env.DEVELOPMENT: "http://localhost:5000",
|
||||
Env.STAGING: "https://staging-api.codeofconquest.com",
|
||||
Env.PRODUCTION: "https://api.codeofconquest.com"
|
||||
}
|
||||
|
||||
var _web_urls := {
|
||||
Env.DEVELOPMENT: "http://localhost:8000", # Flask serves web pages in dev
|
||||
Env.STAGING: "https://staging.codeofconquest.com",
|
||||
Env.PRODUCTION: "https://www.codeofconquest.com"
|
||||
}
|
||||
|
||||
# Feature flags
|
||||
var _features := {
|
||||
"enable_debug_logging": true,
|
||||
"enable_analytics": false,
|
||||
"enable_multiplayer": false,
|
||||
"max_characters_per_user": 5
|
||||
}
|
||||
|
||||
# User preferences (persisted)
|
||||
var _preferences := {
|
||||
"remember_login": true,
|
||||
"auto_save": true,
|
||||
"sound_enabled": true,
|
||||
"music_enabled": true,
|
||||
"sound_volume": 0.8,
|
||||
"music_volume": 0.6
|
||||
}
|
||||
|
||||
# Save file configuration
|
||||
const SETTINGS_FILE_PATH := "user://settings.save"
|
||||
const SETTINGS_VERSION := 1
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_load_settings()
|
||||
_detect_environment()
|
||||
print("[Settings] Service initialized")
|
||||
print("[Settings] Environment: %s" % _environment_to_string(_current_environment))
|
||||
print("[Settings] API URL: %s" % get_api_url())
|
||||
print("[Settings] Web URL: %s" % get_web_url())
|
||||
|
||||
|
||||
## Get current API base URL
|
||||
func get_api_url() -> String:
|
||||
return _api_urls.get(_current_environment, _api_urls[Env.DEVELOPMENT])
|
||||
|
||||
|
||||
## Get current web frontend base URL
|
||||
func get_web_url() -> String:
|
||||
return _web_urls.get(_current_environment, _web_urls[Env.DEVELOPMENT])
|
||||
|
||||
|
||||
## Get current environment
|
||||
func get_environment() -> int:
|
||||
return _current_environment
|
||||
|
||||
|
||||
## Set environment (for testing/switching)
|
||||
func set_environment(env: int) -> void:
|
||||
_current_environment = env
|
||||
print("[Settings] Environment changed to: %s" % _environment_to_string(env))
|
||||
print("[Settings] API URL: %s" % get_api_url())
|
||||
print("[Settings] Web URL: %s" % get_web_url())
|
||||
|
||||
|
||||
## Check if a feature is enabled
|
||||
func is_feature_enabled(feature_name: String) -> bool:
|
||||
return _features.get(feature_name, false)
|
||||
|
||||
|
||||
## Get feature value
|
||||
func get_feature(feature_name: String, default: Variant = null) -> Variant:
|
||||
return _features.get(feature_name, default)
|
||||
|
||||
|
||||
## Set feature flag (for testing/debugging)
|
||||
func set_feature(feature_name: String, value: Variant) -> void:
|
||||
_features[feature_name] = value
|
||||
print("[Settings] Feature updated: %s = %s" % [feature_name, value])
|
||||
|
||||
|
||||
## Get user preference
|
||||
func get_preference(key: String, default: Variant = null) -> Variant:
|
||||
return _preferences.get(key, default)
|
||||
|
||||
|
||||
## Set user preference
|
||||
func set_preference(key: String, value: Variant) -> void:
|
||||
_preferences[key] = value
|
||||
print("[Settings] Preference updated: %s = %s" % [key, value])
|
||||
_save_settings()
|
||||
|
||||
|
||||
## Get all preferences
|
||||
func get_all_preferences() -> Dictionary:
|
||||
return _preferences.duplicate()
|
||||
|
||||
|
||||
## Auto-detect environment based on OS and build flags
|
||||
func _detect_environment() -> void:
|
||||
# Check for --production command line argument
|
||||
var args := OS.get_cmdline_args()
|
||||
if "--production" in args:
|
||||
_current_environment = Env.PRODUCTION
|
||||
return
|
||||
|
||||
if "--staging" in args:
|
||||
_current_environment = Env.STAGING
|
||||
return
|
||||
|
||||
# Default to development
|
||||
_current_environment = Env.DEVELOPMENT
|
||||
|
||||
|
||||
## Save settings to disk
|
||||
func _save_settings() -> void:
|
||||
var save_data := {
|
||||
"version": SETTINGS_VERSION,
|
||||
"preferences": _preferences,
|
||||
"timestamp": Time.get_unix_time_from_system()
|
||||
}
|
||||
|
||||
var file := FileAccess.open(SETTINGS_FILE_PATH, FileAccess.WRITE)
|
||||
if file == null:
|
||||
push_error("[Settings] Failed to open settings file for writing: %s" % FileAccess.get_open_error())
|
||||
return
|
||||
|
||||
file.store_string(JSON.stringify(save_data))
|
||||
file.close()
|
||||
|
||||
print("[Settings] Settings saved to %s" % SETTINGS_FILE_PATH)
|
||||
|
||||
|
||||
## Load settings from disk
|
||||
func _load_settings() -> void:
|
||||
if not FileAccess.file_exists(SETTINGS_FILE_PATH):
|
||||
print("[Settings] No settings file found, using defaults")
|
||||
return
|
||||
|
||||
var file := FileAccess.open(SETTINGS_FILE_PATH, FileAccess.READ)
|
||||
if file == null:
|
||||
push_error("[Settings] Failed to open settings file for reading: %s" % FileAccess.get_open_error())
|
||||
return
|
||||
|
||||
var json_string := file.get_as_text()
|
||||
file.close()
|
||||
|
||||
var json := JSON.new()
|
||||
var parse_error := json.parse(json_string)
|
||||
|
||||
if parse_error != OK:
|
||||
push_error("[Settings] Failed to parse settings file")
|
||||
return
|
||||
|
||||
var save_data: Dictionary = json.data
|
||||
|
||||
# Check version
|
||||
if save_data.get("version", 0) != SETTINGS_VERSION:
|
||||
print("[Settings] Settings file version mismatch, using defaults")
|
||||
return
|
||||
|
||||
# Restore preferences
|
||||
var saved_prefs = save_data.get("preferences", {})
|
||||
for key in saved_prefs:
|
||||
_preferences[key] = saved_prefs[key]
|
||||
|
||||
print("[Settings] Settings loaded from %s" % SETTINGS_FILE_PATH)
|
||||
|
||||
|
||||
## Convert environment enum to string
|
||||
func _environment_to_string(env: int) -> String:
|
||||
match env:
|
||||
Env.DEVELOPMENT:
|
||||
return "Development"
|
||||
Env.STAGING:
|
||||
return "Staging"
|
||||
Env.PRODUCTION:
|
||||
return "Production"
|
||||
_:
|
||||
return "Unknown"
|
||||
Reference in New Issue
Block a user