From b80de72d0b6c7f93c583d629bd850b0881e3d684 Mon Sep 17 00:00:00 2001 From: Tanguy Herbron Date: Sun, 9 May 2021 00:47:32 +0200 Subject: [PATCH] Add bot's squeleton --- index.js | 26 +++++++++++++++++++ package.json | 23 +++++++++++++++++ src/module.js | 28 +++++++++++++++++++++ src/module_manager.js | 58 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 135 insertions(+) create mode 100644 index.js create mode 100644 package.json create mode 100644 src/module.js create mode 100644 src/module_manager.js diff --git a/index.js b/index.js new file mode 100644 index 0000000..1645d19 --- /dev/null +++ b/index.js @@ -0,0 +1,26 @@ +if(process.env.NODE_ENV !== "production") { + require("dotenv").config(); +} + +const Discord = require("discord.js"); +const client = new Discord.Client(); +const ModuleManager = require("./src/module_manager"); + +let moduleManager = new ModuleManager(); + +client.on("ready", () => { + console.log("Logged in as " + client.user.tag); +}); + +client.on("message", message => { + let content = message.toString(); + + if(content.substr(0,1) === "!") { + let boundary = content.indexOf(' '); + let prefix = content.substr(0, boundary); + + moduleManager.execute(prefix, message); + } +}); + +client.login(process.env.DISCORD_TOKEN); diff --git a/package.json b/package.json new file mode 100644 index 0000000..ff7c44a --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "metrios", + "version": "0.0.1", + "description": "Modular discord bot mainly intended for moderation usage", + "main": "index.js", + "scripts": { + "dev": "nodemon index.js" + }, + "keywords": [ + "discord", + "moderation", + "bot" + ], + "author": "Tanguy Herbron", + "license": "MIT", + "devDependencies": { + "dotenv": "^8.2.0", + "nodemon": "^2.0.7" + }, + "dependencies": { + "discord.js": "^12.5.3" + } +} diff --git a/src/module.js b/src/module.js new file mode 100644 index 0000000..9c26cee --- /dev/null +++ b/src/module.js @@ -0,0 +1,28 @@ +const execSync = require("child_process").execSync; + +class Module { + constructor(name, description, prefix, flavor, entrypoint, version) { + this.name = name; + this.description = description; + this.prefix = prefix; + this.flavor = flavor; + this.entrypoint = entrypoint; + this.version = version; + } + + run(message) { + console.log("Running module"); + + switch(this.flavor) { + case "node": + return execSync("node " + this.entrypoint); + break; + default: + return {"status": "error", "message": "Runtime not supported, check configuration"}; + break; + } + } + +} + +module.exports = Module; diff --git a/src/module_manager.js b/src/module_manager.js new file mode 100644 index 0000000..4b01164 --- /dev/null +++ b/src/module_manager.js @@ -0,0 +1,58 @@ +const fs = require("fs"); +const Module = require("./module"); + +class ModuleManager { + constructor() { + console.log("Creating module manager"); + this.moduleList = {}; + this.scanModules(); + } + + scanModules() { + console.log("Scanning for modules"); + fs.readdirSync(process.env.MODULES_DIR).forEach(file => { + let rawData = fs.readFileSync(process.env.MODULES_DIR + "/" + file + "/header.json"); + let header = JSON.parse(rawData); + + this.moduleList[header.prefix] = new Module(header.name, + header.description, + header.prefix, + header.flavor, + process.env.MODULES_DIR + "/" + file + "/" + header.entrypoint, + header.version); + }); + } + + execute(prefix, message) { + let rawResult = this.moduleList[prefix].run(message); + let result = JSON.parse(rawResult.toString()); + + if(result.status === "success") { + switch(result.action) { + case "reply": + this.reply(message, result); + break; + case "send": + this.send(message, result); + default: + break; + } + } + } + + reply(origin, result) { + let message = undefined; + + if(result.format === "standard") { + message = result.message; + } + + if(result.format === "embed") { + message = {embed: result.profile} + } + + origin.reply(message); + } +} + +module.exports = ModuleManager;