예제 #1
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);
            }
        }