Info in chatparser.js

This commit is contained in:
Yaode_owo 2024-12-03 09:15:23 -05:00
parent 021fbf5006
commit 82576a1bea
2 changed files with 131 additions and 86 deletions

View file

@ -1,50 +1,53 @@
/**
* Minecraft Version:
* - 1.20.4
* - 1.20.5
* - 1.20.6
* Minecraft-protocol version: 1.50.0
*
* Language File Version:
* - 1.21.1
* Minecraft Version: 1.20.4 (Basically should support 1.20.5 and 1.20.6)
*
* Version:
* - 1.41
* Language File Version: 1.21.1
*
* Version: 1.44
*
* Update:
* - fix some issue
* - Better ANSI
* - return component if not object
* - Add 0 type player chat and profileless chat, uh useless
* - Fix Color and format
*
* Knowns Issues:
* - Invalid Emojis
* - Spawnpoint Number
*
* Report Issue: https://code.chipmunk.land/Yaode_owo/Minecraft-protocol-1.20.4-chat-parser/issues/new
*/
const lang = require("./en_us.json"); // translate message
function simplify (data) {
try { // Prevent RangeError
if (data === undefined || data === null) return '\x1B[91m*** Component is undefined or missing ***\x1B[0m';
function simplify(data) {
try {
if (data === undefined || data === null) return '\x1B[91m*** Component is undefined or missing ***\x1B[0m';
if (typeof data !== "object") return data;
function transform (value, type) {
if (type === 'compound') {
function transform(value, type) {
if (type === 'compound') {
return Object.keys(value).reduce(function (acc, key) {
acc[key] = simplify(value[key])
return acc
}, {})
acc[key] = simplify(value[key]);
return acc;
}, {});
}
if (type === 'list') {
return value.value.map(function (v) { return transform(v, value.type) })
return value.value.map(function (v) {
return transform(v, value.type);
});
}
return value
return value;
}
return transform(data.value, data.type)
return transform(data.value, data.type);
} catch (e) {
return '\x1B[91m*** Component is too complex ***\x1B[0m';
console.log(e);
return '\x1B[91m*** An unexpected error occurred while processing the component ***\x1B[0m';
// return '\x1B[90m*** When is component is sus ***\x1B[0m';
}
}
function parseMinecraftColor(color) {
if (typeof color === 'string' && ansiMap[color] && !color.startsWith('#')) {
return { color: ansiMap[color], have: true };
@ -64,13 +67,13 @@ function parseMinecraftColor(color) {
function parseMinecraftFormat(format) {
let result = '';
if (!format) return { format: result, have: false };
if (!format) return { format: '', have: false };
if (format.bold === 1) result += ansiMap['bold'];
if (format.italic === 1) result += ansiMap['italic'];
if (format.underlined === 1) result += ansiMap['underlined'];
if (format.strikethrough === 1) result += ansiMap['strikethrough'];
if (format.obfuscated === 1) result += ansiMap['obfuscated'];
return result !== '' ? { format: result, have: true } : { format: result, have: false };
return result !== '' ? { format: result, have: true } : { format: '', have: false };
}
function inject(bot) {
@ -78,19 +81,24 @@ function inject(bot) {
let playerchat = {};
let systemchat = {};
let profilelesschat = {};
/*
let actionbar = {};
let bossbar = {};
let title = {};
*/
bot.on('end', () => {
playerChat = {};
systemChat = {};
profilelessChat = {};
/*
actionbar = {};
bossbar = {};
title = {};
*/
});
/*
bot.on('set_title_text', (packet) => {
title.message = parseMinecraftMessage(simplify(packet.text));
title.noColor_message = parseMinecraftMessageNoColor(simplify(packet.text));
@ -173,7 +181,7 @@ bot.on('action_bar', (packet) => {
bot.emit('custom_actionbar', actionbar.message, actionbar, packet);
bot.emit('custom_allmessage', 'actionbar', actionbar.message, actionbar, packet);
});
*/
bot.on('system_chat', (packet) => { // system
if (packet.isActionBar) return; // useless i guess
@ -201,6 +209,10 @@ bot.on('profileless_chat', (packet) => { // kinda player_chat
profilelesschat.nocolor_targetName = parseMinecraftMessageNoColor(simplify(packet.target));
switch (profilelesschat.type) {
case 0: // normal profileless chat message
profilelesschat.message = parseMinecraftMessage({ "translate": "chat.type.text", "with": [ profilelesschat.senderName, playerchat.formattedMessage ]});
profilelesschat.nocolor_message = parseMinecraftMessageNoColor({ "translate": "chat.type.text", "with": [ profilelesschat.senderName, profilelesschat.plainMessage ]});
break;
case 1: // /me
profilelesschat.message = parseMinecraftMessage({ "translate": "chat.type.emote", "with": [ profilelesschat.senderName, profilelesschat.formattedMessage ]});
profilelesschat.nocolor_message = parseMinecraftMessageNoColor({ "translate": "chat.type.emote", "with": [ profilelesschat.senderName, profilelesschat.formattedMessage ]});
@ -256,33 +268,45 @@ bot.on('player_chat', (packet) => { // player
playerchat.nocolor_targetName = parseMinecraftMessageNoColor(simplify(packet.networkTargetName));
switch (playerchat.type) { // vanish off
case 0: // normal vanilla chat message
playerchat.message = parseMinecraftMessage({ "translate": "chat.type.text", "with": [ playerchat.senderName, playerchat.plainMessage ]});
playerchat.nocolor_message = parseMinecraftMessageNoColor({ "translate": "chat.type.text", "with": [ playerchat.senderName, playerchat.plainMessage ]});
playerchat.jsonMsg = { "translate": "chat.type.text", "with": [ playerchat.senderName, playerchat.plainMessage ]};
break;
case 1: // /minecraft:me
playerchat.message = parseMinecraftMessage({ "translate": "chat.type.emote", "with": [ playerchat.senderName, playerchat.plainMessage ]});
playerchat.nocolor_message = parseMinecraftMessageNoColor({ "translate": "chat.type.emote", "with": [ playerchat.senderName, playerchat.plainMessage ]});
playerchat.jsonMsg = { "translate": "chat.type.emote", "with": [ playerchat.senderName, playerchat.plainMessage ]}
break;
case 2: // player /minecraft:tell
playerchat.message = parseMinecraftMessage({ translate: "commands.message.display.incoming", with: [ playerchat.senderName, playerchat.plainMessage ], color: "gray", italic: true });
playerchat.nocolor_message = parseMinecraftMessageNoColor({ translate: "commands.message.display.incoming", with: [ playerchat.senderName, playerchat.plainMessage ], color: "gray", italic: true });
playerchat.jsonMsg = { translate: "commands.message.display.incoming", with: [ playerchat.senderName, playerchat.plainMessage ], color: "gray", italic: true }
break;
case 3: // you /minecraft:tell
playerchat.message = parseMinecraftMessage({ translate: "commands.message.display.outgoing", with: [ playerchat.targetName, playerchat.plainMessage ], color: "gray", italic: true });
playerchat.nocolor_message = parseMinecraftMessageNoColor({ translate: "commands.message.display.outgoing", with: [ playerchat.targetName, playerchat.plainMessage ], color: "gray", italic: true });
playerchat.jsonMsg = { translate: "commands.message.display.outgoing", with: [ playerchat.targetName, playerchat.plainMessage ], color: "gray", italic: true }
break;
case 4: // player chat
playerchat.message = parseMinecraftMessage(playerchat.unsignedContent);
playerchat.nocolor_message = parseMinecraftMessageNoColor(playerchat.unsignedContent);
playerchat.jsonMsg = playerchat.unsignedContent
break;
case 5: // /say
playerchat.message = parseMinecraftMessage({ translate: 'chat.type.announcement', with: [ playerchat.senderName, playerchat.plainMessage ]});
playerchat.nocolor_message = parseMinecraftMessageNoColor({ translate: 'chat.type.announcement', with: [ playerchat.senderName, playerchat.plainMessage ]});
playerchat.jsonMsg = { translate: 'chat.type.announcement', with: [ playerchat.senderName, playerchat.plainMessage ]}
break;
case 6: // player /minecraft:teammsg || /teammsg
playerchat.message = parseMinecraftMessage({ translate: 'chat.type.team.text', with: [ playerchat.targetName, playerchat.senderName, playerchat.plainMessage ]});
playerchat.nocolor_message = parseMinecraftMessageNoColor({ translate: 'chat.type.team.text', with: [ playerchat.targetName, playerchat.senderName, playerchat.plainMessage ]});
playerchat.jsonMsg = { translate: 'chat.type.team.text', with: [ playerchat.targetName, playerchat.senderName, playerchat.plainMessage ]}
break;
case 7: // you /minecraft:teammsg || /teammsg
playerchat.message = parseMinecraftMessage({ translate: 'chat.type.team.sent', with: [ playerchat.targetName, playerchat.senderName, playerchat.plainMessage ]});
playerchat.nocolor_message = parseMinecraftMessageNoColor({ translate: 'chat.type.team.sent', with: [ playerchat.targetName, playerchat.senderName, playerchat.plainMessage ]});
playerchat.jsonMsg = { translate: 'chat.type.team.sent', with: [ playerchat.targetName, playerchat.senderName, playerchat.plainMessage ]}
break;
default:
console.log(`Unknown player_chat packet. Type: ${playerchat.type}`);
@ -295,8 +319,6 @@ bot.on('player_chat', (packet) => { // player
}
const ansiMap = {
'§0': '\x1B[30m',
'§1': '\x1B[34m',
@ -348,34 +370,18 @@ const ansiMap = {
function parseMinecraftMessage(component) {
if (component === undefined || component === null) return '\x1B[91m*** Component is undefined or missing ***\x1B[0m';
if (typeof component !== "object") return component;
function extractText(comp, prevColor = { color: '', have: false }, prevFormat = { format: '', have: false }) {
let text = '';
let color, format, shouldReset = false;
color = parseMinecraftColor(comp?.color);
format = parseMinecraftFormat(comp);
let shouldReset = false;
let NowColor = parseMinecraftColor(comp?.color);
let NowFormat = parseMinecraftFormat(comp);
if ((comp || comp !== "") && (comp.text || comp.text !== "") && (comp[""] || comp[""] !== "") && (comp.keybind || comp.keybind !== "") && (comp.translate || comp.translate !== "")) {
if (format.have || prevFormat.have) {
if (format.have) {
text += format.format
shouldReset = true;
} else if (prevFormat.have) {
text += prevFormat.format
}
};
if (color.have || prevColor.have) {
if (color.have) {
text += color.color
shouldReset = true;
} else if (prevColor.have) {
text += prevColor.color
}
} else {
text += ansiMap['white'];
text += NowColor.have ? NowColor.color : prevColor.have ? prevColor.color : ansiMap['white'];
if (NowFormat.have || prevFormat.have) {
text += NowFormat.have ? NowFormat.format : prevFormat.format;
shouldReset = true;
};
}
@ -400,7 +406,7 @@ function parseMinecraftMessage(component) {
if (comp.fallback && !lang[comp.translate]) fallbackMsg = true;
if (comp.with && !fallbackMsg) {
const withArgs = comp.with.map(arg => extractText(arg, color.have === true ? color : prevColor, format.have === true ? format : prevFormat));
const withArgs = comp.with.map(arg => extractText(arg, NowColor.have ? NowColor : prevColor, NowFormat.have ? NowFormat : prevFormat));
let usedReplacements = 0;
translateString = translateString.replace(/thing__placeholder__/g, 'default_thing__placeholder__');
@ -455,29 +461,24 @@ function parseMinecraftMessage(component) {
if (comp.extra) {
if (!Array.isArray(comp.extra)) comp.extra = [comp.extra]
comp.extra.forEach(subComp => {
text += extractText(subComp, color.have === true ? color : prevColor, format.have === true ? format : prevFormat);
text += extractText(subComp, NowColor.have ? NowColor : prevColor, NowFormat.have ? NowFormat : prevFormat);
});
}
if (shouldReset) text += ansiMap['reset'];
if ((comp || comp !== "") && (comp.text || comp.text !== "") && (comp[""] || comp[""] !== "") && (comp.keybind || comp.keybind !== "") && (comp.translate || comp.translate !== "")) {
if (prevFormat.have && format.have) {
text += prevFormat.format
}
if (prevColor.have && color.have) {
text += prevColor.color
}
if (shouldReset) {
text += ansiMap['reset']
} else {
text += prevColor.color || ansiMap['white'];
text += prevFormat.format || '';
}
return text;
}
return extractText(component);
// return extractText(component) + ansiMap['reset']; ye if you need
}
function parseMinecraftMessageNoColor(component) {
if (component === undefined || component === null) return '*** Component is undefined or missing ***';
if (typeof component !== "object") return component;
@ -573,34 +574,75 @@ function parseMinecraftMessageNoColor(component) {
}
function cboutput(component) {
if (component === undefined || component === null) return;
function extractText(comp) {
if (component === undefined || component === null) return '\x1B[91m*** Component is undefined or missing ***\x1B[0m';
if (typeof component !== "object") return component;
function extractText(comp, prevColor = { color: '', have: false }, prevFormat = { format: '', have: false }) {
let text = '';
let shouldReset = false;
let NowColor = parseMinecraftColor(comp?.color);
let NowFormat = parseMinecraftFormat(comp);
if ((comp || comp !== "") && (comp.text || comp.text !== "")) {
text += NowColor.have ? NowColor.color : prevColor.have ? prevColor.color : ansiMap['white'];
if (NowFormat.have || prevFormat.have) {
text += NowFormat.have ? NowFormat.format : prevFormat.format;
shouldReset = true;
};
}
if (typeof comp.text === 'string' || typeof comp.text === 'number') {
text += comp.text;
}
if (typeof comp === 'string' || typeof comp === 'number') {
return comp;
text += comp;
}
if (comp.extra) {
if (!Array.isArray(comp.extra)) comp.extra = [comp.extra]
comp.extra.forEach(subComp => {
text += formatfunction(comp, extractText(subComp));
text += extractText(subComp, NowColor.have === true ? NowColor : prevColor, NowFormat.have === true ? NowFormat : prevFormat);
});
}
text = parseMinecraftColor(comp.color) + parseMinecraftFormat(comp) + text + ansiMap['reset'];
return text;
if (shouldReset) {
text += ansiMap['reset']
} else {
text += prevColor.color || ansiMap['white'];
text += prevFormat.format || '';
}
return text;
}
return extractText(component) + ansiMap['reset'];
return extractText(component);
}
function cboutputNoColor(component) {
if (component === undefined || component === null) return '*** Component is undefined or missing ***';
if (typeof component !== "object") return component;
function extractText(comp) {
let text = '';
if (typeof comp.text === 'string' || typeof comp.text === 'number') {
text += comp.text;
}
if (typeof comp === 'string' || typeof comp === 'number') {
text += comp;
}
if (comp.extra) {
if (!Array.isArray(comp.extra)) comp.extra = [comp.extra]
comp.extra.forEach(subComp => {
text += extractText(subComp);
});
}
return text;
}
return extractText(component);
}
module.exports = { inject, parseMinecraftMessage, parseMinecraftMessageNoColor, cboutput, simplify };

View file

@ -5,9 +5,8 @@
* - 1.20.6
*
* ChatParser Version:
* - 1.41, 1.4T (Test Version)
* - 1.44
*
* - Adding Kick Parser
*/
const mc = require('minecraft-protocol');
@ -24,7 +23,6 @@ const bot = mc.createClient({
ChatParse.inject(bot); // load catparser function
bot.on('custom_playerchat', (message, playerchat, packet) => {
console.log(`[PlayerChat] ${message}`);
});
@ -33,13 +31,18 @@ bot.on('custom_profilelesschat', (message, profilelesschat, packet) => {
console.log(`[ProfilelessChat] ${message}`);
});
bot.on('custom_systemchat', (message, systemchat, packet) => {
console.log(`[SystemChat] ${message}`);
});
/*
bot.on('kick_disconnect', (kick) => {
console.log(ChatParse.parseMinecraftMessage(kicked.reason));
})
bot.on('disconnect', (kick) => {
console.log(ChatParse.parseMinecraftMessage(kicked.reason));
})
/*
bot.on('custom_actionbar', (message, actionbar, packet) => {
console.log(`[ActionBar] ${message}`);
});