Exemple #1
0
        public async Task <IRole> GetOrCreateDesignatedMuteRoleAsync(IGuild guild, ulong currentUserId)
        {
            using (var transaction = await DesignatedRoleMappingRepository.BeginCreateTransactionAsync())
            {
                var mapping = (await DesignatedRoleMappingRepository.SearchBriefsAsync(new DesignatedRoleMappingSearchCriteria()
                {
                    GuildId = guild.Id,
                    Type = DesignatedRoleType.ModerationMute,
                    IsDeleted = false
                })).FirstOrDefault();

                if (!(mapping is null))
                {
                    return(guild.Roles.First(x => x.Id == mapping.Role.Id));
                }

                var role = guild.Roles.FirstOrDefault(x => x.Name == MuteRoleName)
                           ?? await guild.CreateRoleAsync(MuteRoleName);

                await DesignatedRoleMappingRepository.CreateAsync(new DesignatedRoleMappingCreationData()
                {
                    GuildId     = guild.Id,
                    RoleId      = role.Id,
                    Type        = DesignatedRoleType.ModerationMute,
                    CreatedById = currentUserId
                });

                transaction.Commit();
                return(role);
            }
        }
        /// <inheritdoc />
        public async Task AddDesignatedRoleAsync(ulong guildId, ulong roleId, DesignatedRoleType type)
        {
            AuthorizationService.RequireAuthenticatedUser();
            AuthorizationService.RequireClaims(AuthorizationClaim.DesignatedRoleMappingCreate);

            using (var transaction = await DesignatedRoleMappingRepository.BeginCreateTransactionAsync())
            {
                if (await DesignatedRoleMappingRepository.AnyAsync(new DesignatedRoleMappingSearchCriteria()
                {
                    GuildId = guildId,
                    RoleId = roleId,
                    Type = type,
                    IsDeleted = false
                }))
                {
                    throw new InvalidOperationException($"Role {roleId} already has a {type} designation");
                }

                await DesignatedRoleMappingRepository.CreateAsync(new DesignatedRoleMappingCreationData()
                {
                    GuildId     = guildId,
                    RoleId      = roleId,
                    Type        = type,
                    CreatedById = AuthorizationService.CurrentUserId.Value
                });

                transaction.Commit();
            }
        }
Exemple #3
0
        /// <inheritdoc />
        public async Task UnConfigureGuildAsync(IGuild guild)
        {
            AuthorizationService.RequireAuthenticatedUser();
            AuthorizationService.RequireClaims(AuthorizationClaim.DesignatedRoleMappingDelete);

            using (var transaction = await DesignatedRoleMappingRepository.BeginDeleteTransactionAsync())
            {
                foreach (var mapping in await DesignatedRoleMappingRepository
                         .SearchBriefsAsync(new DesignatedRoleMappingSearchCriteria()
                {
                    GuildId = guild.Id,
                    Type = DesignatedRoleType.ModerationMute,
                    IsDeleted = false,
                }))
                {
                    await DesignatedRoleMappingRepository.TryDeleteAsync(mapping.Id, AuthorizationService.CurrentUserId.Value);

                    var role = guild.Roles.FirstOrDefault(x => x.Id == mapping.Role.Id);
                    if ((role != null) && (role.Name == MuteRoleName) && (role is IDeletable deletable))
                    {
                        await deletable.DeleteAsync();
                    }
                }

                transaction.Commit();
            }
        }
Exemple #4
0
 private async Task <IEnumerable <GuildRoleBrief> > GetRankRolesAsync(ulong guildId)
 => (await DesignatedRoleMappingRepository
     .SearchBriefsAsync(new DesignatedRoleMappingSearchCriteria
 {
     GuildId = guildId,
     Type = DesignatedRoleType.Rank,
     IsDeleted = false,
 }))
 .Select(r => r.Role);
Exemple #5
0
 private async Task <IEnumerable <GuildRoleBrief> > GetRankRolesAsync()
 => (await DesignatedRoleMappingRepository
     .SearchBriefsAsync(new DesignatedRoleMappingSearchCriteria
 {
     GuildId = AuthorizationService.CurrentGuildId,
     Type = DesignatedRoleType.Rank,
     IsDeleted = false,
 }))
 .Select(r => r.Role);
        /// <inheritdoc />
        public Task <IReadOnlyCollection <DesignatedRoleMappingBrief> > GetDesignatedRolesAsync(ulong guildId)
        {
            AuthorizationService.RequireClaims(AuthorizationClaim.DesignatedRoleMappingRead);

            return(DesignatedRoleMappingRepository.SearchBriefsAsync(new DesignatedRoleMappingSearchCriteria()
            {
                GuildId = guildId,
                IsDeleted = false
            }));
        }
 public Task <bool> RolesHaveDesignationAsync(
     ulong guildId,
     IReadOnlyCollection <ulong> roleIds,
     DesignatedRoleType designation,
     CancellationToken cancellationToken)
 => DesignatedRoleMappingRepository.AnyAsync(new DesignatedRoleMappingSearchCriteria()
 {
     GuildId   = guildId,
     RoleIds   = roleIds,
     IsDeleted = false,
     Type      = designation
 }, default);
 public Task <bool> RoleHasDesignationAsync(
     ulong guildId,
     ulong roleId,
     DesignatedRoleType designation,
     CancellationToken cancellationToken)
 => DesignatedRoleMappingRepository.AnyAsync(new DesignatedRoleMappingSearchCriteria
 {
     GuildId   = guildId,
     RoleId    = roleId,
     IsDeleted = false,
     Type      = designation
 }, default);
        private static (ModixContext, DesignatedRoleMappingRepository) BuildTestContext()
        {
            var modixContext = TestDataContextFactory.BuildTestDataContext(x =>
            {
                x.Set <UserEntity>().AddRange(Users.Entities.Clone());
                x.Set <GuildUserEntity>().AddRange(GuildUsers.Entities.Clone());
                x.Set <GuildRoleEntity>().AddRange(GuildRoles.Entities.Clone());
                x.Set <DesignatedRoleMappingEntity>().AddRange(DesignatedRoleMappings.Entities.Clone());
                x.Set <ConfigurationActionEntity>().AddRange(ConfigurationActions.Entities.Where(y => !(y.DesignatedRoleMappingId is null)).Clone());
            });

            var uut = new DesignatedRoleMappingRepository(modixContext);

            return(modixContext, uut);
        }
