diff --git a/backend/package-lock.json b/backend/package-lock.json index fe1ac44e..3c496965 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -14,7 +14,7 @@ "cors": "^2.8.5", "cross-env": "^5.2.0", "deep-diff": "^1.0.2", - "discord.js": "^13.0.0-dev.a08ce7d.1625097834", + "discord.js": "^13.0.0-dev.ab0b3b9.1625400166", "dotenv": "^4.0.0", "emoji-regex": "^8.0.0", "erlpack": "github:discord/erlpack", @@ -83,7 +83,7 @@ "dependencies": { "@discordjs/voice": "^0.5.1", "discord-api-types": "^0.18.1", - "discord.js": "^13.0.0-dev.a08ce7d.1625097834", + "discord.js": "^13.0.0-dev.ab0b3b9.1625400166", "knub-command-manager": "^9.1.0", "ts-essentials": "^6.0.7" }, @@ -162,9 +162,9 @@ } }, "node_modules/@discordjs/builders": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.1.1.tgz", - "integrity": "sha512-9eBC22bX2HBsob5ixMwZ6quy/vewU5GHuSJhpmSZ3cDGg8XPnrYdzbwI54U+V9kQBTa7M+aMu1lYVqMEPojj8A==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.2.0.tgz", + "integrity": "sha512-TVq7NZBCJrrTRc3CfxOr3IdgY5nrtqVxZ7qDUF1mN6LgxIiOldmFxsSwMrQBzLFVmOwqFyNLKCeblley8UpEuw==", "dependencies": { "discord-api-types": "^0.18.1", "tslib": "^2.3.0" @@ -2160,11 +2160,11 @@ } }, "node_modules/discord.js": { - "version": "13.0.0-dev.a08ce7d.1625097834", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.0.0-dev.a08ce7d.1625097834.tgz", - "integrity": "sha512-JqtGLMxXWKebpV8t4WV/kfCnTdkH4XCQceWcaYH3kZatXHiUNDzypv/Qgi5e8ioSeVKWMQzAaxg5Epm8bpOfZw==", + "version": "13.0.0-dev.ab0b3b9.1625400166", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.0.0-dev.ab0b3b9.1625400166.tgz", + "integrity": "sha512-nTdUyPEvy1OxCoSXVJrJDFMxEIEUr/NIpuf8x0gz0XTdrghDrGR756hX4KuqGT12fm9PpqciyT+52f7fkzIxCQ==", "dependencies": { - "@discordjs/builders": "^0.1.1", + "@discordjs/builders": "^0.2.0", "@discordjs/collection": "^0.1.6", "@discordjs/form-data": "^3.0.1", "@sapphire/async-queue": "^1.1.4", @@ -6438,9 +6438,9 @@ } }, "@discordjs/builders": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.1.1.tgz", - "integrity": "sha512-9eBC22bX2HBsob5ixMwZ6quy/vewU5GHuSJhpmSZ3cDGg8XPnrYdzbwI54U+V9kQBTa7M+aMu1lYVqMEPojj8A==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.2.0.tgz", + "integrity": "sha512-TVq7NZBCJrrTRc3CfxOr3IdgY5nrtqVxZ7qDUF1mN6LgxIiOldmFxsSwMrQBzLFVmOwqFyNLKCeblley8UpEuw==", "requires": { "discord-api-types": "^0.18.1", "tslib": "^2.3.0" @@ -8035,11 +8035,11 @@ "integrity": "sha512-hNC38R9ZF4uaujaZQtQfm5CdQO58uhdkoHQAVvMfIL0LgOSZeW575W8H6upngQOuoxWd8tiRII3LLJm9zuQKYg==" }, "discord.js": { - "version": "13.0.0-dev.a08ce7d.1625097834", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.0.0-dev.a08ce7d.1625097834.tgz", - "integrity": "sha512-JqtGLMxXWKebpV8t4WV/kfCnTdkH4XCQceWcaYH3kZatXHiUNDzypv/Qgi5e8ioSeVKWMQzAaxg5Epm8bpOfZw==", + "version": "13.0.0-dev.ab0b3b9.1625400166", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.0.0-dev.ab0b3b9.1625400166.tgz", + "integrity": "sha512-nTdUyPEvy1OxCoSXVJrJDFMxEIEUr/NIpuf8x0gz0XTdrghDrGR756hX4KuqGT12fm9PpqciyT+52f7fkzIxCQ==", "requires": { - "@discordjs/builders": "^0.1.1", + "@discordjs/builders": "^0.2.0", "@discordjs/collection": "^0.1.6", "@discordjs/form-data": "^3.0.1", "@sapphire/async-queue": "^1.1.4", @@ -8880,7 +8880,7 @@ "@typescript-eslint/parser": "^4.23.0", "chai": "^4.3.4", "discord-api-types": "^0.18.1", - "discord.js": "^13.0.0-dev.a08ce7d.1625097834", + "discord.js": "^13.0.0-dev.ab0b3b9.1625400166", "eslint": "^7.2.0", "husky": "^4.3.8", "knub-command-manager": "^9.1.0", diff --git a/backend/package.json b/backend/package.json index 68a57222..5b045bca 100644 --- a/backend/package.json +++ b/backend/package.json @@ -29,7 +29,7 @@ "cors": "^2.8.5", "cross-env": "^5.2.0", "deep-diff": "^1.0.2", - "discord.js": "^13.0.0-dev.a08ce7d.1625097834", + "discord.js": "^13.0.0-dev.ab0b3b9.1625400166", "dotenv": "^4.0.0", "emoji-regex": "^8.0.0", "erlpack": "github:discord/erlpack", diff --git a/backend/src/index.ts b/backend/src/index.ts index 560e5f45..83146fe2 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -263,8 +263,8 @@ connect().then(async () => { startUptimeCounter(); }); + bot.initialize(); + logger.info("Bot Initialized"); logger.info("Logging in..."); await client.login(process.env.token); - logger.info("Initializing the bot"); - bot.initialize(); }); diff --git a/backend/src/plugins/AutoReactions/events/AddReactionsEvt.ts b/backend/src/plugins/AutoReactions/events/AddReactionsEvt.ts index fc96efc6..7f868af1 100644 --- a/backend/src/plugins/AutoReactions/events/AddReactionsEvt.ts +++ b/backend/src/plugins/AutoReactions/events/AddReactionsEvt.ts @@ -10,7 +10,7 @@ import { autoReactionsEvt } from "../types"; const p = Permissions.FLAGS; export const AddReactionsEvt = autoReactionsEvt({ - event: "message", + event: "messageCreate", allowBots: true, allowSelf: true, diff --git a/backend/src/plugins/Cases/functions/getCaseEmbed.ts b/backend/src/plugins/Cases/functions/getCaseEmbed.ts index 90c051c5..93ee02ef 100644 --- a/backend/src/plugins/Cases/functions/getCaseEmbed.ts +++ b/backend/src/plugins/Cases/functions/getCaseEmbed.ts @@ -1,4 +1,4 @@ -import { MessageOptions } from "discord.js"; +import { MessageEditOptions, MessageOptions } from "discord.js"; import { GuildPluginData } from "knub"; import moment from "moment-timezone"; import { CaseTypes } from "../../../data/CaseTypes"; @@ -14,7 +14,7 @@ export async function getCaseEmbed( caseOrCaseId: Case | number, requestMemberId?: string, noOriginalCaseLink?: boolean, -): Promise { +): Promise { const theCase = await pluginData.state.cases.with("notes").find(resolveCaseId(caseOrCaseId)); if (!theCase) { throw new Error("Unknown case"); diff --git a/backend/src/plugins/CompanionChannels/functions/handleCompanionPermissions.ts b/backend/src/plugins/CompanionChannels/functions/handleCompanionPermissions.ts index de83899b..23131dfb 100644 --- a/backend/src/plugins/CompanionChannels/functions/handleCompanionPermissions.ts +++ b/backend/src/plugins/CompanionChannels/functions/handleCompanionPermissions.ts @@ -54,14 +54,14 @@ export async function handleCompanionPermissions( const channel = pluginData.guild.channels.cache.get(channelId as Snowflake); if (!channel || !(channel instanceof TextChannel)) continue; await channel.permissionOverwrites - .get(userId as Snowflake) + .resolve(userId as Snowflake) ?.delete(`Companion Channel for ${oldChannel!.id} | User Left`); } for (const [channelId, permissions] of permsToSet) { const channel = pluginData.guild.channels.cache.get(channelId as Snowflake); if (!channel || !(channel instanceof TextChannel)) continue; - await channel.updateOverwrite(userId, new Permissions(BigInt(permissions)).serialize(), { + await channel.permissionOverwrites.create(userId as Snowflake, new Permissions(BigInt(permissions)).serialize(), { reason: `Companion Channel for ${voiceChannel!.id} | User Joined`, }); } diff --git a/backend/src/plugins/CustomEvents/actions/addRoleAction.ts b/backend/src/plugins/CustomEvents/actions/addRoleAction.ts index b5549bce..d4f1b61a 100644 --- a/backend/src/plugins/CustomEvents/actions/addRoleAction.ts +++ b/backend/src/plugins/CustomEvents/actions/addRoleAction.ts @@ -1,3 +1,4 @@ +import { Snowflake } from "discord.js"; import * as t from "io-ts"; import { GuildPluginData } from "knub"; import { canActOn } from "../../../pluginUtils"; @@ -30,6 +31,6 @@ export async function addRoleAction( const rolesToAdd = Array.isArray(action.role) ? action.role : [action.role]; await target.edit({ - roles: Array.from(new Set([...target.roles.cache.array(), ...rolesToAdd])), + roles: Array.from(new Set([...target.roles.cache.array(), ...rolesToAdd])) as Snowflake[], }); } diff --git a/backend/src/plugins/CustomEvents/actions/setChannelPermissionOverrides.ts b/backend/src/plugins/CustomEvents/actions/setChannelPermissionOverrides.ts index e9497ed1..80acd61c 100644 --- a/backend/src/plugins/CustomEvents/actions/setChannelPermissionOverrides.ts +++ b/backend/src/plugins/CustomEvents/actions/setChannelPermissionOverrides.ts @@ -1,4 +1,4 @@ -import { Snowflake, TextChannel } from "discord.js"; +import { Permissions, Snowflake, TextChannel } from "discord.js"; import * as t from "io-ts"; import { GuildPluginData } from "knub"; import { ActionError } from "../ActionError"; @@ -31,9 +31,16 @@ export async function setChannelPermissionOverridesAction( } for (const override of action.overrides) { - await channel.overwritePermissions( + channel.permissionOverwrites.create( + override.id as Snowflake, + new Permissions(BigInt(override.allow)).add(BigInt(override.deny)).serialize(), + ); + + /* + await channel.permissionOverwrites overwritePermissions( [{ id: override.id, allow: BigInt(override.allow), deny: BigInt(override.deny), type: override.type }], `Custom event: ${event.name}`, ); + */ } } diff --git a/backend/src/plugins/MessageSaver/events/SaveMessagesEvts.ts b/backend/src/plugins/MessageSaver/events/SaveMessagesEvts.ts index c9b093cd..97f4fe6d 100644 --- a/backend/src/plugins/MessageSaver/events/SaveMessagesEvts.ts +++ b/backend/src/plugins/MessageSaver/events/SaveMessagesEvts.ts @@ -2,7 +2,7 @@ import { Message } from "discord.js"; import { messageSaverEvt } from "../types"; export const MessageCreateEvt = messageSaverEvt({ - event: "message", + event: "messageCreate", allowBots: true, allowSelf: true, diff --git a/backend/src/plugins/Mutes/commands/MutesCmd.ts b/backend/src/plugins/Mutes/commands/MutesCmd.ts index 666d6c94..207693ec 100644 --- a/backend/src/plugins/Mutes/commands/MutesCmd.ts +++ b/backend/src/plugins/Mutes/commands/MutesCmd.ts @@ -213,7 +213,7 @@ export const MutesCmd = mutesCmd({ await listMessage.edit({ components: [row] }); const filter = (iac: MessageComponentInteraction) => iac.message.id === listMessage.id; - const collector = listMessage.createMessageComponentInteractionCollector({ + const collector = listMessage.createMessageComponentCollector({ filter, time: stopCollectionDebounce, }); diff --git a/backend/src/plugins/Mutes/events/ReapplyActiveMuteOnJoinEvt.ts b/backend/src/plugins/Mutes/events/ReapplyActiveMuteOnJoinEvt.ts index a1a942fa..749d194a 100644 --- a/backend/src/plugins/Mutes/events/ReapplyActiveMuteOnJoinEvt.ts +++ b/backend/src/plugins/Mutes/events/ReapplyActiveMuteOnJoinEvt.ts @@ -1,3 +1,4 @@ +import { Snowflake } from "discord.js"; import { LogType } from "../../../data/LogType"; import { stripObjectToScalars } from "../../../utils"; import { memberRolesLock } from "../../../utils/lockNameHelpers"; @@ -15,7 +16,7 @@ export const ReapplyActiveMuteOnJoinEvt = mutesEvt({ if (muteRole) { const memberRoleLock = await pluginData.locks.acquire(memberRolesLock(member)); - await member.roles.add(muteRole); + await member.roles.add(muteRole as Snowflake); memberRoleLock.unlock(); } diff --git a/backend/src/plugins/Mutes/functions/clearExpiredMutes.ts b/backend/src/plugins/Mutes/functions/clearExpiredMutes.ts index 9217e1a2..efd6a2bd 100644 --- a/backend/src/plugins/Mutes/functions/clearExpiredMutes.ts +++ b/backend/src/plugins/Mutes/functions/clearExpiredMutes.ts @@ -16,7 +16,7 @@ export async function clearExpiredMutes(pluginData: GuildPluginData x.managed).map(y => y.id); newRoles = currentUserRoles.filter(r => !managedRoles.includes(r)); - await member.roles.set(newRoles); + await member.roles.set(newRoles as Snowflake[]); } } else { newRoles = currentUserRoles.filter(x => !(removeRoles).includes(x)); - await member.roles.set(newRoles); + await member.roles.set(newRoles as Snowflake[]); } // set roles to be restored @@ -88,7 +88,7 @@ export async function muteUser( // Apply mute role if it's missing if (!currentUserRoles.includes(muteRole as Snowflake)) { try { - await member.roles.add(muteRole); + await member.roles.add(muteRole as Snowflake); } catch (e) { const actualMuteRole = pluginData.guild.roles.cache.find(x => x.id === muteRole); if (!actualMuteRole) { diff --git a/backend/src/plugins/Mutes/functions/unmuteUser.ts b/backend/src/plugins/Mutes/functions/unmuteUser.ts index 437baf31..f1b35db8 100644 --- a/backend/src/plugins/Mutes/functions/unmuteUser.ts +++ b/backend/src/plugins/Mutes/functions/unmuteUser.ts @@ -37,7 +37,7 @@ export async function unmuteUser( const muteRole = pluginData.config.get().mute_role; if (muteRole && member.roles.cache.has(muteRole as Snowflake)) { - await member.roles.remove(muteRole); + await member.roles.remove(muteRole as Snowflake); } if (existingMute?.roles_to_restore) { const guildRoles = pluginData.guild.roles.cache; @@ -46,7 +46,7 @@ export async function unmuteUser( for (const toRestore of existingMute.roles_to_restore) { if (guildRoles.has(toRestore as Snowflake) && toRestore !== muteRole) newRoles.push(toRestore); } - await member.roles.set(newRoles); + await member.roles.set(newRoles as Snowflake[]); } lock.unlock(); diff --git a/backend/src/plugins/NameHistory/events/UpdateNameEvts.ts b/backend/src/plugins/NameHistory/events/UpdateNameEvts.ts index 706c93cc..c41e2cc9 100644 --- a/backend/src/plugins/NameHistory/events/UpdateNameEvts.ts +++ b/backend/src/plugins/NameHistory/events/UpdateNameEvts.ts @@ -15,7 +15,7 @@ export const ChannelJoinEvt = nameHistoryEvt({ }); export const MessageCreateEvt = nameHistoryEvt({ - event: "message", + event: "messageCreate", async listener(meta) { meta.pluginData.state.updateQueue.add(() => updateNickname(meta.pluginData, meta.args.message.member!)); diff --git a/backend/src/plugins/PingableRoles/events/ChangePingableEvts.ts b/backend/src/plugins/PingableRoles/events/ChangePingableEvts.ts index 23c4627c..8153f094 100644 --- a/backend/src/plugins/PingableRoles/events/ChangePingableEvts.ts +++ b/backend/src/plugins/PingableRoles/events/ChangePingableEvts.ts @@ -29,7 +29,7 @@ export const TypingEnablePingableEvt = pingableRolesEvt({ }); export const MessageCreateDisablePingableEvt = pingableRolesEvt({ - event: "message", + event: "messageCreate", async listener(meta) { const pluginData = meta.pluginData; diff --git a/backend/src/plugins/SelfGrantableRoles/commands/RoleAddCmd.ts b/backend/src/plugins/SelfGrantableRoles/commands/RoleAddCmd.ts index 9943a9bb..0568ea41 100644 --- a/backend/src/plugins/SelfGrantableRoles/commands/RoleAddCmd.ts +++ b/backend/src/plugins/SelfGrantableRoles/commands/RoleAddCmd.ts @@ -80,7 +80,7 @@ export const RoleAddCmd = selfGrantableRolesCmd({ try { await msg.member.edit({ - roles: Array.from(newRoleIds), + roles: Array.from(newRoleIds) as Snowflake[], }); } catch { sendErrorMessage( diff --git a/backend/src/plugins/Slowmode/util/applyBotSlowmodeToUserId.ts b/backend/src/plugins/Slowmode/util/applyBotSlowmodeToUserId.ts index 45f35d58..bcc32d55 100644 --- a/backend/src/plugins/Slowmode/util/applyBotSlowmodeToUserId.ts +++ b/backend/src/plugins/Slowmode/util/applyBotSlowmodeToUserId.ts @@ -11,16 +11,13 @@ export async function applyBotSlowmodeToUserId( userId: string, ) { // Deny sendMessage permission from the user. If there are existing permission overwrites, take those into account. - const existingOverride = channel.permissionOverwrites.get(userId as Snowflake); - const newDeniedPermissions = - (existingOverride ? existingOverride.deny.bitfield : 0n) | Permissions.FLAGS.SEND_MESSAGES; - const newAllowedPermissions = - (existingOverride ? existingOverride.allow.bitfield : 0n) & ~Permissions.FLAGS.SEND_MESSAGES; - + const existingOverride = channel.permissionOverwrites.resolve(userId as Snowflake); try { - await channel.overwritePermissions([ - { id: userId, allow: newAllowedPermissions, deny: newDeniedPermissions, type: "member" }, - ]); + if (existingOverride) { + await existingOverride.edit({ SEND_MESSAGES: false }); + } else { + await channel.permissionOverwrites.create(userId as Snowflake, { SEND_MESSAGES: false }, { type: 1 }); + } } catch (e) { const user = pluginData.client.users.fetch(userId as Snowflake) || new UnknownUser({ id: userId }); diff --git a/backend/src/plugins/Slowmode/util/clearBotSlowmodeFromUserId.ts b/backend/src/plugins/Slowmode/util/clearBotSlowmodeFromUserId.ts index c0943900..733a2cdd 100644 --- a/backend/src/plugins/Slowmode/util/clearBotSlowmodeFromUserId.ts +++ b/backend/src/plugins/Slowmode/util/clearBotSlowmodeFromUserId.ts @@ -13,7 +13,7 @@ export async function clearBotSlowmodeFromUserId( // Previously we diffed the overrides so we could clear the "send messages" override without touching other // overrides. Unfortunately, it seems that was a bit buggy - we didn't always receive the event for the changed // overrides and then we also couldn't diff against them. For consistency's sake, we just delete the override now. - await channel.permissionOverwrites.get(userId as Snowflake)?.delete(); + await channel.permissionOverwrites.resolve(userId as Snowflake)?.delete(); } catch (e) { if (!force) { throw e; diff --git a/backend/src/plugins/UsernameSaver/events/UpdateUsernameEvts.ts b/backend/src/plugins/UsernameSaver/events/UpdateUsernameEvts.ts index 10e134b9..093dbce7 100644 --- a/backend/src/plugins/UsernameSaver/events/UpdateUsernameEvts.ts +++ b/backend/src/plugins/UsernameSaver/events/UpdateUsernameEvts.ts @@ -2,7 +2,7 @@ import { usernameSaverEvt } from "../types"; import { updateUsername } from "../updateUsername"; export const MessageCreateUpdateUsernameEvt = usernameSaverEvt({ - event: "message", + event: "messageCreate", async listener(meta) { if (meta.args.message.author.bot) return; diff --git a/backend/src/plugins/Utility/search.ts b/backend/src/plugins/Utility/search.ts index f535539d..c4a78c15 100644 --- a/backend/src/plugins/Utility/search.ts +++ b/backend/src/plugins/Utility/search.ts @@ -198,7 +198,7 @@ export async function displaySearch( await searchMsg.edit({ content: result, components: [row] }); const filter = (iac: MessageComponentInteraction) => iac.message.id === searchMsg.id; - const collector = searchMsg.createMessageComponentInteractionCollector({ filter, time: 2 * MINUTES }); + const collector = searchMsg.createMessageComponentCollector({ filter, time: 2 * MINUTES }); collector.on("collect", async (interaction: MessageComponentInteraction) => { if (msg.author.id !== interaction.user.id) { diff --git a/backend/src/utils/createPaginatedMessage.ts b/backend/src/utils/createPaginatedMessage.ts index 66da9f0b..6bd6aae0 100644 --- a/backend/src/utils/createPaginatedMessage.ts +++ b/backend/src/utils/createPaginatedMessage.ts @@ -1,9 +1,18 @@ -import { Client, Message, MessageOptions, MessageReaction, PartialUser, TextChannel, User } from "discord.js"; +import { + Client, + Message, + MessageEditOptions, + MessageOptions, + MessageReaction, + PartialUser, + TextChannel, + User, +} from "discord.js"; import { Awaitable } from "knub/dist/utils"; import { MINUTES, noop } from "../utils"; import Timeout = NodeJS.Timeout; -export type LoadPageFn = (page: number) => Awaitable; +export type LoadPageFn = (page: number) => Awaitable; export interface PaginateMessageOpts { timeout: number; diff --git a/backend/src/utils/waitForInteraction.ts b/backend/src/utils/waitForInteraction.ts index 7e790436..d3ac1b7d 100644 --- a/backend/src/utils/waitForInteraction.ts +++ b/backend/src/utils/waitForInteraction.ts @@ -23,7 +23,7 @@ export async function waitForButtonConfirm( const message = await channel.send({ ...toPost, components: [row] }); const filter = (iac: MessageComponentInteraction) => iac.message.id === message.id; - const collector = message.createMessageComponentInteractionCollector({ filter, time: 10000 }); + const collector = message.createMessageComponentCollector({ filter, time: 10000 }); collector.on("collect", (interaction: MessageComponentInteraction) => { if (options?.restrictToId && options.restrictToId !== interaction.user.id) {