public string CreateUnverifyMessageToChannel(UnverifyUserProfile profile)
        {
            var endDateTime = profile.EndDateTime.ToLocaleDatetime();
            var username    = profile.DestinationUser.GetFullName();

            return($"Dočasné odebrání přístupu pro uživatele **{username}** bylo dokončeno. Přístup bude navrácen **{endDateTime}**. Důvod: {profile.Reason}");
        }
        public async Task <UnverifyUserProfile> CreateProfileAsync(SocketGuildUser user, SocketGuild guild, string time, string data, bool isSelfunverify, List <string> toKeep,
                                                                   SocketRole mutedRole)
        {
            var result = new UnverifyUserProfile()
            {
                StartDateTime   = DateTime.Now,
                Reason          = ReasonParser.Parse(data),
                EndDateTime     = TimeParser.Parse(time),
                DestinationUser = user,
                IsSelfUnverify  = isSelfunverify
            };

            var selfUnverifyConfig = await GetSelfunverifyConfigAsync(guild);

            if (isSelfunverify && selfUnverifyConfig == null)
            {
                throw new InvalidOperationException("Neplatná konfigurace pro selfunverify");
            }

            if (toKeep != null && selfUnverifyConfig != null)
            {
                toKeep = toKeep.Select(o => o.ToLower()).Distinct().ToList();
                if (toKeep.Count > selfUnverifyConfig.MaxRolesToKeep)
                {
                    throw new ValidationException($"Lze si ponechat maximálně následující počet přístupů: {selfUnverifyConfig.MaxRolesToKeep}");
                }
            }

            await SetRolesAsync(result, user, guild, isSelfunverify, toKeep, selfUnverifyConfig, mutedRole);

            SetChannels(result, user, toKeep, selfUnverifyConfig);

            return(result);
        }
        private void SetChannels(UnverifyUserProfile profile, SocketGuildUser user, List <string> toKeep, SelfUnverifyConfig selfUnverifyConfig)
        {
            var channels = user.Guild.Channels
                           .Select(channel => new ChannelOverwrite(channel, channel.GetPermissionOverwrite(user)))
                           .Where(channel => channel.Permissions != null && (channel.AllowValue > 0 || channel.DenyValue > 0))
                           .ToList();

            profile.ChannelsToRemove.AddRange(channels);

            if (toKeep == null || selfUnverifyConfig == null)
            {
                return;
            }

            foreach (var itemToKeep in toKeep)
            {
                CheckDefinitions(selfUnverifyConfig, itemToKeep);
                var overwrite = profile.ChannelsToRemove.Find(o => o.Channel.Name.Equals(itemToKeep, StringComparison.InvariantCultureIgnoreCase));

                if (overwrite != null)
                {
                    profile.ChannelsToKeep.Add(overwrite);
                    profile.ChannelsToRemove.RemoveAll(o => o.Channel.Id == overwrite.Channel.Id);
                }
            }
        }
Esempio n. 4
0
        public async Task <UnverifyLog> LogSelfUnverifyAsync(UnverifyUserProfile profile, IGuild guild)
        {
            var data = UnverifyLogSet.FromProfile(profile);

            var userEntity = await GrillBotRepository.UsersRepository.GetOrCreateUserAsync(guild.Id, profile.DestinationUser.Id, UsersIncludes.None);

            await GrillBotRepository.CommitAsync();

            GrillBotRepository.Detach(userEntity);

            return(await SaveLogOperationAsync(UnverifyLogOperation.Selfunverify, data.ToJObject(), userEntity.ID, userEntity.ID));
        }
