const lang = require("./en_us.json"); // translate message const nbt = require('prismarine-nbt'); function uuidFromIntArray (arr) { const buf = Buffer.alloc(16) arr.forEach((num, index) => { buf.writeInt32BE(num, index * 4) }) return buf.toString('hex') } function processNbtMessage (msg) { try { if (!msg || msg.type === 'end') return null; if (typeof msg === 'string') return msg const simplified = simplify(msg); // Ensure nbt is defined elsewhere const json = JSON.stringify(simplified, (key, val) => { if (key === 'id' && Array.isArray(val)) return uuidFromIntArray(val); return val; }); return json; } catch (e) { return e; } } const msg = { reason: '{"translate":"multiplayer.disconnect.unverified_username"}' } const msg2 = { "reason": { "type": "compound", "value": { "with": { "type": "list", "value": { "type": "string", "value": [ "Internal Exception: io.netty.handler.codec.EncoderException: java.io.UTFDataFormatException: encoded string (t§k腻腻腻腻腻...腻腻腻腻§rno) too long: 97869 bytes" ] } }, "translate": { "type": "string", "value": "disconnect.genericReason" } } } } console.log(kickparser(msg.reason)); console.log(kickparser(msg2.reason)); // lazy to make it color function kickparser(component) { if (component === undefined) return; if (typeof component === "string") return component; function kickparserText(comp) { let text = ''; if (comp.text && typeof comp.text === 'string' || typeof comp.text === 'number') { text += comp.text; } if (comp[""] && typeof comp[""] === 'string' || typeof comp[""] === 'number') { text += comp[""]; } if (comp && typeof comp === 'string' || typeof comp === 'number') { return comp; } if (comp.extra) { if (!Array.isArray(comp.extra)) comp.extra = [comp.extra] comp.extra.forEach(subComp => { text += extractText(subComp); }); } if (comp.translate) { let translateString = lang[comp.translate] || comp.translate; let DefaultTranslateString = lang[comp.translate] || comp.translate; let DefaultMsg = false; if (comp.with) { const withArgs = comp.with.map(arg => extractText(arg)); let usedReplacements = 0; translateString = translateString.replace(/thing__placeholder__/g, 'default_thing__placeholder__'); translateString = translateString.replace(/%s/g, (match, offset, string) => { if (offset > 0 && string[offset - 1] === '%') { return 's'; } if (usedReplacements < withArgs.length) { if (translateString.length + withArgs[usedReplacements].length > 2048) return 'Translate Crash'; // Prevent translate crash return `thing__placeholder__${usedReplacements++}`; } DefaultMsg = true; return "%s"; }); translateString = translateString.replace(/%(-?\d+)\$s/g, (match, index, stringindex, string) => { const argIndex = parseInt(index, 10) - 1; if (argIndex < 0 || argIndex >= withArgs.length) { DefaultMsg = true; return match; } if (stringindex > 0 && string[stringindex - 1] === '%') { return match; } if (translateString.length + withArgs[argIndex].length > 2048) return 'Translate Crash'; // Prevent translate crash return `thing__placeholder__${argIndex}`; }); for (let i = 0; i < withArgs.length; i++) { if (translateString.length + withArgs[i].length > 2048) return 'Translate Crash'; // Prevent translate crash translateString = translateString.replace(new RegExp(`thing__placeholder__${i}`, 'g'), (match) => { const formattedArg = withArgs[i]; return formattedArg; }); } translateString = translateString.replace(/default_thing__placeholder__/g, 'thing__placeholder__'); } if (DefaultMsg) { text += DefaultTranslateString; } else { text += translateString; } } return text; } // console.log(simplify(component)); return kickparserText(simplify(component)); }