Example #1
0
        public async Task <string> UpdateUnverifyAsync(SocketGuildUser user, SocketGuild guild, string time, SocketUser fromUser)
        {
            var task = Queue.Get <UnverifyBackgroundTask>(o => o.GuildId == guild.Id && o.UserId == user.Id);

            if (task == null)
            {
                throw new NotFoundException("Aktualizace času nelze pro hledaného uživatele provést. Unverify nenalezeno.");
            }

            if (task.CanProcess() || (task.At - DateTime.Now).TotalSeconds < 30.0D)
            {
                throw new ValidationException("Aktualizace data a času již není možná. Vypršel čas, nebo zbývá méně, než půl minuty.");
            }

            var endDateTime = TimeParser.Parse(time, minimumMinutes: 10);
            await UnverifyLogger.LogUpdateAsync(DateTime.Now, endDateTime, guild, fromUser, user);

            var userEntity = await GrillBotRepository.UsersRepository.GetUserAsync(guild.Id, user.Id, UsersIncludes.Unverify);

            userEntity.Unverify.EndDateTime   = endDateTime;
            userEntity.Unverify.StartDateTime = DateTime.Now;
            await GrillBotRepository.CommitAsync();

            task.At = endDateTime;

            var pmMessage = MessageGenerator.CreateUpdatePMMessage(guild, endDateTime);
            await user.SendPrivateMessageAsync(pmMessage);

            return(MessageGenerator.CreateUpdateChannelMessage(user, endDateTime));
        }
Example #2
0
 public UnverifyService(UnverifyChecker checker, UnverifyProfileGenerator profileGenerator, UnverifyLogger logger,
                        UnverifyMessageGenerator messageGenerator, UnverifyTimeParser timeParser, BotState botState, DiscordSocketClient discord,
                        BotLoggingService loggingService, ILogger <UnverifyService> appLogger, IGrillBotRepository grillBotRepository,
                        BackgroundTaskQueue queue)
 {
     Checker = checker;
     UnverifyProfileGenerator = profileGenerator;
     UnverifyLogger           = logger;
     MessageGenerator         = messageGenerator;
     TimeParser         = timeParser;
     BotState           = botState;
     DiscordClient      = discord;
     Logger             = loggingService;
     AppLogger          = appLogger;
     GrillBotRepository = grillBotRepository;
     Queue = queue;
 }
Example #3
0
        public async Task RecoverToStateAsync(long id, SocketGuildUser fromUser)
        {
            var record = await GrillBotRepository.UnverifyRepository.FindLogItemByIDAsync(id);

            if (record == null)
            {
                throw new NotFoundException($"Záznam o unverify s ID {id} nebyl nalezen.");
            }

            if (record.Operation != UnverifyLogOperation.Unverify && record.Operation != UnverifyLogOperation.Selfunverify)
            {
                throw new ValidationException("Obnovení lze provést pouze přes operace Unverify a SelfUnverify");
            }

            if (record.ToUser.Unverify != null)
            {
                throw new ValidationException("Nelze provést obnovení stavu před unverify uživateli, který má unverify.");
            }

            var guild = DiscordClient.GetGuild(record.ToUser.GuildIDSnowflake);

            if (guild == null)
            {
                throw new NotFoundException("Nelze najít server, na kterém bylo uživateli uděleno unverify.");
            }

            var user = await guild.GetUserFromGuildAsync(record.ToUser.UserIDSnowflake);

            if (user == null)
            {
                throw new NotFoundException($"Nelze vyhledat uživatele na serveru {guild.Name}");
            }

            var unverifyConfig = (await GrillBotRepository.ConfigRepository.FindConfigAsync(guild.Id, "unverify", null, false))?.GetData <UnverifyConfig>();
            var mutedRole      = unverifyConfig == null ? null : guild.GetRole(unverifyConfig.MutedRoleID);

            var data = record.Json.ToObject <UnverifyLogSet>();

            var rolesToReturn = data.RolesToRemove.Where(o => !user.Roles.Any(x => x.Id == o))
                                .Select(o => guild.GetRole(o)).Where(role => role != null).ToList();

            var channelsToReturn = data.ChannelsToRemove
                                   .Select(o => new ChannelOverwrite(guild.GetChannel(o.ChannelID), new OverwritePermissions(o.AllowValue, o.DenyValue)))
                                   .Where(o => o.Channel is SocketGuildChannel)
                                   .Where(o =>
            {
                var perms = ((SocketGuildChannel)o.Channel).GetPermissionOverwrite(user);
                return(perms != null && (perms.Value.AllowValue != o.AllowValue || perms.Value.DenyValue != o.DenyValue));
            })
                                   .ToList();

            await UnverifyLogger.LogRecoverAsync(rolesToReturn, channelsToReturn, guild, user, fromUser);

            if (rolesToReturn.Count > 0)
            {
                await user.AddRolesAsync(rolesToReturn);
            }

            if (channelsToReturn.Count > 0)
            {
                foreach (var channel in channelsToReturn)
                {
                    if (channel.Channel is SocketGuildChannel socketGuildChannel)
                    {
                        await socketGuildChannel.AddPermissionOverwriteAsync(user, channel.Perms);
                    }
                }
            }

            if (mutedRole != null)
            {
                await user.RemoveRoleAsync(mutedRole);
            }
        }
