Added role based perm checks

This commit is contained in:
2025-08-21 16:53:24 +02:00
parent e06787dd80
commit 46da0ffb23
32 changed files with 84 additions and 14 deletions

View File

@@ -8,6 +8,7 @@ export default {
description: "Anime subcommands",
public: true,
dev: false,
requiredRole: "none",
data: new SlashCommandBuilder()
.setName("anime")

View File

@@ -9,6 +9,7 @@ export default {
description: "Ban a user",
dev: false,
public: false,
requiredRole: "admin",
data: new SlashCommandBuilder()
.setName("ban")
@@ -55,12 +56,6 @@ export default {
const mod = await interaction.guild!.members.fetch(interaction.user.id)
const memberRoles = member.roles.cache.map(role => role.id)
const modRoles = mod.roles.cache.map(role => role.id)
if (!modRoles.includes(admin)) {
await interaction.editReply("You do not have permission to use this command.")
return
}
if (interaction.guild!.members.me!.roles.highest.position <= member.roles.highest.position) {
await interaction.editReply("I cannot ban this member.")

View File

@@ -11,6 +11,7 @@ export default {
description: "Get information about the bot",
dev: false,
public: true,
requiredRole: "none",
data: new SlashCommandBuilder()
.setName("botinfo")

View File

@@ -10,6 +10,7 @@ export default {
description: "Check a player's stats.",
dev: false,
public: true,
requiredRole: "none",
data: new SlashCommandBuilder()
.setName("check")

View File

@@ -8,6 +8,7 @@ export default {
description: "Clears messages",
dev: false,
public: false,
requiredRole: "admin",
data: new SlashCommandBuilder()
.setName("clear")

View File

@@ -8,6 +8,7 @@ export default {
description: "Configure the bot",
dev: false,
public: false,
requiredRole: "superadmin",
data: new SlashCommandBuilder()
.setName("config")

View File

@@ -9,6 +9,7 @@ export default {
description: "Find a person by the ign",
dev: false,
public: false,
requiredRole: "helper",
data: new SlashCommandBuilder()
.setName("find")

View File

@@ -11,6 +11,7 @@ export default {
description: "Force unverify a user",
dev: false,
public: false,
requiredRole: "superadmin",
data: new SlashCommandBuilder()
.setName("forceunverify")

View File

@@ -12,6 +12,7 @@ export default {
description: "Force update the user",
dev: false,
public: false,
requiredRole: "helper",
data: new SlashCommandBuilder()
.setName("forceupdate")

View File

@@ -13,6 +13,7 @@ export default {
description: "Force verify a user.",
dev: false,
public: false,
requiredRole: "admin",
data: new SlashCommandBuilder()
.setName("forceverify")

View File

@@ -11,6 +11,7 @@ export default {
dev: false,
public: true,
subcommands: true,
requiredRole: "none",
data: new SlashCommandBuilder()
.setName("guild")

View File

@@ -7,6 +7,7 @@ export default {
description: "Help command",
dev: false,
public: true,
requiredRole: "none",
data: new SlashCommandBuilder()
.setName("help")

View File

@@ -9,6 +9,7 @@ export default {
description: "Kick a member from the server.",
dev: false,
public: false,
requiredRole: "helper",
data: new SlashCommandBuilder()
.setName("kick")
@@ -34,12 +35,6 @@ export default {
const reason = interaction.options.getString("reason") ?? "No reason provided."
const mod = await interaction.guild!.members.fetch(interaction.user.id)
const memberRoles = member.roles.cache.map(role => role.id)
const modRoles = mod.roles.cache.map(role => role.id)
if (!modRoles.includes(helper) && !modRoles.includes(admin)) {
await interaction.editReply("You do not have permission to use this command.")
return
}
if (member.id === interaction.applicationId) {
await interaction.editReply("I cannot kick myself.")

View File

@@ -7,6 +7,7 @@ export default {
description: "Get the bot's ping.",
dev: false,
public: true,
requiredRole: "none",
data: new SlashCommandBuilder()
.setName("ping")

View File

@@ -8,6 +8,7 @@ export default {
description: "Shows pp size",
public: true,
dev: false,
requiredRole: "none",
data: new SlashCommandBuilder()
.setName("pp")

View File

@@ -10,6 +10,7 @@ export default {
description: "Remove a person on the waiting list.",
dev: false,
public: false,
requiredRole: "helper",
data: new SlashCommandBuilder()
.setName("remove")

View File

@@ -8,6 +8,7 @@ export default {
description: "Displays the requirements for the guild.",
dev: false,
public: true,
requiredRole: "none",
data: new SlashCommandBuilder()
.setName("reqs")

View File

@@ -7,6 +7,7 @@ export default {
description: "Send a message to a channel.",
dev: false,
public: false,
requiredRole: "superadmin",
data: new SlashCommandBuilder()
.setName("send")

View File

@@ -8,6 +8,7 @@ export default {
description: "Set your nickname",
dev: false,
public: false,
requiredRole: "admin",
data: new SlashCommandBuilder()
.setName("setnick")

View File

@@ -15,9 +15,10 @@ import { ICommand } from "~/typings"
export default {
name: "setup",
description: "Used for setup of the bot.",
dev: true,
dev: false,
public: false,
subcommands: true,
requiredRole: "superadmin",
data: new SlashCommandBuilder()
.setName("setup")

View File

@@ -17,6 +17,7 @@ export default {
description: "Set the slowmode of a channel.",
dev: false,
public: false,
requiredRole: "admin",
data: new SlashCommandBuilder()
.setName("slowmode")

View File

@@ -13,6 +13,7 @@ export default {
dev: false,
public: false,
subcommands: true,
requiredRole: "helper",
data: new SlashCommandBuilder()
.setName("staff")

View File

@@ -10,6 +10,7 @@ export default {
description: "Times out a memeber",
dev: false,
public: false,
requiredRole: "helper",
data: new SlashCommandBuilder()
.setName("timeout")

View File

@@ -9,6 +9,7 @@ export default {
description: "Unban a user from the server",
dev: false,
public: false,
requiredRole: "admin",
data: new SlashCommandBuilder()
.setName("unban")

View File

@@ -12,6 +12,7 @@ export default {
description: "Update your guild rank.",
dev: false,
public: true,
requiredRole: "none",
data: new SlashCommandBuilder()
.setName("update")

View File

@@ -9,6 +9,7 @@ export default {
description: "Get a player's UUID",
dev: false,
public: true,
requiredRole: "none",
data: new SlashCommandBuilder()
.setName("uuid")

View File

@@ -12,6 +12,7 @@ export default {
description: "Verify yourself as a member of the server.",
dev: false,
public: true,
requiredRole: "none",
data: new SlashCommandBuilder()
.setName("verify")

View File

@@ -9,6 +9,7 @@ export default {
description: "Get your user info",
public: true,
dev: false,
requiredRole: "none",
data: new SlashCommandBuilder()
.setName("whoami")

View File

@@ -9,6 +9,7 @@ export default {
description: "Get's the ign of a user.",
dev: false,
public: false,
requiredRole: "helper",
data: new SlashCommandBuilder()
.setName("whois")

View File

@@ -16,6 +16,7 @@ export interface ICommand {
dev?: boolean
public: boolean
subcommands?: boolean
requiredRole?: "none" | "helper" | "admin" | "superadmin"
data: SlashCommandBuilder
execute: (arg: { interaction: ChatInputCommandInteraction, client: ExtendedClient }) => Promise<void>
}

View File

@@ -1,10 +1,11 @@
import { Events, MessageFlags } from "discord.js"
import { Events, GuildMember, MessageFlags } from "discord.js"
import fs from "fs"
import path from "path"
import { embedColor } from "~/config/options"
import { ICommand, LoadEventsOptions } from "~/typings"
import { ExtendedClient as Client } from "~/utils/Client"
import logToChannel from "~/utils/Functions/logtochannel"
import { isAdmin, isHelper, isSuperAdmin } from "../Functions/staff"
import tryCatch from "../Functions/trycatch"
import { log } from "../Logger"
@@ -33,6 +34,43 @@ export default async function loadSlashCommandsEvents(client: Client, { ft, dir
return
}
if (!command.requiredRole && !isSuperAdmin(interaction.member as GuildMember)) {
await interaction.reply({
content: "You do not have permission to use this command.",
flags: MessageFlags.Ephemeral
})
return
}
switch (command.requiredRole) {
case "superadmin":
if (!isSuperAdmin(interaction.member as GuildMember)) {
await interaction.reply({
content: "You do not have permission to use this command.",
flags: MessageFlags.Ephemeral
})
}
break
case "admin":
if (!isAdmin(interaction.member as GuildMember)) {
await interaction.reply({
content: "You do not have permission to use this command.",
flags: MessageFlags.Ephemeral
})
}
break
case "helper":
if (!isHelper(interaction.member as GuildMember)) {
await interaction.reply({
content: "You do not have permission to use this command.",
flags: MessageFlags.Ephemeral
})
}
break
case "none":
break
}
const [error] = await tryCatch(command.execute({ interaction, client }))
if (!error) return

View File

@@ -0,0 +1,14 @@
import { GuildMember, PermissionFlagsBits } from "discord.js"
import { admin, helper } from "~/config/roles"
export function isSuperAdmin(member: GuildMember) {
return member.permissions.has(PermissionFlagsBits.Administrator)
}
export function isAdmin(member: GuildMember) {
return member.roles.cache.has(admin) || member.permissions.has(PermissionFlagsBits.Administrator)
}
export function isHelper(member: GuildMember) {
return member.roles.cache.has(helper) || member.roles.cache.has(admin) || member.permissions.has(PermissionFlagsBits.Administrator)
}