Ejemplo n.º 1
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));
            }
        }