Example #4
0
        public async Task <string> RemoveUnverifyAsync(SocketGuild guild, SocketGuildUser user, SocketUser fromUser, bool isAuto = false)
        {
            try
            {
                BotState.CurrentReturningUnverifyFor.Add(user);

                var userEntity = await GrillBotRepository.UsersRepository.GetUserAsync(guild.Id, user.Id, UsersIncludes.Unverify);

                if (userEntity?.Unverify == null)
                {
                    return(MessageGenerator.CreateRemoveAccessUnverifyNotFound(user));
                }

                var unverifyConfig = (await GrillBotRepository.ConfigRepository.FindConfigAsync(guild.Id, "unverify", null, false))?.GetData <UnverifyConfig>();
                var mutedRole      = unverifyConfig == null ? null : guild.GetRole(unverifyConfig.MutedRoleID);

                var rolesToReturn = userEntity.Unverify.DeserializedRoles.Where(o => !user.Roles.Any(x => x.Id == o))
                                    .Select(o => guild.GetRole(o)).Where(role => role != null).ToList();

                var channelsToReturn = userEntity.Unverify.DeserializedChannels
                                       .Select(o => new ChannelOverwrite(guild.GetChannel(o.ChannelIdSnowflake), o.GetPermissions()))
                                       .Where(o => o.Channel != null).ToList();

                if (isAuto)
                {
                    await UnverifyLogger.LogAutoRemoveAsync(rolesToReturn, channelsToReturn, user, guild);
                }
                else
                {
                    await UnverifyLogger.LogRemoveAsync(rolesToReturn, channelsToReturn, guild, user, fromUser);
                }

                foreach (var channel in channelsToReturn)
                {
                    if (channel.Channel is SocketGuildChannel socketGuildChannel)
                    {
                        try
                        {
                            await socketGuildChannel.AddPermissionOverwriteAsync(user, channel.Perms);
                        }
                        catch (HttpException ex)
                        {
                            var message = new LogMessage(LogSeverity.Error, nameof(UnverifyService), $"An error occured when unverify returning access to channel {channel.Channel.Name} for user {user.GetFullName()}", ex);
                            await Logger.OnLogAsync(message);
                        }
                    }
                }

                await user.AddRolesAsync(rolesToReturn);

                if (mutedRole != null)
                {
                    await user.RemoveRoleAsync(mutedRole);
                }

                userEntity.Unverify = null;
                await GrillBotRepository.CommitAsync();

                Queue.TryRemove <UnverifyBackgroundTask>(o => o.GuildId == guild.Id && o.UserId == user.Id);

                if (!isAuto)
                {
                    var message = MessageGenerator.CreateRemoveAccessManuallyPMMessage(guild);
                    await user.SendPrivateMessageAsync(message);
                }

                return(MessageGenerator.CreateRemoveAccessManuallyToChannel(user));
            }
            catch (Exception ex)
            {
                if (!isAuto)
                {
                    throw;
                }

                var message = new LogMessage(LogSeverity.Error, nameof(UnverifyService), "An error occured when unverify returning access.", ex);
                await Logger.OnLogAsync(message);

                return(MessageGenerator.CreateRemoveAccessManuallyFailed(user, ex));
            }
            finally
            {
                BotState.CurrentReturningUnverifyFor.RemoveAll(o => o.Id == user.Id);
            }
        }
