Moderation
Ban, kick, timeout, and unban with permission checks.
Always check the moderator's permissions before calling guild moderation helpers. See Permissions. Cache helpers: member.kickable, member.bannable, member.moderatable (need guild.members.me).
Ban options are camelCase: reason, deleteMessageDays (0 to 7), banDurationSeconds. Prefer member.kick() / member.ban() / member.timeout(ms) when you already have a GuildMember. Guild helpers still take a user ID.
Member helpers
javascript
const member = message.member ?? await guild.fetchMember(userId);
await member.kick();
await member.ban({ reason: 'spam', deleteMessageDays: 1 });
await member.timeout(60_000, 'cool down');
await member.timeout(null);Ban
javascript
const userId = parseUserMention(target);
if (userId) {
await guild.ban(userId, {
reason: rest.join(' ') || undefined,
deleteMessageDays: 1,
});
await message.reply(`Banned <@${userId}>.`);
}Kick
javascript
const userId = parseUserMention(target);
if (userId) {
await guild.kick(userId);
await message.reply(`Kicked <@${userId}>.`);
}Unban
javascript
const userId = parseUserMention(target);
if (userId) {
await guild.unban(userId);
await message.reply(`Unbanned <@${userId}>.`);
}Skeleton with permission checks
javascript
import { Client, Events, PermissionFlags, parseUserMention } from '@fluxerjs/core';
const PREFIX = '!';
const client = new Client();
async function getModeratorPerms(message) {
const guild = await message.resolveGuild();
if (!guild) return null;
const member =
guild.members.get(message.author.id) ??
(await guild.fetchMember(message.author.id).catch(() => null));
return member?.permissions ?? null;
}
client.on(Events.MessageCreate, async (message) => {
if (message.author.bot || !message.content?.startsWith(PREFIX)) return;
const [cmd, target, ...rest] = message.content.slice(PREFIX.length).trim().split(/\s+/);
const perms = await getModeratorPerms(message);
if (!perms) return;
const guild = await message.resolveGuild();
if (!guild) return;
const canBan =
perms.has(PermissionFlags.BanMembers) || perms.has(PermissionFlags.Administrator);
const canKick =
perms.has(PermissionFlags.KickMembers) || perms.has(PermissionFlags.Administrator);
const canTimeout =
perms.has(PermissionFlags.ModerateMembers) || perms.has(PermissionFlags.Administrator);
if (cmd === 'ban' && canBan) {
const userId = parseUserMention(target);
if (userId) {
await guild.ban(userId, {
reason: rest.join(' ') || undefined,
deleteMessageDays: 1,
});
await message.reply(`Banned <@${userId}>.`);
}
}
if (cmd === 'kick' && canKick) {
const userId = parseUserMention(target);
if (userId) {
await guild.kick(userId);
await message.reply(`Kicked <@${userId}>.`);
}
}
if (cmd === 'timeout' && canTimeout) {
const userId = parseUserMention(target);
const member = userId ? await guild.members.resolve(userId).catch(() => null) : null;
if (member?.moderatable) {
await member.timeout(60_000, rest.join(' ') || 'cool down');
await message.reply(`Timed out <@${userId}> for 60s.`);
}
}
});
await client.login(process.env.FLUXER_BOT_TOKEN);Full bot with embeds and error mapping: moderation-bot. Error codes: Errors.