Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
        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);
                }
            }
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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));
        }
Exemplo n.º 6
0
        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));
        }
Exemplo n.º 7
0
 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);
 }
Exemplo n.º 8
0
        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));
        }
Exemplo n.º 9
0
        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));
        }
Exemplo n.º 10
0
 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);
 }
Exemplo n.º 11
0
        public void SetEvent(ulong userId, FFXIVRole role, string eventId)
        {
            var slot = GetQueue(role)
                       .FirstOrDefault(s => s.Id == userId);

            if (slot != null)
            {
                slot.EventId = eventId;
            }
        }
Exemplo n.º 12
0
        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));
        }
Exemplo n.º 13
0
        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);
        }
Exemplo n.º 14
0
        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);
        }
Exemplo n.º 15
0
        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);
        }
Exemplo n.º 16
0
        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);
        }
Exemplo n.º 17
0
        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);
        }
Exemplo n.º 18
0
        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);
        }
Exemplo n.º 19
0
        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
            };
        }
Exemplo n.º 20
0
 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);
     }
 }
Exemplo n.º 21
0
        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);
            }
        }
Exemplo n.º 22
0
        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));
        }
Exemplo n.º 23
0
        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);
        }
Exemplo n.º 24
0
        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));
                }
            }
        }
Exemplo n.º 25
0
        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);
        }
Exemplo n.º 26
0
        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);
        }
Exemplo n.º 27
0
        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);
            }
        }
Exemplo n.º 28
0
 public bool Remove(ulong userId, FFXIVRole role)
 {
     return(GetQueue(role)
            .Remove(s => s.Id == userId));
 }
Exemplo n.º 29
0
 public int Count(FFXIVRole role, string eventId)
 {
     return(GetQueue(role)
            .Where(s => !s.RoleIds.Any())
            .Count(EventValid(eventId)));
 }
Exemplo n.º 30
0
 protected IList <QueueSlot> GetQueue(FFXIVRole role) => role switch
 {