Skip to content

Commit

Permalink
feat: added role guard
Browse files Browse the repository at this point in the history
- will only accept interactions from moderators or higher
  • Loading branch information
jonasschultheiss committed Sep 6, 2022
1 parent 37b7fb0 commit eaf37aa
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@ import {
SubCommand,
TransformedCommandExecutionContext,
UseFilters,
UseGuards,
UsePipes
} from '@discord-nestjs/core';
import { Logger } from '@nestjs/common';
import { DynamicRole } from '@prisma/client';
import { roleMention } from 'discord.js';
import { InteractionFromPermittedUserGuard } from 'src/bot/role.guard';
import { CommandValidationFilter } from '../../../filter/command-validation.filter';
import { PrismaExceptionFilter } from '../../../filter/prisma-exception.filter';
import { CreateDynamicRoleDto } from '../../dto/create-dynamic-role.dto';
Expand All @@ -21,6 +23,7 @@ import { DynamicRolesService } from '../../dynamic-roles.service';
})
@UsePipes(TransformPipe, ValidationPipe)
@UseFilters(CommandValidationFilter, PrismaExceptionFilter)
@UseGuards(InteractionFromPermittedUserGuard)
export class CreateDynamicRoleSubCommand implements DiscordTransformedCommand<CreateDynamicRoleDto> {
private readonly logger: Logger;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@ import {
SubCommand,
TransformedCommandExecutionContext,
UseFilters,
UseGuards,
UsePipes
} from '@discord-nestjs/core';
import { Logger } from '@nestjs/common';
import { PrismaNotFoundExceptionFilter } from 'src/bot/filter/prisma-not-found.filter';
import { InteractionFromPermittedUserGuard } from 'src/bot/role.guard';
import { CommandValidationFilter } from '../../../filter/command-validation.filter';
import { PrismaExceptionFilter } from '../../../filter/prisma-exception.filter';
import { DeleteDynamicRoleDto } from '../../dto/delete-dynamic-role.dto';
Expand All @@ -20,6 +22,7 @@ import { DynamicRolesService } from '../../dynamic-roles.service';
})
@UsePipes(TransformPipe, ValidationPipe)
@UseFilters(CommandValidationFilter, PrismaExceptionFilter, PrismaNotFoundExceptionFilter)
@UseGuards(InteractionFromPermittedUserGuard)
export class DeleteDynamicRoleSubCommand implements DiscordTransformedCommand<DeleteDynamicRoleDto> {
private readonly logger: Logger;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@ import {
SubCommand,
TransformedCommandExecutionContext,
UseFilters,
UseGuards,
UsePipes
} from '@discord-nestjs/core';
import { Logger } from '@nestjs/common';
import { roleMention } from 'discord.js';
import { PrismaNotFoundExceptionFilter } from 'src/bot/filter/prisma-not-found.filter';
import { InteractionFromPermittedUserGuard } from 'src/bot/role.guard';
import { CommandValidationFilter } from '../../../filter/command-validation.filter';
import { PrismaExceptionFilter } from '../../../filter/prisma-exception.filter';
import { UpdateDynamicRoleDto } from '../../dto/update-dynamic-role.dto';
Expand All @@ -21,6 +23,7 @@ import { DynamicRolesService } from '../../dynamic-roles.service';
})
@UsePipes(TransformPipe, ValidationPipe)
@UseFilters(CommandValidationFilter, PrismaExceptionFilter, PrismaNotFoundExceptionFilter)
@UseGuards(InteractionFromPermittedUserGuard)
export class UpdateDynamicRoleSubCommand implements DiscordTransformedCommand<UpdateDynamicRoleDto> {
private readonly logger: Logger;

Expand Down
13 changes: 13 additions & 0 deletions src/bot/role.guard.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { DiscordGuard } from '@discord-nestjs/core';
import { ConfigService } from '@nestjs/config';
import { GuildMemberRoleManager, Interaction } from 'discord.js';

export class InteractionFromPermittedUserGuard implements DiscordGuard {
constructor(private readonly configService: ConfigService) {}

async canActive(event: 'interactionCreate', [interaction]: [Interaction]): Promise<boolean> {
const roleManager = interaction.member.roles as GuildMemberRoleManager;
const modRole = await interaction.guild.roles.fetch(process.env.DISCORD_MOD_ROLE_ID);
return roleManager.member.roles.highest.position >= modRole.position;
}
}

0 comments on commit eaf37aa

Please sign in to comment.