288b7045b6
Data and information plugin. Expose methods in mcData with acceptable ux. Also central place for all kinds of debug features.
127 lines
4.3 KiB
JavaScript
127 lines
4.3 KiB
JavaScript
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
|
|
cfg.botAddress = new RegExp(`^${bot.username} (!.+)`)
|
|
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
|
|
|
|
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)
|
|
// })
|