Skip to content

Commit

Permalink
check role hierarchy on all mod commands
Browse files Browse the repository at this point in the history
  • Loading branch information
Larsundso committed Dec 29, 2023
1 parent a328615 commit 9a22567
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 22 deletions.
2 changes: 1 addition & 1 deletion src/BaseClient/ClientHelperModules/mod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ export default async <T extends CT.ModTypes>(
cmd,
);
case CT.ModTypes.WarnAdd:
return mod.warnAdd();
return mod.warnAdd(options, language, message, cmd);
case CT.ModTypes.StrikeAdd:
return mod.strikeAdd(options, language, message, cmd);
case CT.ModTypes.SoftWarnAdd:
Expand Down
4 changes: 2 additions & 2 deletions src/BaseClient/ClientHelperModules/mod/mod/banRemove.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import * as Discord from 'discord.js';
import * as CT from '../../../../Typings/Typings.js';

import cache from '../../cache.js';
Expand All @@ -9,6 +8,7 @@ import { request } from '../../requestHandler.js';
import actionAlreadyApplied from '../actionAlreadyApplied.js';
import err from '../err.js';
import permissionError from '../permissionError.js';
import { canUnbanUser } from '../../requestHandler/guilds/unbanUser.js';

export default async (
options: CT.ModOptions<CT.ModTypes.BanRemove>,
Expand All @@ -21,7 +21,7 @@ export default async (
cache.bans.delete(options.guild.id, options.target.id);

const me = await getBotMemberFromGuild(options.guild);
if (!me.permissions.has(Discord.PermissionFlagsBits.BanMembers) && !options.skipChecks) {
if (!canUnbanUser(me) && !options.skipChecks) {
permissionError(cmd, message, language, type);
return false;
}
Expand Down
13 changes: 6 additions & 7 deletions src/BaseClient/ClientHelperModules/mod/mod/channelBanAdd.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import actionAlreadyApplied from '../actionAlreadyApplied.js';
import err from '../err.js';
import getMembers from '../getMembers.js';
import permissionError from '../permissionError.js';
import { canEdit } from '../../requestHandler/channels/edit.js';

export default async (
options: CT.ModOptions<CT.ModTypes.ChannelBanAdd>,
Expand Down Expand Up @@ -43,8 +44,10 @@ export default async (
return false;
}

const memberResponse = await getMembers(cmd, options, language, message, type);
if (!memberResponse) {
const memberRes = await getMembers(cmd, options, language, message, type);
if (memberRes && !memberRes.canExecute) return false;

if (!memberRes) {
const sticky = await DataBase.sticky.findUnique({ where: { guildid: options.guild.id } });
if (!sticky?.stickypermsactive) return false;

Expand Down Expand Up @@ -77,11 +80,7 @@ export default async (
}

const me = await getBotMemberFromGuild(options.guild);
if (
(!me.permissions.has(Discord.PermissionFlagsBits.ManageChannels) ||
!options.channel.permissionsFor(me).has(Discord.PermissionFlagsBits.ManageChannels)) &&
!options.skipChecks
) {
if (canEdit(options.channel, { permission_overwrites: [] }, me) && !options.skipChecks) {
permissionError(cmd, message, language, type);
return false;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,10 @@ export default async (

cache.channelBans.delete(options.guild.id, options.channel.id, options.target.id);

const memberResponse = await getMembers(cmd, options, language, message, type);
if (!memberResponse) {
const memberRes = await getMembers(cmd, options, language, message, type);
if (memberRes && !memberRes.canExecute) return false;

if (!memberRes) {
const sticky = await DataBase.sticky.findUnique({ where: { guildid: options.guild.id } });
if (!sticky?.stickypermsactive) return true;

Expand Down
25 changes: 17 additions & 8 deletions src/BaseClient/ClientHelperModules/mod/mod/kickAdd.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@ import type * as ModTypes from '../../mod.js';
import { request } from '../../requestHandler.js';

import actionAlreadyApplied from '../actionAlreadyApplied.js';
import getMembers from '../getMembers.js';
import err from '../err.js';
import permissionError from '../permissionError.js';
import { canRemoveMember } from '../../requestHandler/guilds/removeMember.js';

export default async (
options: CT.ModOptions<CT.ModTypes.KickAdd>,
Expand All @@ -17,20 +19,27 @@ export default async (
) => {
const type = CT.ModTypes.KickAdd;

const me = await getBotMemberFromGuild(options.guild);
if (!me.permissions.has(Discord.PermissionFlagsBits.KickMembers) && !options.skipChecks) {
permissionError(cmd, message, language, type);
const memberRes = await getMembers(cmd, options, language, message, type);
if (memberRes && !memberRes.canExecute) return false;

if (!memberRes?.targetMember && !options.skipChecks) {
actionAlreadyApplied(cmd, message, options.target, language, type);
return false;
}

const member = options.guild.members.cache.get(options.target.id);

if (!member && !options.skipChecks) {
actionAlreadyApplied(cmd, message, options.target, language, type);
const me = await getBotMemberFromGuild(options.guild);
if (
memberRes?.targetMember &&
canRemoveMember(me, memberRes.targetMember) &&
!options.skipChecks
) {
permissionError(cmd, message, language, type);
return false;
}

const res = member ? await request.guilds.removeMember(member, options.reason) : false;
const res = memberRes?.targetMember
? await request.guilds.removeMember(memberRes.targetMember, options.reason)
: false;
if (res && (res as Discord.DiscordAPIError).message) {
err(cmd, res as Discord.DiscordAPIError, language, message, options.guild);
return false;
Expand Down
8 changes: 7 additions & 1 deletion src/BaseClient/ClientHelperModules/mod/mod/strikeAdd.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import error from '../../error.js';
import type * as ModTypes from '../../mod.js';

import getStrike from '../getStrike.js';
import getMembers from '../getMembers.js';

import banAdd from './banAdd.js';
import channelBanAdd from './channelBanAdd.js';
Expand All @@ -26,6 +27,11 @@ export default async <T extends CT.ModTypes>(
const options = rawOpts as CT.ModOptions<T>;
const strike = await getStrike(options.target, options.guild);

const memberRes = await getMembers(cmd, options, language, message, CT.ModTypes.StrikeAdd);
if (memberRes && !memberRes.canExecute) {
return { success: false, type: CT.ModTypes.StrikeAdd, options: options as CT.ModOptions<T> };
}

if (!strike) {
cache.punishments.delete(options.target.id);
(await import(`../../mod.js`)).default(cmd, CT.ModTypes.WarnAdd, options, message);
Expand Down Expand Up @@ -105,7 +111,7 @@ export default async <T extends CT.ModTypes>(
};
}
case Prisma.$Enums.AutoPunishPunishmentType.warn:
return { success: warnAdd(), type: CT.ModTypes.WarnAdd, options };
return { success: warnAdd(options, language, message, cmd), type: CT.ModTypes.WarnAdd, options };
case Prisma.$Enums.AutoPunishPunishmentType.tempban: {
const opts = {
...options,
Expand Down
17 changes: 16 additions & 1 deletion src/BaseClient/ClientHelperModules/mod/mod/warnAdd.ts
Original file line number Diff line number Diff line change
@@ -1 +1,16 @@
export default async () => true;
import * as CT from '../../../../Typings/Typings.js';

import getMembers from '../getMembers.js';

import type * as ModTypes from '../../mod.js';

export default async (
options: CT.ModOptions<CT.ModTypes.WarnAdd>,
language: CT.Language,
message: ModTypes.ResponseMessage,
cmd: ModTypes.CmdType,
) => {
const memberRes = await getMembers(cmd, options, language, message, CT.ModTypes.WarnAdd);
if (memberRes && !memberRes.canExecute) return false;
return true;
};

0 comments on commit 9a22567

Please sign in to comment.