Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 20 additions & 15 deletions src/WeatherManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,9 @@ void WeatherManager::LoadPerWeatherSettingsFromDisk()
settingsFile.close();

// Store the entire weather settings in cache
// The structure is expected to be: { "FeatureName": { settings }, ... }
if (weatherData.is_object()) {
for (auto& [featureName, featureSettings] : weatherData.items()) {
// The structure is expected to be: { "featureSettings": { "FeatureName": { settings }, ... }
if (weatherData.is_object() && weatherData.contains("featureSettings") && weatherData["featureSettings"].is_object()) {
for (auto& [featureName, featureSettings] : weatherData["featureSettings"].items()) {
perWeatherSettingsCache[weatherKey][featureName] = featureSettings;
}
logger::info("Loaded settings for weather: {}", weatherKey);
Expand Down Expand Up @@ -157,26 +157,31 @@ void WeatherManager::SaveSettingsToWeather(RE::TESWeather* weather, const std::s
}
}

// Ensure weatherData is an object and has featureSettings
if (!weatherData.is_object()) {
weatherData = json::object();
}
if (!weatherData.contains("featureSettings") || !weatherData["featureSettings"].is_object()) {
weatherData["featureSettings"] = json::object();
}
auto& featureSettings = weatherData["featureSettings"];

// Update with new feature settings or remove feature entry if settings empty
if (settings.is_object() && settings.empty()) {
// Remove feature entry from loaded JSON
if (weatherData.is_object()) {
weatherData.erase(featureName);
}
featureSettings.erase(featureName);
} else {
weatherData[featureName] = settings;
featureSettings[featureName] = settings;
}

Comment thread
alandtse marked this conversation as resolved.
// Write back to disk
if (weatherData.is_object() && weatherData.empty()) {
if (featureSettings.empty()) {
// No features left for this weather — remove file if it exists
if (std::filesystem::exists(filePath)) {
try {
std::filesystem::remove(filePath);
logger::info("Removed weather settings file (no features remain): {}", filePath);
} catch (const std::filesystem::filesystem_error& e) {
logger::warn("Failed to remove empty weather settings file ({}): {}", filePath, e.what());
}
std::error_code ec;
if (std::filesystem::remove(filePath, ec)) {
logger::info("Removed weather settings file (no features remain): {}", filePath);
} else if (ec) {
logger::warn("Failed to remove empty weather settings file ({}): {}", filePath, ec.message());
}
return;
}
Expand Down