Esempio n. 5
0
 public static UnverifyLogSet FromProfile(UnverifyUserProfile profile)
 {
     return(new UnverifyLogSet()
     {
         ChannelsToKeep = profile.ChannelsToKeep,
         ChannelsToRemove = profile.ChannelsToRemove,
         EndDateTime = profile.EndDateTime,
         Reason = profile.Reason,
         RolesToKeep = profile.RolesToKeep.Select(o => o.Id).ToList(),
         RolesToRemove = profile.RolesToRemove.Select(o => o.Id).ToList(),
         StartDateTime = profile.StartDateTime
     });
 }
        private void FilterUnavailableRoles(UnverifyUserProfile profile, SocketRole mutedRole)
        {
            var unavailableRoles = profile.RolesToRemove.FindAll(o => o.IsEveryone || o.IsManaged);

            unavailableRoles.RemoveAll(o => o.IsEveryone); // Ignore everyone role.

            if (mutedRole != null)
            {
                unavailableRoles = unavailableRoles.FindAll(o => o.Id != mutedRole.Id);
            }

            profile.RolesToKeep.AddRange(unavailableRoles);
            profile.RolesToRemove.RemoveAll(o => o.IsEveryone || unavailableRoles.Any(x => x.Id == o.Id));
        }
        private async Task FilterHigherRolesIfSelfunverifyAsync(UnverifyUserProfile profile, bool isSelfunverify, SocketGuild guild)
        {
            if (!isSelfunverify)
            {
                return;
            }

            var botUser = await guild.GetUserFromGuildAsync(Discord.CurrentUser.Id);

            var botRolePosition = botUser.Roles.Max(o => o.Position);

            var rolesToKeep = profile.RolesToRemove.Where(o => o.Position >= botRolePosition).ToList();

            profile.RolesToKeep.AddRange(rolesToKeep);
            profile.RolesToRemove.RemoveAll(o => rolesToKeep.Any(x => x.Id == o.Id));
        }
        private async Task SetRolesAsync(UnverifyUserProfile profile, SocketGuildUser user, SocketGuild guild, bool selfUnverify, List <string> toKeep,
                                         SelfUnverifyConfig selfUnverifyConfig, SocketRole mutedRole)
        {
            profile.RolesToRemove.AddRange(user.Roles);

            await FilterHigherRolesIfSelfunverifyAsync(profile, selfUnverify, guild);

            FilterUnavailableRoles(profile, mutedRole);

            if (toKeep == null || selfUnverifyConfig == null)
            {
                return;
            }

            foreach (var toKeepItem in toKeep)
            {
                CheckDefinitions(selfUnverifyConfig, toKeepItem);
                var role = profile.RolesToRemove.Find(o => string.Equals(o.Name, toKeepItem, StringComparison.InvariantCultureIgnoreCase));

                if (role != null)
                {
                    profile.RolesToKeep.Add(role);
                    profile.RolesToRemove.Remove(role);

                    continue;
                }

                foreach (var group in selfUnverifyConfig.RolesToKeep)
                {
                    if (group.Value == null)
                    {
                        continue;
                    }

                    if (group.Value.Contains(toKeepItem))
                    {
                        var roleItem = profile.RolesToRemove.Find(o => string.Equals(o.Name, group.Key == "_" ? toKeepItem : group.Key, StringComparison.InvariantCultureIgnoreCase));

                        if (roleItem != null)
                        {
                            profile.RolesToKeep.Add(roleItem);
                            profile.RolesToRemove.Remove(roleItem);
                        }
                    }
                }
            }
        }
