public void Insert(ulong uid, int position, FFXIVRole role) { var queue = GetQueue(role); var slot = queue.FirstOrDefault(s => s.Id == uid); if (slot != null) { slot.ExpirationNotified = false; slot.QueueTime = DateTime.UtcNow; } Remove(uid, role); try { queue.Insert(position, slot ?? new QueueSlot(uid)); } catch (ArgumentOutOfRangeException) { Enqueue(uid, role, slot?.EventId ?? ""); } queue.RemoveAll(s => s == null, overload: true); }
public DiscordIntegratedEnqueueResult EnqueueWithDiscordRole(ulong userId, FFXIVRole role, IRole discordRole, SocketCommandContext context, string eventId) { if (context.Guild == null) { return(DiscordIntegratedEnqueueResult.NoGuild); } if (!context.Guild.GetUser(userId).HasRole(discordRole)) { return(DiscordIntegratedEnqueueResult.DoesNotHaveRole); } var queue = GetQueue(role); lock (queue) { if (queue.Any(s => EventValid(eventId)(s) && s.Id == userId)) { return(DiscordIntegratedEnqueueResult.AlreadyInQueue); } eventId ??= ""; var slot = new QueueSlot(userId, eventId, roleIds: new[] { discordRole.Id }); queue.Add(slot); return(DiscordIntegratedEnqueueResult.Success); } }
public ulong?Dequeue(FFXIVRole role, string eventId) { var queue = GetQueue(role); lock (queue) { if (queue.Count == 0) { return(null); } QueueSlot slot; if (string.IsNullOrEmpty(eventId)) { slot = queue.FirstOrDefault(s => !s.RoleIds.Any() && string.IsNullOrEmpty(s.EventId)); } else { slot = queue.FirstOrDefault(s => !s.RoleIds.Any() && s.EventId == eventId); } if (slot != null) { RemoveAll(slot.Id); return(slot.Id); } else { return(null); } } }
public bool EnqueueAndConfirm(ulong userId, FFXIVRole role, string eventId) { var success = base.Enqueue(userId, role, eventId); GetAllSlots().First(s => s.Id == userId).Confirmed = true; return(success); }
public void Shove_Works_NoEvent(FFXIVRole role) { var queue = new FFXIV3RoleQueue(); queue.Enqueue(UserId, role, ""); queue.Shove(UserId, role); Assert.AreEqual(1, queue.GetPosition(UserId, role, null)); }
public void Insert_Works_Event(FFXIVRole role) { var queue = new FFXIV3RoleQueue(); queue.Enqueue(UserId, role, EventId); queue.Insert(UserId, 0, role); Assert.AreEqual(1, queue.GetPosition(UserId, role, EventId)); }
public int GetPosition(ulong userId, FFXIVRole role, string eventId) { return(GetQueue(role) .Where(s => !s.RoleIds.Any()) .Where(EventValid(eventId)) .ToList() .IndexOf(s => s.Id == userId) + 1); }
public void Insert_Works_NoEvent(FFXIVRole role) { var queue = new FFXIV3RoleQueue(); queue.Enqueue(userId, role, ""); queue.Insert(userId, 0, role); Assert.AreEqual(1, queue.GetPosition(userId, role, null)); }
public void Shove_Works_Event(FFXIVRole role) { var queue = new FFXIV3RoleQueue(); queue.Enqueue(userId, role, eventId); queue.Shove(userId, role); Assert.AreEqual(1, queue.GetPosition(userId, role, eventId)); }
public int GetPositionWithDiscordRole(ulong userId, FFXIVRole role, IRole discordRole, SocketCommandContext context, string eventId) { return(GetQueue(role) .Where(s => SlotHasRole(s, discordRole, context)) .Where(EventValid(eventId)) .ToList() .IndexOf(s => s.Id == userId) + 1); }
public void SetEvent(ulong userId, FFXIVRole role, string eventId) { var slot = GetQueue(role) .FirstOrDefault(s => s.Id == userId); if (slot != null) { slot.EventId = eventId; } }
public void SetEvent_Works(FFXIVRole role) { var queue = new FFXIV3RoleQueue(); queue.Enqueue(userId, role, eventId); queue.SetEvent(userId, role, null); var userEventId = queue.GetEvent(userId, role); Assert.That(string.IsNullOrEmpty(userEventId)); }
public IEnumerable <ulong> GetSlotDiscordRoles(ulong userId, FFXIVRole role, SocketCommandContext context) { if (context.Guild == null) { return(null); } var queue = GetQueue(role); return(queue.FirstOrDefault(s => s.Id == userId)?.RoleIds); }
public void Dequeue_Normal_PullsForNormal(FFXIVRole role) { var queue = new FFXIV3RoleQueue(); var enqueueSuccess = queue.Enqueue(userId, role, null); Assert.IsTrue(enqueueSuccess); var outUId = queue.Dequeue(role, null); Assert.IsNotNull(outUId); }
public void Dequeue_Event_PullsForEvent(FFXIVRole role) { var queue = new FFXIV3RoleQueue(); var enqueueSuccess = queue.Enqueue(userId, role, eventId); Assert.IsTrue(enqueueSuccess); var outUId = queue.Dequeue(role, eventId); Assert.IsNotNull(outUId); }
public void Dequeue_Event_PullsForEvent(FFXIVRole role) { var queue = new TestQueue(); var enqueueSuccess = queue.EnqueueAndConfirm(UserId, role, EventId); Assert.IsTrue(enqueueSuccess); var outUId = queue.Dequeue(role, EventId); Assert.IsNotNull(outUId); }
public void Queue_NoParameters_MaintainsState_EmptyEvent(FFXIVRole role) { var queue = new FFXIV3RoleQueue(); var enqueueSuccess = queue.Enqueue(UserId, role, ""); Assert.IsTrue(enqueueSuccess); var outUId = queue.Dequeue(role, ""); Assert.IsTrue(outUId.HasValue); Assert.AreEqual(UserId, outUId.Value); }
public void Dequeue_Normal_DoesNotPullForEvent(FFXIVRole role) { var queue = new FFXIV3RoleQueue(); var enqueueSuccess = queue.Enqueue(UserId, role, EventId); Assert.IsTrue(enqueueSuccess); var outUId = queue.Dequeue(role, null); Assert.IsNull(outUId); }
public void SetRole(ulong userId, FFXIVRole role, IRole discordRole) { var slot = GetQueue(role) .FirstOrDefault(s => s.Id == userId); if (slot == null) { return; } slot.RoleIds = discordRole == null ? new List <ulong>() : new List <ulong> { discordRole.Id }; }
public bool Remove(ulong userId, FFXIVRole role, string eventId) { try { return(GetQueue(role) .RemoveAll(s => EventValid(eventId)(s) && s.Id == userId, overload: true) .Any()); } catch (ArgumentOutOfRangeException) { return(false); } }
public bool Enqueue(ulong userId, FFXIVRole role, string eventId) { var queue = GetQueue(role); lock (queue) { if (queue.Any(tuple => tuple.Id == userId)) { return(false); } queue.Add(new QueueSlot(userId, eventId ?? "")); return(true); } }
private IEnumerable <ulong> GetAlmostTimedOut(FFXIVRole role, double secondsBeforeNow, double gracePeriod) { var queue = GetQueue(role); var almostTimedOut = queue .Where(s => !s.ExpirationNotified) .Where(s => (DateTime.UtcNow - s.QueueTime).TotalSeconds > secondsBeforeNow - gracePeriod) .ToList(); foreach (var slot in almostTimedOut) { slot.ExpirationNotified = true; } return(almostTimedOut.Select(tuple => tuple.Id)); }
public IEnumerable <EventSlotState> GetEventStates(ulong userId, FFXIVRole role) { var eventStates = GetQueue(role) .Where(s => s.Id == userId) .Select(s => new EventSlotState { Confirmed = s.Confirmed, EventId = s.EventId, }) .ToList(); if (!eventStates.Any(e => string.IsNullOrEmpty(e.EventId))) { eventStates.Add(new EventSlotState()); } return(eventStates); }
protected IEnumerable <ulong> QueryTimeout(FFXIVRole role, double secondsBeforeNow, bool excludeEvents = false) { var queue = GetQueue(role); lock (queue) { if (excludeEvents) { return(queue .RemoveAll(s => string.IsNullOrEmpty(s.EventId) && (DateTime.UtcNow - s.QueueTime).TotalSeconds > secondsBeforeNow, overload: true) .Select(s => s.Id)); } else { return(queue.RemoveAll(s => (DateTime.UtcNow - s.QueueTime).TotalSeconds > secondsBeforeNow, overload: true) .Select(s => s.Id)); } } }
public async Task Refresh_Works_NoEvent(FFXIVRole role) { var queue = new TestQueue(); var enqueuedSlot = new QueueSlot(UserId, "", new List <ulong>()) { QueueTime = DateTime.UtcNow.AddHours(-4).AddMinutes(-45), }; queue.AddSlot(enqueuedSlot, role); await Task.Delay(1000); var now = DateTime.UtcNow; queue.Refresh(UserId); var dequeuedSlot = queue.GetAllSlots().First(); Assert.AreEqual(now.Hour, dequeuedSlot.QueueTime.Hour); Assert.AreEqual(now.Minute, dequeuedSlot.QueueTime.Minute); }
public void Queue_EventId_NotCountedNormally(FFXIVRole role) { var queue = new FFXIV3RoleQueue(); var enqueueSuccess = queue.Enqueue(UserId, role, EventId); Assert.IsTrue(enqueueSuccess); var pos1 = queue.GetPosition(UserId, role, null); Assert.AreEqual(0, pos1); var pos2 = queue.GetPosition(UserId, role, EventId); Assert.AreEqual(1, pos2); var count1 = queue.Count(role, null); Assert.AreEqual(0, count1); var count2 = queue.Count(role, EventId); Assert.AreEqual(1, count2); }
public ulong?DequeueWithDiscordRole(FFXIVRole role, IRole discordRole, SocketCommandContext context, string eventId) { if (context.Guild == null) { return(null); } var queue = GetQueue(role); lock (queue) { if (queue.Count == 0) { return(null); } eventId ??= ""; QueueSlot slot; if (string.IsNullOrEmpty(eventId)) { slot = queue.FirstOrDefault(s => SlotHasRole(s, discordRole, context) && string.IsNullOrEmpty(s.EventId)); } else { slot = queue.FirstOrDefault(s => SlotHasRole(s, discordRole, context) && s.EventId == eventId && s.Confirmed); } if (slot == null) { return(null); } var user = slot.Id; RemoveAll(user, eventId); return(user); } }
public bool Remove(ulong userId, FFXIVRole role) { return(GetQueue(role) .Remove(s => s.Id == userId)); }
public int Count(FFXIVRole role, string eventId) { return(GetQueue(role) .Where(s => !s.RoleIds.Any()) .Count(EventValid(eventId))); }
protected IList <QueueSlot> GetQueue(FFXIVRole role) => role switch {