diff --git a/package.json b/package.json index c2016d71..3e1d6fe5 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "esbuild": "^0.15.5", "eslint": "^8.24.0", "standalone-electron-types": "^1.0.0", + "type-fest": "^3.1.0", "typescript": "^4.8.4", "yazl": "^2.5.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a949059f..915500c8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,7 @@ specifiers: esbuild: ^0.15.5 eslint: ^8.24.0 standalone-electron-types: ^1.0.0 + type-fest: ^3.1.0 typescript: ^4.8.4 yazl: ^2.5.1 @@ -27,6 +28,7 @@ devDependencies: esbuild: 0.15.5 eslint: 8.24.0 standalone-electron-types: 1.0.0 + type-fest: 3.1.0 typescript: 4.8.4 yazl: 2.5.1 @@ -1190,6 +1192,11 @@ packages: engines: {node: '>=10'} dev: true + /type-fest/3.1.0: + resolution: {integrity: sha512-StmrZmK3eD9mDF9Vt7UhqthrDSk66O9iYl5t5a0TSoVkHjl0XZx/xuc/BRz4urAXXGHOY5OLsE0RdJFIApSFmw==} + engines: {node: '>=14.16'} + dev: true + /typescript/4.8.4: resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} engines: {node: '>=4.2.0'} diff --git a/src/api/Commands.ts b/src/api/Commands.ts index f7f42e94..ba6c7fa6 100644 --- a/src/api/Commands.ts +++ b/src/api/Commands.ts @@ -1,5 +1,10 @@ -import { Channel, Guild } from "discord-types/general"; -import { waitFor } from "../webpack"; +import { Channel, Guild, Embed, Message } from "discord-types/general"; +import { lazyWebpack, mergeDefaults } from "../utils/misc"; +import { waitFor, findByProps, find, filters } from "../webpack"; +import type { PartialDeep } from "type-fest"; + +const createBotMessage = lazyWebpack(filters.byCode('username:"Clyde"')); +const MessageSender = lazyWebpack(filters.byProps([ "receiveMessage" ])); export function _init(cmds: Command[]) { try { @@ -77,7 +82,21 @@ export function registerCommand(command: Command, plugin: string) { BUILT_IN.push(command); } -export function unregisterCommand(name: string) { +/** + * Send a message as Clyde + * @param {string} channelId ID of channel to send message to + * @param {Message} message Message to send + * @returns {Message} + */ +export function sendBotMessage(channelId: string, message: PartialDeep) { + const botMessage = createBotMessage({ channelId, content: "", embeds: [] }); + + MessageSender.receiveMessage(channelId, mergeDefaults(message, botMessage)); + + return message; +} + +export function unregisterCommand(name: string) { 1; const idx = BUILT_IN.findIndex(c => c.name === name); if (idx === -1) return false; diff --git a/src/plugins/echo.ts b/src/plugins/echo.ts new file mode 100644 index 00000000..9e79800f --- /dev/null +++ b/src/plugins/echo.ts @@ -0,0 +1,23 @@ +import definePlugin from "../utils/types"; +import { ApplicationCommandInputType, sendBotMessage, findOption, OptionalMessageOption } from "../api/Commands"; +import { ReactionEmoji, Message, MessageReaction, JSMessage } from "discord-types/general"; + +export default definePlugin({ + name: "Echo", + description: "Uses Clydes message function to send a custom message of your choice (locally)", + authors: [{ name: "ICodeInAssembly", id: 702973430449832038n }], + dependencies: ["CommandsAPI"], + commands: [ + { + name: "echo", + description: "Sends a message as Clyde (locally)", + options: [OptionalMessageOption], + inputType: ApplicationCommandInputType.BOT, + execute: (opts, ctx) => { + const message = findOption(opts, "message", ""); + + sendBotMessage(ctx.channel.id, { content: message }); + }, + }, + ] +});