mirror of
https://github.com/RaidMax/IW4M-Admin.git
synced 2025-06-09 23:00:57 -05:00
moved event API stuff around
finally fixed threading issue (which actually had to do with IW4x log outputs being out of sync (not an issue with my code). What a lot of headache over something that wasn't my fault.
This commit is contained in:
@ -119,7 +119,17 @@ namespace SharedLibraryCore.Commands
|
||||
{
|
||||
await E.Target.Kick(E.Data, E.Origin);
|
||||
await E.Origin.Tell($"^5{E.Target} ^7{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_KICK_SUCCESS"]}");
|
||||
E.Owner.Manager.GetEventHandler().AddEvent(new GameEvent(GameEvent.EventType.Kick, E.Data, E.Origin, E.Target, E.Owner));
|
||||
|
||||
var e = new GameEvent()
|
||||
{
|
||||
Type = GameEvent.EventType.Kick,
|
||||
Data = E.Data,
|
||||
Origin = E.Origin,
|
||||
Target = E.Target,
|
||||
Owner = E.Owner
|
||||
};
|
||||
|
||||
E.Owner.Manager.GetEventHandler().AddEvent(e);
|
||||
}
|
||||
else
|
||||
await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_KICK_FAIL"]} {E.Target.Name}");
|
||||
@ -179,14 +189,17 @@ namespace SharedLibraryCore.Commands
|
||||
{
|
||||
await E.Target.TempBan(Message, length, E.Origin);
|
||||
await E.Origin.Tell($"^5{E.Target} ^7{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_TEMPBAN_SUCCESS"]} ^5{length.TimeSpanText()}");
|
||||
E.Owner.Manager.GetEventHandler().AddEvent(new GameEvent()
|
||||
|
||||
var e = new GameEvent()
|
||||
{
|
||||
Type = GameEvent.EventType.TempBan,
|
||||
Data = E.Data,
|
||||
Origin = E.Origin,
|
||||
Target = E.Target,
|
||||
Owner = E.Owner
|
||||
});
|
||||
};
|
||||
|
||||
E.Owner.Manager.GetEventHandler().AddEvent(e);
|
||||
}
|
||||
else
|
||||
await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_TEMPBAN_FAIL"]} {E.Target.Name}");
|
||||
@ -732,7 +745,17 @@ namespace SharedLibraryCore.Commands
|
||||
};
|
||||
|
||||
await E.Owner.Manager.GetPenaltyService().Create(newPenalty);
|
||||
E.Owner.Manager.GetEventHandler().AddEvent(new GameEvent(GameEvent.EventType.Flag, E.Data, E.Origin, E.Target, E.Owner));
|
||||
|
||||
var e = new GameEvent()
|
||||
{
|
||||
Type = GameEvent.EventType.Flag,
|
||||
Data = E.Data,
|
||||
Origin = E.Origin,
|
||||
Target = E.Target,
|
||||
Owner = E.Owner
|
||||
};
|
||||
|
||||
E.Owner.Manager.GetEventHandler().AddEvent(e);
|
||||
await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_FLAG_SUCCESS"]} ^5{E.Target.Name}");
|
||||
}
|
||||
|
||||
@ -766,15 +789,16 @@ namespace SharedLibraryCore.Commands
|
||||
await E.Owner.Manager.GetClientService().Update(E.Target);
|
||||
await E.Origin.Tell($"{Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_FLAG_UNFLAG"]} ^5{E.Target.Name}");
|
||||
|
||||
E.Owner.Manager.GetEventHandler().AddEvent(new GameEvent()
|
||||
var e = new GameEvent()
|
||||
{
|
||||
Data = E.Data,
|
||||
Origin = E.Origin,
|
||||
Target = E.Target,
|
||||
Owner = E.Owner,
|
||||
Type = GameEvent.EventType.Unflag
|
||||
});
|
||||
};
|
||||
|
||||
E.Owner.Manager.GetEventHandler().AddEvent(e);
|
||||
}
|
||||
|
||||
else
|
||||
@ -846,7 +870,17 @@ namespace SharedLibraryCore.Commands
|
||||
await E.Owner.Manager.GetPenaltyService().Create(newReport);
|
||||
|
||||
await E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_REPORT_SUCCESS"]);
|
||||
E.Owner.Manager.GetEventHandler().AddEvent(new GameEvent(GameEvent.EventType.Report, E.Data, E.Origin, E.Target, E.Owner));
|
||||
|
||||
var e = new GameEvent()
|
||||
{
|
||||
Type = GameEvent.EventType.Report,
|
||||
Data = E.Data,
|
||||
Origin = E.Origin,
|
||||
Target = E.Target,
|
||||
Owner = E.Owner
|
||||
};
|
||||
|
||||
E.Owner.Manager.GetEventHandler().AddEvent(e);
|
||||
await E.Owner.ToAdmins(String.Format("^5{0}^7->^1{1}^7: {2}", E.Origin.Name, E.Target.Name, E.Data));
|
||||
}
|
||||
}
|
||||
|
80
SharedLibraryCore/Events/EventAPI.cs
Normal file
80
SharedLibraryCore/Events/EventAPI.cs
Normal file
@ -0,0 +1,80 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using SharedLibraryCore.Dtos;
|
||||
|
||||
namespace SharedLibraryCore.Events
|
||||
{
|
||||
public class EventApi
|
||||
{
|
||||
const int MaxEvents = 100;
|
||||
static Queue<EventInfo> RecentEvents = new Queue<EventInfo>();
|
||||
|
||||
public static IEnumerable<EventInfo> GetEvents(bool shouldConsume)
|
||||
{
|
||||
var eventList = RecentEvents.ToArray();
|
||||
|
||||
// clear queue if events should be consumed
|
||||
if (shouldConsume)
|
||||
{
|
||||
RecentEvents.Clear();
|
||||
}
|
||||
|
||||
return eventList;
|
||||
}
|
||||
|
||||
public static void OnGameEvent(object sender, GameEventArgs eventState)
|
||||
{
|
||||
var E = eventState.Event;
|
||||
// don't want to clog up the api with unknown events
|
||||
if (E.Type == GameEvent.EventType.Unknown)
|
||||
return;
|
||||
|
||||
var apiEvent = new EventInfo()
|
||||
{
|
||||
ExtraInfo = E.Extra?.ToString() ?? E.Data,
|
||||
GameInfo = new EntityInfo()
|
||||
{
|
||||
Name = E.Owner.GameName.ToString(),
|
||||
Id = (int)E.Owner.GameName
|
||||
},
|
||||
OwnerEntity = new EntityInfo()
|
||||
{
|
||||
Name = E.Owner.Hostname,
|
||||
Id = E.Owner.GetHashCode()
|
||||
},
|
||||
OriginEntity = E.Origin == null ? null : new EntityInfo()
|
||||
{
|
||||
Id = E.Origin.ClientId,
|
||||
Name = E.Origin.Name
|
||||
},
|
||||
TargetEntity = E.Target == null ? null : new EntityInfo()
|
||||
{
|
||||
Id = E.Target.ClientId,
|
||||
Name = E.Target.Name
|
||||
},
|
||||
EventType = new EntityInfo()
|
||||
{
|
||||
Id = (int)E.Type,
|
||||
Name = E.Type.ToString()
|
||||
},
|
||||
EventTime = E.Time
|
||||
};
|
||||
|
||||
// add the new event to the list
|
||||
AddNewEvent(apiEvent);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds event to the list and removes first added if reached max capacity
|
||||
/// </summary>
|
||||
/// <param name="info">EventInfo to add</param>
|
||||
private static void AddNewEvent(EventInfo info)
|
||||
{
|
||||
// remove the first added event
|
||||
if (RecentEvents.Count >= MaxEvents)
|
||||
RecentEvents.Dequeue();
|
||||
|
||||
RecentEvents.Enqueue(info);
|
||||
}
|
||||
}
|
||||
}
|
@ -44,29 +44,17 @@ namespace SharedLibraryCore
|
||||
StatusUpdate
|
||||
}
|
||||
|
||||
public GameEvent(EventType t, string d, Player O, Player T, Server S)
|
||||
{
|
||||
Type = t;
|
||||
Data = d?.Trim();
|
||||
Origin = O;
|
||||
Target = T;
|
||||
Owner = S;
|
||||
OnProcessed = new ManualResetEventSlim();
|
||||
Time = DateTime.UtcNow;
|
||||
CurrentEventId++;
|
||||
Id = CurrentEventId;
|
||||
}
|
||||
static long NextEventId;
|
||||
static long GetNextEventId() => Interlocked.Increment(ref NextEventId);
|
||||
|
||||
public GameEvent()
|
||||
{
|
||||
OnProcessed = new ManualResetEventSlim();
|
||||
OnProcessed = new SemaphoreSlim(0);
|
||||
OnProcessed.Release();
|
||||
Time = DateTime.UtcNow;
|
||||
CurrentEventId++;
|
||||
Id = CurrentEventId;
|
||||
Id = GetNextEventId();
|
||||
}
|
||||
|
||||
private static long CurrentEventId;
|
||||
|
||||
public EventType Type;
|
||||
public string Data; // Data is usually the message sent by player
|
||||
public string Message;
|
||||
@ -75,8 +63,8 @@ namespace SharedLibraryCore
|
||||
public Server Owner;
|
||||
public Boolean Remote = false;
|
||||
public object Extra { get; set; }
|
||||
public ManualResetEventSlim OnProcessed { get; set; }
|
||||
public DateTime Time { get; private set; }
|
||||
public SemaphoreSlim OnProcessed { get; set; }
|
||||
public DateTime Time { get; set; }
|
||||
public long Id { get; private set; }
|
||||
|
||||
/// <summary>
|
23
SharedLibraryCore/Events/GameEventArgs.cs
Normal file
23
SharedLibraryCore/Events/GameEventArgs.cs
Normal file
@ -0,0 +1,23 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace SharedLibraryCore.Events
|
||||
{
|
||||
/// <summary>
|
||||
/// represents the state of a game event for event processing
|
||||
/// </summary>
|
||||
public class GameEventArgs : System.ComponentModel.AsyncCompletedEventArgs
|
||||
{
|
||||
|
||||
public GameEventArgs(Exception error, bool cancelled, GameEvent userState) : base(error, cancelled, userState)
|
||||
{
|
||||
Event = userState;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Game event that occured on a server
|
||||
/// </summary>
|
||||
public GameEvent Event { get; }
|
||||
}
|
||||
}
|
@ -1,21 +0,0 @@
|
||||
using SharedLibraryCore.Dtos;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace SharedLibraryCore.Interfaces
|
||||
{
|
||||
public interface IEventApi
|
||||
{
|
||||
/// <summary>
|
||||
/// Processes event from server as event info
|
||||
/// </summary>
|
||||
/// <param name="sender">Object state from Delegate method call</param>
|
||||
/// <param name="E">Event to process</param>
|
||||
void OnServerEvent(object sender, GameEvent E);
|
||||
/// <summary>
|
||||
/// Get list of recent events
|
||||
/// </summary>
|
||||
/// <param name="shouldConsume">specify wether the request should clear all events after retrieving</param>
|
||||
/// <returns>List of recent event</returns>
|
||||
IEnumerable<EventInfo> GetEvents(bool shouldConsume);
|
||||
}
|
||||
}
|
@ -13,6 +13,6 @@ namespace SharedLibraryCore.Interfaces
|
||||
/// Add a game event event to the queue to be processed
|
||||
/// </summary>
|
||||
/// <param name="gameEvent">Game event</param>
|
||||
void AddEvent(GameEvent gameEvent);
|
||||
bool AddEvent(GameEvent gameEvent);
|
||||
}
|
||||
}
|
||||
|
@ -16,7 +16,7 @@ namespace SharedLibraryCore.Interfaces
|
||||
/// <param name="fileSizeDiff"></param>
|
||||
/// <param name="startPosition"></param>
|
||||
/// <returns></returns>
|
||||
ICollection<GameEvent> EventsFromLog(Server server, long fileSizeDiff, long startPosition);
|
||||
ICollection<GameEvent> ReadEventsFromLog(Server server, long fileSizeDiff, long startPosition);
|
||||
/// <summary>
|
||||
/// how long the log file is
|
||||
/// </summary>
|
||||
|
@ -23,7 +23,6 @@ namespace SharedLibraryCore.Interfaces
|
||||
AliasService GetAliasService();
|
||||
PenaltyService GetPenaltyService();
|
||||
IDictionary<int, Player> GetPrivilegedClients();
|
||||
IEventApi GetEventApi();
|
||||
/// <summary>
|
||||
/// Get the event handlers
|
||||
/// </summary>
|
||||
|
@ -150,7 +150,8 @@ namespace SharedLibraryCore.RCon
|
||||
// will this really prevent flooding?
|
||||
if ((DateTime.Now - LastQuery).TotalMilliseconds < 350)
|
||||
{
|
||||
await Task.Delay(350);
|
||||
//await Task.Delay(350);
|
||||
Thread.Sleep(350);
|
||||
}
|
||||
|
||||
LastQuery = DateTime.Now;
|
||||
|
@ -118,25 +118,17 @@ namespace SharedLibraryCore
|
||||
{
|
||||
#if !DEBUG
|
||||
string formattedMessage = String.Format(RconParser.GetCommandPrefixes().Say, Message);
|
||||
|
||||
var e = new GameEvent()
|
||||
{
|
||||
Message = formattedMessage,
|
||||
Data = formattedMessage,
|
||||
Owner = this,
|
||||
Type = GameEvent.EventType.Broadcast,
|
||||
};
|
||||
|
||||
Manager.GetEventHandler().AddEvent(e);
|
||||
#else
|
||||
Logger.WriteVerbose(Message.StripColors());
|
||||
#endif
|
||||
Manager.GetEventHandler().AddEvent(new GameEvent()
|
||||
var e = new GameEvent()
|
||||
{
|
||||
Type = GameEvent.EventType.Broadcast,
|
||||
Data = Message,
|
||||
Owner = this
|
||||
});
|
||||
};
|
||||
|
||||
Manager.GetEventHandler().AddEvent(e);
|
||||
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
|
Reference in New Issue
Block a user