using LocationsApi.Models; using MongoDB.Driver; namespace LocationsApi.Services; public class GameSettingsService { public const string ScoutTrainingSeconds = "ScoutTrainingSeconds"; public const string ArcherTrainingSeconds = "ArcherTrainingSeconds"; public const string ScoutGoldCost = "ScoutGoldCost"; public const string ArcherGoldCost = "ArcherGoldCost"; public const string ArcherWoodCost = "ArcherWoodCost"; public const string LogCampBuildSeconds = "LogCampBuildSeconds"; public const string MineBuildSeconds = "MineBuildSeconds"; public const string BarracksBuildSeconds = "BarracksBuildSeconds"; public const string FarmBuildSeconds = "FarmBuildSeconds"; public const string BarracksGoldCost = "BarracksGoldCost"; public const string BarracksWoodCost = "BarracksWoodCost"; public const string BarracksOreCost = "BarracksOreCost"; public const string LogCampWoodPerMinute = "LogCampWoodPerMinute"; public const string MineOrePerMinute = "MineOrePerMinute"; public const string FarmFoodPerMinute = "FarmFoodPerMinute"; public const string StartingGold = "StartingGold"; public const string HeadquartersGoldPerMinute = "HeadquartersGoldPerMinute"; public const string TownHallGoldCapacity = "TownHallGoldCapacity"; public const string TownHallWoodCapacity = "TownHallWoodCapacity"; public const string TownHallOreCapacity = "TownHallOreCapacity"; public const string TownHallFoodCapacity = "TownHallFoodCapacity"; private readonly IMongoCollection _settings; public GameSettingsService(IConfiguration cfg) { var connectionString = cfg["MongoDB:ConnectionString"] ?? "mongodb://127.0.0.1:27017"; var databaseName = cfg["MongoDB:DatabaseName"] ?? "territory-autobattler"; var client = new MongoClient(connectionString); var database = client.GetDatabase(databaseName); _settings = database.GetCollection("GameSettings"); _settings.Indexes.CreateOne(new CreateIndexModel( Builders.IndexKeys.Ascending(x => x.Key), new CreateIndexOptions { Unique = true })); } public async Task GetIntAsync(string key, int defaultValue) { var now = DateTime.UtcNow; var setting = await _settings.FindOneAndUpdateAsync( x => x.Key == key, Builders.Update .SetOnInsert(x => x.Key, key) .SetOnInsert(x => x.IntValue, defaultValue) .SetOnInsert(x => x.CreatedAtUtc, now) .Set(x => x.UpdatedAtUtc, now), new FindOneAndUpdateOptions { IsUpsert = true, ReturnDocument = ReturnDocument.After }); return Math.Max(1, setting.IntValue); } public async Task GetNonNegativeIntAsync(string key, int defaultValue) { var now = DateTime.UtcNow; var setting = await _settings.FindOneAndUpdateAsync( x => x.Key == key, Builders.Update .SetOnInsert(x => x.Key, key) .SetOnInsert(x => x.IntValue, defaultValue) .SetOnInsert(x => x.CreatedAtUtc, now) .Set(x => x.UpdatedAtUtc, now), new FindOneAndUpdateOptions { IsUpsert = true, ReturnDocument = ReturnDocument.After }); return Math.Max(0, setting.IntValue); } }