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.

Questions?Join the Fluxer community for help with the SDK.Join Fluxer