3
0
Fork 0
mirror of https://github.com/ZeppelinBot/Zeppelin.git synced 2025-03-16 14:11:50 +00:00

migrate permissions

Signed-off-by: GitHub <noreply@github.com>
This commit is contained in:
metal 2023-03-11 14:31:59 +00:00 committed by GitHub
parent 8281299369
commit fda9a35f29
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
23 changed files with 75 additions and 70 deletions

View file

@ -2,7 +2,6 @@ import { ApiPermissions } from "@shared/apiPermissions";
import { getRepository, Repository } from "typeorm"; import { getRepository, Repository } from "typeorm";
import { BaseRepository } from "./BaseRepository"; import { BaseRepository } from "./BaseRepository";
import { ApiPermissionAssignment } from "./entities/ApiPermissionAssignment"; import { ApiPermissionAssignment } from "./entities/ApiPermissionAssignment";
import { Permissions } from "discord.js";
import { ApiAuditLog } from "./ApiAuditLog"; import { ApiAuditLog } from "./ApiAuditLog";
import { AuditLogEventTypes } from "./apiAuditLogTypes"; import { AuditLogEventTypes } from "./apiAuditLogTypes";

View file

@ -1,4 +1,4 @@
import { Permissions, Snowflake, TextChannel } from "discord.js"; import { PermissionsBitField, Snowflake, TextChannel } from "discord.js";
import { GuildPluginData } from "knub"; import { GuildPluginData } from "knub";
import moment from "moment-timezone"; import moment from "moment-timezone";
import { channelToTemplateSafeChannel, userToTemplateSafeUser } from "../../../utils/templateSafeObjects"; import { channelToTemplateSafeChannel, userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
@ -26,7 +26,9 @@ export async function deleteNextItem(pluginData: GuildPluginData<AutoDeletePlugi
const logs = pluginData.getPlugin(LogsPlugin); const logs = pluginData.getPlugin(LogsPlugin);
const perms = channel.permissionsFor(pluginData.client.user!.id); const perms = channel.permissionsFor(pluginData.client.user!.id);
if (!hasDiscordPermissions(perms, Permissions.FLAGS.VIEW_CHANNEL | Permissions.FLAGS.READ_MESSAGE_HISTORY)) { if (
!hasDiscordPermissions(perms, PermissionsBitField.Flags.ViewChannel | PermissionsBitField.Flags.ReadMessageHistory)
) {
logs.logBotAlert({ logs.logBotAlert({
body: `Missing permissions to read messages or message history in auto-delete channel ${verboseChannelMention( body: `Missing permissions to read messages or message history in auto-delete channel ${verboseChannelMention(
channel, channel,
@ -35,7 +37,7 @@ export async function deleteNextItem(pluginData: GuildPluginData<AutoDeletePlugi
return; return;
} }
if (!hasDiscordPermissions(perms, Permissions.FLAGS.MANAGE_MESSAGES)) { if (!hasDiscordPermissions(perms, PermissionsBitField.Flags.ManageMessages)) {
logs.logBotAlert({ logs.logBotAlert({
body: `Missing permissions to delete messages in auto-delete channel ${verboseChannelMention(channel)}`, body: `Missing permissions to delete messages in auto-delete channel ${verboseChannelMention(channel)}`,
}); });

View file

@ -1,4 +1,4 @@
import { GuildChannel, Permissions } from "discord.js"; import { GuildChannel, PermissionsBitField } from "discord.js";
import { commandTypeHelpers as ct } from "../../../commandTypes"; import { commandTypeHelpers as ct } from "../../../commandTypes";
import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils";
import { canUseEmoji, customEmojiRegex, isEmoji } from "../../../utils"; import { canUseEmoji, customEmojiRegex, isEmoji } from "../../../utils";
@ -7,7 +7,7 @@ import { missingPermissionError } from "../../../utils/missingPermissionError";
import { readChannelPermissions } from "../../../utils/readChannelPermissions"; import { readChannelPermissions } from "../../../utils/readChannelPermissions";
import { autoReactionsCmd } from "../types"; import { autoReactionsCmd } from "../types";
const requiredPermissions = readChannelPermissions | Permissions.FLAGS.ADD_REACTIONS; const requiredPermissions = readChannelPermissions | PermissionsBitField.Flags.AddReactions;
export const NewAutoReactionsCmd = autoReactionsCmd({ export const NewAutoReactionsCmd = autoReactionsCmd({
trigger: "auto_reactions", trigger: "auto_reactions",

View file

@ -1,4 +1,4 @@
import { GuildChannel, GuildTextBasedChannel, Permissions } from "discord.js"; import { GuildChannel, GuildTextBasedChannel, PermissionsBitField } from "discord.js";
import { LogType } from "../../../data/LogType"; import { LogType } from "../../../data/LogType";
import { isDiscordAPIError } from "../../../utils"; import { isDiscordAPIError } from "../../../utils";
import { getMissingChannelPermissions } from "../../../utils/getMissingChannelPermissions"; import { getMissingChannelPermissions } from "../../../utils/getMissingChannelPermissions";
@ -8,7 +8,7 @@ import { LogsPlugin } from "../../Logs/LogsPlugin";
import { autoReactionsEvt } from "../types"; import { autoReactionsEvt } from "../types";
import { AutoReaction } from "../../../data/entities/AutoReaction"; import { AutoReaction } from "../../../data/entities/AutoReaction";
const p = Permissions.FLAGS; const p = PermissionsBitField.Flags;
export const AddReactionsEvt = autoReactionsEvt({ export const AddReactionsEvt = autoReactionsEvt({
event: "messageCreate", event: "messageCreate",
@ -40,7 +40,7 @@ export const AddReactionsEvt = autoReactionsEvt({
const me = pluginData.guild.members.cache.get(pluginData.client.user!.id)!; const me = pluginData.guild.members.cache.get(pluginData.client.user!.id)!;
if (me) { if (me) {
const missingPermissions = getMissingChannelPermissions(me, channel, readChannelPermissions | p.ADD_REACTIONS); const missingPermissions = getMissingChannelPermissions(me, channel, readChannelPermissions | p.AddReactions);
if (missingPermissions) { if (missingPermissions) {
const logs = pluginData.getPlugin(LogsPlugin); const logs = pluginData.getPlugin(LogsPlugin);
logs.logBotAlert({ logs.logBotAlert({

View file

@ -1,4 +1,4 @@
import { Permissions, Snowflake } from "discord.js"; import { PermissionsBitField, Snowflake } from "discord.js";
import * as t from "io-ts"; import * as t from "io-ts";
import { LogType } from "../../../data/LogType"; import { LogType } from "../../../data/LogType";
import { nonNullish, unique } from "../../../utils"; import { nonNullish, unique } from "../../../utils";
@ -10,7 +10,7 @@ import { LogsPlugin } from "../../Logs/LogsPlugin";
import { ignoreRoleChange } from "../functions/ignoredRoleChanges"; import { ignoreRoleChange } from "../functions/ignoredRoleChanges";
import { automodAction } from "../helpers"; import { automodAction } from "../helpers";
const p = Permissions.FLAGS; const p = PermissionsBitField.Flags;
export const AddRolesAction = automodAction({ export const AddRolesAction = automodAction({
configType: t.array(t.string), configType: t.array(t.string),
@ -20,7 +20,7 @@ export const AddRolesAction = automodAction({
const members = unique(contexts.map((c) => c.member).filter(nonNullish)); const members = unique(contexts.map((c) => c.member).filter(nonNullish));
const me = pluginData.guild.members.cache.get(pluginData.client.user!.id)!; const me = pluginData.guild.members.cache.get(pluginData.client.user!.id)!;
const missingPermissions = getMissingPermissions(me.permissions, p.MANAGE_ROLES); const missingPermissions = getMissingPermissions(me.permissions, p.ManageRoles);
if (missingPermissions) { if (missingPermissions) {
const logs = pluginData.getPlugin(LogsPlugin); const logs = pluginData.getPlugin(LogsPlugin);
logs.logBotAlert({ logs.logBotAlert({

View file

@ -1,4 +1,4 @@
import { Permissions, PermissionString } from "discord.js"; import { PermissionsBitField, PermissionsString } from "discord.js";
import * as t from "io-ts"; import * as t from "io-ts";
import { automodAction } from "../helpers"; import { automodAction } from "../helpers";
import { tNullable, isValidSnowflake, tPartialDictionary } from "../../../utils"; import { tNullable, isValidSnowflake, tPartialDictionary } from "../../../utils";
@ -14,7 +14,7 @@ export const ChangePermsAction = automodAction({
configType: t.type({ configType: t.type({
target: t.string, target: t.string,
channel: tNullable(t.string), channel: tNullable(t.string),
perms: tPartialDictionary(t.keyof(Permissions.FLAGS), tNullable(t.boolean)), perms: tPartialDictionary(t.keyof(PermissionsBitField.Flags), tNullable(t.boolean)),
}), }),
defaultConfig: {}, defaultConfig: {},
@ -52,9 +52,9 @@ export const ChangePermsAction = automodAction({
const channel = pluginData.guild.channels.resolve(channelId); const channel = pluginData.guild.channels.resolve(channelId);
if (!channel || channel.isThread()) return; if (!channel || channel.isThread()) return;
const overwrite = channel.permissionOverwrites.cache.find((pw) => pw.id === target); const overwrite = channel.permissionOverwrites.cache.find((pw) => pw.id === target);
const allow = new Permissions(overwrite?.allow ?? 0n).serialize(); const allow = new PermissionsBitField(overwrite?.allow ?? 0n).serialize();
const deny = new Permissions(overwrite?.deny ?? 0n).serialize(); const deny = new PermissionsBitField(overwrite?.deny ?? 0n).serialize();
const newPerms: Partial<Record<PermissionString, boolean | null>> = {}; const newPerms: Partial<Record<PermissionsString, boolean | null>> = {};
for (const key in allow) { for (const key in allow) {
if (typeof actionConfig.perms[key] !== "undefined") { if (typeof actionConfig.perms[key] !== "undefined") {
@ -86,11 +86,11 @@ export const ChangePermsAction = automodAction({
if (!role) return; if (!role) return;
const perms = new Permissions(role.permissions).serialize(); const perms = new PermissionsBitField(role.permissions).serialize();
for (const key in actionConfig.perms) { for (const key in actionConfig.perms) {
perms[key] = actionConfig.perms[key]; perms[key] = actionConfig.perms[key];
} }
const permsArray = <PermissionString[]>Object.keys(perms).filter((key) => perms[key]); const permsArray = <PermissionsString[]>Object.keys(perms).filter((key) => perms[key]);
await role.setPermissions(new Permissions(permsArray)).catch(noop); await role.setPermissions(new PermissionsBitField(permsArray)).catch(noop);
}, },
}); });

View file

@ -1,4 +1,4 @@
import { Permissions, Snowflake } from "discord.js"; import { PermissionsBitField, Snowflake } from "discord.js";
import * as t from "io-ts"; import * as t from "io-ts";
import { LogType } from "../../../data/LogType"; import { LogType } from "../../../data/LogType";
import { nonNullish, unique } from "../../../utils"; import { nonNullish, unique } from "../../../utils";
@ -10,7 +10,7 @@ import { LogsPlugin } from "../../Logs/LogsPlugin";
import { ignoreRoleChange } from "../functions/ignoredRoleChanges"; import { ignoreRoleChange } from "../functions/ignoredRoleChanges";
import { automodAction } from "../helpers"; import { automodAction } from "../helpers";
const p = Permissions.FLAGS; const p = PermissionsBitField.Flags;
export const RemoveRolesAction = automodAction({ export const RemoveRolesAction = automodAction({
configType: t.array(t.string), configType: t.array(t.string),
@ -21,7 +21,7 @@ export const RemoveRolesAction = automodAction({
const members = unique(contexts.map((c) => c.member).filter(nonNullish)); const members = unique(contexts.map((c) => c.member).filter(nonNullish));
const me = pluginData.guild.members.cache.get(pluginData.client.user!.id)!; const me = pluginData.guild.members.cache.get(pluginData.client.user!.id)!;
const missingPermissions = getMissingPermissions(me.permissions, p.MANAGE_ROLES); const missingPermissions = getMissingPermissions(me.permissions, p.ManageRoles);
if (missingPermissions) { if (missingPermissions) {
const logs = pluginData.getPlugin(LogsPlugin); const logs = pluginData.getPlugin(LogsPlugin);
logs.logBotAlert({ logs.logBotAlert({

View file

@ -1,4 +1,4 @@
import { MessageOptions, Permissions, Snowflake, TextChannel, ThreadChannel, User } from "discord.js"; import { MessageOptions, PermissionsBitField, Snowflake, TextChannel, ThreadChannel, User } from "discord.js";
import * as t from "io-ts"; import * as t from "io-ts";
import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects"; import { userToTemplateSafeUser } from "../../../utils/templateSafeObjects";
import { renderTemplate, TemplateSafeValueContainer } from "../../../templateFormatter"; import { renderTemplate, TemplateSafeValueContainer } from "../../../templateFormatter";
@ -72,7 +72,7 @@ export const ReplyAction = automodAction({
if ( if (
!hasDiscordPermissions( !hasDiscordPermissions(
channel.permissionsFor(pluginData.client.user!.id), channel.permissionsFor(pluginData.client.user!.id),
Permissions.FLAGS.SEND_MESSAGES | Permissions.FLAGS.VIEW_CHANNEL, PermissionsBitField.Flags.SendMessages | PermissionsBitField.Flags.ViewChannel,
) )
) { ) {
pluginData.getPlugin(LogsPlugin).logBotAlert({ pluginData.getPlugin(LogsPlugin).logBotAlert({
@ -84,7 +84,10 @@ export const ReplyAction = automodAction({
// If the message is an embed, check for embed permissions // If the message is an embed, check for embed permissions
if ( if (
typeof formatted !== "string" && typeof formatted !== "string" &&
!hasDiscordPermissions(channel.permissionsFor(pluginData.client.user!.id), Permissions.FLAGS.EMBED_LINKS) !hasDiscordPermissions(
channel.permissionsFor(pluginData.client.user!.id),
PermissionsBitField.Flags.EmbedLinks,
)
) { ) {
pluginData.getPlugin(LogsPlugin).logBotAlert({ pluginData.getPlugin(LogsPlugin).logBotAlert({
body: `Missing permissions to reply **with an embed** in ${verboseChannelMention( body: `Missing permissions to reply **with an embed** in ${verboseChannelMention(

View file

@ -1,4 +1,4 @@
import { Permissions, Snowflake, StageChannel, TextChannel, VoiceChannel } from "discord.js"; import { PermissionsBitField, Snowflake, StageChannel, TextChannel, VoiceChannel } from "discord.js";
import { GuildPluginData } from "knub"; import { GuildPluginData } from "knub";
import { LogType } from "../../../data/LogType"; import { LogType } from "../../../data/LogType";
import { isDiscordAPIError, MINUTES } from "../../../utils"; import { isDiscordAPIError, MINUTES } from "../../../utils";
@ -64,7 +64,7 @@ export async function handleCompanionPermissions(
const channel = pluginData.guild.channels.cache.get(channelId as Snowflake); const channel = pluginData.guild.channels.cache.get(channelId as Snowflake);
if (!channel || !(channel instanceof TextChannel)) continue; if (!channel || !(channel instanceof TextChannel)) continue;
pluginData.state.serverLogs.ignoreLog(LogType.CHANNEL_UPDATE, channelId, 3 * 1000); pluginData.state.serverLogs.ignoreLog(LogType.CHANNEL_UPDATE, channelId, 3 * 1000);
const fullSerialized = new Permissions(BigInt(permissions)).serialize(); const fullSerialized = new PermissionsBitField(BigInt(permissions)).serialize();
const onlyAllowed = filterObject(fullSerialized, (v) => v === true); const onlyAllowed = filterObject(fullSerialized, (v) => v === true);
await channel.permissionOverwrites.create(userId, onlyAllowed, { await channel.permissionOverwrites.create(userId, onlyAllowed, {
reason: `Companion Channel for ${voiceChannel!.id} | User Joined`, reason: `Companion Channel for ${voiceChannel!.id} | User Joined`,

View file

@ -1,4 +1,4 @@
import { Permissions, Snowflake, TextChannel, PermissionString } from "discord.js"; import { Snowflake, TextChannel, PermissionsString, PermissionsBitField } from "discord.js";
import * as t from "io-ts"; import * as t from "io-ts";
import { GuildPluginData } from "knub"; import { GuildPluginData } from "knub";
import { ActionError } from "../ActionError"; import { ActionError } from "../ActionError";
@ -32,9 +32,9 @@ export async function setChannelPermissionOverridesAction(
} }
for (const override of action.overrides) { for (const override of action.overrides) {
const allow = new Permissions(BigInt(override.allow)).serialize(); const allow = new PermissionsBitField(BigInt(override.allow)).serialize();
const deny = new Permissions(BigInt(override.deny)).serialize(); const deny = new PermissionsBitField(BigInt(override.deny)).serialize();
const perms: Partial<Record<PermissionString, boolean | null>> = {}; const perms: Partial<Record<PermissionsString, boolean | null>> = {};
for (const key in allow) { for (const key in allow) {
if (allow[key]) { if (allow[key]) {
perms[key] = true; perms[key] = true;

View file

@ -1,6 +1,6 @@
import { GuildPluginData } from "knub"; import { GuildPluginData } from "knub";
import { InternalPosterPluginType } from "../types"; import { InternalPosterPluginType } from "../types";
import { AnyChannel, GuildChannel, MessageManager, NewsChannel, Permissions, TextChannel } from "discord.js"; import { AnyChannel, GuildChannel, MessageManager, NewsChannel, PermissionsBitField, TextChannel } from "discord.js";
import { isDiscordAPIError } from "../../../utils"; import { isDiscordAPIError } from "../../../utils";
type WebhookInfo = [id: string, token: string]; type WebhookInfo = [id: string, token: string];
@ -27,7 +27,7 @@ export async function getOrCreateWebhookForChannel(
// Create new webhook // Create new webhook
const member = pluginData.client.user && pluginData.guild.members.cache.get(pluginData.client.user.id); const member = pluginData.client.user && pluginData.guild.members.cache.get(pluginData.client.user.id);
if (!member || member.permissions.has(Permissions.FLAGS.MANAGE_WEBHOOKS)) { if (!member || member.permissions.has(PermissionsBitField.Flags.ManageWebhooks)) {
try { try {
const webhook = await channel.createWebhook(`Zephook ${channel.id}`); const webhook = await channel.createWebhook(`Zephook ${channel.id}`);
await pluginData.state.webhooks.create({ await pluginData.state.webhooks.create({

View file

@ -1,4 +1,4 @@
import { Permissions, Snowflake, TextChannel } from "discord.js"; import { PermissionsBitField, Snowflake, TextChannel } from "discord.js";
import { LogType } from "../../../data/LogType"; import { LogType } from "../../../data/LogType";
import { resolveMember } from "../../../utils"; import { resolveMember } from "../../../utils";
import { hasDiscordPermissions } from "../../../utils/hasDiscordPermissions"; import { hasDiscordPermissions } from "../../../utils/hasDiscordPermissions";
@ -39,7 +39,7 @@ export const PostAlertOnMemberJoinEvt = modActionsEvt({
const botMember = await resolveMember(pluginData.client, pluginData.guild, pluginData.client.user!.id); const botMember = await resolveMember(pluginData.client, pluginData.guild, pluginData.client.user!.id);
const botPerms = alertChannel.permissionsFor(botMember ?? pluginData.client.user!.id); const botPerms = alertChannel.permissionsFor(botMember ?? pluginData.client.user!.id);
if (!hasDiscordPermissions(botPerms, Permissions.FLAGS.SEND_MESSAGES)) { if (!hasDiscordPermissions(botPerms, PermissionsBitField.Flags.SendMessages)) {
logs.logBotAlert({ logs.logBotAlert({
body: `Missing "Send Messages" permissions for the \`alert_channel\` configured in \`mod_actions\`: \`${alertChannelId}\``, body: `Missing "Send Messages" permissions for the \`alert_channel\` configured in \`mod_actions\`: \`${alertChannelId}\``,
}); });

View file

@ -1,4 +1,4 @@
import { Permissions, Snowflake } from "discord.js"; import { PermissionsBitField, Snowflake } from "discord.js";
import { GuildPluginData } from "knub"; import { GuildPluginData } from "knub";
import { LogType } from "../../../data/LogType"; import { LogType } from "../../../data/LogType";
import { isDiscordAPIError, isDiscordHTTPError, SECONDS, sleep } from "../../../utils"; import { isDiscordAPIError, isDiscordHTTPError, SECONDS, sleep } from "../../../utils";
@ -12,7 +12,7 @@ export async function isBanned(
timeout: number = 5 * SECONDS, timeout: number = 5 * SECONDS,
): Promise<boolean> { ): Promise<boolean> {
const botMember = pluginData.guild.members.cache.get(pluginData.client.user!.id); const botMember = pluginData.guild.members.cache.get(pluginData.client.user!.id);
if (botMember && !hasDiscordPermissions(botMember.permissions, Permissions.FLAGS.BAN_MEMBERS)) { if (botMember && !hasDiscordPermissions(botMember.permissions, PermissionsBitField.Flags.BanMembers)) {
pluginData.getPlugin(LogsPlugin).logBotAlert({ pluginData.getPlugin(LogsPlugin).logBotAlert({
body: `Missing "Ban Members" permission to check for existing bans`, body: `Missing "Ban Members" permission to check for existing bans`,
}); });

View file

@ -1,4 +1,4 @@
import { GuildMemberEditData, Permissions } from "discord.js"; import { GuildMemberEditData, PermissionsBitField } from "discord.js";
import intersection from "lodash.intersection"; import intersection from "lodash.intersection";
import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects"; import { memberToTemplateSafeMember } from "../../../utils/templateSafeObjects";
import { LogType } from "../../../data/LogType"; import { LogType } from "../../../data/LogType";
@ -9,7 +9,7 @@ import { missingPermissionError } from "../../../utils/missingPermissionError";
import { LogsPlugin } from "../../Logs/LogsPlugin"; import { LogsPlugin } from "../../Logs/LogsPlugin";
import { persistEvt } from "../types"; import { persistEvt } from "../types";
const p = Permissions.FLAGS; const p = PermissionsBitField.Flags;
export const LoadDataEvt = persistEvt({ export const LoadDataEvt = persistEvt({
event: "guildMemberAdd", event: "guildMemberAdd",
@ -33,8 +33,8 @@ export const LoadDataEvt = persistEvt({
// Check permissions // Check permissions
const me = pluginData.guild.members.cache.get(pluginData.client.user!.id)!; const me = pluginData.guild.members.cache.get(pluginData.client.user!.id)!;
let requiredPermissions = 0n; let requiredPermissions = 0n;
if (config.persist_nicknames) requiredPermissions |= p.MANAGE_NICKNAMES; if (config.persist_nicknames) requiredPermissions |= p.ManageNicknames;
if (config.persisted_roles) requiredPermissions |= p.MANAGE_ROLES; if (config.persisted_roles) requiredPermissions |= p.ManageRoles;
const missingPermissions = getMissingPermissions(me.permissions, requiredPermissions); const missingPermissions = getMissingPermissions(me.permissions, requiredPermissions);
if (missingPermissions) { if (missingPermissions) {
pluginData.getPlugin(LogsPlugin).logBotAlert({ pluginData.getPlugin(LogsPlugin).logBotAlert({

View file

@ -1,4 +1,4 @@
import { ChannelType, GuildTextBasedChannel, Permissions, TextChannel, ThreadChannel, Util } from "discord.js"; import { ChannelType, GuildTextBasedChannel, PermissionsBitField, TextChannel, ThreadChannel, Util } from "discord.js";
import humanizeDuration from "humanize-duration"; import humanizeDuration from "humanize-duration";
import { commandTypeHelpers as ct } from "../../../commandTypes"; import { commandTypeHelpers as ct } from "../../../commandTypes";
import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils"; import { sendErrorMessage, sendSuccessMessage } from "../../../pluginUtils";
@ -88,7 +88,7 @@ export const SlowmodeSetCmd = slowmodeCmd({
if (mode === "native") { if (mode === "native") {
const missingPermissions = getMissingPermissions( const missingPermissions = getMissingPermissions(
channelPermissions ?? new Permissions(), channelPermissions ?? new PermissionsBitField(),
NATIVE_SLOWMODE_PERMISSIONS, NATIVE_SLOWMODE_PERMISSIONS,
); );
if (missingPermissions) { if (missingPermissions) {
@ -103,7 +103,7 @@ export const SlowmodeSetCmd = slowmodeCmd({
if (mode === "bot") { if (mode === "bot") {
const missingPermissions = getMissingPermissions( const missingPermissions = getMissingPermissions(
channelPermissions ?? new Permissions(), channelPermissions ?? new PermissionsBitField(),
BOT_SLOWMODE_PERMISSIONS, BOT_SLOWMODE_PERMISSIONS,
); );
if (missingPermissions) { if (missingPermissions) {

View file

@ -1,8 +1,8 @@
import { Permissions } from "discord.js"; import { PermissionsBitField } from "discord.js";
const p = Permissions.FLAGS; const p = PermissionsBitField.Flags;
export const NATIVE_SLOWMODE_PERMISSIONS = p.VIEW_CHANNEL | p.MANAGE_CHANNELS; export const NATIVE_SLOWMODE_PERMISSIONS = p.ViewChannel | p.ManageChannels;
export const BOT_SLOWMODE_PERMISSIONS = p.VIEW_CHANNEL | p.MANAGE_ROLES | p.MANAGE_MESSAGES; export const BOT_SLOWMODE_PERMISSIONS = p.ViewChannel | p.ManageRoles | p.ManageMessages;
export const BOT_SLOWMODE_CLEAR_PERMISSIONS = p.VIEW_CHANNEL | p.MANAGE_ROLES; export const BOT_SLOWMODE_CLEAR_PERMISSIONS = p.ViewChannel | p.ManageRoles;
export const BOT_SLOWMODE_DISABLE_PERMISSIONS = p.VIEW_CHANNEL | p.MANAGE_ROLES; export const BOT_SLOWMODE_DISABLE_PERMISSIONS = p.ViewChannel | p.ManageRoles;

View file

@ -1,4 +1,4 @@
import { MessageEmbedOptions, Permissions, Role } from "discord.js"; import { MessageEmbedOptions, PermissionsBitField, Role } from "discord.js";
import humanizeDuration from "humanize-duration"; import humanizeDuration from "humanize-duration";
import { GuildPluginData } from "knub"; import { GuildPluginData } from "knub";
import moment from "moment-timezone"; import moment from "moment-timezone";
@ -36,8 +36,8 @@ export async function getRoleInfoEmbed(
round: true, round: true,
}); });
const rolePerms = role.permissions.has(Permissions.FLAGS.ADMINISTRATOR) const rolePerms = role.permissions.has(PermissionsBitField.Flags.Administrator)
? [PERMISSION_NAMES.ADMINISTRATOR] ? [PERMISSION_NAMES.Administrator]
: role.permissions.toArray().map((p) => PERMISSION_NAMES[p]); : role.permissions.toArray().map((p) => PERMISSION_NAMES[p]);
// -1 because of the @everyone role // -1 because of the @everyone role

View file

@ -4,7 +4,7 @@ import {
MessageActionRow, MessageActionRow,
MessageButton, MessageButton,
MessageComponentInteraction, MessageComponentInteraction,
Permissions, PermissionsBitField,
Snowflake, Snowflake,
TextChannel, TextChannel,
User, User,
@ -430,7 +430,7 @@ async function performBanSearch(
perPage = SEARCH_RESULTS_PER_PAGE, perPage = SEARCH_RESULTS_PER_PAGE,
): Promise<{ results: User[]; totalResults: number; page: number; lastPage: number; from: number; to: number }> { ): Promise<{ results: User[]; totalResults: number; page: number; lastPage: number; from: number; to: number }> {
const member = pluginData.guild.members.cache.get(pluginData.client.user!.id); const member = pluginData.guild.members.cache.get(pluginData.client.user!.id);
if (member && !hasDiscordPermissions(member.permissions, Permissions.FLAGS.BAN_MEMBERS)) { if (member && !hasDiscordPermissions(member.permissions, PermissionsBitField.Flags.BanMembers)) {
throw new SearchError(`Unable to search bans: missing "Ban Members" permission`); throw new SearchError(`Unable to search bans: missing "Ban Members" permission`);
} }

View file

@ -1,9 +1,9 @@
import { Guild, GuildMember, Permissions, Role, Snowflake } from "discord.js"; import { Guild, GuildMember, PermissionsBitField, Role, Snowflake } from "discord.js";
import { getMissingPermissions } from "./getMissingPermissions"; import { getMissingPermissions } from "./getMissingPermissions";
import { hasDiscordPermissions } from "./hasDiscordPermissions"; import { hasDiscordPermissions } from "./hasDiscordPermissions";
export function canAssignRole(guild: Guild, member: GuildMember, roleId: string) { export function canAssignRole(guild: Guild, member: GuildMember, roleId: string) {
if (getMissingPermissions(member.permissions, Permissions.FLAGS.MANAGE_ROLES)) { if (getMissingPermissions(member.permissions, PermissionsBitField.Flags.ManageRoles)) {
return false; return false;
} }
@ -18,7 +18,7 @@ export function canAssignRole(guild: Guild, member: GuildMember, roleId: string)
const memberRoles = member.roles.cache; const memberRoles = member.roles.cache;
const highestRoleWithManageRoles = memberRoles.reduce<Role | null>((highest, role) => { const highestRoleWithManageRoles = memberRoles.reduce<Role | null>((highest, role) => {
if (!hasDiscordPermissions(role.permissions, Permissions.FLAGS.MANAGE_ROLES)) return highest; if (!hasDiscordPermissions(role.permissions, PermissionsBitField.Flags.ManageRoles)) return highest;
if (highest == null) return role; if (highest == null) return role;
if (role.position > highest.position) return role; if (role.position > highest.position) return role;
return highest; return highest;

View file

@ -1,4 +1,4 @@
import { Permissions } from "discord.js"; import { PermissionsBitField } from "discord.js";
/** /**
* @param resolvedPermissions A Permission object from e.g. GuildChannel#permissionsFor() or Member#permission * @param resolvedPermissions A Permission object from e.g. GuildChannel#permissionsFor() or Member#permission
@ -6,13 +6,13 @@ import { Permissions } from "discord.js";
* @return Bitmask of missing permissions * @return Bitmask of missing permissions
*/ */
export function getMissingPermissions( export function getMissingPermissions(
resolvedPermissions: Permissions | Readonly<Permissions>, resolvedPermissions: PermissionsBitField | Readonly<PermissionsBitField>,
requiredPermissions: number | bigint, requiredPermissions: number | bigint,
): bigint { ): bigint {
const allowedPermissions = resolvedPermissions; const allowedPermissions = resolvedPermissions;
const nRequiredPermissions = requiredPermissions; const nRequiredPermissions = requiredPermissions;
if (Boolean(allowedPermissions.bitfield & Permissions.FLAGS.ADMINISTRATOR)) { if (Boolean(allowedPermissions.bitfield & PermissionsBitField.Flags.Administrator)) {
return BigInt(0); return BigInt(0);
} }

View file

@ -1,11 +1,11 @@
import { Permissions } from "discord.js"; import { PermissionsBitField } from "discord.js";
const permissionNumberToName: Map<bigint, string> = new Map(); const permissionNumberToName: Map<bigint, string> = new Map();
const ignoredPermissionConstants = ["all", "allGuild", "allText", "allVoice"]; const ignoredPermissionConstants = ["all", "allGuild", "allText", "allVoice"];
for (const key in Permissions.FLAGS) { for (const key in PermissionsBitField.Flags) {
if (ignoredPermissionConstants.includes(key)) continue; if (ignoredPermissionConstants.includes(key)) continue;
permissionNumberToName.set(BigInt(Permissions.FLAGS[key]), key); permissionNumberToName.set(BigInt(PermissionsBitField.Flags[key]), key);
} }
/** /**

View file

@ -1,18 +1,18 @@
import { Permissions, PermissionString } from "discord.js"; import { PermissionsBitField } from "discord.js";
/** /**
* @param resolvedPermissions A Permission object from e.g. GuildChannel#permissionsOf() or Member#permission * @param resolvedPermissions A Permission object from e.g. GuildChannel#permissionsOf() or Member#permission
* @param requiredPermissions Bitmask of required permissions * @param requiredPermissions Bitmask of required permissions
*/ */
export function hasDiscordPermissions( export function hasDiscordPermissions(
resolvedPermissions: Permissions | Readonly<Permissions> | null, resolvedPermissions: PermissionsBitField | Readonly<PermissionsBitField> | null,
requiredPermissions: number | bigint, requiredPermissions: number | bigint,
) { ) {
if (resolvedPermissions == null) { if (resolvedPermissions == null) {
return false; return false;
} }
if (resolvedPermissions.has(Permissions.FLAGS.ADMINISTRATOR)) { if (resolvedPermissions.has(PermissionsBitField.Flags.Administrator)) {
return true; return true;
} }

View file

@ -1,9 +1,10 @@
import { Permissions } from "discord.js"; import { PermissionsBitField } from "discord.js";
/** /**
* Bitmask of permissions required to read messages in a channel * Bitmask of permissions required to read messages in a channel
*/ */
export const readChannelPermissions = Permissions.FLAGS.VIEW_CHANNEL | Permissions.FLAGS.READ_MESSAGE_HISTORY; export const readChannelPermissions =
PermissionsBitField.Flags.ViewChannel | PermissionsBitField.Flags.ReadMessageHistory;
/** /**
* Bitmask of permissions required to read messages in a channel (bigint) * Bitmask of permissions required to read messages in a channel (bigint)