Skip to content

Permissions

Check member permissions (guild-level and channel-specific), bot permissions via guild.members.me, owner override, and PermissionFlags.

Overview

Use member.permissions for guild-level checks (roles only) and member.permissionsIn(channel) for channel-specific permissions (includes overwrites). The server owner always has all permissions.

Guild-level permissions

member.permissions returns an object with has(permission). Use it for server-wide actions like ban, kick, manage roles.

javascript
import { Client, Events, PermissionFlags } from '@erinjs/core';

const client = new Client({ intents: 0 });

async function getMemberPerms(message) {
  const guild = message.guild ?? await message.client.guilds.resolve(message.guildId);
  if (!guild) return null;
  const member = guild.members.get(message.author.id) ?? await guild.fetchMember(message.author.id);
  return member?.permissions ?? null;
}

client.on(Events.MessageCreate, async (message) => {
  const perms = await getMemberPerms(message);
  if (!perms) return;

  if (perms.has(PermissionFlags.BanMembers)) {
    await message.reply('You can ban members.');
  }
  if (perms.has(PermissionFlags.Administrator)) {
    await message.reply('You have Administrator.');
  }
});

await client.login(process.env.ERIN_BOT_TOKEN);

Bot's own permissions (guild.members.me)

Discord.js Compatible

See API reference for full details.

Use guild.members.me to get the bot's GuildMember. Returns null if not cached. Use guild.members.fetchMe() to load it. Discord.js parity.

javascript
// Check if the bot can ban members in this guild
const guild = message.guild ?? await message.client.guilds.resolve(message.guildId);
const me = guild?.members.me ?? (guild ? await guild.members.fetchMe() : null);
if (me?.permissions.has(PermissionFlags.BanMembers)) {
  await message.reply('I have Ban Members permission.');
}

Editing the bot's guild profile (nickname)

Use guild.members.me.edit({ nick }) to change the bot's nickname in that guild. Pass nick: null to clear and show the username. Requires Change Nickname permission (or bot has Manage Nicknames). See examples/ping-bot.js for a !setnick command.

javascript
const guild = message.guild ?? await client.guilds.resolve(message.guildId);
const me = guild?.members.me ?? (guild ? await guild.members.fetchMe() : null);
if (me) {
  await me.edit({ nick: 'My Custom Nick' });
  await message.reply('Nickname updated!');
}
// Clear nickname (show username)
await me.edit({ nick: null });

Owner override

The guild owner automatically receives all permissions regardless of roles. No need to give the owner a role with Administrator.

javascript
// When the message author is the server owner:
const perms = member.permissions;
perms.has(PermissionFlags.BanMembers);  // true
perms.has(PermissionFlags.ManageRoles); // true
perms.has(PermissionFlags.Administrator); // true
// ... all permission flags return true for the owner

Channel-specific permissions

member.permissionsIn(channel) applies channel overwrites. Use it when checking if a user can send messages, read history, or connect to voice in a specific channel.

javascript
const channel = message.channel;
if (channel?.canSendMessage?.()) {
  const perms = member.permissionsIn(channel);
  if (perms.has(PermissionFlags.SendMessages)) {
    await channel.send('You can send here!');
  }
}

Managing roles

Create, fetch, edit, and delete roles with guild.createRole(), guild.fetchRoles(), guild.fetchRole(roleId), role.edit(), and role.delete(). Use resolvePermissionsToBitfield() for permission bitfields. See the Roles guide for full examples.

javascript
// Create a role with specific permissions
const role = await guild.createRole({
  name: 'Mod',
  permissions: ['KickMembers', 'BanMembers', 'ManageMessages'],
});

// Add/remove roles from members
await guild.addRoleToMember(userId, roleId);
await guild.removeRoleFromMember(userId, roleId);

PermissionFlags reference

Common flags: BanMembers, KickMembers, Administrator, ManageRoles, ManageChannels, ManageGuild, ViewAuditLog, ManageMessages, SendMessages, EmbedLinks, AttachFiles, ReadMessageHistory, MentionEveryone, Connect, Speak, MuteMembers, ModerateMembers, CreateExpressions, PinMessages, BypassSlowmode.

javascript
import { PermissionFlags } from '@erinjs/core';

// Check multiple
const canModerate = perms.has(PermissionFlags.BanMembers) || perms.has(PermissionFlags.Administrator);

// List all permissions the user has
const names = Object.keys(PermissionFlags).filter((name) =>
  perms.has(PermissionFlags[name])
);
await message.reply(`Your permissions: ${names.join(', ')}`);

Released under the Apache-2.0 License.