Configuration
SwiftlyS2's configuration system lets your plugin create config files, bind typed models, and reload settings at runtime, through APIISwiftlyCore.Configuration (APIIPluginConfigurationService).
Paths
string basePath = Core.Configuration.BasePath;
bool exists = Core.Configuration.BasePathExists;
string configPath = Core.Configuration.GetConfigPath("config.jsonc"); // needs the extensionSee APIIPluginConfigurationService.BasePath, APIIPluginConfigurationService.BasePathExists and APIIPluginConfigurationService.GetConfigPath.
Initializing Config Files
// From a packaged templates/ folder
Core.Configuration.InitializeWithTemplate("config.jsonc", "config.template.jsonc");
// From a typed model - creates the file with defaults if it doesn't exist yet
Core.Configuration.InitializeJsonWithModel<MainConfig>("config.jsonc", "Main");
Core.Configuration.InitializeTomlWithModel<DatabaseConfig>("database.toml", "Database");See APIIPluginConfigurationService.InitializeWithTemplate, APIIPluginConfigurationService.InitializeJsonWithModel and APIIPluginConfigurationService.InitializeTomlWithModel - all three return APIIPluginConfigurationService, so they chain, followed by APIIPluginConfigurationService.Configure to register the file as a live, reloadable source:
Core.Configuration
.InitializeJsonWithModel<MainConfig>("config.jsonc", "Main")
.InitializeTomlWithModel<DatabaseConfig>("database.toml", "Database")
.Configure(builder =>
{
builder.AddJsonFile(Core.Configuration.GetConfigPath("config.jsonc"), optional: false, reloadOnChange: true);
builder.AddTomlFile(Core.Configuration.GetConfigPath("database.toml"), optional: false, reloadOnChange: true);
});AddJsonFile/AddTomlFile resolve relative to the process's working
directory, not your plugin folder - pass the full path from GetConfigPath,
not a bare file name.
Use APIIPluginConfigurationService.Manager to reach the raw IConfigurationManager directly.
Complete Example
namespace MyPlugin;
public class MainConfig
{
public bool Enabled { get; set; } = true;
public bool Debug { get; set; } = false;
public int MaxPlayers { get; set; } = 32;
}
public class DatabaseConfig
{
public string Host { get; set; } = "127.0.0.1";
public int Port { get; set; } = 3306;
}
public override void Load(bool hotReload)
{
Core.Configuration
.InitializeJsonWithModel<MainConfig>("config.jsonc", "Main")
.InitializeTomlWithModel<DatabaseConfig>("database.toml", "Database")
.Configure(builder =>
{
builder.AddJsonFile(Core.Configuration.GetConfigPath("config.jsonc"), optional: false, reloadOnChange: true);
builder.AddTomlFile(Core.Configuration.GetConfigPath("database.toml"), optional: false, reloadOnChange: true);
});
var services = new ServiceCollection();
services.AddSwiftly(Core);
services.AddOptionsWithValidateOnStart<MainConfig>().BindConfiguration("Main");
services.AddOptionsWithValidateOnStart<DatabaseConfig>().BindConfiguration("Database");
}See Dependency Injection for more on services.AddSwiftly(Core). Consume with IOptionsMonitor<T> to react to reloads:
public class ExampleService
{
public ExampleService(IOptionsMonitor<MainConfig> main)
{
main.OnChange(cfg => Console.WriteLine($"Main config reloaded. Enabled: {cfg.Enabled}"));
}
}