const env = require("dotenv-packed").parseEnv().parsed const fs = require('fs'); let cfg = { admin: "Applezaus", mods: ["Applezaus", "tanner6", "Angram42", "[WEB] Angram42", "[WEB] Applezaus"], stateMachines: {} } const mineflayer = require("mineflayer"); // const { createGetAccessor } = require('typescript'); const options = !isNaN(parseInt(process.argv[3])) && parseInt(process.argv[3]) > 1e2 ? { host: process.argv[2] || process.env.MINECRAFT_HOST || env.MINECRAFT_HOST || 'localhost', // Change this to the ip you want. port: parseInt(process.argv[3]) || process.env.MINECRAFT_PORT || env.MINECRAFT_PORT // || 58471, } : { host: process.argv[2] || process.env.MINECRAFT_HOST || env.MINECRAFT_HOST || 'localhost', // Change this to the ip you want. username: process.argv[3] || process.env.MINECRAFT_USER || env.MINECRAFT_USER, password: process.argv[4] || process.env.MINECRAFT_PASS || env.MINECRAFT_PASS, // port: process.argv[5] || process.env.MINECRAFT_PORT || 58471, } const bot = mineflayer.createBot(options) cfg.botOptions = options let plugins = {} function loadplugin(pluginname, pluginpath) { try { plugins[pluginname] = require(pluginpath) plugins[pluginname].load(cfg) } catch (error) { if (error.code == 'MODULE_NOT_FOUND') { console.warn('plugin not used:', pluginpath) } else { console.error(error) } } } function unloadplugin(pluginname, pluginpath) { pluginpath = pluginpath ? pluginpath : './plugins/' + pluginname const plugin = require.resolve(pluginpath) try { if (plugin && require.cache[plugin]) { require.cache[plugin].exports.unload() delete plugins[pluginname] delete require.cache[plugin] } } catch (error) { console.error(error) } } reloadplugin = (event, filename, pluginpath) => { if (!/\.js$/.test(filename)) { return } if (!cfg.fsTimeout) { console.info(event, filename) pluginpath = (pluginpath ? pluginpath : './plugins/') + filename const check = Object.keys(cfg.plugins) console.info(`reload file:`, pluginpath) const plugin = require.resolve(pluginpath) if (plugin && require.cache[plugin]) { // console.debug(Object.keys(cfg.plugins)) unloadplugin(filename.split(".js")[0], pluginpath) console.assert(Object.keys(cfg.plugins).length == check.length - 1, "plugin not removed, potential memory leak") } loadplugin(filename.split(".js")[0], pluginpath) if (Object.keys(cfg.plugins).length != check.length) { // If left < right : // - new plugin that's not registered in cfg.plugins, so added // - rename, so old wasn't removed // If left > right : // - error in file (syntax, missing load()), so was not reloaded console.warn("plugin count mismatch", check.length, Object.keys(cfg.plugins).length, Object.keys(cfg.plugins)) } cfg.fsTimeout = setTimeout(function () { cfg.fsTimeout = null }, 2000) // give 2 seconds for multiple events } // console.log('file.js %s event', event) } fs.watch('./lib/plugins', reloadplugin) cfg.bot = bot // TODO better name, or switch to array cfg.botAddressPrefix = '!' cfg.quiet = true // == actually do stuff bot.once("spawn", () => { plugins = { command: require('./plugins/command'), eater: require('./plugins/eater'), inventory: require('./plugins/inventory'), informer: require('./plugins/informer'), finder: require('./plugins/finder'), sleeper: require('./plugins/sleeper'), armor: require('./plugins/armor'), mover: require('./plugins/mover'), guard: require('./plugins/guard'), // miner: require('./plugins/miner.js'), statemachine: require('./plugins/statemachine'), } cfg.plugins = plugins cfg.botAddressRegex = new RegExp(`^${bot.username} (${cfg.botAddressPrefix}.+)`) for (const plugin of Object.values(plugins)) { try { plugin.load(cfg) } catch (error) { console.warn(error) } } }) bot.on("death", () => { bot.pathfinder && bot.pathfinder.setGoal(null) // plugins.guard.unload() }) // bot.on("respawn", () => { // // setTimeout(plugins.guard.load, 2000) // })