108 lines
No EOL
2.9 KiB
JavaScript
108 lines
No EOL
2.9 KiB
JavaScript
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 { // RangeError: Maximum call stack size exceeded
|
|
if (!msg || msg.type === 'end' || msg === undefined || msg.type !== 'compound') return msg
|
|
const simplified = nbt.simplify(msg)
|
|
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);
|
|
} |