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 (typeof msg === 'string') { // just create simple nbt structure msg = { id: 'string', value: msg }; } if (!msg || msg.type === 'end') return msg; const simplified = nbt.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 '{"text":""}'; } } 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(processNbtMessage(msg.reason))); console.log(kickparser(processNbtMessage(msg2.reason))); // lazy to make it color function kickparser(component) { if (component === undefined) return; try { jsonComponent = JSON.parse(component); } catch (e) { console.error("Invalid JSON format:", component); return ''; } function kickparserText(comp) { let text = ''; if (typeof comp === 'string') { text += comp; } if (typeof comp.value === 'string') { text += comp.value; } if (comp.with) { text += kickparserText(comp.with); } if (comp.value) { [comp.value].forEach(subComp => { if (typeof subComp === 'string') text += subComp; text += kickparserText(subComp); }); } if (comp.translate) { let translateString = lang[comp.translate] || comp.translate; if (comp.with) { const withArgs = comp.with.map(arg => kickparserText(arg)); let usedReplacements = 0; translateString = translateString.replace(/%s/g, () => { if (usedReplacements < withArgs.length) { return withArgs[usedReplacements++]; } return "%s"; }); withArgs.forEach((arg, index) => { const regex = new RegExp(`%${index + 1}\\$s`, 'g'); translateString = translateString.replace(regex, arg); }); } text += translateString; } return text; } return kickparserText(jsonComponent); }