A dashboard layout for single mineflayer bot.
Install the package with yarn
yarn add mineflayer-dashboard
Install the package with npm
npm install --save mineflayer-dashboard
Then 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. InCHAT
mode you can see all of the chat messages sent to the player.REPL
- InREPL
mode 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
wvffle
and 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 toCHAT
mode:repl
- Change toREPL
mode
You can add custom commands by simply doing
bot.dashboard.commands['say'] = (user, ...words) => {
const sentence = words.join(' ')
bot.chat(`/forcesay ${user} ${sentence}`)
}