mirror of
https://github.com/RaidMax/IW4M-Admin.git
synced 2025-06-11 15:52:25 -05:00
Use game time from log to ignore potential false disconnect lines - Fix for latent linking issues with multiple ips - Anticheat fix for T6 - retry kick on update if they're not allowed to connect
This commit is contained in:
@ -2,6 +2,8 @@
|
||||
using SharedLibraryCore.Database.Models;
|
||||
using SharedLibraryCore.Interfaces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using static SharedLibraryCore.Server;
|
||||
|
||||
@ -78,7 +80,18 @@ namespace IW4MAdmin.Application.EventParsers
|
||||
|
||||
public virtual GameEvent GenerateGameEvent(string logLine)
|
||||
{
|
||||
logLine = Regex.Replace(logLine, @"([0-9]+:[0-9]+ |^[0-9]+ )", "").Trim();
|
||||
var timeMatch = Regex.Match(logLine, @"^ *(([0-9]+):([0-9]+) |^[0-9]+ )");
|
||||
int gameTime = 0;
|
||||
|
||||
if (timeMatch.Success)
|
||||
{
|
||||
gameTime = (timeMatch.Groups.Values as IEnumerable<object>)
|
||||
.Skip(2)
|
||||
.Select(_value => int.Parse(_value.ToString()))
|
||||
.Sum();
|
||||
logLine = logLine.Substring(timeMatch.Value.Length);
|
||||
}
|
||||
|
||||
string[] lineSplit = logLine.Split(';');
|
||||
string eventType = lineSplit[0];
|
||||
|
||||
@ -107,7 +120,8 @@ namespace IW4MAdmin.Application.EventParsers
|
||||
Origin = new EFClient() { NetworkId = originId },
|
||||
Message = message,
|
||||
Extra = logLine,
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.Origin
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.Origin,
|
||||
GameTime = gameTime
|
||||
};
|
||||
}
|
||||
|
||||
@ -118,7 +132,8 @@ namespace IW4MAdmin.Application.EventParsers
|
||||
Origin = new EFClient() { NetworkId = originId },
|
||||
Message = message,
|
||||
Extra = logLine,
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.Origin
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.Origin,
|
||||
GameTime = gameTime
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -139,7 +154,8 @@ namespace IW4MAdmin.Application.EventParsers
|
||||
Data = logLine,
|
||||
Origin = new EFClient() { NetworkId = originId },
|
||||
Target = new EFClient() { NetworkId = targetId },
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.Origin | GameEvent.EventRequiredEntity.Target
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.Origin | GameEvent.EventRequiredEntity.Target,
|
||||
GameTime = gameTime
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -159,7 +175,8 @@ namespace IW4MAdmin.Application.EventParsers
|
||||
Data = logLine,
|
||||
Origin = new EFClient() { NetworkId = originId },
|
||||
Target = new EFClient() { NetworkId = targetId },
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.Origin | GameEvent.EventRequiredEntity.Target
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.Origin | GameEvent.EventRequiredEntity.Target,
|
||||
GameTime = gameTime
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -185,7 +202,8 @@ namespace IW4MAdmin.Application.EventParsers
|
||||
State = EFClient.ClientState.Connecting,
|
||||
},
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.None,
|
||||
IsBlocking = true
|
||||
IsBlocking = true,
|
||||
GameTime = gameTime
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -210,7 +228,8 @@ namespace IW4MAdmin.Application.EventParsers
|
||||
State = EFClient.ClientState.Disconnecting
|
||||
},
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.None,
|
||||
IsBlocking = true
|
||||
IsBlocking = true,
|
||||
GameTime = gameTime
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -223,7 +242,8 @@ namespace IW4MAdmin.Application.EventParsers
|
||||
Data = logLine,
|
||||
Origin = Utilities.IW4MAdminClient(),
|
||||
Target = Utilities.IW4MAdminClient(),
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.None
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.None,
|
||||
GameTime = gameTime
|
||||
};
|
||||
}
|
||||
|
||||
@ -238,7 +258,8 @@ namespace IW4MAdmin.Application.EventParsers
|
||||
Origin = Utilities.IW4MAdminClient(),
|
||||
Target = Utilities.IW4MAdminClient(),
|
||||
Extra = dump.DictionaryFromKeyValue(),
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.None
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.None,
|
||||
GameTime = gameTime
|
||||
};
|
||||
}
|
||||
|
||||
@ -250,7 +271,8 @@ namespace IW4MAdmin.Application.EventParsers
|
||||
Type = GameEvent.EventType.JoinTeam,
|
||||
Data = logLine,
|
||||
Origin = new EFClient() { NetworkId = lineSplit[1].ConvertGuidToLong(Configuration.GuidNumberStyle) },
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.Target
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.Target,
|
||||
GameTime = gameTime
|
||||
};
|
||||
}
|
||||
|
||||
@ -267,7 +289,8 @@ namespace IW4MAdmin.Application.EventParsers
|
||||
Data = logLine,
|
||||
Origin = new EFClient() { NetworkId = originId },
|
||||
Target = new EFClient() { NetworkId = targetId },
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.Origin | GameEvent.EventRequiredEntity.Target
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.Origin | GameEvent.EventRequiredEntity.Target,
|
||||
GameTime = gameTime
|
||||
};
|
||||
}
|
||||
|
||||
@ -283,7 +306,8 @@ namespace IW4MAdmin.Application.EventParsers
|
||||
Data = logLine,
|
||||
Origin = new EFClient() { NetworkId = originId },
|
||||
Target = new EFClient() { NetworkId = targetId },
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.Origin | GameEvent.EventRequiredEntity.Target
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.Origin | GameEvent.EventRequiredEntity.Target,
|
||||
GameTime = gameTime
|
||||
};
|
||||
}
|
||||
|
||||
@ -293,7 +317,8 @@ namespace IW4MAdmin.Application.EventParsers
|
||||
Data = logLine,
|
||||
Origin = Utilities.IW4MAdminClient(),
|
||||
Target = Utilities.IW4MAdminClient(),
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.None
|
||||
RequiredEntity = GameEvent.EventRequiredEntity.None,
|
||||
GameTime = gameTime
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -28,6 +28,7 @@ namespace IW4MAdmin
|
||||
private readonly ITranslationLookup _translationLookup;
|
||||
private const int REPORT_FLAG_COUNT = 4;
|
||||
private readonly IPluginImporter _pluginImporter;
|
||||
private int lastGameTime = 0;
|
||||
|
||||
public int Id { get; private set; }
|
||||
|
||||
@ -93,18 +94,18 @@ namespace IW4MAdmin
|
||||
if (client.ClientNumber >= 0)
|
||||
{
|
||||
#endif
|
||||
Logger.WriteInfo($"Client {client} [{client.State.ToString().ToLower()}] disconnecting...");
|
||||
Clients[client.ClientNumber] = null;
|
||||
await client.OnDisconnect();
|
||||
Logger.WriteInfo($"Client {client} [{client.State.ToString().ToLower()}] disconnecting...");
|
||||
Clients[client.ClientNumber] = null;
|
||||
await client.OnDisconnect();
|
||||
|
||||
var e = new GameEvent()
|
||||
{
|
||||
Origin = client,
|
||||
Owner = this,
|
||||
Type = GameEvent.EventType.Disconnect
|
||||
};
|
||||
var e = new GameEvent()
|
||||
{
|
||||
Origin = client,
|
||||
Owner = this,
|
||||
Type = GameEvent.EventType.Disconnect
|
||||
};
|
||||
|
||||
Manager.GetEventHandler().AddEvent(e);
|
||||
Manager.GetEventHandler().AddEvent(e);
|
||||
#if DEBUG == true
|
||||
}
|
||||
#endif
|
||||
@ -434,6 +435,14 @@ namespace IW4MAdmin
|
||||
|
||||
else if (E.Type == GameEvent.EventType.PreDisconnect)
|
||||
{
|
||||
bool isPotentialFalseQuit = E.GameTime.HasValue && E.GameTime.Value == lastGameTime;
|
||||
|
||||
if (isPotentialFalseQuit)
|
||||
{
|
||||
Logger.WriteInfo($"Receive predisconnect event for {E}, but it occured at game time {E.GameTime.Value}, which is the same last map change, so we're ignoring");
|
||||
return false;
|
||||
}
|
||||
|
||||
// predisconnect comes from minimal rcon polled players and minimal log players
|
||||
// so we need to disconnect the "full" version of the client
|
||||
var client = GetClientsAsList().FirstOrDefault(_client => _client.Equals(E.Origin));
|
||||
@ -531,11 +540,21 @@ namespace IW4MAdmin
|
||||
string mapname = dict["mapname"];
|
||||
UpdateMap(mapname);
|
||||
}
|
||||
|
||||
if (E.GameTime.HasValue)
|
||||
{
|
||||
lastGameTime = E.GameTime.Value;
|
||||
}
|
||||
}
|
||||
|
||||
if (E.Type == GameEvent.EventType.MapEnd)
|
||||
{
|
||||
Logger.WriteInfo("Game ending...");
|
||||
|
||||
if (E.GameTime.HasValue)
|
||||
{
|
||||
lastGameTime = E.GameTime.Value;
|
||||
}
|
||||
}
|
||||
|
||||
if (E.Type == GameEvent.EventType.Tell)
|
||||
@ -601,6 +620,12 @@ namespace IW4MAdmin
|
||||
Logger.WriteDebug(e.GetExceptionInfo());
|
||||
}
|
||||
}
|
||||
|
||||
else if (client.IPAddress != null && client.State == ClientState.Disconnecting)
|
||||
{
|
||||
Logger.WriteWarning($"{client} state is Disconnecting (probably kicked), but they are still connected. trying to kick again...");
|
||||
await client.CanConnect(client.IPAddress);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
Reference in New Issue
Block a user