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()
{
}
}
}