Files
yandex-quest-server/Services/CodeGenerationService.cs
2023-07-08 21:28:08 +05:00

142 lines
4.8 KiB
C#

using YandexGameServer.Models;
namespace YandexGameServer.Services
{
public enum Cities
{
MoscowRedRose,
MoscowCity,
MoscowSkolkovo,
SaintPetersburg,
Yekaterinburg,
Novosibirsk,
Kazan,
Innopolis,
RostovOnDon,
NizhnyNovgorod,
Simferopol,
Vladivostok,
Krasnodar,
Samara,
Chelyabinsk,
Perm,
Tula,
Sochi,
Ufa,
Krasnoyarsk,
Tumen,
Voronezh,
Minsk,
Serbia
}
public class CodeGenerationService : IDisposable
{
private readonly DatabaseService _databaseService;
private readonly ILogger<CodeGenerationService> _logger;
private CancellationTokenSource _cts;
private DateTime _triggerDate;
public readonly Dictionary<Cities, string> citiesTranslation = new Dictionary<Cities, string>()
{
{ Cities.MoscowRedRose, "Москва, Красная Роза" },
{ Cities.MoscowCity, "Москва, Москва-Сити" },
{ Cities.MoscowSkolkovo, "Москва, Сколково" },
{ Cities.SaintPetersburg, "Санкт-Петербург" },
{ Cities.Yekaterinburg, "Екатеринбург" },
{ Cities.Novosibirsk, "Новосибирск" },
{ Cities.Kazan, "Казань" },
{ Cities.Innopolis, "Иннополис" },
{ Cities.RostovOnDon, "Ростов-На-Дону" },
{ Cities.NizhnyNovgorod, "Нижний Новгород" },
{ Cities.Simferopol, "Симферополь" },
{ Cities.Vladivostok, "Владивосток" },
{ Cities.Krasnodar, "Краснодар" },
{ Cities.Samara, "Самара" },
{ Cities.Chelyabinsk, "Челябинск" },
{ Cities.Perm, "Пермь" },
{ Cities.Tula, "Тула" },
{ Cities.Sochi, "Сочи" },
{ Cities.Ufa, "Уфа" },
{ Cities.Krasnoyarsk, "Красноярск" },
{ Cities.Tumen, "Тюмень" },
{ Cities.Voronezh, "Воронеж" },
{ Cities.Minsk, "Минск" },
{ Cities.Serbia, "Сербия" }
};
public CodeGenerationService(DatabaseService databaseService, ILogger<CodeGenerationService> logger)
{
_cts = new CancellationTokenSource();
_databaseService = databaseService;
_logger = logger;
_triggerDate = new DateTime(DateTime.UtcNow.Year, DateTime.UtcNow.Month, DateTime.UtcNow.Day, 0, 0, 0) + TimeSpan.FromDays(1);
_logger.LogInformation($"дата и время следующей смены: {_triggerDate.ToShortDateString()}, {_triggerDate.ToShortTimeString()}");
Task.Run(async () =>
{
var list = await _databaseService.GetCitiesCodesAsync();
if (list.Count == 0)
{
await InitKeys();
await UpdateCityCodes();
}
while (!_cts.Token.IsCancellationRequested)
{
if (DateTime.UtcNow > _triggerDate)
{
_logger.LogWarning($"смена кода ({DateTime.UtcNow.ToShortTimeString()})");
await UpdateCityCodes();
_triggerDate += TimeSpan.FromDays(1);
}
await Task.Delay(1000);
}
});
}
public async Task InitKeys()
{
Cities cities = new Cities();
for(int i = 0; i < citiesTranslation.Count; i++)
{
cities = (Cities)i;
await _databaseService.CreateAsync(new CityUniqueCode() { cityEnum = cities, city = citiesTranslation[cities], adminKey = new Random().Next(0, 1000000) });
}
}
private async Task UpdateCityCodes()
{
Random rand = new Random();
List<int> codesInUse = new List<int>();
var citiesCodes = await _databaseService.GetCitiesCodesAsync();
for (int i = 0; i < citiesCodes.Count; i++)
{
var randomCode = rand.Next(100000, 1000000);
while (codesInUse.Contains(randomCode))
{
randomCode = rand.Next(100000, 1000000);
await Task.Yield();
}
citiesCodes[i].key = randomCode;
codesInUse.Add(randomCode);
await _databaseService.UpdateAsync(citiesCodes[i]);
}
}
public void Dispose()
{
_cts.Cancel();
_cts.Dispose();
_cts = null;
}
}
}