Example #5
0
        private async Task <string> SetUnverifyAsync(SocketUser socketUser, string time, string data, SocketGuild guild, SocketUser fromUser, bool selfUnverify,
                                                     List <string> toKeep, SocketRole mutedRole)
        {
            var user = await guild.GetUserFromGuildAsync(socketUser.Id);

            await Checker.ValidateAsync(user, guild, selfUnverify);

            var profile = await UnverifyProfileGenerator.CreateProfileAsync(user, guild, time, data, selfUnverify, toKeep, mutedRole);

            UnverifyLog unverifyLogEntity;

            if (selfUnverify)
            {
                unverifyLogEntity = await UnverifyLogger.LogSelfUnverifyAsync(profile, guild);
            }
            else
            {
                unverifyLogEntity = await UnverifyLogger.LogUnverifyAsync(profile, guild, fromUser);
            }

            try
            {
                if (mutedRole != null)
                {
                    await user.SetRoleAsync(mutedRole);
                }

                await user.RemoveRolesAsync(profile.RolesToRemove);

                foreach (var channelOverride in profile.ChannelsToRemove)
                {
                    var channel = guild.GetChannel(channelOverride.ChannelID);
                    await channel?.AddPermissionOverwriteAsync(user, new OverwritePermissions(viewChannel : PermValue.Deny));
                }

                var userEntity = await GrillBotRepository.UsersRepository.GetOrCreateUserAsync(guild.Id, user.Id, UsersIncludes.Unverify);

                userEntity.Unverify = new Database.Entity.Unverify.Unverify()
                {
                    DeserializedChannels = profile.ChannelsToRemove.ConvertAll(o => new ChannelOverride(o.ChannelID, o.Perms)),
                    DeserializedRoles    = profile.RolesToRemove.ConvertAll(o => o.Id),
                    EndDateTime          = profile.EndDateTime,
                    Reason          = profile.Reason,
                    StartDateTime   = profile.StartDateTime,
                    SetLogOperation = unverifyLogEntity
                };

                await GrillBotRepository.CommitAsync();

                Queue.Add(new UnverifyBackgroundTask(guild.Id, user.Id, profile.EndDateTime));

                var pmMessage = MessageGenerator.CreateUnverifyPMMessage(profile, guild);
                await user.SendPrivateMessageAsync(pmMessage);

                return(MessageGenerator.CreateUnverifyMessageToChannel(profile));
            }
            catch (Exception ex)
            {
                if (mutedRole != null)
                {
                    await user.RemoveRoleAsync(mutedRole);
                }

                await user.AddRolesAsync(profile.RolesToRemove);

                foreach (var channelOverride in profile.ChannelsToRemove)
                {
                    var channel = guild.GetChannel(channelOverride.ChannelID);

                    if (channel != null)
                    {
                        await channel.AddPermissionOverwriteAsync(user, channelOverride.Perms);
                    }
                }

                var errorMessage = new LogMessage(LogSeverity.Warning, nameof(UnverifyService), "An error occured when unverify removing access.", ex);
                await Logger.OnLogAsync(errorMessage);

                return(MessageGenerator.CreateUnverifyFailedToChannel(user));
            }
        }