Compare commits

..

3 Commits

Author SHA1 Message Date
jay
72c4622091 feat(informer): various improvements and fixes
Feat:
- Letter aliases for subcommands.
- Most recent command when no input.
- Start player relative info stub.

Fix:
- Player username not shown.
2021-03-23 15:14:13 +05:00
jay
0757776d8b feat(command): 🎨 make botaddress prefix and regex more flexible and configurable 2021-03-23 14:39:07 +05:00
jay
a0ffaf1654 build(typescript): 🚨 add @types dep to satisfy typescript errors
Typescript linter had an error that `require` was undefined.
This happened after updating Nodejs from 14.15 to 14.16.
Not sure if this should be a global dep or local
2021-03-23 13:25:26 +05:00
4 changed files with 39 additions and 13 deletions

View File

@ -86,7 +86,9 @@ reloadplugin = (event, filename, pluginpath) => {
fs.watch('./lib/plugins', reloadplugin) fs.watch('./lib/plugins', reloadplugin)
cfg.bot = bot cfg.bot = bot
cfg.botAddress = new RegExp(`^${bot.username} (!.+)`) // TODO better name, or switch to array
cfg.botAddressPrefix = '!'
cfg.botAddressRegex = new RegExp(`^${bot.username} (${cfg.botAddressPrefix}.+)`)
cfg.quiet = true cfg.quiet = true

View File

@ -62,6 +62,9 @@ const events = {
const events_registered = [] const events_registered = []
function command(username, message) { function command(username, message) {
// TODO better name, maybe an array?
cfg.botAddressPrefix = cfg.botAddressPrefix || "!"
function fuzzyRespond(responses, probability = 1, timeout = 1) { function fuzzyRespond(responses, probability = 1, timeout = 1) {
if (Math.random() < probability) { if (Math.random() < probability) {
const response = responses[Math.floor(Math.random() * responses.length)] const response = responses[Math.floor(Math.random() * responses.length)]
@ -76,7 +79,7 @@ function command(username, message) {
} }
} }
if (username === bot.username && !message.startsWith("!")) return if (username === bot.username && !message.startsWith(cfg.botAddressPrefix)) return
const player = bot.players[username] ? bot.players[username].entity : null const player = bot.players[username] ? bot.players[username].entity : null
@ -88,11 +91,12 @@ function command(username, message) {
} }
if (message.startsWith("!") || cfg.botAddress.test(message)) { if (message.startsWith(cfg.botAddressPrefix) || cfg.botAddressRegex.test(message)) {
message = cfg.botAddress.test(message) ? cfg.botAddress.exec(message)[1] : message message = cfg.botAddressRegex.test(message) ? cfg.botAddressRegex.exec(message)[1] : message
console.log(message) console.log(message)
message = message.slice(1) // remove `!` // remove `!`
message = message.startsWith(cfg.botAddressPrefix) ? message.slice(cfg.botAddressPrefix.length) : message
// TODO command dispatchEvent, for aliases // TODO command dispatchEvent, for aliases
function subcommand(message) { function subcommand(message) {
const message_parts = message.split(/\s+/) const message_parts = message.split(/\s+/)
@ -327,7 +331,7 @@ function command(username, message) {
} }
break break
case "info": case "info":
cfg.plugins.informer.command(message_parts.splice(1)) cfg.plugins.informer.command(message_parts.splice(1), player)
break break
// case "use": // case "use":
// bot.useOn(bot.nearestEntity()) // bot.useOn(bot.nearestEntity())

View File

@ -1,6 +1,7 @@
let cfg let cfg
let bot let bot
let mcData let mcData
// import v from 'vec3'
const v = require('vec3') const v = require('vec3')
function block(pos) { function block(pos) {
@ -51,34 +52,47 @@ function item(
} }
function entity(name) { function entity(name) {
const entity = bot.nearestEntity((entity) => { const entity = typeof name === "string" ? bot.nearestEntity((entity) => {
const ename = entity.name || entity.username const ename = entity.name || entity.username
return name && ename ? ename == name : true return name && ename ? ename == name : true
}) }) : entity
console.log(entity) console.log(entity)
if (!entity) { if (!entity) {
cfg.quiet || bot.chat("no entity") cfg.quiet || bot.chat("no entity")
return entity return entity
} }
let info = [entity.type, entity.name || entity.username] let info = [entity.type, entity.username || entity.name]
// TODO various info depending on the type of entity; player, villager, etc
if (entity.metadata) info.push("len: " + entity.metadata.length) if (entity.metadata) info.push("len: " + entity.metadata.length)
cfg.quiet || bot.chat(info.join("; ")) cfg.quiet || bot.chat(info.join("; "))
return entity
} }
function command(message_parts) { function command(message_parts, player) {
if (message_parts.length > 0) {
cfg.info.recentCommand = message_parts
}
switch (message_parts.length) { switch (message_parts.length) {
case 0: case 0:
// TODO most recent command? if (cfg.info.recentCommand) {
block() command(cfg.info.recentCommand, player)
} else {
// TODO dispatch on instance of entity, block, etc..
// TODO have the logic inside the function or with a utility function
block(player.position || player?.entity.position || null)
}
break; break;
case 1: case 1:
switch (message_parts[0]) { switch (message_parts[0]) {
case "i":
case "item": case "item":
item() item()
break break
case "e":
case "entity": case "entity":
entity() entity()
break break
case "b":
case "block": case "block":
default: default:
block() block()
@ -89,9 +103,11 @@ function command(message_parts) {
case 2: case 2:
switch (message_parts[0]) { switch (message_parts[0]) {
case "i":
case "item": case "item":
item(message_parts[1]) item(message_parts[1])
break break
case "e":
case "entity": case "entity":
default: default:
entity(message_parts[1]) entity(message_parts[1])
@ -101,6 +117,7 @@ function command(message_parts) {
case 4: case 4:
switch (message_parts[0]) { switch (message_parts[0]) {
case "b":
case "block": case "block":
default: default:
block(message_parts.slice(1)) block(message_parts.slice(1))
@ -110,6 +127,7 @@ function command(message_parts) {
break; break;
default: default:
cfg.quiet || bot.chat("info: unknown command")
break; break;
} }
} }
@ -119,6 +137,7 @@ const load = (config) => {
bot = cfg.bot bot = cfg.bot
cfg.info = { cfg.info = {
quiet: cfg.quiet, quiet: cfg.quiet,
recentCommand: null,
} }
mcData = bot.mcData || (bot.mcData = require('minecraft-data')(bot.version)) mcData = bot.mcData || (bot.mcData = require('minecraft-data')(bot.version))
} }

View File

@ -30,6 +30,7 @@
}, },
"homepage": "https://github.com/PrismarineJS/prismarine-template#readme", "homepage": "https://github.com/PrismarineJS/prismarine-template#readme",
"devDependencies": { "devDependencies": {
"@types/node": "^14.14.35",
"jest": "^26.6.3", "jest": "^26.6.3",
"require-self": "^0.2.3", "require-self": "^0.2.3",
"typescript": "^4.2.3" "typescript": "^4.2.3"