server-master/srcs/WingsAPI.Game/RainbowBattle/IRainbowBattleManager.cs
2026-02-10 18:21:30 +01:00

140 lines
No EOL
3.8 KiB
C#

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using WingsEmu.Game._enum;
using WingsEmu.Game.Configurations;
namespace WingsEmu.Game.RainbowBattle;
public interface IRainbowBattleManager
{
bool IsActive { get; set; }
bool IsRegistrationActive { get; }
DateTime RegistrationStartTime { get; }
DateTime? RainbowBattleProcessTime { get; set; }
IReadOnlyList<(TimeSpan, int, TimeType)> Warnings { get; }
IEnumerable<long> RegisteredPlayers { get; }
IEnumerable<RainbowBattleParty> RainbowBattleParties { get; }
void EnableBattleRainbowRegistration();
void DisableBattleRainbowRegistration();
void RegisterPlayer(long id);
void UnregisterPlayer(long id);
void ClearRegisteredPlayers();
void AddRainbowBattle(RainbowBattleParty rainbowBattleParty);
void RemoveRainbowBattle(RainbowBattleParty rainbowBattleParty);
}
public class RainbowBattleManager : IRainbowBattleManager
{
private readonly ReaderWriterLockSlim _lock = new();
private readonly ConcurrentDictionary<Guid, RainbowBattleParty> _rainbowBattleParties = new();
private readonly HashSet<long> _registeredPlayers = new();
public RainbowBattleManager(RainbowBattleConfiguration rainbowBattleConfiguration)
{
var warnings = new List<(TimeSpan, int, TimeType)>();
foreach (TimeSpan warning in rainbowBattleConfiguration.Warnings)
{
TimeSpan time = TimeSpan.FromMinutes(5) - warning;
bool isSec = time.TotalMinutes < 1;
warnings.Add(new ValueTuple<TimeSpan, int, TimeType>(warning, (int)(isSec ? time.TotalSeconds : time.TotalMinutes), isSec ? TimeType.SECONDS : TimeType.MINUTES));
}
Warnings = warnings;
}
public bool IsActive { get; set; }
public bool IsRegistrationActive { get; private set; }
public void EnableBattleRainbowRegistration()
{
IsRegistrationActive = true;
RegistrationStartTime = DateTime.UtcNow.AddSeconds(30);
}
public void DisableBattleRainbowRegistration()
{
IsRegistrationActive = false;
RegistrationStartTime = DateTime.MinValue;
}
public DateTime RegistrationStartTime { get; private set; }
public DateTime? RainbowBattleProcessTime { get; set; }
public IReadOnlyList<(TimeSpan, int, TimeType)> Warnings { get; }
public void RegisterPlayer(long id)
{
_lock.EnterWriteLock();
try
{
_registeredPlayers.Add(id);
}
finally
{
_lock.ExitWriteLock();
}
}
public void UnregisterPlayer(long id)
{
_lock.EnterWriteLock();
try
{
_registeredPlayers.Remove(id);
}
finally
{
_lock.ExitWriteLock();
}
}
public IEnumerable<long> RegisteredPlayers
{
get
{
_lock.EnterReadLock();
try
{
return _registeredPlayers.ToArray();
}
finally
{
_lock.ExitReadLock();
}
}
}
public void ClearRegisteredPlayers()
{
_lock.EnterWriteLock();
try
{
_registeredPlayers.Clear();
}
finally
{
_lock.ExitWriteLock();
}
}
public void AddRainbowBattle(RainbowBattleParty rainbowBattleParty)
{
_rainbowBattleParties.TryAdd(rainbowBattleParty.Id, rainbowBattleParty);
}
public void RemoveRainbowBattle(RainbowBattleParty rainbowBattleParty)
{
_rainbowBattleParties.Remove(rainbowBattleParty.Id, out _);
}
public IEnumerable<RainbowBattleParty> RainbowBattleParties => _rainbowBattleParties.Values.ToArray();
}