Exemple #10
0
        private async Task <IRole> GetDesignatedMuteRoleAsync(IGuild guild)
        {
            var mapping = (await DesignatedRoleMappingRepository.SearchBriefsAsync(new DesignatedRoleMappingSearchCriteria()
            {
                GuildId = guild.Id,
                Type = DesignatedRoleType.ModerationMute,
                IsDeleted = false
            })).FirstOrDefault();

            if (mapping == null)
            {
                throw new InvalidOperationException($"There are currently no designated mute roles within guild {guild.Id}");
            }

            return(guild.Roles.First(x => x.Id == mapping.Role.Id));
        }
Exemple #11
0
        /// <inheritdoc />
        public async Task RemoveDesignatedRoleByIdAsync(long id)
        {
            AuthorizationService.RequireClaims(AuthorizationClaim.DesignatedRoleMappingDelete);

            using (var transaction = await DesignatedRoleMappingRepository.BeginDeleteTransactionAsync())
            {
                var deletedCount = await DesignatedRoleMappingRepository.DeleteAsync(new DesignatedRoleMappingSearchCriteria()
                {
                    Id        = id,
                    IsDeleted = false
                }, AuthorizationService.CurrentUserId.Value);

                if (deletedCount == 0)
                {
                    throw new InvalidOperationException($"No role assignment exists with id {id}");
                }

                transaction.Commit();
            }
        }
Exemple #12
0
        /// <inheritdoc />
        public async Task RemoveDesignatedRoleAsync(ulong guildId, ulong roleId, DesignatedRoleType type)
        {
            AuthorizationService.RequireClaims(AuthorizationClaim.DesignatedRoleMappingDelete);

            using (var transaction = await DesignatedRoleMappingRepository.BeginDeleteTransactionAsync())
            {
                var deletedCount = await DesignatedRoleMappingRepository.DeleteAsync(new DesignatedRoleMappingSearchCriteria()
                {
                    GuildId   = guildId,
                    RoleId    = roleId,
                    Type      = type,
                    IsDeleted = false
                }, AuthorizationService.CurrentUserId.Value);

                if (deletedCount == 0)
                {
                    throw new InvalidOperationException($"Role {roleId} does not have a {type} designation");
                }

                transaction.Commit();
            }
        }
Exemple #13
0
        private async Task SetUpMentionableRoles(IGuild guild)
        {
            var mentionableRoleMappings = await DesignatedRoleMappingRepository.SearchBriefsAsync(new DesignatedRoleMappingSearchCriteria
            {
                GuildId   = guild.Id,
                Type      = DesignatedRoleType.RestrictedMentionability,
                IsDeleted = false
            });

            Log.Information("Roles with RestrictedMentionability are: {Roles}", mentionableRoleMappings.Select(d => d.Role.Name));

            //Get the actual roles that correspond to our mappings
            var mentionableRoles = mentionableRoleMappings
                                   .Join(guild.Roles, d => d.Role.Id, d => d.Id, (map, role) => role)
                                   .Where(d => d.IsMentionable);

            try
            {
                //Ensure all roles with restricted mentionability are not mentionable
                foreach (var role in mentionableRoles)
                {
                    Log.Information("Role @{Role} has RestrictedMentionability but was marked as Mentionable.", role.Name);
                    await role.ModifyAsync(d => d.Mentionable = false);

                    Log.Information("Role @{Role} was set to unmentionable.", role.Name);
                }
            }
            catch (HttpException ex)
            {
                var errorTemplate = "An exception was thrown when attempting to set up mention-restricted roles for {Guild}. " +
                                    "This is likely due to Modix not having the \"Manage Roles\" permission, or Modix's role being below one of " +
                                    "the mention-restricted roles in your server's Role list - please check your server settings.";

                Log.Error(ex, errorTemplate, guild.Name);
            }
        }
 /// <inheritdoc />
 public Task <IReadOnlyCollection <DesignatedRoleMappingBrief> > SearchDesignatedRolesAsync(DesignatedRoleMappingSearchCriteria searchCriteria)
 => DesignatedRoleMappingRepository.SearchBriefsAsync(searchCriteria);