mirror of
https://github.com/RaidMax/IW4M-Admin.git
synced 2025-06-27 23:50:40 -05:00
fix alias command sending message to origin instead of target
(hopefully) fix an issue with banned players causing exception if they create events before they are kicked out fix issues with sometimes wrong error message for timeout show most recent IP address at top of alias list optimization to some sql queries
This commit is contained in:
63
Application/Misc/EventProfiler.cs
Normal file
63
Application/Misc/EventProfiler.cs
Normal file
@ -0,0 +1,63 @@
|
||||
using SharedLibraryCore;
|
||||
using SharedLibraryCore.Interfaces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace IW4MAdmin.Application.Misc
|
||||
{
|
||||
internal class EventPerformance
|
||||
{
|
||||
public long ExecutionTime { get; set; }
|
||||
public GameEvent Event { get; set; }
|
||||
public string EventInfo => $"{Event.Type}, {Event.FailReason}, {Event.IsBlocking}, {Event.Data}, {Event.Message}, {Event.Extra}";
|
||||
}
|
||||
|
||||
public class DuplicateKeyComparer<TKey> : IComparer<TKey> where TKey : IComparable
|
||||
{
|
||||
public int Compare(TKey x, TKey y)
|
||||
{
|
||||
int result = x.CompareTo(y);
|
||||
|
||||
if (result == 0)
|
||||
return 1;
|
||||
else
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
internal class EventProfiler
|
||||
{
|
||||
public double AverageEventTime { get; private set; }
|
||||
public double MaxEventTime => Events.Values.Last().ExecutionTime;
|
||||
public double MinEventTime => Events.Values[0].ExecutionTime;
|
||||
public int TotalEventCount => Events.Count;
|
||||
public SortedList<long, EventPerformance> Events { get; private set; } = new SortedList<long, EventPerformance>(new DuplicateKeyComparer<long>());
|
||||
private readonly ILogger _logger;
|
||||
|
||||
public EventProfiler(ILogger logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public void Profile(DateTime start, DateTime end, GameEvent gameEvent)
|
||||
{
|
||||
_logger.WriteDebug($"Starting profile of event {gameEvent.Id}");
|
||||
long executionTime = (long)Math.Round((end - start).TotalMilliseconds);
|
||||
|
||||
var perf = new EventPerformance()
|
||||
{
|
||||
Event = gameEvent,
|
||||
ExecutionTime = executionTime
|
||||
};
|
||||
|
||||
lock (Events)
|
||||
{
|
||||
Events.Add(executionTime, perf);
|
||||
}
|
||||
|
||||
AverageEventTime = (AverageEventTime * (TotalEventCount - 1) + executionTime) / TotalEventCount;
|
||||
_logger.WriteDebug($"Finished profile of event {gameEvent.Id}");
|
||||
}
|
||||
}
|
||||
}
|
@ -3,7 +3,6 @@ using SharedLibraryCore.Interfaces;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IW4MAdmin.Application
|
||||
{
|
||||
@ -20,16 +19,21 @@ namespace IW4MAdmin.Application
|
||||
}
|
||||
|
||||
readonly string FileName;
|
||||
readonly SemaphoreSlim OnLogWriting;
|
||||
readonly ReaderWriterLockSlim WritingLock;
|
||||
static readonly short MAX_LOG_FILES = 10;
|
||||
|
||||
public Logger(string fn)
|
||||
{
|
||||
FileName = Path.Join(Utilities.OperatingDirectory, "Log", $"{fn}.log");
|
||||
OnLogWriting = new SemaphoreSlim(1, 1);
|
||||
WritingLock = new ReaderWriterLockSlim();
|
||||
RotateLogs();
|
||||
}
|
||||
|
||||
~Logger()
|
||||
{
|
||||
WritingLock.Dispose();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// rotates logs when log is initialized
|
||||
/// </summary>
|
||||
@ -56,7 +60,7 @@ namespace IW4MAdmin.Application
|
||||
|
||||
void Write(string msg, LogType type)
|
||||
{
|
||||
OnLogWriting.Wait();
|
||||
WritingLock.EnterWriteLock();
|
||||
|
||||
string stringType = type.ToString();
|
||||
msg = msg.StripColors();
|
||||
@ -74,7 +78,7 @@ namespace IW4MAdmin.Application
|
||||
#if DEBUG
|
||||
// lets keep it simple and dispose of everything quickly as logging wont be that much (relatively)
|
||||
Console.WriteLine(LogLine);
|
||||
File.AppendAllText(FileName, $"{LogLine}{Environment.NewLine}");
|
||||
//File.AppendAllText(FileName, $"{LogLine}{Environment.NewLine}");
|
||||
//Debug.WriteLine(msg);
|
||||
#else
|
||||
if (type == LogType.Error || type == LogType.Verbose)
|
||||
@ -91,7 +95,7 @@ namespace IW4MAdmin.Application
|
||||
Console.WriteLine(ex.GetExceptionInfo());
|
||||
}
|
||||
|
||||
OnLogWriting.Release(1);
|
||||
WritingLock.ExitWriteLock();
|
||||
}
|
||||
|
||||
public void WriteVerbose(string msg)
|
||||
|
Reference in New Issue
Block a user