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)
// })