From afeb6beda015e1460542f1436053e7a27566ea9c Mon Sep 17 00:00:00 2001 From: "Ean Milligan (Bastion)" Date: Sat, 29 Apr 2023 04:29:15 -0400 Subject: [PATCH] Verify bot can dm users when they try to whitelist an event + deno fmt --- src/buttons/event-creation/step2-finalize.ts | 2 +- .../event-creation/step3-createEvent.ts | 23 ++++++++++++++++-- src/buttons/live-event/editActivity.ts | 22 ++++++++++------- src/buttons/live-event/toggleWLStatus.ts | 24 ++++++++++++++++--- src/commandUtils.ts | 8 +++++++ 5 files changed, 64 insertions(+), 15 deletions(-) diff --git a/src/buttons/event-creation/step2-finalize.ts b/src/buttons/event-creation/step2-finalize.ts index 8f10ff6..c4a035f 100644 --- a/src/buttons/event-creation/step2-finalize.ts +++ b/src/buttons/event-creation/step2-finalize.ts @@ -47,7 +47,7 @@ const execute = async (bot: Bot, interaction: Interaction) => { // Log custom event to see if we should add it as a preset if (customAct) { - dbClient.execute(queries.insertCustomActivity, [category, activity.name, activity.maxMembers]).catch((e) => utils.commonLoggers.dbError('step2-finalize.ts@custom', 'insert into', e)) + dbClient.execute(queries.insertCustomActivity, [category, activity.name, activity.maxMembers]).catch((e) => utils.commonLoggers.dbError('step2-finalize.ts@custom', 'insert into', e)); } const rawEventTime = tempDataMap.get(eventTimeId) || ''; diff --git a/src/buttons/event-creation/step3-createEvent.ts b/src/buttons/event-creation/step3-createEvent.ts index 1bfe610..b6fa5e3 100644 --- a/src/buttons/event-creation/step3-createEvent.ts +++ b/src/buttons/event-creation/step3-createEvent.ts @@ -1,8 +1,8 @@ -import { Bot, Interaction, InteractionResponseTypes, MessageComponentTypes } from '../../../deps.ts'; +import { ApplicationCommandFlags, Bot, Interaction, InteractionResponseTypes, MessageComponentTypes } from '../../../deps.ts'; import { generateLFGButtons } from './utils.ts'; import { idSeparator, LfgEmbedIndexes } from '../eventUtils.ts'; import { deleteTokenEarly } from '../tokenCleanup.ts'; -import { somethingWentWrong } from '../../commandUtils.ts'; +import { dmTestMessage, safelyDismissMsg, sendDirectMessage, somethingWentWrong, warnColor } from '../../commandUtils.ts'; import { dbClient, queries } from '../../db.ts'; import utils from '../../utils.ts'; @@ -23,6 +23,25 @@ const execute = async (bot: Bot, interaction: Interaction) => { const ownerId: bigint = BigInt(interaction.message.embeds[0].footer?.iconUrl?.split('#')[1] || '0'); const eventTime: Date = new Date(parseInt(interaction.message.embeds[0].fields[LfgEmbedIndexes.ICSLink].value.split('?t=')[1].split('&n=')[0] || '0')); + // Check if we need to ensure DMs are open + if (interaction.data.customId.includes(idSeparator)) { + const dmSuccess = Boolean(await sendDirectMessage(bot, interaction.member.id, dmTestMessage).catch((e: Error) => utils.commonLoggers.messageSendError('toggleWLStatus.ts', 'send DM fail', e))); + if (!dmSuccess) { + bot.helpers.sendInteractionResponse(interaction.id, interaction.token, { + type: InteractionResponseTypes.ChannelMessageWithSource, + data: { + flags: ApplicationCommandFlags.Ephemeral, + embeds: [{ + color: warnColor, + title: 'Event not created.', + description: `In order to create a whitelisted event, your DMs must be open to receive Join Requests. Please open your DMs and try again.\n\n${safelyDismissMsg}`, + }], + }, + }).catch((e: Error) => utils.commonLoggers.interactionSendError('toggleWLStatus.ts@dmFail', interaction, e)); + return; + } + } + // Send Event Message const eventMessage = await bot.helpers.sendMessage(interaction.channelId, { embeds: [interaction.message.embeds[0]], diff --git a/src/buttons/live-event/editActivity.ts b/src/buttons/live-event/editActivity.ts index 2389b88..9437993 100644 --- a/src/buttons/live-event/editActivity.ts +++ b/src/buttons/live-event/editActivity.ts @@ -76,8 +76,9 @@ const execute = async (bot: Bot, interaction: Interaction) => { embeds: [{ color: failColor, title: 'Invalid Max Member count!', - description: `${config.name} parsed the max members as \`${isNaN(activityMaxPlayers) ? 'Not a Number' : activityMaxPlayers - }\`, which is outside of the allowed range. Please re-edit this activity, but make sure the maximum player count is between 1 and 99.\n\n${safelyDismissMsg}`, + description: `${config.name} parsed the max members as \`${ + isNaN(activityMaxPlayers) ? 'Not a Number' : activityMaxPlayers + }\`, which is outside of the allowed range. Please re-edit this activity, but make sure the maximum player count is between 1 and 99.\n\n${safelyDismissMsg}`, }], }, }).catch((e: Error) => utils.commonLoggers.interactionSendError('editActivity.ts@invalidPlayer', interaction, e)); @@ -93,7 +94,9 @@ const execute = async (bot: Bot, interaction: Interaction) => { selectedActivity.maxMembers = activityMaxPlayers; // Log custom event to see if we should add it as a preset - dbClient.execute(queries.insertCustomActivity, [selectedCategory, selectedActivity.name, selectedActivity.maxMembers]).catch((e) => utils.commonLoggers.dbError('editActivity.ts@custom', 'insert into', e)) + dbClient.execute(queries.insertCustomActivity, [selectedCategory, selectedActivity.name, selectedActivity.maxMembers]).catch((e) => + utils.commonLoggers.dbError('editActivity.ts@custom', 'insert into', e) + ); } else { const rawIdxPath: Array = finalizedIdxPath.split(pathIdxSeparator); const idxPath: Array = rawIdxPath.map((rawIdx) => rawIdx ? parseInt(rawIdx) : -1); @@ -195,12 +198,13 @@ const execute = async (bot: Bot, interaction: Interaction) => { data: { embeds: [{ title: 'Please select a Game and Activity, or create a Custom Event.', - description: `Changing activity for [this event](${utils.idsToMessageUrl({ - guildId: interaction.guildId, - channelId: evtChannelId, - messageId: evtMessageId, - }) - }).\n\n${selfDestructMessage(new Date().getTime())}`, + description: `Changing activity for [this event](${ + utils.idsToMessageUrl({ + guildId: interaction.guildId, + channelId: evtChannelId, + messageId: evtMessageId, + }) + }).\n\n${selfDestructMessage(new Date().getTime())}`, color: infoColor1, }], flags: ApplicationCommandFlags.Ephemeral, diff --git a/src/buttons/live-event/toggleWLStatus.ts b/src/buttons/live-event/toggleWLStatus.ts index dca44fa..7a982d6 100644 --- a/src/buttons/live-event/toggleWLStatus.ts +++ b/src/buttons/live-event/toggleWLStatus.ts @@ -1,5 +1,5 @@ import { ApplicationCommandFlags, Bot, Interaction, InteractionResponseTypes, MessageComponentTypes } from '../../../deps.ts'; -import { safelyDismissMsg, somethingWentWrong, successColor } from '../../commandUtils.ts'; +import { dmTestMessage, safelyDismissMsg, sendDirectMessage, somethingWentWrong, successColor, warnColor } from '../../commandUtils.ts'; import { idSeparator, pathIdxEnder, pathIdxSeparator } from '../eventUtils.ts'; import { deleteTokenEarly } from '../tokenCleanup.ts'; import utils from '../../utils.ts'; @@ -15,7 +15,25 @@ const execute = async (bot: Bot, interaction: Interaction) => { dbClient.execute(queries.callIncCnt(makeWhitelisted ? 'btn-eeMakeWL' : 'btn-eeMakePublic')).catch((e) => utils.commonLoggers.dbError('toggleWLStatus.ts', 'call sproc INC_CNT on', e)); const [evtChannelId, evtMessageId] = (interaction.data.customId.replaceAll(pathIdxEnder, '').split(idSeparator)[1] || '').split(pathIdxSeparator).map((id) => BigInt(id || '0')); - // TODO: verify we can DM owner before applying update + // Check if we need to ensure DMs are open + if (makeWhitelisted) { + const dmSuccess = Boolean(await sendDirectMessage(bot, interaction.member.id, dmTestMessage).catch((e: Error) => utils.commonLoggers.messageSendError('toggleWLStatus.ts', 'send DM fail', e))); + if (!dmSuccess) { + bot.helpers.sendInteractionResponse(interaction.id, interaction.token, { + type: InteractionResponseTypes.ChannelMessageWithSource, + data: { + flags: ApplicationCommandFlags.Ephemeral, + embeds: [{ + color: warnColor, + title: 'Event not modified.', + description: `In order to turn the whitelist on, your DMs must be open to receive Join Requests. Please open your DMs and try again.\n\n${safelyDismissMsg}`, + }], + }, + }).catch((e: Error) => utils.commonLoggers.interactionSendError('toggleWLStatus.ts@dmFail', interaction, e)); + return; + } + } + bot.helpers.editMessage(evtChannelId, evtMessageId, { components: [{ type: MessageComponentTypes.ActionRow, @@ -32,7 +50,7 @@ const execute = async (bot: Bot, interaction: Interaction) => { description: `This event is now ${makeWhitelisted ? 'whitelisted, meaning you will have to approve join requests from all future members' : 'public'}.\n\n${safelyDismissMsg}`, }], }, - }).catch((e: Error) => utils.commonLoggers.interactionSendError('toggleWLStatus.ts', interaction, e)) + }).catch((e: Error) => utils.commonLoggers.interactionSendError('toggleWLStatus.ts@dmSuccess', interaction, e)) ).catch((e) => { utils.commonLoggers.messageEditError('toggleWLStatus.ts', 'toggleWLStatusFailed', e); somethingWentWrong(bot, interaction, 'editFailedInToggleWLStatusButton'); diff --git a/src/commandUtils.ts b/src/commandUtils.ts index 888ee7c..50e6226 100644 --- a/src/commandUtils.ts +++ b/src/commandUtils.ts @@ -80,3 +80,11 @@ Ran into a bug? Report it to my developers using \`/${reportSlashName} [issue d text: `Current Version: ${config.version}`, }, }; + +export const dmTestMessage: CreateMessage = { + embeds: [{ + color: infoColor2, + title: 'Heyo! Just making sure I can reach you.', + description: 'This message is just to make sure I can DM you any Join Requests to your event. If you are reading this message, it means you have everything set up correctly.', + }], +};