SwiftlyS2
Development

Configuration

SwiftlyS2 provides a flexible configuration system that allows your plugin to create config files, bind typed models, and reload settings while the server is running.

Accessing Configuration Service

The configuration service is available through Core.Configuration.

public override void Load(bool hotReload)
{
    var configuration = Core.Configuration;
}

Configuration Paths

You can inspect where your plugin configuration files are stored and build full paths for individual files.

Base Path

string basePath = Core.Configuration.BasePath;

Check if Base Path Exists

bool exists = Core.Configuration.BasePathExists;

Get Configuration File Path

string configPath = Core.Configuration.GetConfigPath("config.jsonc");

GetConfigPath expects the file name including extension.

Initializing Configuration Files

Configuration files can be initialized from packaged templates or from C# models.

Initialize with Template

To use templates, package a templates folder in your plugin and place the template files there.

Core.Configuration.InitializeWithTemplate("config.jsonc", "config.template.jsonc");
Core.Configuration.InitializeWithTemplate("database.toml", "database.template.toml");

Initialize JSON with Model

Core.Configuration.InitializeJsonWithModel<MainConfig>("config.jsonc", "Main");

Initialize TOML with Model

Core.Configuration.InitializeTomlWithModel<DatabaseConfig>("database.toml", "Database");

Both model-based methods create the file only when it does not already exist.

Configuring the Configuration Manager

After initialization, configure the internal manager with your providers and reload behavior.

Core.Configuration.Configure(builder =>
{
    builder.AddJsonFile("config.jsonc", optional: false, reloadOnChange: true);
    builder.AddTomlFile("database.toml", optional: false, reloadOnChange: true);
});

The Configure function receives an IConfigurationBuilder and returns IPluginConfigurationService, so you can continue chaining methods.

Method Chaining

All setup methods return the configuration service, allowing fluent setup in one block.

Core.Configuration
    .InitializeJsonWithModel<MainConfig>("config.jsonc", "Main")
    .InitializeTomlWithModel<DatabaseConfig>("database.toml", "Database")
    .Configure(builder =>
    {
        builder.AddJsonFile("config.jsonc", optional: false, reloadOnChange: true);
        builder.AddTomlFile("database.toml", optional: false, reloadOnChange: true);
    });

Working with Configuration Manager

You can access the internal configuration manager directly when needed.

IConfigurationManager manager = Core.Configuration.Manager;

Complete Example

1. Define Configuration Models

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;
}

2. Initialize in Plugin Load

public override void Load(bool hotReload)
{
    Core.Configuration
        .InitializeJsonWithModel<MainConfig>("config.jsonc", "Main")
        .InitializeTomlWithModel<DatabaseConfig>("database.toml", "Database")
        .Configure(builder =>
        {
            builder.AddJsonFile("config.jsonc", optional: false, reloadOnChange: true);
            builder.AddTomlFile("database.toml", optional: false, reloadOnChange: true);
        });

    var services = new ServiceCollection();

    services.AddSwiftly(Core);
    services.AddOptionsWithValidateOnStart<MainConfig>().BindConfiguration("Main");
    services.AddOptionsWithValidateOnStart<DatabaseConfig>().BindConfiguration("Database");
}

3. Consume with IOptionsMonitor

public class ExampleService
{
    private readonly IOptionsMonitor<MainConfig> _main;
    private readonly IOptionsMonitor<DatabaseConfig> _database;

    public ExampleService(IOptionsMonitor<MainConfig> main, IOptionsMonitor<DatabaseConfig> database)
    {
        _main = main;
        _database = database;

        _main.OnChange(newConfig =>
        {
            Console.WriteLine($"Main config reloaded. Enabled: {newConfig.Enabled}");
        });
    }

    public void PrintSettings()
    {
        Console.WriteLine($"Debug: {_main.CurrentValue.Debug}");
        Console.WriteLine($"DB Host: {_database.CurrentValue.Host}:{_database.CurrentValue.Port}");
    }
}

Reference

See IPluginConfigurationService for more details.

On this page