using System; using System.Collections.Generic; using System.Linq; using Artemis.Core.DataModelExpansions; namespace Artemis.Core { /// /// Represents a data model event with event arguments of type /// public class DataModelEvent : IDataModelEvent where T : DataModelEventArgs { private bool _trackHistory; /// /// Creates a new instance of the class with history tracking disabled /// public DataModelEvent() { } /// /// Creates a new instance of the /// /// A boolean indicating whether the last 20 events should be tracked public DataModelEvent(bool trackHistory) { _trackHistory = trackHistory; } /// [DataModelProperty(Name = "Last trigger", Description = "The time at which the event last triggered")] public DateTime LastTrigger { get; private set; } /// [DataModelProperty(Name = "Time since trigger", Description = "The time that has passed since the last trigger")] public TimeSpan TimeSinceLastTrigger => DateTime.Now - LastTrigger; /// /// Gets the event arguments of the last time the event was triggered /// [DataModelProperty(Description = "The arguments of the last time this event triggered")] public T? LastEventArguments { get; private set; } /// [DataModelProperty(Description = "The total amount of times this event has triggered since the module was activated")] public int TriggerCount { get; private set; } /// /// Gets a queue of the last 20 event arguments /// Always empty if is /// [DataModelProperty(Description = "The arguments of the last time this event triggered")] public Queue EventArgumentsHistory { get; } = new(20); /// /// Trigger the event with the given /// /// The event argument to pass to the event public void Trigger(T eventArgs) { if (eventArgs == null) throw new ArgumentNullException(nameof(eventArgs)); eventArgs.TriggerTime = DateTime.Now; LastEventArguments = eventArgs; LastTrigger = DateTime.Now; TriggerCount++; if (TrackHistory) { lock (EventArgumentsHistory) { if (EventArgumentsHistory.Count == 20) EventArgumentsHistory.Dequeue(); EventArgumentsHistory.Enqueue(eventArgs); } } OnEventTriggered(); } internal virtual void OnEventTriggered() { EventTriggered?.Invoke(this, EventArgs.Empty); } /// [DataModelIgnore] public Type ArgumentsType => typeof(T); /// [DataModelIgnore] public string TriggerPastParticiple => "triggered"; /// [DataModelIgnore] public bool TrackHistory { get => _trackHistory; set { EventArgumentsHistory.Clear(); _trackHistory = value; } } /// [DataModelIgnore] public DataModelEventArgs? LastEventArgumentsUntyped => LastEventArguments; /// [DataModelIgnore] public List EventArgumentsHistoryUntyped => EventArgumentsHistory.Cast().ToList(); /// public event EventHandler? EventTriggered; /// public void Reset() { TriggerCount = 0; EventArgumentsHistory.Clear(); } /// public void Update() { } } /// /// Represents a data model event without event arguments /// public class DataModelEvent : IDataModelEvent { private bool _trackHistory; /// /// Creates a new instance of the class with history tracking disabled /// public DataModelEvent() { } /// /// Creates a new instance of the /// /// A boolean indicating whether the last 20 events should be tracked public DataModelEvent(bool trackHistory) { _trackHistory = trackHistory; } /// [DataModelProperty(Name = "Last trigger", Description = "The time at which the event last triggered")] public DateTime LastTrigger { get; private set; } /// [DataModelProperty(Name = "Time since trigger", Description = "The time that has passed since the last trigger")] public TimeSpan TimeSinceLastTrigger => DateTime.Now - LastTrigger; /// /// Gets the event arguments of the last time the event was triggered /// [DataModelProperty(Description = "The arguments of the last time this event triggered")] public DataModelEventArgs? LastTriggerArguments { get; private set; } /// [DataModelProperty(Description = "The total amount of times this event has triggered since the module was activated")] public int TriggerCount { get; private set; } /// /// Gets a queue of the last 20 event arguments /// Always empty if is /// [DataModelProperty(Description = "The arguments of the last time this event triggered")] public Queue EventArgumentsHistory { get; } = new(20); /// /// Trigger the event /// public void Trigger() { DataModelEventArgs eventArgs = new() {TriggerTime = DateTime.Now}; LastTriggerArguments = eventArgs; LastTrigger = DateTime.Now; TriggerCount++; if (TrackHistory) { lock (EventArgumentsHistory) { if (EventArgumentsHistory.Count == 20) EventArgumentsHistory.Dequeue(); EventArgumentsHistory.Enqueue(eventArgs); } } OnEventTriggered(); } internal virtual void OnEventTriggered() { EventTriggered?.Invoke(this, EventArgs.Empty); } /// [DataModelIgnore] public Type ArgumentsType => typeof(DataModelEventArgs); /// [DataModelIgnore] public string TriggerPastParticiple => "triggered"; /// [DataModelIgnore] public bool TrackHistory { get => _trackHistory; set { EventArgumentsHistory.Clear(); _trackHistory = value; } } /// [DataModelIgnore] public DataModelEventArgs? LastEventArgumentsUntyped => LastTriggerArguments; /// [DataModelIgnore] public List EventArgumentsHistoryUntyped => EventArgumentsHistory.ToList(); /// public event EventHandler? EventTriggered; /// public void Reset() { TriggerCount = 0; EventArgumentsHistory.Clear(); } /// public void Update() { } } }