142 lines
4.8 KiB
C#
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;
|
|
}
|
|
}
|
|
} |