Ejemplo n.º 1
0
        public async Task Clear()
        {
            if (!PickupHelpers.IsInPickupChannel((IGuildChannel)Context.Channel))
            {
                return;
            }

            //find queues with user in it
            var allQueues = await _queueRepository.AllQueues(Context.Guild.Id.ToString());

            var matchingQueues = allQueues.Where(q => q.Subscribers.Any(s => s.Id == Context.User.Id) || q.WaitingList.Any(w => w.Id == Context.User.Id));

            var pickupQueues = matchingQueues as PickupQueue[] ?? matchingQueues.ToArray();

            if (pickupQueues.Any())
            {
                foreach (var queue in pickupQueues)
                {
                    queue.WaitingList.RemoveAll(w => w.Id == Context.User.Id);
                    queue.Updated = DateTime.UtcNow;

                    var updatedQueue = await _subscriberCommandService.Leave(queue, Context.Channel, (IGuildUser)Context.User, false);

                    updatedQueue ??= queue;

                    if (!updatedQueue.Subscribers.Any() && !updatedQueue.WaitingList.Any())
                    {
                        await _queueRepository.RemoveQueue(updatedQueue.Name, updatedQueue.GuildId); //Try to remove queue if its empty.

                        if (string.IsNullOrEmpty(queue.StaticMessageId))
                        {
                            continue;
                        }
                        var queuesChannel = await PickupHelpers.GetPickupQueuesChannel(Context.Guild);

                        await queuesChannel.DeleteMessageAsync(Convert.ToUInt64(queue.StaticMessageId));
                    }
                    else
                    {
                        await _queueRepository.UpdateQueue(updatedQueue);
                    }
                }

                //if queues found and user is in queue
                await Context.Channel.SendMessageAsync(
                    $"{PickupHelpers.GetMention(Context.User)} - You have been removed from all queues",
                    messageReference : new MessageReference(Context.Message.Id))
                .AutoRemoveMessage(10);
            }
        }
Ejemplo n.º 2
0
        public async Task List()
        {
            if (!PickupHelpers.IsInPickupChannel((IGuildChannel)Context.Channel))
            {
                return;
            }

            //find all active queues
            var queues = await _queueRepository.AllQueues(Context.Guild.Id.ToString());

            Embed embed;
            //if queues found
            var pickupQueues = queues as PickupQueue[] ?? queues.ToArray();

            if (!pickupQueues.Any())
            {
                embed = new EmbedBuilder
                {
                    Title       = "Active queues",
                    Description = "There are no active pickup queues at this time, maybe you should `!create` one \uD83D\uDE09",
                    Color       = Color.Orange
                }.Build();

                await Context.Channel.SendMessageAsync(embed : embed).AutoRemoveMessage(10);

                return;
            }

            var ordered = pickupQueues.OrderByDescending(w => w.Readiness);

            foreach (var q in ordered)
            {
                embed = new EmbedBuilder
                {
                    Title       = $"{q.Name}{(q.Started ? " - Started" : "")}",
                    Description = BuildListResponse(q).ToString(),
                    Color       = Color.Orange
                }.Build();
                await Context.Channel.SendMessageAsync(embed : embed).AutoRemoveMessage();
            }
        }
Ejemplo n.º 3
0
        public async Task Add(string queueName, ISocketMessageChannel channel, IGuildUser user)
        {
            var         guild = (SocketGuild)user.Guild;
            PickupQueue queue;

            if (!string.IsNullOrWhiteSpace(queueName))
            {
                queue = await _queueRepository.FindQueue(queueName, guild.Id.ToString());
            }
            else
            {
                var queues = (await _queueRepository.AllQueues(guild.Id.ToString())).OrderByDescending(w => w.Readiness).ToList();
                queue = queues.Any(q => q.Readiness < 100) ? queues.FirstOrDefault(q => q.Readiness < 100) : queues.FirstOrDefault();
            }

            if (queue == null)
            {
                await channel.SendMessageAsync($"`Queue with the name '{queueName}' doesn't exists!`").AutoRemoveMessage(10);

                return;
            }

            if (!await _miscCommandService.VerifyUserFlaggedStatus(user, channel))
            {
                return;
            }

            if (queue.Subscribers.Any(w => w.Id == user.Id))
            {
                await channel.SendMessageAsync($"`{queue.Name} - {PickupHelpers.ParseSubscribers(queue)}`");

                return;
            }

            var activity = await _activitiesRepository.Find(user);

            activity.PickupAdd += 1;

            queue.Updated = DateTime.UtcNow;

            bool updateStaticMessage = false;

            if (queue.Subscribers.Count >= queue.MaxInQueue)
            {
                if (queue.WaitingList.All(w => w.Id != user.Id))
                {
                    queue.WaitingList.Add(new Subscriber {
                        Id = user.Id, Name = PickupHelpers.GetNickname(user)
                    });
                    updateStaticMessage = true;

                    if (channel.Name != ChannelNames.ActivePickups)
                    {
                        await channel.SendMessageAsync($"`You have been added to the '{queue.Name}' waiting list`").AutoRemoveMessage(10);
                    }
                }
                else
                {
                    if (channel.Name != ChannelNames.ActivePickups)
                    {
                        await channel.SendMessageAsync($"`You are already on the '{queue.Name}' waiting list`").AutoRemoveMessage(10);
                    }
                }
            }
            else
            {
                updateStaticMessage = true;
                queue.Subscribers.Add(new Subscriber {
                    Id = user.Id, Name = PickupHelpers.GetNickname(user)
                });

                if (queue.Subscribers.Count == queue.MaxInQueue)
                {
                    await PickupHelpers.NotifyUsers(
                        queue,
                        guild.Name,
                        user,
                        queue.Subscribers.Select(s => guild.GetUser(s.Id)).Where(u => u != null).ToArray());
                }

                if (channel.Name != ChannelNames.ActivePickups)
                {
                    await channel.SendMessageAsync($"`{queue.Name} - {PickupHelpers.ParseSubscribers(queue)}`");
                }
            }

            if (updateStaticMessage)
            {
                queue = await _listCommandService.SaveStaticQueueMessage(queue, guild);
            }

            await _queueRepository.UpdateQueue(queue);

            await _activitiesRepository.Update(activity);
        }
