using Impostor.Server.Events.Client;
using Impostor.Server.Net.Factories;
using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
namespace Impostor.Server.Net.Manager
{
private readonly ILogger<ClientManager> _logger;
private readonly IEventManager _eventManager;
private readonly ConcurrentDictionary<int, ClientBase> _clients;
+ private readonly CompatibilityConfig _compatibilityConfig;
private readonly IClientFactory _clientFactory;
private int _idLast;
- public ClientManager(ILogger<ClientManager> logger, IEventManager eventManager, IClientFactory clientFactory)
+ public ClientManager(ILogger<ClientManager> logger, IEventManager eventManager, IClientFactory clientFactory, IOptions<CompatibilityConfig> compatibilityConfig)
{
_logger = logger;
_eventManager = eventManager;
_clientFactory = clientFactory;
_clients = new ConcurrentDictionary<int, ClientBase>();
+ _compatibilityConfig = compatibilityConfig.Value;
}
private enum VersionCompareResult
public async ValueTask RegisterConnectionAsync(IHazelConnection connection, string name, int clientVersion, Language language, QuickChatModes chatMode, PlatformSpecificData? platformSpecificData)
{
var versionCompare = CompareVersion(clientVersion);
- if (versionCompare != VersionCompareResult.Compatible || platformSpecificData == null)
+ if (versionCompare == VersionCompareResult.ServerTooOld && _compatibilityConfig.AllowFutureGameVersions && platformSpecificData != null)
+ {
+ GameVersion.ParseVersion(clientVersion, out var year, out var month, out var day, out var revision);
+ _logger.LogWarning("Client connected using future version: {clientVersion} ({version}). Unsupported, continue at your own risk.", clientVersion, $"{year}.{month}.{day}{(revision == 0 ? string.Empty : "." + revision)}");
+ }
+ else if (versionCompare != VersionCompareResult.Compatible || platformSpecificData == null)
{
GameVersion.ParseVersion(clientVersion, out var year, out var month, out var day, out var revision);
_logger.LogTrace("Client connected using unsupported version: {clientVersion} ({version})", clientVersion, $"{year}.{month}.{day}{(revision == 0 ? string.Empty : "." + revision)}");