fisr commit
This commit is contained in:
@@ -0,0 +1,142 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user