commit 41c1365249c95ff4782af475be2015dc08123fda Author: Ninjdai Date: Tue Mar 12 20:04:08 2024 +0100 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1687d79 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +config.json diff --git a/commands/wol/setup.mjs b/commands/wol/setup.mjs new file mode 100644 index 0000000..8056184 --- /dev/null +++ b/commands/wol/setup.mjs @@ -0,0 +1,25 @@ +import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder, SlashCommandBuilder } from "discord.js"; + +export default { + data: new SlashCommandBuilder() + .setName("setup") + .setDefaultMemberPermissions(0x8) + .setDescription("Affiche un embed pour démarrer le serveur."), + async execute(interaction, client) { + await interaction.channel.send({ embeds: [startEmbed], components: [startRow] }); + await interaction.reply({ content: "Voilà", ephemeral: true }); + }, +}; + +const startEmbed = new EmbedBuilder() + .setTitle("ඞ") + .setDescription("Cliquez sur le bouton ci-dessous pour démarrer le serveur !\nRendez-vous ensuite sur le panel pour lancer le serveur minecraft :p") + .setColor("#966709") + +const startRow = new ActionRowBuilder() + .setComponents([ + new ButtonBuilder() + .setCustomId('start') + .setStyle(ButtonStyle.Success) + .setLabel('Lancer le serveur') + ]) diff --git a/config.example.json b/config.example.json new file mode 100644 index 0000000..418ae84 --- /dev/null +++ b/config.example.json @@ -0,0 +1,5 @@ +{ + "token" : "NeverGonnaGiveYouUp", + "clientId" : "Bot's ID", + "MAC" : "MM:AA:CC:AA:DD:RR" +} diff --git a/events/interactionCreate.mjs b/events/interactionCreate.mjs new file mode 100644 index 0000000..54f005e --- /dev/null +++ b/events/interactionCreate.mjs @@ -0,0 +1,61 @@ +import { buttonList } from "../interactions/buttons/index.mjs"; +/*import { modalList } from "../interactions/modals/index.mjs"; +import { selectMenuList } from "../interactions/selectmenus/index.mjs"; +*/ + +export default { + name: "interactionCreate", + async execute(interaction, client) { + + if ( + interaction.isChatInputCommand() || + interaction.isContextMenuCommand() + ) { + const command = client.commands.get(interaction.commandName); + if (!command) return; + + try { + await command.execute(interaction, client); + } catch (error) { + console.error(error); + try { + await interaction.reply({ + content: + "There was an error while executing this command!", + ephemeral: true, + }); + } catch (error) { + console.error(error); + } + } + } else if (interaction.isButton()) { + buttonList[interaction.customId.split("_")[0]] + ? buttonList[interaction.customId.split("_")[0]].execute( + interaction, + client, + ) + : errorMessage(interaction); + } else if (interaction.isStringSelectMenu()) { + selectMenuList[interaction.customId.split("_")[0]].execute( + interaction, + client, + ); + } else if (interaction.isModalSubmit()) { + modalList[interaction.customId.split("_")[0]] + ? modalList[interaction.customId.split("_")[0]].execute( + interaction, + client, + ) + : errorMessage(interaction); + } else { + console.log(interaction); + } + }, +}; + +function errorMessage(interaction) { + interaction.reply({ + content: "Si vous encounter this error, please contact @ninjdai !", + ephemeral: true, + }); +} diff --git a/events/ready.mjs b/events/ready.mjs new file mode 100644 index 0000000..1c769b6 --- /dev/null +++ b/events/ready.mjs @@ -0,0 +1,8 @@ +export default { + name: "ready", + once: true, + async execute(client) { + console.log("Ready !"); + client.user.setStatus("online"); + }, +}; diff --git a/functions.mjs b/functions.mjs new file mode 100644 index 0000000..b40d4a8 --- /dev/null +++ b/functions.mjs @@ -0,0 +1,83 @@ +import { REST } from "@discordjs/rest"; +import { Routes } from "discord-api-types/v10"; +import { Collection } from "discord.js"; +import fs from "fs"; + +import config from "./config.json" assert { type: "json" }; +const { token, clientId } = config; + +const rest = new REST({ version: "10" }).setToken(token); + +async function deploy_commands(client, loadcommands) { + if (typeof loadcommands != "boolean" && loadcommands != null) + throw "loadcommands argument needs to be boolean or null"; + + const commands = []; + client.commands = new Collection(); + const commandCategories = fs + .readdirSync("./commands") + .filter((file) => !file.includes(".")); + console.log(`Loading ${commandCategories.toString()} commands...`); + for (const category of commandCategories) { + const commandFiles = fs + .readdirSync(`./commands/${category}`) + .filter((file) => file.endsWith(".mjs")); + console.log(`Loading ${commandFiles.toString()}...`); + for (const file of commandFiles) { + const { default: command } = await import( + `./commands/${category}/${file}` + ); + commands.push(command.data); + client.commands.set(command.data.name, command); + + console.log(`${category}/${command.data.name} chargé !`); + } + } + if (loadcommands == true) { + slashCommandLoad(client, commands); + console.log("Refreshed slash commands !"); + } else if (loadcommands == false) { + //Deletes slash commands + slashCommandLoad(client, []); + console.log("Deleted slash commands !"); + } else { + console.log("Kept old commands"); + } +} + +async function slashCommandLoad(client, commands) { + try { + console.log("Loading slash commands..."); + await rest.put(Routes.applicationCommands(clientId), { + body: commands, + }); + console.log("Slash commands loaded !"); + } catch (error) { + console.error(error); + } + return client.commands; +} + +function loadErrorCatcher() { + console.log("Loading error catcher..."); + + process.on("unhandledRejection", (reason, promise) => { + console.log(reason, "\n", promise); + }); + + process.on("uncaughtException", (err, origin) => { + console.log(err, "\n", origin); + }); + + process.on("uncaughtExceptionMonitor", (err, origin) => { + console.log(err, "\n", origin); + }); + + process.on("warning", (warn) => { + console.log(warn); + }); + + console.log("Error catcher loaded !"); +} + +export { deploy_commands, loadErrorCatcher }; diff --git a/index.mjs b/index.mjs new file mode 100644 index 0000000..ba31b41 --- /dev/null +++ b/index.mjs @@ -0,0 +1,40 @@ +import fs from "fs"; +import { Client, GatewayIntentBits } from "discord.js"; +import { deploy_commands, loadErrorCatcher } from "./functions.mjs"; + +import config from "./config.json" assert { type: "json" }; +const { token } = config; + +const client = new Client({ + intents: [ + GatewayIntentBits.Guilds, + GatewayIntentBits.GuildModeration, + GatewayIntentBits.GuildMessages, + GatewayIntentBits.MessageContent, + ], +}); + +loadErrorCatcher(); + +const eventFiles = fs + .readdirSync("./events") + .filter((file) => file.endsWith(".mjs")); +for (const file of eventFiles) { + const { default: event } = await import(`./events/${file}`); + if (event.once) { + client.once(event.name, (...args) => event.execute(...args, client)); + } else { + client.on(event.name, (...args) => event.execute(...args, client)); + } + console.log(`Loaded ${event.name} event !`); +} + +deploy_commands(client, true); +/* + true will refresh slash commands (SET endpoint) + false will delete them (SET endpoint with an empty array) + null will not change slash commands +*/ + + +client.login(token); diff --git a/interactions/buttons/index.mjs b/interactions/buttons/index.mjs new file mode 100644 index 0000000..dba8887 --- /dev/null +++ b/interactions/buttons/index.mjs @@ -0,0 +1,7 @@ +import start from "./src/start.mjs"; + +const buttonList = { + start: start, +}; + +export { buttonList }; diff --git a/interactions/buttons/src/start.mjs b/interactions/buttons/src/start.mjs new file mode 100644 index 0000000..c176b0d --- /dev/null +++ b/interactions/buttons/src/start.mjs @@ -0,0 +1,17 @@ +import wol from "wake_on_lan"; + +import config from "../../../config.json" assert { type: "json" }; +const { MAC } = config; + +export default { + async execute(interaction, client) { + await interaction.reply({ content: "Lancement du serveur...", ephemeral: true }); + wol.wake(MAC, async function(error) { + if (error) { + await interaction.editReply({ content: "Erreur lors du démarrage !" }) + } else { + await interaction.editReply({ content: "Le serveur devrait démarrer sous peu !" }) + }; + }); + }, +}; diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..80d10ad --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,25 @@ +{ + "include": [ + "*.json" + ], + "compilerOptions": { + "lib": ["ESNext"], + "module": "esnext", + "target": "esnext", + "moduleResolution": "bundler", + "moduleDetection": "force", + "allowImportingTsExtensions": true, + "noEmit": true, + "composite": true, + "strict": true, + "downlevelIteration": true, + "skipLibCheck": true, + "jsx": "preserve", + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "allowJs": true, + "types": [ + "bun-types" // add Bun global + ] + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..44db001 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,292 @@ +{ + "name": "wolbot", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "wolbot", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "discord.js": "^14.14.1", + "wake_on_lan": "^1.0.0" + } + }, + "node_modules/@discordjs/builders": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.7.0.tgz", + "integrity": "sha512-GDtbKMkg433cOZur8Dv6c25EHxduNIBsxeHrsRoIM8+AwmEZ8r0tEpckx/sHwTLwQPOF3e2JWloZh9ofCaMfAw==", + "dependencies": { + "@discordjs/formatters": "^0.3.3", + "@discordjs/util": "^1.0.2", + "@sapphire/shapeshift": "^3.9.3", + "discord-api-types": "0.37.61", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/collection": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz", + "integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==", + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/formatters": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.3.tgz", + "integrity": "sha512-wTcI1Q5cps1eSGhl6+6AzzZkBBlVrBdc9IUhJbijRgVjCNIIIZPgqnUj3ntFODsHrdbGU8BEG9XmDQmgEEYn3w==", + "dependencies": { + "discord-api-types": "0.37.61" + }, + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/rest": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.2.0.tgz", + "integrity": "sha512-nXm9wT8oqrYFRMEqTXQx9DUTeEtXUDMmnUKIhZn6O2EeDY9VCdwj23XCPq7fkqMPKdF7ldAfeVKyxxFdbZl59A==", + "dependencies": { + "@discordjs/collection": "^2.0.0", + "@discordjs/util": "^1.0.2", + "@sapphire/async-queue": "^1.5.0", + "@sapphire/snowflake": "^3.5.1", + "@vladfrangu/async_event_emitter": "^2.2.2", + "discord-api-types": "0.37.61", + "magic-bytes.js": "^1.5.0", + "tslib": "^2.6.2", + "undici": "5.27.2" + }, + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/rest/node_modules/@discordjs/collection": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.0.0.tgz", + "integrity": "sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@discordjs/util": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.0.2.tgz", + "integrity": "sha512-IRNbimrmfb75GMNEjyznqM1tkI7HrZOf14njX7tCAAUetyZM1Pr8hX/EK2lxBCOgWDRmigbp24fD1hdMfQK5lw==", + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/ws": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.0.2.tgz", + "integrity": "sha512-+XI82Rm2hKnFwAySXEep4A7Kfoowt6weO6381jgW+wVdTpMS/56qCvoXyFRY0slcv7c/U8My2PwIB2/wEaAh7Q==", + "dependencies": { + "@discordjs/collection": "^2.0.0", + "@discordjs/rest": "^2.1.0", + "@discordjs/util": "^1.0.2", + "@sapphire/async-queue": "^1.5.0", + "@types/ws": "^8.5.9", + "@vladfrangu/async_event_emitter": "^2.2.2", + "discord-api-types": "0.37.61", + "tslib": "^2.6.2", + "ws": "^8.14.2" + }, + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/@discordjs/ws/node_modules/@discordjs/collection": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.0.0.tgz", + "integrity": "sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@sapphire/async-queue": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.2.tgz", + "integrity": "sha512-7X7FFAA4DngXUl95+hYbUF19bp1LGiffjJtu7ygrZrbdCSsdDDBaSjB7Akw0ZbOu6k0xpXyljnJ6/RZUvLfRdg==", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sapphire/shapeshift": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.6.tgz", + "integrity": "sha512-4+Na/fxu2SEepZRb9z0dbsVh59QtwPuBg/UVaDib3av7ZY14b14+z09z6QVn0P6Dv6eOU2NDTsjIi0mbtgP56g==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@sapphire/snowflake": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.1.tgz", + "integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@types/node": { + "version": "20.11.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.20.tgz", + "integrity": "sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/ws": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", + "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vladfrangu/async_event_emitter": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.2.4.tgz", + "integrity": "sha512-ButUPz9E9cXMLgvAW8aLAKKJJsPu1dY1/l/E8xzLFuysowXygs6GBcyunK9rnGC4zTsnIc2mQo71rGw9U+Ykug==", + "engines": { + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/discord-api-types": { + "version": "0.37.61", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.61.tgz", + "integrity": "sha512-o/dXNFfhBpYHpQFdT6FWzeO7pKc838QeeZ9d91CfVAtpr5XLK4B/zYxQbYgPdoMiTDvJfzcsLW5naXgmHGDNXw==" + }, + "node_modules/discord.js": { + "version": "14.14.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.14.1.tgz", + "integrity": "sha512-/hUVzkIerxKHyRKopJy5xejp4MYKDPTszAnpYxzVVv4qJYf+Tkt+jnT2N29PIPschicaEEpXwF2ARrTYHYwQ5w==", + "dependencies": { + "@discordjs/builders": "^1.7.0", + "@discordjs/collection": "1.5.3", + "@discordjs/formatters": "^0.3.3", + "@discordjs/rest": "^2.1.0", + "@discordjs/util": "^1.0.2", + "@discordjs/ws": "^1.0.2", + "@sapphire/snowflake": "3.5.1", + "@types/ws": "8.5.9", + "discord-api-types": "0.37.61", + "fast-deep-equal": "3.1.3", + "lodash.snakecase": "4.1.1", + "tslib": "2.6.2", + "undici": "5.27.2", + "ws": "8.14.2" + }, + "engines": { + "node": ">=16.11.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + }, + "node_modules/magic-bytes.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.8.0.tgz", + "integrity": "sha512-lyWpfvNGVb5lu8YUAbER0+UMBTdR63w2mcSUlhhBTyVbxJvjgqwyAf3AZD6MprgK0uHuBoWXSDAMWLupX83o3Q==" + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ts-mixer": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==" + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/undici": { + "version": "5.27.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz", + "integrity": "sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/wake_on_lan": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wake_on_lan/-/wake_on_lan-1.0.0.tgz", + "integrity": "sha512-0QSpxny0QmsssshI6kePj6cobQPK+i8r5shfj58ZfQIUH9fUTyAaYPqZO3W/Ai7mN4vQVdTdsSGIr20M81UL6Q==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "wake": "wake" + } + }, + "node_modules/ws": { + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..99e14a5 --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "name": "wolbot", + "version": "1.0.0", + "description": "", + "main": "index.mjs", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Ninjdai", + "license": "MIT", + "dependencies": { + "discord.js": "^14.14.1", + "wake_on_lan": "^1.0.0" + } +}