diff --git a/helpers/messages/getMessage.ts b/helpers/messages/getMessage.ts index 1cc0e7c3c..e8e736cc9 100644 --- a/helpers/messages/getMessage.ts +++ b/helpers/messages/getMessage.ts @@ -9,5 +9,8 @@ export async function getMessage(bot: Bot, channelId: bigint, id: bigint) { bot.constants.routes.CHANNEL_MESSAGE(channelId, id), ); + // If the message does not exist + if (!result?.id) return; + return bot.transformers.message(bot, result); } diff --git a/helpers/messages/getMessages.ts b/helpers/messages/getMessages.ts index 8dc3c9088..93968914e 100644 --- a/helpers/messages/getMessages.ts +++ b/helpers/messages/getMessages.ts @@ -1,5 +1,6 @@ import type { Bot } from "../../bot.ts"; import { DiscordMessage } from "../../types/discord.ts"; +import { Collection } from "../../util/collection.ts"; import { hasProperty } from "../../util/utils.ts"; /** Fetches between 2-100 messages. Requires VIEW_CHANNEL and READ_MESSAGE_HISTORY */ @@ -18,7 +19,10 @@ export async function getMessages( bot.constants.routes.CHANNEL_MESSAGES(channelId, options), ); - return await Promise.all(result.map((res) => bot.transformers.message(bot, res))); + return new Collection(result.map((res) => { + const msg = bot.transformers.message(bot, res); + return [msg.id, msg]; + })); } /** https://discord.com/developers/docs/resources/channel#get-channel-messages-query-string-params */ diff --git a/tests/mod.ts b/tests/mod.ts index 54bf3a275..0975c690b 100644 --- a/tests/mod.ts +++ b/tests/mod.ts @@ -1,19 +1,7 @@ import enableCachePlugin from "../plugins/cache/mod.ts"; import { ChannelTypes, createBot, createEventHandlers, startBot } from "../mod.ts"; import { assertEquals, assertExists, dotenv } from "./deps.ts"; -import { deleteMessageWithoutReasonTest, deleteMessageWithReasonTest } from "./helpers/messages/deleteMessage.ts"; -import { getMessagesTest } from "./helpers/messages/getMessages.ts"; -import { deleteMessagesWithoutReasonTest, deleteMessagesWithReasonTest } from "./helpers/messages/deleteMessages.ts"; import { delayUntil } from "./utils.ts"; -import { - sendMessageWithComponents, - sendMessageWithEmbedsTest, - sendMessageWithTextTest, -} from "./helpers/messages/sendMessage.ts"; -import { getMessageTest } from "./helpers/messages/getMessage.ts"; -import { editMessageTest } from "./helpers/messages/editMessage.ts"; -import { pinMessageTests } from "./helpers/messages/pin.ts"; -import { categoryChildrenTest } from "./helpers/channels/categoryChannels.ts"; import { deleteChannelOverwriteTests } from "./helpers/channels/deleteChannelOverwrite.ts"; import { editChannelTests } from "./helpers/channels/editChannel.ts"; import { CACHED_COMMUNITY_GUILD_ID, sanitizeMode } from "./constants.ts"; @@ -99,100 +87,6 @@ export const message = await bot.helpers.sendMessage(channel.id, { content: "Hello Skillz", }); -Deno.test({ - name: "[message] send message with text", - fn: async (t) => { - await sendMessageWithTextTest(channel.id); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[message] send message with embeds", - fn: async (t) => { - await sendMessageWithEmbedsTest(channel.id); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[message] send message with components", - fn: async (t) => { - await sendMessageWithComponents(channel.id); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[message] edit message", - fn: async (t) => { - await editMessageTest(channel.id); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[message] delete message without a reason", - fn: async (t) => { - await deleteMessageWithoutReasonTest(channel.id); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[message] delete message with a reason", - fn: async (t) => { - await deleteMessageWithReasonTest(channel.id); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[message] delete messages without a reason", - fn: async (t) => { - await deleteMessagesWithoutReasonTest(channel.id); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[message] delete messages with a reason", - fn: async (t) => { - await deleteMessagesWithReasonTest(channel.id); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[message] fetch a message", - fn: async (t) => { - await getMessageTest(channel.id); - }, - ...sanitizeMode, -}); -Deno.test({ - name: "[message] fetch messages", - fn: async (t) => { - await getMessagesTest(channel.id); - }, - ...sanitizeMode, -}); - -Deno.test({ - name: "[message] pin a message", - fn: async (t) => { - await pinMessageTests(channel.id, message.id); - }, - ...sanitizeMode, -}); - -Deno.test({ - name: "[channel] send message with text", - fn: async (t) => { - await sendMessageWithTextTest(channel.id); - }, - ...sanitizeMode, -}); - -Deno.test({ - name: "[channel] filter all category channels", - async fn(t) { - await categoryChildrenTest(guild.id); - }, - ...sanitizeMode, -}); Deno.test({ name: "[channel] delete a channel overwrite", async fn(t) { diff --git a/testss/channels/messages/message.test.ts b/testss/channels/messages/message.test.ts index a23e643e0..9c80bb88b 100644 --- a/testss/channels/messages/message.test.ts +++ b/testss/channels/messages/message.test.ts @@ -1,4 +1,4 @@ -import { ChannelTypes } from "../../../mod.ts"; +import { ButtonStyles, ChannelTypes, MessageComponentTypes } from "../../../mod.ts"; import { assertEquals, assertExists, assertNotEquals } from "../../deps.ts"; import { loadBot } from "../../mod.ts"; import { CACHED_COMMUNITY_GUILD_ID } from "../../utils.ts"; @@ -24,86 +24,267 @@ Deno.test({ assertEquals(message.content, "Hello Skillz"); }); + // Send a message with embeds + await t.step("[message] Send a message with embeds", async () => { + const message = await bot.helpers.sendMessage(channel.id, { + content: "Hello Skillz", + embeds: [ + { + title: "Deno", + description: "Deno is a modern web platform for building the web.", + url: "https://deno.land/", + color: 0x00ff00, + fields: [ + { + name: "Deno", + value: "Deno is a modern web platform for building the web.", + inline: true, + }, + { + name: "Deno", + value: "Deno is a modern web platform for building the web.", + inline: true, + }, + ], + footer: { + text: "Deno", + iconUrl: "https://deno.land/favicon.ico", + }, + image: { + url: "https://deno.land/favicon.ico", + }, + thumbnail: { + url: "https://deno.land/favicon.ico", + }, + }, + ], + }); + assertExists(message.id); + assertEquals(message.content, "Hello Skillz"); + assertEquals(message.embeds.length, 1); + assertEquals(message.embeds[0].title, "Deno"); + assertEquals(message.embeds[0].description, "Deno is a modern web platform for building the web."); + assertEquals(message.embeds[0].url, "https://deno.land/"); + assertEquals(message.embeds[0].color, 0x00ff00); + assertEquals(message.embeds[0].fields?.length, 2); + assertEquals(message.embeds[0].fields?.[0].name, "Deno"); + assertEquals(message.embeds[0].fields?.[0].value, "Deno is a modern web platform for building the web."); + assertEquals(message.embeds[0].fields?.[0].inline, true); + assertEquals(message.embeds[0].fields?.[1].name, "Deno"); + assertEquals(message.embeds[0].fields?.[1].value, "Deno is a modern web platform for building the web."); + assertEquals(message.embeds[0].fields?.[1].inline, true); + assertEquals(message.embeds[0].footer?.text, "Deno"); + assertEquals(message.embeds[0].footer?.iconUrl, "https://deno.land/favicon.ico"); + assertEquals(message.embeds[0].image?.url, "https://deno.land/favicon.ico"); + assertEquals(message.embeds[0].thumbnail?.url, "https://deno.land/favicon.ico"); + }); + + // Send a message with components + await t.step("[message] Send a message with components", async () => { + const message = await bot.helpers.sendMessage(channel.id, { + content: "Hello Skillz", + components: [ + { + type: MessageComponentTypes.ActionRow, + components: [ + { + type: MessageComponentTypes.Button, + label: "Doc", + style: ButtonStyles.Link, + url: `https://discordeno.mod.land/`, + }, + { + type: MessageComponentTypes.Button, + label: "Server", + style: ButtonStyles.Link, + url: `https://discord.gg/ddeno`, + }, + ], + }, + { + type: MessageComponentTypes.ActionRow, + components: [ + { + type: MessageComponentTypes.Button, + label: "Hi", + customId: `hi`, + style: ButtonStyles.Primary, + }, + ], + }, + ], + }); + assertExists(message.id); + assertEquals(message.content, "Hello Skillz"); + assertEquals(message.components?.length, 2); + assertEquals(message.components?.[0].type, MessageComponentTypes.ActionRow); + assertEquals(message.components?.[0].components?.length, 2); + assertEquals(message.components?.[0].components?.[0].type, MessageComponentTypes.Button); + assertEquals(message.components?.[0].components?.[0].label, "Doc"); + assertEquals(message.components?.[0].components?.[0].style, ButtonStyles.Link); + assertEquals(message.components?.[0].components?.[0].url, `https://discordeno.mod.land/`); + assertEquals(message.components?.[0].components?.[1].type, MessageComponentTypes.Button); + assertEquals(message.components?.[0].components?.[1].label, "Server"); + assertEquals(message.components?.[0].components?.[1].style, ButtonStyles.Link); + assertEquals(message.components?.[0].components?.[1].url, `https://discord.gg/ddeno`); + assertEquals(message.components?.[1].type, MessageComponentTypes.ActionRow); + assertEquals(message.components?.[1].components?.length, 1); + assertEquals(message.components?.[1].components?.[0].type, MessageComponentTypes.Button); + assertEquals(message.components?.[1].components?.[0].label, "Hi"); + assertEquals(message.components?.[1].components?.[0].customId, `hi`); + assertEquals(message.components?.[1].components?.[0].style, ButtonStyles.Primary); + }); + + // Edit the message + await t.step("[message] Edit the message", async () => { + const message = await bot.helpers.sendMessage(channel.id, { + content: "Hello Skillz", + }); + assertExists(message.id); + assertEquals(message.content, "Hello Skillz"); + const editedMessage = await bot.helpers.editMessage(channel.id, message.id, { + content: "Hello Skillz 2", + embeds: [ + { + title: "Deno", + description: "Deno is a modern web platform for building the web.", + }, + ], + }); + + assertEquals(editedMessage.content, "Hello Skillz 2"); + assertEquals(editedMessage.embeds.length, 1); + assertEquals(editedMessage.embeds[0].title, "Deno"); + assertEquals(editedMessage.embeds[0].description, "Deno is a modern web platform for building the web."); + }); + + // Delete the message with a reason + await t.step("[message] Delete the message with a reason", async () => { + const message = await bot.helpers.sendMessage(channel.id, { + content: "Hello Skillz", + }); + assertExists(message.id); + assertEquals(message.content, "Hello Skillz"); + + await bot.helpers.deleteMessage(channel.id, message.id, "Test"); + const deletedMessage = await bot.helpers.getMessage(channel.id, message.id); + assertEquals(deletedMessage, undefined); + }); + + // Delete the message without a reason + await t.step("[message] Delete the message with a reason", async () => { + const message = await bot.helpers.sendMessage(channel.id, { + content: "Hello Skillz", + }); + assertExists(message.id); + assertEquals(message.content, "Hello Skillz"); + + await bot.helpers.deleteMessage(channel.id, message.id); + const deletedMessage = await bot.helpers.getMessage(channel.id, message.id); + assertEquals(deletedMessage, undefined); + }); + + // Bulk delete messages with a reason + await t.step("[message] Bulk delete messages with a reason", async () => { + const message1 = await bot.helpers.sendMessage(channel.id, { + content: "Hello Skillz", + }); + assertExists(message1.id); + assertEquals(message1.content, "Hello Skillz"); + + const message2 = await bot.helpers.sendMessage(channel.id, { + content: "Hello Skillz 2", + }); + assertExists(message2.id); + assertEquals(message2.content, "Hello Skillz 2"); + + await bot.helpers.deleteMessages(channel.id, [message1.id, message2.id], "Test"); + const deletedMessage1 = await bot.helpers.getMessage(channel.id, message1.id); + assertEquals(deletedMessage1, undefined); + const deletedMessage2 = await bot.helpers.getMessage(channel.id, message2.id); + assertEquals(deletedMessage2, undefined); + }); + + // Bulk delete messages without a reason + await t.step("[message] Bulk delete messages without a reason", async () => { + const message1 = await bot.helpers.sendMessage(channel.id, { + content: "Hello Skillz", + }); + assertExists(message1.id); + assertEquals(message1.content, "Hello Skillz"); + + const message2 = await bot.helpers.sendMessage(channel.id, { + content: "Hello Skillz 2", + }); + assertExists(message2.id); + assertEquals(message2.content, "Hello Skillz 2"); + + await bot.helpers.deleteMessages(channel.id, [message1.id, message2.id]); + const deletedMessage1 = await bot.helpers.getMessage(channel.id, message1.id); + assertEquals(deletedMessage1, undefined); + const deletedMessage2 = await bot.helpers.getMessage(channel.id, message2.id); + assertEquals(deletedMessage2, undefined); + }); + + // Get a message + await t.step("[message] Get a message", async () => { + const message = await bot.helpers.sendMessage(channel.id, { + content: "Hello Skillz", + }); + assertExists(message.id); + assertEquals(message.content, "Hello Skillz"); + + const getMessage = await bot.helpers.getMessage(channel.id, message.id); + assertExists(getMessage); + assertEquals(getMessage.content, message.content); + assertEquals(getMessage.id, message.id); + }); + + // Pin a message + await t.step("[message] Pin a message", async (t) => { + const message = await bot.helpers.sendMessage(channel.id, { + content: "Hello Skillz", + }); + assertExists(message.id); + assertEquals(message.content, "Hello Skillz"); + + await bot.helpers.pinMessage(channel.id, message.id); + const pinnedMessages = await bot.helpers.getPins(channel.id); + assertEquals(pinnedMessages.length, 1); + assertEquals(pinnedMessages[0].content, message.content); + assertEquals(pinnedMessages[0].id, message.id); + + // Unpin a message + await t.step("[message] Unpin a message", async () => { + await bot.helpers.unpinMessage(channel.id, message.id); + const pinnedMessages = await bot.helpers.getPins(channel.id); + assertEquals(pinnedMessages.length, 0); + }); + }); + + // Fetch multiple messages + await t.step("[message] Fetch multiple messages", async () => { + const message1 = await bot.helpers.sendMessage(channel.id, { + content: "Hello Skillz", + }); + assertExists(message1.id); + assertEquals(message1.content, "Hello Skillz"); + + const message2 = await bot.helpers.sendMessage(channel.id, { + content: "Hello Skillz 2", + }); + assertExists(message2.id); + assertEquals(message2.content, "Hello Skillz 2"); + + const messages = await bot.helpers.getMessages(channel.id, { + limit: 2, + }); + assertEquals(messages.size, 2); + assertEquals(messages.get(message1.id)?.content, message1.content); + assertEquals(messages.get(message2.id)?.content, message2.content); + }); + // Delete the channel once test is done await bot.helpers.deleteChannel(channel.id); }, }); - -// Deno.test({ -// name: "[message] send message with text", -// fn: async (t) => { -// await sendMessageWithTextTest(channel.id); -// }, -// ...sanitizeMode, -// }); -// Deno.test({ -// name: "[message] send message with embeds", -// fn: async (t) => { -// await sendMessageWithEmbedsTest(channel.id); -// }, -// ...sanitizeMode, -// }); -// Deno.test({ -// name: "[message] send message with components", -// fn: async (t) => { -// await sendMessageWithComponents(channel.id); -// }, -// ...sanitizeMode, -// }); -// Deno.test({ -// name: "[message] edit message", -// fn: async (t) => { -// await editMessageTest(channel.id); -// }, -// ...sanitizeMode, -// }); -// Deno.test({ -// name: "[message] delete message without a reason", -// fn: async (t) => { -// await deleteMessageWithoutReasonTest(channel.id); -// }, -// ...sanitizeMode, -// }); -// Deno.test({ -// name: "[message] delete message with a reason", -// fn: async (t) => { -// await deleteMessageWithReasonTest(channel.id); -// }, -// ...sanitizeMode, -// }); -// Deno.test({ -// name: "[message] delete messages without a reason", -// fn: async (t) => { -// await deleteMessagesWithoutReasonTest(channel.id); -// }, -// ...sanitizeMode, -// }); -// Deno.test({ -// name: "[message] delete messages with a reason", -// fn: async (t) => { -// await deleteMessagesWithReasonTest(channel.id); -// }, -// ...sanitizeMode, -// }); -// Deno.test({ -// name: "[message] fetch a message", -// fn: async (t) => { -// await getMessageTest(channel.id); -// }, -// ...sanitizeMode, -// }); -// Deno.test({ -// name: "[message] fetch messages", -// fn: async (t) => { -// await getMessagesTest(channel.id); -// }, -// ...sanitizeMode, -// }); - -// Deno.test({ -// name: "[message] pin a message", -// fn: async (t) => { -// await pinMessageTests(channel.id, message.id); -// }, -// ...sanitizeMode, -// });