From 82576a1bea097efe373c4cd6f94ace8249a608ec Mon Sep 17 00:00:00 2001 From: Yaode_owo Date: Tue, 3 Dec 2024 09:15:23 -0500 Subject: [PATCH] Info in chatparser.js --- main/chatparser.js | 202 +++++++++++++++++++++++++++------------------ main/main.js | 15 ++-- 2 files changed, 131 insertions(+), 86 deletions(-) diff --git a/main/chatparser.js b/main/chatparser.js index db99718..79b0a94 100644 --- a/main/chatparser.js +++ b/main/chatparser.js @@ -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; + let shouldReset = false; + let NowColor = parseMinecraftColor(comp?.color); + let NowFormat = parseMinecraftFormat(comp); - color = parseMinecraftColor(comp?.color); - format = 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']; + if ((comp || comp !== "") && (comp.text || comp.text !== "") && (comp[""] || comp[""] !== "") && (comp.keybind || comp.keybind !== "") && (comp.translate || comp.translate !== "")) { + 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 }; \ No newline at end of file diff --git a/main/main.js b/main/main.js index 28f9bc5..f0a181f 100644 --- a/main/main.js +++ b/main/main.js @@ -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,22 +23,26 @@ const bot = mc.createClient({ ChatParse.inject(bot); // load catparser function - bot.on('custom_playerchat', (message, playerchat, packet) => { console.log(`[PlayerChat] ${message}`); }); bot.on('custom_profilelesschat', (message, profilelesschat, packet) => { - console.log(`[ProfilelessChat] ${message}`); + 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}`); });