using System; using System.Collections.Generic; using SharedLibraryCore; using SharedLibraryCore.Dtos; using SharedLibraryCore.Interfaces; using SharedLibraryCore.Objects; namespace IW4MAdmin.Application.API { class EventApi : IEventApi { private const int MaxEvents = 32; private Queue RecentEvents = new Queue(); public IEnumerable GetEvents(bool shouldConsume) { var eventList = RecentEvents.ToArray(); // clear queue if events should be consumed if (shouldConsume) { RecentEvents.Clear(); } return eventList; } public void OnServerEvent(object sender, GameEvent E) { // 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, 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); } /// /// Adds event to the list and removes first added if reached max capacity /// /// EventInfo to add private void AddNewEvent(EventInfo info) { // remove the first added event if (RecentEvents.Count >= MaxEvents) RecentEvents.Dequeue(); RecentEvents.Enqueue(info); } } }