A dashboard layout for single mineflayer bot.
Install the package with yarn
yarn add mineflayer-dashboardInstall the package with npm
npm install --save mineflayer-dashboardThen load up the plugin using mineflayer.
You can pass options argument:
chatPattern- a pattern that is tested against a message to determine if it's chat message or a system message. It's better to add this option as mineflayer's chat pattern will match messages like[SkinsRestorer] Your skin has been changed.. Also custom patterns are much faster than mineflayer's default one.
bot.loadPlugin(require('mineflayer-dashboard')({
chatPattern: /^» \w+? » /
}))
// or
bot.loadPlugin(require('mineflayer-dashboard'))+--------------------+-----------+
| | |
| | |
| MODE WINDOW | LOG |
| | |
| | |
+----+---------------+-----------+
|MODE| TEXT INPUT |
+----+---------------------------+
- TEXT INPUT - Here you insert your text / commands
- MODE - Mode indicator, tells you current mode
- LOG - Here you can print out some stuff
- MODE WINDOW - Here you can print out mode related stuff
Logging in log window is accessible by using bot.dashboard.log function.
NOTE: Please do not use console.log as it may create some unwanted artifacts. If any other dependency is using console.log you may try to overwrite this function by
bot.once('inject_allowed', () => {
global.console.log = bot.dashboard.log
global.console.error = bot.dashboard.log
})All error logging is passed to the dashboard log window. That means all of the error handlers created before plugin load are no longer listened. This was a crucial step to maintain the layout of the app.
Dashboard comes with 2 modes:
CHAT- Default mode. InCHATmode you can see all of the chat messages sent to the player.REPL- InREPLmode you can run javascript code to control over your bot.
We expose Mode class in the bot.dashboard.
The first parameter is mode name. It'll be used to create :<name> command to switch to this mode
Second one is options:
fg- foreground color for mode indicatorbg- background color for mode indicatorinterpreter- It defines what is happening when you hit enter in the text input. Bound to mode instancecompleter- This function should returnString[]orPromise<String[]>with the completions to current string. Bound to mode instance- A single completion needs to be the remainder of the completed string. For example, when I want to complete nickname
wvffleand I hit<tab>with cursor posiotioned in positionwv|then I need to return[ 'ffle' ]
- A single completion needs to be the remainder of the completed string. For example, when I want to complete nickname
bypassDefaultCompletion- bypass default completion system, don't cache matches.
When in this mode, we can send messages to different players. To change the reciever simply add :to <user> at the end of the message
let lastUser = null
const whisper = new bot.dashboard.Mode('whisper', {
bg: 'blue',
interpreter (string) {
let words = string.split(' ')
// Check if we change receiver
if (/ :to \w{3,16}$/.test(string)) {
lastUser = words[words.length - 1]
words = words.slice(0, -2)
}
// Log an error if there is no receiver
if (lastUser === null) {
return bot.dashboard.log("No receiver set, please add ' :to <user>' at the end of the message")
}
// Send message
const message = words.join(' ')
bot.chat(`/msg ${lastUser} ${message}`)
this.println(`to ${lastUser}: ${message}`)
},
async completer (string) {
// We're using already well defined minecraft completer
return bot.dashboard._minecraftCompleter(string)
}
})
bot.dashboard.addMode(whisper)
bot.on('whisper', (username, message) => {
// Log a notification if not in whisper mode
if (bot.dashboard.mode !== whisper) {
return bot.dashboard.log(`You have a new message from ${username}`)
}
// Display messages in the mode
whisper.println(`${username}: ${message}`)
})Simply type :<command> arg1 arg2...
:say wvffle "I like waffles"NOTE: In this case :say is a custom command
NOTE: In this case "I like waffles" is a string passed as arg2
We provide some basic commands for the dashboard.
:help- Display available commands:exit- Kill the bot / exit the application:clear- Clear mode window:<mode>- Change to<mode>mode:chat- Change toCHATmode:repl- Change toREPLmode
You can add custom commands by simply doing
bot.dashboard.commands['say'] = (user, ...words) => {
const sentence = words.join(' ')
bot.chat(`/forcesay ${user} ${sentence}`)
}