Update to some stat stuff to fix some latent issues
This commit is contained in:
parent
f6857ac635
commit
91078eec0f
@ -70,7 +70,6 @@ namespace IW4MAdmin.Application.IO
|
|||||||
foreach (var ev in events)
|
foreach (var ev in events)
|
||||||
{
|
{
|
||||||
_server.Manager.GetEventHandler().AddEvent(ev);
|
_server.Manager.GetEventHandler().AddEvent(ev);
|
||||||
await ev.WaitAsync(Utilities.DefaultCommandTimeout, _server.Manager.CancellationToken);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
previousFileSize = fileSize;
|
previousFileSize = fileSize;
|
||||||
|
@ -31,7 +31,7 @@ namespace IW4MAdmin.Application.IO
|
|||||||
|
|
||||||
public long Length => -1;
|
public long Length => -1;
|
||||||
|
|
||||||
public int UpdateInterval => 250;
|
public int UpdateInterval => 500;
|
||||||
|
|
||||||
public async Task<ICollection<GameEvent>> ReadEventsFromLog(Server server, long fileSizeDiff, long startPosition)
|
public async Task<ICollection<GameEvent>> ReadEventsFromLog(Server server, long fileSizeDiff, long startPosition)
|
||||||
{
|
{
|
||||||
|
@ -16,7 +16,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
{
|
{
|
||||||
public static async Task<List<string>> GetMostPlayed(Server s)
|
public static async Task<List<string>> GetMostPlayed(Server s)
|
||||||
{
|
{
|
||||||
long serverId = await StatManager.GetIdForServer(s);
|
long serverId = StatManager.GetIdForServer(s);
|
||||||
|
|
||||||
List<string> mostPlayed = new List<string>()
|
List<string> mostPlayed = new List<string>()
|
||||||
{
|
{
|
||||||
|
@ -17,7 +17,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
if (E.Origin.ClientNumber >= 0)
|
if (E.Origin.ClientNumber >= 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
long serverId = await Helpers.StatManager.GetIdForServer(E.Owner);
|
long serverId = Helpers.StatManager.GetIdForServer(E.Owner);
|
||||||
|
|
||||||
EFClientStatistics clientStats;
|
EFClientStatistics clientStats;
|
||||||
using (var ctx = new DatabaseContext(disableTracking: true))
|
using (var ctx = new DatabaseContext(disableTracking: true))
|
||||||
|
@ -17,7 +17,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
{
|
{
|
||||||
public static async Task<List<string>> GetTopStats(Server s)
|
public static async Task<List<string>> GetTopStats(Server s)
|
||||||
{
|
{
|
||||||
long serverId = await StatManager.GetIdForServer(s);
|
long serverId = StatManager.GetIdForServer(s);
|
||||||
List<string> topStatsText = new List<string>()
|
List<string> topStatsText = new List<string>()
|
||||||
{
|
{
|
||||||
$"^5--{Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_TOP_TEXT"]}--"
|
$"^5--{Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_TOP_TEXT"]}--"
|
||||||
|
@ -42,7 +42,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
long serverId = await StatManager.GetIdForServer(E.Owner);
|
long serverId = StatManager.GetIdForServer(E.Owner);
|
||||||
|
|
||||||
using (var ctx = new DatabaseContext(disableTracking: true))
|
using (var ctx = new DatabaseContext(disableTracking: true))
|
||||||
{
|
{
|
||||||
|
@ -36,7 +36,7 @@ namespace IW4MAdmin.Plugins.Stats.Web.Controllers
|
|||||||
|
|
||||||
if (server != null)
|
if (server != null)
|
||||||
{
|
{
|
||||||
serverId = await StatManager.GetIdForServer(server);
|
serverId = StatManager.GetIdForServer(server);
|
||||||
}
|
}
|
||||||
|
|
||||||
var results = await Plugin.Manager.GetTopStats(offset, count, serverId);
|
var results = await Plugin.Manager.GetTopStats(offset, count, serverId);
|
||||||
|
@ -21,17 +21,28 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
{
|
{
|
||||||
private readonly ConcurrentDictionary<long, ServerStats> _servers;
|
private readonly ConcurrentDictionary<long, ServerStats> _servers;
|
||||||
private readonly ILogger _log;
|
private readonly ILogger _log;
|
||||||
|
private static List<EFServer> serverModels;
|
||||||
private readonly SemaphoreSlim OnProcessingPenalty;
|
private readonly SemaphoreSlim OnProcessingPenalty;
|
||||||
private readonly SemaphoreSlim OnProcessingSensitive;
|
private readonly SemaphoreSlim OnProcessingSensitive;
|
||||||
|
private readonly List<EFClientKill> _hitCache;
|
||||||
|
|
||||||
public StatManager(IManager mgr)
|
public StatManager(IManager mgr)
|
||||||
{
|
{
|
||||||
_servers = new ConcurrentDictionary<long, ServerStats>();
|
_servers = new ConcurrentDictionary<long, ServerStats>();
|
||||||
|
_hitCache = new List<EFClientKill>();
|
||||||
_log = mgr.GetLogger(0);
|
_log = mgr.GetLogger(0);
|
||||||
OnProcessingPenalty = new SemaphoreSlim(1, 1);
|
OnProcessingPenalty = new SemaphoreSlim(1, 1);
|
||||||
OnProcessingSensitive = new SemaphoreSlim(1, 1);
|
OnProcessingSensitive = new SemaphoreSlim(1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetupServerIds()
|
||||||
|
{
|
||||||
|
using (var ctx = new DatabaseContext(disableTracking: true))
|
||||||
|
{
|
||||||
|
serverModels = ctx.Set<EFServer>().ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public EFClientStatistics GetClientStats(int clientId, long serverId)
|
public EFClientStatistics GetClientStats(int clientId, long serverId)
|
||||||
{
|
{
|
||||||
return _servers[serverId].PlayerStats[clientId];
|
return _servers[serverId].PlayerStats[clientId];
|
||||||
@ -188,7 +199,12 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
// insert the server if it does not exist
|
// insert the server if it does not exist
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
long serverId = GetIdForServer(sv).Result;
|
if (serverModels == null)
|
||||||
|
{
|
||||||
|
SetupServerIds();
|
||||||
|
}
|
||||||
|
|
||||||
|
long serverId = GetIdForServer(sv);
|
||||||
EFServer server;
|
EFServer server;
|
||||||
|
|
||||||
using (var ctx = new DatabaseContext(disableTracking: true))
|
using (var ctx = new DatabaseContext(disableTracking: true))
|
||||||
@ -263,7 +279,7 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
long serverId = await GetIdForServer(pl.CurrentServer);
|
long serverId = GetIdForServer(pl.CurrentServer);
|
||||||
|
|
||||||
if (!_servers.ContainsKey(serverId))
|
if (!_servers.ContainsKey(serverId))
|
||||||
{
|
{
|
||||||
@ -363,7 +379,7 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
clientStats.SessionScore = pl.Score;
|
clientStats.SessionScore = pl.Score;
|
||||||
clientStats.LastScore = pl.Score;
|
clientStats.LastScore = pl.Score;
|
||||||
|
|
||||||
if (!detectionStats.TryAdd(pl.ClientId, new Cheat.Detection(_log, clientStats)))
|
if (!detectionStats.TryAdd(pl.ClientId, new Detection(_log, clientStats)))
|
||||||
{
|
{
|
||||||
_log.WriteWarning("Could not add client to detection");
|
_log.WriteWarning("Could not add client to detection");
|
||||||
}
|
}
|
||||||
@ -397,7 +413,7 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
{
|
{
|
||||||
pl.CurrentServer.Logger.WriteInfo($"Removing {pl} from stats");
|
pl.CurrentServer.Logger.WriteInfo($"Removing {pl} from stats");
|
||||||
|
|
||||||
long serverId = await GetIdForServer(pl.CurrentServer);
|
long serverId = GetIdForServer(pl.CurrentServer);
|
||||||
var playerStats = _servers[serverId].PlayerStats;
|
var playerStats = _servers[serverId].PlayerStats;
|
||||||
var detectionStats = _servers[serverId].PlayerDetections;
|
var detectionStats = _servers[serverId].PlayerDetections;
|
||||||
var serverStats = _servers[serverId].ServerStatistics;
|
var serverStats = _servers[serverId].ServerStatistics;
|
||||||
@ -406,8 +422,8 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
{
|
{
|
||||||
pl.CurrentServer.Logger.WriteWarning($"Client disconnecting not in stats {pl}");
|
pl.CurrentServer.Logger.WriteWarning($"Client disconnecting not in stats {pl}");
|
||||||
// remove the client from the stats dictionary as they're leaving
|
// remove the client from the stats dictionary as they're leaving
|
||||||
playerStats.TryRemove(pl.ClientId, out EFClientStatistics removedValue1);
|
playerStats.TryRemove(pl.ClientId, out _);
|
||||||
detectionStats.TryRemove(pl.ClientId, out Detection removedValue2);
|
detectionStats.TryRemove(pl.ClientId, out _);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -415,8 +431,8 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
var clientStats = playerStats[pl.ClientId];
|
var clientStats = playerStats[pl.ClientId];
|
||||||
|
|
||||||
// remove the client from the stats dictionary as they're leaving
|
// remove the client from the stats dictionary as they're leaving
|
||||||
playerStats.TryRemove(pl.ClientId, out EFClientStatistics removedValue3);
|
playerStats.TryRemove(pl.ClientId, out _);
|
||||||
detectionStats.TryRemove(pl.ClientId, out Detection removedValue4);
|
detectionStats.TryRemove(pl.ClientId, out _);
|
||||||
|
|
||||||
// sync their stats before they leave
|
// sync their stats before they leave
|
||||||
clientStats = UpdateStats(clientStats);
|
clientStats = UpdateStats(clientStats);
|
||||||
@ -433,20 +449,6 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
|
|
||||||
public void AddDamageEvent(string eventLine, int attackerClientId, int victimClientId, long serverId)
|
public void AddDamageEvent(string eventLine, int attackerClientId, int victimClientId, long serverId)
|
||||||
{
|
{
|
||||||
// todo: maybe do something with this
|
|
||||||
//string regex = @"^(D);(.+);([0-9]+);(allies|axis);(.+);([0-9]+);(allies|axis);(.+);(.+);([0-9]+);(.+);(.+)$";
|
|
||||||
//var match = Regex.Match(eventLine, regex, RegexOptions.IgnoreCase);
|
|
||||||
|
|
||||||
//if (match.Success)
|
|
||||||
//{
|
|
||||||
// // this gives us what team the player is on
|
|
||||||
// var attackerStats = Servers[serverId].PlayerStats[attackerClientId];
|
|
||||||
// var victimStats = Servers[serverId].PlayerStats[victimClientId];
|
|
||||||
// IW4Info.Team victimTeam = (IW4Info.Team)Enum.Parse(typeof(IW4Info.Team), match.Groups[4].ToString(), true);
|
|
||||||
// IW4Info.Team attackerTeam = (IW4Info.Team)Enum.Parse(typeof(IW4Info.Team), match.Groups[7].ToString(), true);
|
|
||||||
// attackerStats.Team = attackerTeam;
|
|
||||||
// victimStats.Team = victimTeam;
|
|
||||||
//}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -516,10 +518,9 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
AnglesList = snapshotAngles
|
AnglesList = snapshotAngles
|
||||||
};
|
};
|
||||||
|
|
||||||
if ((hit.DeathType == IW4Info.MeansOfDeath.MOD_SUICIDE &&
|
if (hit.HitLoc == IW4Info.HitLocation.shield)
|
||||||
hit.Damage == 100000) || hit.HitLoc == IW4Info.HitLocation.shield)
|
|
||||||
{
|
{
|
||||||
// suicide by switching teams so let's not count it against them
|
// we don't care about shield hits
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -550,74 +551,80 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
clientStats.HitLocations.Single(hl => hl.Location == hit.HitLoc).HitCount += 1;
|
clientStats.HitLocations.Single(hl => hl.Location == hit.HitLoc).HitCount += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
using (var ctx = new DatabaseContext(disableTracking: true))
|
|
||||||
{
|
|
||||||
ctx.Set<EFClientStatistics>().Update(clientStats);
|
|
||||||
await ctx.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
using (var ctx = new DatabaseContext())
|
try
|
||||||
{
|
{
|
||||||
try
|
if (Plugin.Config.Configuration().StoreClientKills)
|
||||||
{
|
{
|
||||||
if (Plugin.Config.Configuration().StoreClientKills)
|
_hitCache.Add(hit);
|
||||||
{
|
|
||||||
ctx.Set<EFClientKill>().Add(hit);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Plugin.Config.Configuration().EnableAntiCheat && !attacker.IsBot && attacker.ClientId != victim.ClientId)
|
if (_hitCache.Count > Detection.MAX_TRACKED_HIT_COUNT)
|
||||||
{
|
{
|
||||||
DetectionPenaltyResult result = new DetectionPenaltyResult() { ClientPenalty = EFPenalty.PenaltyType.Any };
|
|
||||||
|
using (var ctx = new DatabaseContext())
|
||||||
|
{
|
||||||
|
ctx.AddRange(_hitCache);
|
||||||
|
await ctx.SaveChangesAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
_hitCache.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (Plugin.Config.Configuration().EnableAntiCheat && !attacker.IsBot && attacker.ClientId != victim.ClientId)
|
||||||
|
{
|
||||||
|
DetectionPenaltyResult result = new DetectionPenaltyResult() { ClientPenalty = EFPenalty.PenaltyType.Any };
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
if (clientDetection.TrackedHits.Count > 0)
|
if (clientDetection.TrackedHits.Count > 0)
|
||||||
#else
|
#else
|
||||||
if (clientDetection.TrackedHits.Count > Detection.MAX_TRACKED_HIT_COUNT)
|
if (clientDetection.TrackedHits.Count > Detection.MAX_TRACKED_HIT_COUNT)
|
||||||
#endif
|
#endif
|
||||||
|
{
|
||||||
|
while (clientDetection.TrackedHits.Count > 0)
|
||||||
{
|
{
|
||||||
while (clientDetection.TrackedHits.Count > 0)
|
await OnProcessingPenalty.WaitAsync();
|
||||||
|
|
||||||
|
var oldestHit = clientDetection.TrackedHits.OrderBy(_hits => _hits.TimeOffset).First();
|
||||||
|
clientDetection.TrackedHits.Remove(oldestHit);
|
||||||
|
|
||||||
|
result = clientDetection.ProcessHit(oldestHit, isDamage);
|
||||||
|
await ApplyPenalty(result, attacker);
|
||||||
|
|
||||||
|
if (clientDetection.Tracker.HasChanges && result.ClientPenalty != EFPenalty.PenaltyType.Any)
|
||||||
{
|
{
|
||||||
await OnProcessingPenalty.WaitAsync();
|
using (var ctx = new DatabaseContext())
|
||||||
|
|
||||||
var oldestHit = clientDetection.TrackedHits.OrderBy(_hits => _hits.TimeOffset).First();
|
|
||||||
clientDetection.TrackedHits.Remove(oldestHit);
|
|
||||||
|
|
||||||
result = clientDetection.ProcessHit(oldestHit, isDamage);
|
|
||||||
await ApplyPenalty(result, attacker, ctx);
|
|
||||||
|
|
||||||
if (clientDetection.Tracker.HasChanges && result.ClientPenalty != EFPenalty.PenaltyType.Any)
|
|
||||||
{
|
{
|
||||||
SaveTrackedSnapshots(clientDetection, ctx);
|
SaveTrackedSnapshots(clientDetection, ctx);
|
||||||
|
await ctx.SaveChangesAsync();
|
||||||
if (result.ClientPenalty == EFPenalty.PenaltyType.Ban)
|
|
||||||
{
|
|
||||||
OnProcessingPenalty.Release(1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
OnProcessingPenalty.Release(1);
|
if (result.ClientPenalty == EFPenalty.PenaltyType.Ban)
|
||||||
|
{
|
||||||
|
OnProcessingPenalty.Release(1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
else
|
OnProcessingPenalty.Release(1);
|
||||||
{
|
|
||||||
clientDetection.TrackedHits.Add(hit);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.Set<EFHitLocationCount>().UpdateRange(clientStats.HitLocations);
|
else
|
||||||
await ctx.SaveChangesAsync();
|
{
|
||||||
|
clientDetection.TrackedHits.Add(hit);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_log.WriteError("Could not save hit or AC info");
|
_log.WriteError("Could not save hit or AC info");
|
||||||
_log.WriteDebug(ex.GetExceptionInfo());
|
_log.WriteDebug(ex.GetExceptionInfo());
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async Task ApplyPenalty(DetectionPenaltyResult penalty, EFClient attacker, DatabaseContext ctx)
|
async Task ApplyPenalty(DetectionPenaltyResult penalty, EFClient attacker)
|
||||||
{
|
{
|
||||||
var penaltyClient = Utilities.IW4MAdminClient(attacker.CurrentServer);
|
var penaltyClient = Utilities.IW4MAdminClient(attacker.CurrentServer);
|
||||||
switch (penalty.ClientPenalty)
|
switch (penalty.ClientPenalty)
|
||||||
@ -713,7 +720,7 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
|
|
||||||
public async Task AddStandardKill(EFClient attacker, EFClient victim)
|
public async Task AddStandardKill(EFClient attacker, EFClient victim)
|
||||||
{
|
{
|
||||||
long serverId = await GetIdForServer(attacker.CurrentServer);
|
long serverId = GetIdForServer(attacker.CurrentServer);
|
||||||
|
|
||||||
EFClientStatistics attackerStats = null;
|
EFClientStatistics attackerStats = null;
|
||||||
if (!_servers[serverId].PlayerStats.ContainsKey(attacker.ClientId))
|
if (!_servers[serverId].PlayerStats.ContainsKey(attacker.ClientId))
|
||||||
@ -743,7 +750,6 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
|
|
||||||
// update the total stats
|
// update the total stats
|
||||||
_servers[serverId].ServerStatistics.TotalKills += 1;
|
_servers[serverId].ServerStatistics.TotalKills += 1;
|
||||||
await Sync(attacker.CurrentServer);
|
|
||||||
|
|
||||||
// this happens when the round has changed
|
// this happens when the round has changed
|
||||||
if (attackerStats.SessionScore == 0)
|
if (attackerStats.SessionScore == 0)
|
||||||
@ -801,16 +807,6 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
attackerStats.LastStatHistoryUpdate = DateTime.UtcNow;
|
attackerStats.LastStatHistoryUpdate = DateTime.UtcNow;
|
||||||
await UpdateStatHistory(attacker, attackerStats);
|
await UpdateStatHistory(attacker, attackerStats);
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo: do we want to save this immediately?
|
|
||||||
using (var ctx = new DatabaseContext(disableTracking: true))
|
|
||||||
{
|
|
||||||
var clientStatsSet = ctx.Set<EFClientStatistics>();
|
|
||||||
|
|
||||||
clientStatsSet.Attach(attackerStats).State = EntityState.Modified;
|
|
||||||
clientStatsSet.Attach(victimStats).State = EntityState.Modified;
|
|
||||||
await ctx.SaveChangesAsync();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -824,12 +820,12 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
int currentSessionTime = (int)(DateTime.UtcNow - client.LastConnection).TotalSeconds;
|
int currentSessionTime = (int)(DateTime.UtcNow - client.LastConnection).TotalSeconds;
|
||||||
|
|
||||||
// don't update their stat history if they haven't played long
|
// don't update their stat history if they haven't played long
|
||||||
#if DEBUG == false
|
//#if DEBUG == false
|
||||||
if (currentSessionTime < 60)
|
if (currentSessionTime < 60)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
//#endif
|
||||||
|
|
||||||
int currentServerTotalPlaytime = clientStats.TimePlayed + currentSessionTime;
|
int currentServerTotalPlaytime = clientStats.TimePlayed + currentSessionTime;
|
||||||
|
|
||||||
@ -858,12 +854,12 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
|
|
||||||
#region INDIVIDUAL_SERVER_PERFORMANCE
|
#region INDIVIDUAL_SERVER_PERFORMANCE
|
||||||
// get the client ranking for the current server
|
// get the client ranking for the current server
|
||||||
int individualClientRanking = await ctx.Set<EFRating>()
|
int individualClientRanking = await ctx.Set<EFRating>()
|
||||||
.Where(GetRankingFunc(clientStats.ServerId))
|
.Where(GetRankingFunc(clientStats.ServerId))
|
||||||
// ignore themselves in the query
|
// ignore themselves in the query
|
||||||
.Where(c => c.RatingHistory.ClientId != client.ClientId)
|
.Where(c => c.RatingHistory.ClientId != client.ClientId)
|
||||||
.Where(c => c.Performance > clientStats.Performance)
|
.Where(c => c.Performance > clientStats.Performance)
|
||||||
.CountAsync() + 1;
|
.CountAsync() + 1;
|
||||||
|
|
||||||
// limit max history per server to 40
|
// limit max history per server to 40
|
||||||
if (clientHistory.Ratings.Count(r => r.ServerId == clientStats.ServerId) >= 40)
|
if (clientHistory.Ratings.Count(r => r.ServerId == clientStats.ServerId) >= 40)
|
||||||
@ -1218,7 +1214,7 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
|
|
||||||
public async Task Sync(Server sv)
|
public async Task Sync(Server sv)
|
||||||
{
|
{
|
||||||
long serverId = await GetIdForServer(sv);
|
long serverId = GetIdForServer(sv);
|
||||||
|
|
||||||
using (var ctx = new DatabaseContext(disableTracking: true))
|
using (var ctx = new DatabaseContext(disableTracking: true))
|
||||||
{
|
{
|
||||||
@ -1237,7 +1233,7 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
_servers[serverId].IsTeamBased = isTeamBased;
|
_servers[serverId].IsTeamBased = isTeamBased;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task<long> GetIdForServer(Server server)
|
public static long GetIdForServer(Server server)
|
||||||
{
|
{
|
||||||
if ($"{server.IP}:{server.Port.ToString()}" == "66.150.121.184:28965")
|
if ($"{server.IP}:{server.Port.ToString()}" == "66.150.121.184:28965")
|
||||||
{
|
{
|
||||||
@ -1248,13 +1244,9 @@ namespace IW4MAdmin.Plugins.Stats.Helpers
|
|||||||
id = id < 0 ? Math.Abs(id) : id;
|
id = id < 0 ? Math.Abs(id) : id;
|
||||||
long? serverId;
|
long? serverId;
|
||||||
|
|
||||||
// todo: cache this eventually, as it shouldn't change
|
serverId = serverModels.FirstOrDefault(_server => _server.ServerId == server.EndPoint ||
|
||||||
using (var ctx = new DatabaseContext(disableTracking: true))
|
_server.EndPoint == server.ToString() ||
|
||||||
{
|
_server.ServerId == id)?.ServerId;
|
||||||
serverId = (await ctx.Set<EFServer>().FirstOrDefaultAsync(_server => _server.ServerId == server.EndPoint ||
|
|
||||||
_server.EndPoint == server.ToString() ||
|
|
||||||
_server.ServerId == id))?.ServerId;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!serverId.HasValue)
|
if (!serverId.HasValue)
|
||||||
{
|
{
|
||||||
|
@ -50,12 +50,12 @@ namespace IW4MAdmin.Plugins.Stats
|
|||||||
if (!string.IsNullOrEmpty(E.Data) &&
|
if (!string.IsNullOrEmpty(E.Data) &&
|
||||||
E.Origin.ClientId > 1)
|
E.Origin.ClientId > 1)
|
||||||
{
|
{
|
||||||
await Manager.AddMessageAsync(E.Origin.ClientId, await StatManager.GetIdForServer(E.Owner), E.Data);
|
await Manager.AddMessageAsync(E.Origin.ClientId, StatManager.GetIdForServer(E.Owner), E.Data);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GameEvent.EventType.MapChange:
|
case GameEvent.EventType.MapChange:
|
||||||
Manager.SetTeamBased(await StatManager.GetIdForServer(E.Owner), E.Owner.Gametype != "dm");
|
Manager.SetTeamBased(StatManager.GetIdForServer(E.Owner), E.Owner.Gametype != "dm");
|
||||||
Manager.ResetKillstreaks(await StatManager.GetIdForServer(E.Owner));
|
Manager.ResetKillstreaks(StatManager.GetIdForServer(E.Owner));
|
||||||
break;
|
break;
|
||||||
case GameEvent.EventType.MapEnd:
|
case GameEvent.EventType.MapEnd:
|
||||||
break;
|
break;
|
||||||
@ -77,7 +77,7 @@ namespace IW4MAdmin.Plugins.Stats
|
|||||||
break;
|
break;
|
||||||
case GameEvent.EventType.ScriptKill:
|
case GameEvent.EventType.ScriptKill:
|
||||||
string[] killInfo = (E.Data != null) ? E.Data.Split(';') : new string[0];
|
string[] killInfo = (E.Data != null) ? E.Data.Split(';') : new string[0];
|
||||||
if (killInfo.Length >= 14 && !ShouldIgnoreEvent(E.Origin, E.Target))
|
if (E.Owner.CustomCallback && killInfo.Length >= 14 && !ShouldIgnoreEvent(E.Origin, E.Target))
|
||||||
{
|
{
|
||||||
// this treats "world" damage as self damage
|
// this treats "world" damage as self damage
|
||||||
if (IsWorldDamage(E.Origin))
|
if (IsWorldDamage(E.Origin))
|
||||||
@ -85,7 +85,7 @@ namespace IW4MAdmin.Plugins.Stats
|
|||||||
E.Origin = E.Target;
|
E.Origin = E.Target;
|
||||||
}
|
}
|
||||||
|
|
||||||
await Manager.AddScriptHit(false, E.Time, E.Origin, E.Target, await StatManager.GetIdForServer(E.Owner), S.CurrentMap.Name, killInfo[7], killInfo[8],
|
await Manager.AddScriptHit(false, E.Time, E.Origin, E.Target, StatManager.GetIdForServer(E.Owner), S.CurrentMap.Name, killInfo[7], killInfo[8],
|
||||||
killInfo[5], killInfo[6], killInfo[3], killInfo[4], killInfo[9], killInfo[10], killInfo[11], killInfo[12], killInfo[13], killInfo[14], killInfo[15]);
|
killInfo[5], killInfo[6], killInfo[3], killInfo[4], killInfo[9], killInfo[10], killInfo[11], killInfo[12], killInfo[13], killInfo[14], killInfo[15]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -100,10 +100,6 @@ namespace IW4MAdmin.Plugins.Stats
|
|||||||
|
|
||||||
await Manager.AddStandardKill(E.Origin, E.Target);
|
await Manager.AddStandardKill(E.Origin, E.Target);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new Exception();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case GameEvent.EventType.Damage:
|
case GameEvent.EventType.Damage:
|
||||||
if (!E.Owner.CustomCallback && !ShouldIgnoreEvent(E.Origin, E.Target))
|
if (!E.Owner.CustomCallback && !ShouldIgnoreEvent(E.Origin, E.Target))
|
||||||
@ -114,12 +110,12 @@ namespace IW4MAdmin.Plugins.Stats
|
|||||||
E.Origin = E.Target;
|
E.Origin = E.Target;
|
||||||
}
|
}
|
||||||
|
|
||||||
Manager.AddDamageEvent(E.Data, E.Origin.ClientId, E.Target.ClientId, await StatManager.GetIdForServer(E.Owner));
|
Manager.AddDamageEvent(E.Data, E.Origin.ClientId, E.Target.ClientId, StatManager.GetIdForServer(E.Owner));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GameEvent.EventType.ScriptDamage:
|
case GameEvent.EventType.ScriptDamage:
|
||||||
killInfo = (E.Data != null) ? E.Data.Split(';') : new string[0];
|
killInfo = (E.Data != null) ? E.Data.Split(';') : new string[0];
|
||||||
if (killInfo.Length >= 14 && !ShouldIgnoreEvent(E.Origin, E.Target))
|
if (E.Owner.CustomCallback && killInfo.Length >= 14 && !ShouldIgnoreEvent(E.Origin, E.Target))
|
||||||
{
|
{
|
||||||
// this treats "world" damage as self damage
|
// this treats "world" damage as self damage
|
||||||
if (IsWorldDamage(E.Origin))
|
if (IsWorldDamage(E.Origin))
|
||||||
@ -127,7 +123,7 @@ namespace IW4MAdmin.Plugins.Stats
|
|||||||
E.Origin = E.Target;
|
E.Origin = E.Target;
|
||||||
}
|
}
|
||||||
|
|
||||||
await Manager.AddScriptHit(true, E.Time, E.Origin, E.Target, await StatManager.GetIdForServer(E.Owner), S.CurrentMap.Name, killInfo[7], killInfo[8],
|
await Manager.AddScriptHit(true, E.Time, E.Origin, E.Target, StatManager.GetIdForServer(E.Owner), S.CurrentMap.Name, killInfo[7], killInfo[8],
|
||||||
killInfo[5], killInfo[6], killInfo[3], killInfo[4], killInfo[9], killInfo[10], killInfo[11], killInfo[12], killInfo[13], killInfo[14], killInfo[15]);
|
killInfo[5], killInfo[6], killInfo[3], killInfo[4], killInfo[9], killInfo[10], killInfo[11], killInfo[12], killInfo[13], killInfo[14], killInfo[15]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -19,7 +19,7 @@ namespace Stats.ViewComponents
|
|||||||
|
|
||||||
if (server != null)
|
if (server != null)
|
||||||
{
|
{
|
||||||
serverId = await StatManager.GetIdForServer(server);
|
serverId = StatManager.GetIdForServer(server);
|
||||||
}
|
}
|
||||||
|
|
||||||
return View("_List", await Plugin.Manager.GetTopStats(offset, count, serverId));
|
return View("_List", await Plugin.Manager.GetTopStats(offset, count, serverId));
|
||||||
|
@ -22,6 +22,7 @@ namespace SharedLibraryCore.Database
|
|||||||
public DbSet<EFMeta> EFMeta { get; set; }
|
public DbSet<EFMeta> EFMeta { get; set; }
|
||||||
public DbSet<EFChangeHistory> EFChangeHistory { get; set; }
|
public DbSet<EFChangeHistory> EFChangeHistory { get; set; }
|
||||||
|
|
||||||
|
|
||||||
[Obsolete]
|
[Obsolete]
|
||||||
private static readonly ILoggerFactory _loggerFactory = new LoggerFactory(new[] {
|
private static readonly ILoggerFactory _loggerFactory = new LoggerFactory(new[] {
|
||||||
new ConsoleLoggerProvider((category, level) => level == LogLevel.Information, true)
|
new ConsoleLoggerProvider((category, level) => level == LogLevel.Information, true)
|
||||||
@ -113,9 +114,9 @@ namespace SharedLibraryCore.Database
|
|||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
#pragma warning disable CS0612 // Type or member is obsolete
|
#pragma warning disable CS0612 // Type or member is obsolete
|
||||||
optionsBuilder.UseLoggerFactory(_loggerFactory)
|
// optionsBuilder.UseLoggerFactory(_loggerFactory)
|
||||||
#pragma warning restore CS0612 // Type or member is obsolete
|
#pragma warning restore CS0612 // Type or member is obsolete
|
||||||
.EnableSensitiveDataLogging();
|
// .EnableSensitiveDataLogging();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user