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 _logger; private CancellationTokenSource _cts; private DateTime _triggerDate; public readonly Dictionary citiesTranslation = new Dictionary() { { 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 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 codesInUse = new List(); 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; } } }