Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/StarRootLoader.cpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
commit6352e8e3196f78388b6c771073f9e03eaa612673 (patch)
treee23772f79a7fbc41bc9108951e9e136857484bf4 /source/game/StarRootLoader.cpp
parent6741a057e5639280d85d0f88ba26f000baa58f61 (diff)
everything everywhere
all at once
Diffstat (limited to 'source/game/StarRootLoader.cpp')
-rw-r--r--source/game/StarRootLoader.cpp192
1 files changed, 192 insertions, 0 deletions
diff --git a/source/game/StarRootLoader.cpp b/source/game/StarRootLoader.cpp
new file mode 100644
index 0000000..0bba5e5
--- /dev/null
+++ b/source/game/StarRootLoader.cpp
@@ -0,0 +1,192 @@
+#include "StarRootLoader.hpp"
+#include "StarLexicalCast.hpp"
+#include "StarJsonExtra.hpp"
+
+namespace Star {
+
+Json const BaseAssetsSettings = Json::parseJson(R"JSON(
+ {
+ "assetTimeToLive" : 30,
+
+ // In seconds, audio less than this long will be decompressed in memory.
+ "audioDecompressLimit" : 4.0,
+
+ "workerPoolSize" : 2,
+
+ "pathIgnore" : [
+ "/\\.",
+ "/~",
+ "thumbs\\.db$",
+ "\\.bak$",
+ "\\.tmp$",
+ "\\.zip$",
+ "\\.orig$",
+ "\\.fail$",
+ "\\.psd$",
+ "\\.tmx$"
+ ],
+
+ "digestIgnore" : [
+ "\\.ogg$",
+ "\\.wav$",
+ "\\.abc$"
+ ]
+ }
+ )JSON");
+
+Json const BaseDefaultConfiguration = Json::parseJson(R"JSON(
+ {
+ "configurationVersion" : {
+ "basic" : 2
+ },
+
+ "gameServerPort" : 21025,
+ "gameServerBind" : "::",
+
+ "serverUsers" : {},
+ "allowAnonymousConnections" : true,
+
+ "bannedUuids" : [],
+ "bannedIPs" : [],
+
+ "serverName" : "A Starbound Server",
+ "maxPlayers" : 8,
+ "maxTeamSize" : 4,
+ "serverFidelity" : "automatic",
+
+ "checkAssetsDigest" : false,
+
+ "safeScripts" : true,
+ "scriptRecursionLimit" : 100,
+ "scriptInstructionLimit" : 10000000,
+ "scriptProfilingEnabled" : false,
+ "scriptInstructionMeasureInterval" : 10000,
+
+ "allowAdminCommands" : true,
+ "allowAdminCommandsFromAnyone" : false,
+ "anonymousConnectionsAreAdmin" : false,
+
+ "clientP2PJoinable" : true,
+ "clientIPJoinable" : false,
+
+ "clearUniverseFiles" : false,
+ "clearPlayerFiles" : false,
+ "playerBackupFileCount" : 3,
+
+ "tutorialMessages" : true,
+
+ "interactiveHighlight" : true,
+
+ "monochromeLighting" : false,
+
+ "crafting" : {
+ "filterHaveMaterials" : false
+ },
+
+ "inventory" : {
+ "pickupToActionBar" : true
+ }
+ }
+ )JSON");
+
+RootLoader::RootLoader(Defaults defaults) {
+ String baseConfigFile;
+ Maybe<String> userConfigFile;
+
+ addParameter("bootconfig", "bootconfig", Optional,
+ strf("Boot time configuration file, defaults to sbinit.config"));
+ addParameter("logfile", "logfile", Optional,
+ strf("Log to the given logfile relative to the root directory, defaults to %s",
+ defaults.logFile ? *defaults.logFile : "no log file"));
+ addParameter("loglevel", "level", Optional,
+ strf("Sets the logging level (debug|info|warn|error), defaults to %s",
+ LogLevelNames.getRight(defaults.logLevel)));
+ addSwitch("quiet", strf("Do not log to stdout, defaults to %s", defaults.quiet));
+ addSwitch("verbose", strf("Log to stdout, defaults to %s", !defaults.quiet));
+ addSwitch("runtimeconfig",
+ strf("Sets the path to the runtime configuration storage file relative to root directory, defauts to %s",
+ defaults.runtimeConfigFile ? *defaults.runtimeConfigFile : "no storage file"));
+ m_defaults = move(defaults);
+}
+
+pair<Root::Settings, RootLoader::Options> RootLoader::parseOrDie(
+ StringList const& cmdLineArguments) const {
+ auto options = VersionOptionParser::parseOrDie(cmdLineArguments);
+ return {rootSettingsForOptions(options), options};
+}
+
+pair<RootUPtr, RootLoader::Options> RootLoader::initOrDie(StringList const& cmdLineArguments) const {
+ auto p = parseOrDie(cmdLineArguments);
+ auto root = make_unique<Root>(p.first);
+ return {move(root), p.second};
+}
+
+pair<Root::Settings, RootLoader::Options> RootLoader::commandParseOrDie(int argc, char** argv) {
+ auto options = VersionOptionParser::commandParseOrDie(argc, argv);
+ return {rootSettingsForOptions(options), options};
+}
+
+pair<RootUPtr, RootLoader::Options> RootLoader::commandInitOrDie(int argc, char** argv) {
+ auto p = commandParseOrDie(argc, argv);
+ auto root = make_unique<Root>(p.first);
+ return {move(root), p.second};
+}
+
+Root::Settings RootLoader::rootSettingsForOptions(Options const& options) const {
+ try {
+ String bootConfigFile = options.parameters.value("bootconfig").maybeFirst().value("sbinit.config");
+ Json bootConfig = Json::parseJson(File::readFileString(bootConfigFile));
+
+ Json assetsSettings = jsonMerge(
+ BaseAssetsSettings,
+ m_defaults.additionalAssetsSettings,
+ bootConfig.get("assetsSettings", {})
+ );
+
+ Root::Settings rootSettings;
+ rootSettings.assetsSettings.assetTimeToLive = assetsSettings.getInt("assetTimeToLive");
+ rootSettings.assetsSettings.audioDecompressLimit = assetsSettings.getFloat("audioDecompressLimit");
+ rootSettings.assetsSettings.workerPoolSize = assetsSettings.getUInt("workerPoolSize");
+ rootSettings.assetsSettings.missingImage = assetsSettings.optString("missingImage");
+ rootSettings.assetsSettings.missingAudio = assetsSettings.optString("missingAudio");
+ rootSettings.assetsSettings.pathIgnore = jsonToStringList(assetsSettings.get("pathIgnore"));
+ rootSettings.assetsSettings.digestIgnore = jsonToStringList(assetsSettings.get("digestIgnore"));
+
+ rootSettings.assetDirectories = jsonToStringList(bootConfig.get("assetDirectories"));
+
+ rootSettings.defaultConfiguration = jsonMerge(
+ BaseDefaultConfiguration,
+ m_defaults.additionalDefaultConfiguration,
+ bootConfig.get("defaultConfiguration", {})
+ );
+
+ rootSettings.storageDirectory = bootConfig.getString("storageDirectory");
+
+ rootSettings.logFile = options.parameters.value("logfile").maybeFirst().orMaybe(m_defaults.logFile);
+ rootSettings.logFileBackups = bootConfig.getUInt("logFileBackups", 5);
+
+ if (auto ll = options.parameters.value("loglevel").maybeFirst())
+ rootSettings.logLevel = LogLevelNames.getLeft(*ll);
+ else
+ rootSettings.logLevel = m_defaults.logLevel;
+
+ if (options.switches.contains("quiet"))
+ rootSettings.quiet = true;
+ else if (options.switches.contains("verbose"))
+ rootSettings.quiet = false;
+ else
+ rootSettings.quiet = m_defaults.quiet;
+
+ if (auto rc = options.parameters.value("runtimeconfig").maybeFirst())
+ rootSettings.runtimeConfigFile = *rc;
+ else
+ rootSettings.runtimeConfigFile = m_defaults.runtimeConfigFile;
+
+ return rootSettings;
+
+ } catch (std::exception const& e) {
+ throw StarException("Could not perform initial Root load", e);
+ }
+}
+
+}