diff --git a/examples/.env.example b/examples/.env.example new file mode 100644 index 0000000..23e679f --- /dev/null +++ b/examples/.env.example @@ -0,0 +1 @@ +TOKEN=YOUR_BOT_TOKEN \ No newline at end of file diff --git a/examples/builderComponent.ts b/examples/builderComponent.ts new file mode 100644 index 0000000..6fa1923 --- /dev/null +++ b/examples/builderComponent.ts @@ -0,0 +1,58 @@ +import "https://deno.land/std@0.146.0/dotenv/load.ts"; +import { + ActionRowBuilder, + ButtonBuilder, + ButtonStyles, + ComponentInteraction, + GatewayIntents, + InteractionResponseTypes, + Session, +} from "./deps.ts"; + +const token = Deno.env.get("TOKEN") ?? Deno.args[0]; + +if (!token) { + throw new Error("Please provide a token"); +} + +const intents = GatewayIntents.MessageContent | GatewayIntents.Guilds | GatewayIntents.GuildMessages; +const session = new Session({ token, intents }); + +const PREFIX = ">"; +const components = new ButtonBuilder().setCustomId("ping").setLabel("Hello!").setStyle(ButtonStyles.Success); +const row = new ActionRowBuilder().addComponents(components).toJSON(); + +session.on("ready", (payload) => { + console.log("Logged in as:", payload.user.username); +}); + +session.on("messageCreate", (message) => { + if (message.author?.bot || !message.content.startsWith(PREFIX)) { + return; + } + + const args = message.content.substring(PREFIX.length).trim().split(/\s+/gm); + const name = args.shift()?.toLowerCase(); + console.log(args, name); + + if (name === "ping") { + console.log(row) + message.reply({ components: [row] }) + .then(() => {}) + .catch(e => console.error(e)) + } +}); + +// Follow interaction event +session.on("interactionCreate", (interaction) => { + if (!interaction.isComponent()) return; + const component = interaction as ComponentInteraction; + if (component.customId == "ping") { + component.respond({ + type: InteractionResponseTypes.ChannelMessageWithSource, + data: { content: "pong!" }, + }); + } +}); + +await session.start(); \ No newline at end of file diff --git a/examples/deno.ts b/examples/deno.ts index 9da4800..2ace28a 100644 --- a/examples/deno.ts +++ b/examples/deno.ts @@ -22,11 +22,11 @@ session.on("ready", (payload) => { const PREFIX = ">"; session.on("messageCreate", (message) => { - if (message.author.bot || message.content.startsWith(PREFIX)) { + if (message.author?.bot || !message.content.startsWith(PREFIX)) { return; } - const args = message.content.slice(PREFIX.length).trim().split(/\s+/gm); + const args = message.content.substring(PREFIX.length).trim().split(/\s+/gm); const name = args.shift()?.toLowerCase(); if (name === "ping") { diff --git a/examples/slashCommand.ts b/examples/slashCommand.ts new file mode 100644 index 0000000..0515302 --- /dev/null +++ b/examples/slashCommand.ts @@ -0,0 +1,43 @@ +import "https://deno.land/std@0.146.0/dotenv/load.ts"; +import { CreateApplicationCommand, GatewayIntents, InteractionResponseTypes, Session } from "./deps.ts"; + +const token = Deno.env.get("TOKEN") ?? Deno.args[0]; + +if (!token) { + throw new Error("Please provide a token"); +} + +const intents = GatewayIntents.MessageContent | GatewayIntents.Guilds | GatewayIntents.GuildMessages; +const session = new Session({ token, intents }); + +const command: CreateApplicationCommand = { + name: "ping", + description: "Replies with pong!", +}; + +const guildId = ''; + +session.on("ready", async (payload) => { + console.log("Logged in as:", payload.user.username); + console.log("Creating the application commands..."); + // create command + try { + await session.createApplicationCommand(command, guildId); + console.log("Done!"); + } catch (err) { + console.error(err); + } +}); + +// Follow interaction event +session.on("interactionCreate", (interaction) => { + if (!interaction.isCommand()) return; + if (interaction.commandName === "ping") { + interaction.respond({ + type: InteractionResponseTypes.ChannelMessageWithSource, + data: { content: "pong!" }, + }); + } +}); + +await session.start() \ No newline at end of file diff --git a/packages/biscuit/structures/Message.ts b/packages/biscuit/structures/Message.ts index 7f0b8ad..251a3b1 100644 --- a/packages/biscuit/structures/Message.ts +++ b/packages/biscuit/structures/Message.ts @@ -8,6 +8,7 @@ import type { FileContent, MessageActivityTypes, MessageTypes, + DiscordMessageComponents } from "../../discordeno/mod.ts"; import type { Component } from "./components/Component.ts"; import type { GetReactions } from "../Routes.ts"; @@ -20,7 +21,6 @@ import Member from "./Member.ts"; import Attachment from "./Attachment.ts"; import ComponentFactory from "./components/ComponentFactory.ts"; import MessageReaction from "./MessageReaction.ts"; -import Sticker from "./Sticker.ts"; import * as Routes from "../Routes.ts"; import { StickerItem } from "./Sticker.ts"; @@ -51,6 +51,7 @@ export interface CreateMessage { files?: FileContent[]; messageReference?: CreateMessageReference; tts?: boolean; + components?: DiscordMessageComponents; } /** @@ -290,6 +291,7 @@ export class Message implements Model { : undefined, embeds: options.embeds, tts: options.tts, + components: options.components, }, ); diff --git a/packages/biscuit/structures/builders/InputTextComponentBuilder.ts b/packages/biscuit/structures/builders/InputTextComponentBuilder.ts index b4c7e98..71e7521 100644 --- a/packages/biscuit/structures/builders/InputTextComponentBuilder.ts +++ b/packages/biscuit/structures/builders/InputTextComponentBuilder.ts @@ -43,7 +43,7 @@ export class InputTextBuilder { this.#data.required = required; return this; } - toJSON() { - return { ...this.#data }; + toJSON(): DiscordInputTextComponent { + return { ...this.#data, type: this.type }; } } diff --git a/packages/biscuit/structures/builders/MessageActionRow.ts b/packages/biscuit/structures/builders/MessageActionRow.ts index 262f2fc..237f6fa 100644 --- a/packages/biscuit/structures/builders/MessageActionRow.ts +++ b/packages/biscuit/structures/builders/MessageActionRow.ts @@ -1,4 +1,4 @@ -import type { MessageComponentTypes } from "../../../discordeno/mod.ts"; +import type { DiscordActionRow, MessageComponentTypes } from "../../../discordeno/mod.ts"; import type { ComponentBuilder } from "../../Util.ts"; export class ActionRowBuilder { @@ -23,7 +23,10 @@ export class ActionRowBuilder { return this; } - toJSON() { - return { type: this.type, components: this.components.map((c) => c.toJSON()) }; + toJSON(): DiscordActionRow { + return { + type: this.type, + components: this.components.map((c) => c.toJSON()) as DiscordActionRow["components"], + }; } } diff --git a/packages/biscuit/structures/builders/MessageButton.ts b/packages/biscuit/structures/builders/MessageButton.ts index 943012b..3b96bb9 100644 --- a/packages/biscuit/structures/builders/MessageButton.ts +++ b/packages/biscuit/structures/builders/MessageButton.ts @@ -39,6 +39,6 @@ export class ButtonBuilder { } toJSON(): DiscordButtonComponent { - return { ...this.#data }; + return { ...this.#data, type: this.type }; } } diff --git a/packages/biscuit/structures/builders/MessageSelectMenu.ts b/packages/biscuit/structures/builders/MessageSelectMenu.ts index b8f1229..0b3c1db 100644 --- a/packages/biscuit/structures/builders/MessageSelectMenu.ts +++ b/packages/biscuit/structures/builders/MessageSelectMenu.ts @@ -47,7 +47,7 @@ export class SelectMenuBuilder { ); } - toJSON() { - return { ...this.#data, options: this.options.map((option) => option.toJSON()) }; + toJSON(): DiscordSelectMenuComponent { + return { ...this.#data, type: this.type, options: this.options.map((option) => option.toJSON()) }; } }