86 lines
3.7 KiB
C#
86 lines
3.7 KiB
C#
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 PeasantTrainingSeconds = "PeasantTrainingSeconds";
|
|
public const string ScoutGoldCost = "ScoutGoldCost";
|
|
public const string ArcherGoldCost = "ArcherGoldCost";
|
|
public const string ArcherWoodCost = "ArcherWoodCost";
|
|
public const string PeasantGoldCost = "PeasantGoldCost";
|
|
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 ProductionBuildingResourceCapacity = "ProductionBuildingResourceCapacity";
|
|
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<GameSetting> _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<GameSetting>("GameSettings");
|
|
|
|
_settings.Indexes.CreateOne(new CreateIndexModel<GameSetting>(
|
|
Builders<GameSetting>.IndexKeys.Ascending(x => x.Key),
|
|
new CreateIndexOptions { Unique = true }));
|
|
}
|
|
|
|
public async Task<int> GetIntAsync(string key, int defaultValue)
|
|
{
|
|
var now = DateTime.UtcNow;
|
|
var setting = await _settings.FindOneAndUpdateAsync(
|
|
x => x.Key == key,
|
|
Builders<GameSetting>.Update
|
|
.SetOnInsert(x => x.Key, key)
|
|
.SetOnInsert(x => x.IntValue, defaultValue)
|
|
.SetOnInsert(x => x.CreatedAtUtc, now)
|
|
.Set(x => x.UpdatedAtUtc, now),
|
|
new FindOneAndUpdateOptions<GameSetting>
|
|
{
|
|
IsUpsert = true,
|
|
ReturnDocument = ReturnDocument.After
|
|
});
|
|
|
|
return Math.Max(1, setting.IntValue);
|
|
}
|
|
|
|
public async Task<int> GetNonNegativeIntAsync(string key, int defaultValue)
|
|
{
|
|
var now = DateTime.UtcNow;
|
|
var setting = await _settings.FindOneAndUpdateAsync(
|
|
x => x.Key == key,
|
|
Builders<GameSetting>.Update
|
|
.SetOnInsert(x => x.Key, key)
|
|
.SetOnInsert(x => x.IntValue, defaultValue)
|
|
.SetOnInsert(x => x.CreatedAtUtc, now)
|
|
.Set(x => x.UpdatedAtUtc, now),
|
|
new FindOneAndUpdateOptions<GameSetting>
|
|
{
|
|
IsUpsert = true,
|
|
ReturnDocument = ReturnDocument.After
|
|
});
|
|
|
|
return Math.Max(0, setting.IntValue);
|
|
}
|
|
}
|