using FSO.Server.Database;
using FSO.Server.Discord;
using FSO.Server.Servers.Api.JsonWebToken;
using FSO.Server.Servers.City;
using FSO.Server.Servers.Lot;
using FSO.Server.Servers.Tasks;
using FSO.Server.Servers.UserApi;
using Ninject.Activation;
using Ninject.Modules;
using System;
using System.Collections.Generic;
using System.IO;
namespace FSO.Server
{
public class ServerConfiguration
{
public string GameLocation;
public string SimNFS;
public string UpdateBranch;
public DatabaseConfiguration Database;
public ServerConfigurationservices Services;
public DiscordConfiguration Discord;
///
/// Secret string used as a key for signing JWT tokens for the admin system
///
public string Secret;
///
/// Update ID this server is running on. All shards that we host will report needing this version, and this is reported with our host information.
/// Loaded from updateID.txt if present.
///
public int? UpdateID;
}
public class ServerConfigurationservices
{
public ApiServerConfiguration UserApi;
public TaskServerConfiguration Tasks;
public List Cities;
public List Lots;
}
public class ServerConfigurationModule : NinjectModule
{
private ServerConfiguration GetConfiguration(IContext context)
{
//TODO: Allow config path to be overriden in a switch
var configPath = "config.json";
if (!File.Exists(configPath))
{
throw new Exception("Configuration file, config.json, missing");
}
var data = File.ReadAllText(configPath);
try
{
return Newtonsoft.Json.JsonConvert.DeserializeObject(data);
}catch(Exception ex)
{
throw new Exception("Could not deserialize config.json", ex);
}
}
private class DatabaseConfigurationProvider : IProvider
{
private ServerConfiguration Config;
public DatabaseConfigurationProvider(ServerConfiguration config)
{
this.Config = config;
}
public Type Type
{
get
{
return typeof(DatabaseConfiguration);
}
}
public object Create(IContext context)
{
return this.Config.Database;
}
}
private class JWTConfigurationProvider : IProvider
{
private ServerConfiguration Config;
public JWTConfigurationProvider(ServerConfiguration config)
{
this.Config = config;
}
public Type Type
{
get
{
return typeof(JWTConfiguration);
}
}
public object Create(IContext context)
{
return new JWTConfiguration() {
Key = System.Text.UTF8Encoding.UTF8.GetBytes(Config.Secret)
};
}
}
public override void Load()
{
this.Bind().ToMethod(new Func(GetConfiguration)).InSingletonScope();
this.Bind().ToProvider().InSingletonScope();
this.Bind().ToProvider().InSingletonScope();
}
}
}