Пример #1
0
        public static async Task HandlerAdd(DiscordSocketClient client, FFXIV3RoleQueueService queueService, DbService db, Cacheable <IUserMessage, ulong> cachedMessage, SocketReaction reaction)
        {
            var userId = reaction.UserId;

            if (client.CurrentUser.Id == userId || !RoleReactions.ContainsKey(reaction.Emote.Name))
            {
                return;
            }

            var role = RoleReactions[reaction.Emote.Name];

            var eventId = await AnnounceUtil.GetEventId(cachedMessage);

            if (eventId == null)
            {
                return;
            }

            var guildConfig = db.Guilds.FirstOrDefault(g => g.Id == SpecialGuilds.CrystalExploratoryMissions);

            if (guildConfig == null)
            {
                Log.Error("No guild configuration found for the default guild!");
                return;
            }

            var user  = client.GetUser(userId);
            var guild = client.GetGuild(SpecialGuilds.CrystalExploratoryMissions);

            var message = await cachedMessage.GetOrDownloadAsync();

            var inputChannel = guild.GetTextChannel(GetScheduleInputChannel(guildConfig, message.Channel.Id));
            var eventMessage = await inputChannel.GetMessageAsync(eventId.Value);

            var host         = guild.GetUser(eventMessage.Author.Id);
            var discordRoles = DelubrumProgressionRoles.Roles.Keys
                               .Select(rId => guild.GetRole(rId));
            var authorHasProgressionRole = discordRoles.Any(dr => host.HasRole(dr));
            var freshProg = !authorHasProgressionRole || eventMessage.Content.ToLowerInvariant().Contains("810201516291653643");

#if DEBUG
            Log.Information("Fresh prog: {FreshProg}", freshProg);
#endif

            var scheduleQueue = GetScheduleQueue(guildConfig, freshProg, reaction.Channel.Id);
            if (scheduleQueue == 0)
            {
                return;
            }

            var queueName = QueueInfo.LfgChannels[scheduleQueue];
            var queue     = queueService.GetOrCreateQueue(queueName);

            if (queue.Enqueue(userId, role, eventId.Value.ToString()))
            {
                await user.SendMessageAsync($"You have been added to the {role} queue for event `{eventId}`. " +
                                            "You can check your position in queue with `~queue` in the queue channel.\n" +
                                            "Clicking the reaction again will refresh your position in the queue.");

                Log.Information("User {User} has been added to the {FFXIVRole} queue for {QueueName}, with event {Event}", user.ToString(), role.ToString(), queueName, eventId);
            }
            else
            {
                queueService.GetOrCreateQueue("lfg-castrum").Refresh(userId);
                queueService.GetOrCreateQueue("lfg-delubrum-normal").Refresh(userId);
                queueService.GetOrCreateQueue("lfg-drs-fresh-prog").Refresh(userId);
                queueService.GetOrCreateQueue("lfg-delubrum-savage").Refresh(userId);

                await user.SendMessageAsync($"{user.Mention}, your timeouts in the Bozja queues have been refreshed!");
            }

            queueService.Save();

            try
            {
                await message.RemoveReactionAsync(reaction.Emote, userId);
            }
            catch { /* ignored */ }
        }
Пример #2
0
        public static async Task HandlerAdd(DiscordSocketClient client, FFXIV3RoleQueueService queueService, IDbService db, Cacheable <IUserMessage, ulong> cachedMessage, SocketReaction reaction)
        {
            var userId = reaction.UserId;

            if (client.CurrentUser.Id == userId || !RoleReactions.ContainsKey(reaction.Emote.Name))
            {
                return;
            }

            var role = RoleReactions[reaction.Emote.Name];

            var eventId = await AnnounceUtil.GetEventId(cachedMessage);

            if (eventId == null)
            {
                return;
            }

            var guildConfig = db.Guilds.FirstOrDefault(g => g.Id == SpecialGuilds.CrystalExploratoryMissions);

            if (guildConfig == null)
            {
                Log.Error("No guild configuration found for the default guild!");
                return;
            }

            var user  = client.GetUser(userId);
            var guild = client.GetGuild(SpecialGuilds.CrystalExploratoryMissions);

            var message = await cachedMessage.GetOrDownloadAsync();

            var noQueueChannels = new[]
            {
                guildConfig.BozjaClusterScheduleOutputChannel,
                guildConfig.SocialScheduleOutputChannel,
                guildConfig.DelubrumNormalScheduleOutputChannel,
                guildConfig.DelubrumScheduleOutputChannel,

                guildConfig.CastrumScheduleOutputChannel,
                guildConfig.ScheduleOutputChannel, // BA
            };

            if (noQueueChannels.Contains(message.Channel.Id))
            {
                return;
            }

            var inputChannel = guild.GetTextChannel(GetScheduleInputChannel(guildConfig, message.Channel.Id));

            if (inputChannel == null)
            {
                return;
            }
            var eventMessage = await inputChannel.GetMessageAsync(eventId.Value);

            var host         = guild.GetUser(eventMessage.Author.Id);
            var discordRoles = DelubrumProgressionRoles.Roles.Keys
                               .Select(rId => guild.GetRole(rId));
            var authorHasProgressionRole = discordRoles.Any(dr => host.HasRole(dr));
            var freshProg = !authorHasProgressionRole || eventMessage.Content.ToLowerInvariant().Contains("810201516291653643");

#if DEBUG
            Log.Information("Fresh prog: {FreshProg}", freshProg);
#endif

            var scheduleQueue = GetScheduleQueue(guildConfig, freshProg, reaction.Channel.Id);
            if (scheduleQueue == 0)
            {
                return;
            }

            var queueName = QueueInfo.LfgChannels[scheduleQueue];
            var queue     = queueService.GetOrCreateQueue(queueName);

            if (queue.Enqueue(userId, role, eventId.Value.ToString()))
            {
                var embed     = message.Embeds.FirstOrDefault(e => e.Type == EmbedType.Rich);
                var eventTime = embed?.Timestamp;
                if (eventTime != null && eventTime.Value.AddHours(-2) <= DateTimeOffset.Now)
                {
                    queue.ConfirmEvent(userId, eventId.Value.ToString());
#if DEBUG
                    Log.Information("Auto-confirmed.");
#endif
                }
#if DEBUG
                else
                {
                    if (eventTime != null)
                    {
                        Log.Information((eventTime.Value - DateTimeOffset.Now).ToString());
                    }

                    Log.Information("Not auto-confirmed.");
                }
#endif

                await user.SendMessageAsync($"You have been added to the {role} queue for event `{eventId}`. " +
                                            "You can check your position in queue with `~queue` in the queue channel.");

                Log.Information("User {User} has been added to the {FFXIVRole} queue for {QueueName}, with event {Event}", user.ToString(), role.ToString(), queueName, eventId);
            }
            else
            {
                await user.SendMessageAsync("You are already in that queue, in position " +
                                            $"{queue.GetPosition(userId, role, eventId.Value.ToString())}/{queue.Count(role, eventId.Value.ToString())}.\n" +
                                            $"If you would like to leave the queue, please use `~leavequeue {eventId}` in the queue channel.");
            }

            queueService.Save();

            try
            {
                await message.RemoveReactionAsync(reaction.Emote, userId);
            }
            catch { /* ignored */ }
        }