Esempio n. 9
0
        public UnverifyLogItem(UnverifyLog entity, DiscordSocketClient client)
        {
            var guild = client.GetGuild(entity.FromUser.GuildIDSnowflake);

            ID        = entity.ID;
            Operation = entity.Operation;
            DateTime  = entity.CreatedAt;
            FromUser  = guild.GetUserFromGuildAsync(entity.FromUser.UserIDSnowflake).Result;
            ToUser    = guild.GetUserFromGuildAsync(entity.ToUser.UserIDSnowflake).Result;

            switch (entity.Operation)
            {
            case UnverifyLogOperation.Autoremove:
            case UnverifyLogOperation.Remove:
            case UnverifyLogOperation.Recover:
                var removeLogData = entity.Json.ToObject <UnverifyLogRemove>();
                RemoveData = new UnverifyRemoveOperation()
                {
                    ReturnedChannels = removeLogData.ReturnedOverrides.Select(o => guild.GetChannel(o.ChannelID)).Where(o => o != null).ToList(),
                    ReturnedRoles    = removeLogData.ReturnedRoles.Select(o => guild.GetRole(o)).Where(o => o != null).ToList()
                };
                break;

            case UnverifyLogOperation.Selfunverify:
            case UnverifyLogOperation.Unverify:
                var logData = entity.Json.ToObject <UnverifyLogSet>();
                Profile = new UnverifyUserProfile()
                {
                    EndDateTime      = logData.EndDateTime,
                    Reason           = logData.Reason,
                    StartDateTime    = logData.StartDateTime,
                    ChannelsToKeep   = logData.ChannelsToKeep.Select(o => new ChannelOverwrite(guild.GetChannel(o.ChannelID), new OverwritePermissions(o.AllowValue, o.DenyValue))).Where(o => o.Channel != null).ToList(),
                    ChannelsToRemove = logData.ChannelsToRemove.Select(o => new ChannelOverwrite(guild.GetChannel(o.ChannelID), new OverwritePermissions(o.AllowValue, o.DenyValue))).Where(o => o.Channel != null).ToList(),
                    RolesToKeep      = logData.RolesToKeep.Select(o => guild.GetRole(o)).Where(o => o != null).ToList(),
                    RolesToRemove    = logData.RolesToRemove.Select(o => guild.GetRole(o)).Where(o => o != null).ToList()
                };
                break;

            case UnverifyLogOperation.Update:
                UpdateData = entity.Json.ToObject <UnverifyLogUpdate>();
                break;
            }
        }
Esempio n. 10
0
        public async Task <List <UnverifyInfo> > GetCurrentUnverifies(SocketGuild guild)
        {
            var usersWithUnverify = GrillBotRepository.UsersRepository.GetUsersWithUnverify(guild.Id);

            var result = new List <UnverifyInfo>();

            foreach (var userEntity in usersWithUnverify)
            {
                var user = await guild.GetUserFromGuildAsync(userEntity.UserIDSnowflake);

                var logData = userEntity.Unverify.SetLogOperation.Json.ToObject <UnverifyLogSet>();

                var profile = new UnverifyUserProfile()
                {
                    Reason          = userEntity.Unverify.Reason,
                    EndDateTime     = userEntity.Unverify.EndDateTime,
                    StartDateTime   = userEntity.Unverify.StartDateTime,
                    DestinationUser = user,
                    RolesToKeep     = logData.RolesToKeep.Select(o => guild.GetRole(o)).Where(o => o != null).ToList(),
                    RolesToRemove   = logData.RolesToRemove.Select(o => guild.GetRole(o)).Where(o => o != null).ToList(),
                    IsSelfUnverify  = userEntity.Unverify.SetLogOperation.Operation == UnverifyLogOperation.Selfunverify
                };

                profile.ChannelsToKeep = logData.ChannelsToKeep.Select(o => new ChannelOverwrite(guild.GetChannel(o.ChannelID), new OverwritePermissions(o.AllowValue, o.DenyValue)))
                                         .Where(o => o.Channel != null).ToList();

                profile.ChannelsToRemove = logData.ChannelsToRemove.Select(o => new ChannelOverwrite(guild.GetChannel(o.ChannelID), new OverwritePermissions(o.AllowValue, o.DenyValue)))
                                           .Where(o => o.Channel != null).ToList();

                result.Add(new UnverifyInfo()
                {
                    ID      = userEntity.ID,
                    Profile = profile
                });
            }

            return(result);
        }
Esempio n. 11
0
        public string CreateUnverifyPMMessage(UnverifyUserProfile profile, SocketGuild guild)
        {
            var endDateTime = profile.EndDateTime.ToLocaleDatetime();

            return($"Byly ti dočasně odebrány všechny práva na serveru **{guild.Name}**. Přístup ti bude navrácen **{endDateTime}**. Důvod: {profile.Reason}");
        }