Ejemplo n.º 4
0
        public async Task Add([Name("Queue name"), Summary("Queue name"), Remainder] string queueName = "")
        {
            //find queue with name {queueName}
            PickupQueue queue = null;

            if (!string.IsNullOrWhiteSpace(queueName))
            {
                queue = await _queueRepository.FindQueue(queueName, Context.Guild.Id.ToString());
            }
            else
            {
                var queues = (await _queueRepository.AllQueues(Context.Guild.Id.ToString())).OrderByDescending(w => w.Readiness).ToList();
                queue = queues.Any(q => q.Readiness < 100) ? queues.FirstOrDefault(q => q.Readiness < 100) : queues.FirstOrDefault();
            }

            if (queue == null)
            {
                await Context.Channel.SendMessageAsync($"`Queue with the name '{queueName}' doesn't exists!`");

                return;
            }

            if (!await VerifyUserFlaggedStatus())
            {
                return;
            }

            if (queue.Subscribers.Any(w => w.Id == Context.User.Id))
            {
                await Context.Channel.SendMessageAsync($"`{queue.Name} - {ParseSubscribers(queue)}`");

                return;
            }

            if (queue.Subscribers.Count >= queue.MaxInQueue)
            {
                if (queue.WaitingList.All(w => w.Id != Context.User.Id))
                {
                    queue.Updated = DateTime.UtcNow;
                    queue.WaitingList.Add(new Subscriber {
                        Id = Context.User.Id, Name = GetNickname(Context.User)
                    });

                    await _queueRepository.UpdateQueue(queue);

                    await ReplyAsync($"`You have been added to the '{queue.Name}' waiting list`");
                }
                else
                {
                    await ReplyAsync($"`You are already on the '{queue.Name}' waiting list`");
                }

                return;
            }

            queue.Updated = DateTime.UtcNow;
            queue.Subscribers.Add(new Subscriber {
                Id = Context.User.Id, Name = GetNickname(Context.User)
            });

            //if queue found
            await _queueRepository.UpdateQueue(queue);

            if (queue.Subscribers.Count == queue.MaxInQueue)
            {
                await NotifyUsers(queue, Context.Guild.Name, queue.Subscribers.Select(subscriber => Context.Guild.GetUser(subscriber.Id)).ToArray());
            }

            await Context.Channel.SendMessageAsync($"`{queue.Name} - {ParseSubscribers(queue)}`");
        }
Ejemplo n.º 5
0
        public async Task Promote(PickupQueue queue, ITextChannel pickupChannel, IGuildUser user)
        {
            var guild    = (SocketGuild)user.Guild;
            var activity = await _activitiesRepository.Find(user);

            activity.PickupPromote += 1;
            await _activitiesRepository.Update(activity);

            if (queue?.MaxInQueue <= queue?.Subscribers.Count)
            {
                await pickupChannel.SendMessageAsync("Queue is full, why the spam?").AutoRemoveMessage(10);

                return;
            }

            var role = guild.Roles.FirstOrDefault(w => w.Name == RoleNames.PickupPromote);

            if (role == null)
            {
                return;               //Failed to get role;
            }
            var users = guild.Users.Where(w => w.Roles.Any(r => r.Id == role.Id)).ToList();

            if (!users.Any())
            {
                await pickupChannel.SendMessageAsync("No users have subscribed using the `!subscribe` command.")
                .AutoRemoveMessage(10);

                return;
            }

            using (pickupChannel.EnterTypingState())
            {
                if (queue == null)
                {
                    var queues = await _queueRepository.AllQueues(user.GuildId.ToString());

                    var filtered = queues.Where(q => q.MaxInQueue > q.Subscribers.Count).ToArray();
                    if (filtered.Any())
                    {
                        await pickupChannel.SendMessageAsync($"There are {filtered.Length} pickup queues with spots left, check out the `!list`! - {role.Mention}")
                        .AutoRemoveMessage();
                    }
                }
                else
                {
                    var sb    = BuildPromoteMessage(queue, pickupChannel);
                    var embed = new EmbedBuilder
                    {
                        Title       = $"Pickup queue {queue.Name} needs more players",
                        Description = sb.ToString(),
                        Author      = new EmbedAuthorBuilder {
                            Name = "pickup-bot"
                        },
                        Color = Color.Orange
                    }.Build();

                    foreach (var u in users)
                    {
                        await u.SendMessageAsync(embed : embed);

                        await Task.Delay(TimeSpan.FromMilliseconds(200));
                    }
                }
            }
        }