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); } }
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(); } }
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); }
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)}`"); }
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)); } } } }