Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .gitmodules

This file was deleted.

1 change: 0 additions & 1 deletion html/hex-viewer
Submodule hex-viewer deleted from 33738b
89 changes: 89 additions & 0 deletions html/mainPage/hex-viewer.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Packet hex</title>
<style>
:root {
color-scheme: dark;
font-family: "PT Mono", Consolas, monospace;
background: #242424;
color: #e8e8e8;
}

body {
margin: 0;
min-height: 100vh;
background: #242424;
}

pre {
box-sizing: border-box;
margin: 0;
min-width: max-content;
padding: 12px;
font: 13px/1.55 "PT Mono", Consolas, monospace;
white-space: pre;
tab-size: 4;
}

.offset {
color: #8ab4f8;
}

.ascii {
color: #a8c7a0;
}
</style>
</head>
<body>
<pre id="output">No packet selected.</pre>
<script>
const output = document.getElementById('output')

function toBytes (value) {
if (value instanceof ArrayBuffer) return new Uint8Array(value)
if (ArrayBuffer.isView(value)) {
return new Uint8Array(value.buffer, value.byteOffset, value.byteLength)
}
if (value && value.type === 'Buffer' && Array.isArray(value.data)) {
return Uint8Array.from(value.data)
}
if (Array.isArray(value)) return Uint8Array.from(value)
return new Uint8Array()
}

function escapeText (value) {
return value
.replace(/&/g, '&amp;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
}

function formatBytes (bytes) {
if (bytes.length === 0) return 'No raw packet data.'

const offsetWidth = Math.max(4, (bytes.length - 1).toString(16).length)
const rows = []
for (let offset = 0; offset < bytes.length; offset += 16) {
const slice = bytes.slice(offset, offset + 16)
const hex = Array.from(slice, byte => byte.toString(16).padStart(2, '0').toUpperCase())
.join(' ')
.padEnd(47, ' ')
const ascii = Array.from(slice, byte => byte >= 32 && byte <= 126 ? String.fromCharCode(byte) : '.')
.join('')
rows.push(
`<span class="offset">${offset.toString(16).padStart(offsetWidth, '0').toUpperCase()}</span> ` +
`${hex} <span class="ascii">${escapeText(ascii)}</span>`
)
}
return rows.join('\n')
}

window.addEventListener('message', event => {
output.innerHTML = formatBytes(toBytes(event.data))
})
</script>
</body>
</html>
11 changes: 7 additions & 4 deletions html/mainPage/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,11 @@ <h3>Filtering</h3>
</div>
<div id="extendedPresets">
</div>
<br><br>
<div class="box" style="height: calc(100% - 118px);">
<br><br>
<input class="filter packet-type-filter" id="filtering-search"
oninput="updateFilteringPacketSearch()"
placeholder="Search packet name or ID" type="search">
<div class="box" style="height: calc(100% - 154px);">
<ul class="packetlist" id="filtering-packets">

</ul>
Expand Down Expand Up @@ -139,7 +142,7 @@ <h3>Scripting (beta)</h3>
</div>
<div class="split" id="sidebar">
<div class="toolbar tab">
<button class="tab-button tablinks-rightpanel active" onclick="openMenu(event, 'tree', '-rightpanel')">Data</button>
<button class="tab-button tablinks-rightpanel active" onclick="openMenu(event, 'tree', '-rightpanel')">Data</button>
<button class="tab-button tablinks-rightpanel" id="wiki-button" onclick="openMenu(event, 'wikivg', '-rightpanel'); scrollWikiToCurrentPacket()">wiki.vg</button>
<button class="tab-button tablinks-rightpanel" onclick="openMenu(event, 'hex', '-rightpanel'); scrollWikiToCurrentPacket()">Hex view</button>
</div>
Expand All @@ -151,7 +154,7 @@ <h3>Scripting (beta)</h3>
<iframe id="iframe"></iframe>
</div>
<div class="tabcontent tabcontent-rightpanel" id="hex" style="height: 100%; padding: 0px; overflow: hidden;">
<iframe id="hex-viewer" src="../hex-viewer/hex-viewer.html" style="display: none;"></iframe>
<iframe id="hex-viewer" src="./hex-viewer.html" style="display: none;"></iframe>
</div>
</div>
</div>
Expand Down
20 changes: 16 additions & 4 deletions html/mainPage/js/filteringLogic.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,27 @@
exports.packetFilteredByFilterBox = function (packet, filter, hiddenPackets, inverseFiltering, regexFilter,
sharedVars) {
if(!hiddenPackets) return false;
if (hiddenPackets[packet.direction].includes(packet.meta.name)) {
if (!packet || !hiddenPackets) return false
const direction = packet.direction || ''
const meta = packet.meta || {}
const packetName = meta.name === undefined ? 'unknown' : String(meta.name)
const hiddenForDirection = Array.isArray(hiddenPackets[direction])
? hiddenPackets[direction]
: []
if (hiddenForDirection.includes(packetName)) {
return true
}

if (sharedVars.lastFilter === '') {
return false
}

const comparisonString = packet.hexIdString + ' ' + packet.meta.name + ' ' + JSON.stringify(packet.data)
let packetData
try {
packetData = JSON.stringify(packet.data)
} catch (err) {
packetData = String(packet.data)
}
const comparisonString = String(packet.hexIdString || '') + ' ' + packetName + ' ' + packetData

if (regexFilter && typeof filter === 'string') {
try {
Expand All @@ -36,5 +48,5 @@ exports.packetFilteredByFilterBox = function (packet, filter, hiddenPackets, inv
}

exports.packetCollapsed = function (packet, filter, hiddenPackets) {
return packet.meta.name === 'position'
return Boolean(packet && packet.meta && packet.meta.name === 'position')
}
149 changes: 136 additions & 13 deletions html/mainPage/js/ipcHandler.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,22 @@ exports.setup = function (passedSharedVars) {

sharedVars.ipcRenderer.on('copyPacketData', (event, arg) => {
const ipcMessage = JSON.parse(arg)
let data = sharedVars.allPackets[ipcMessage.id].data
data = sharedVars.proxyCapabilities.jsonData ? JSON.stringify(data, null, 2) : data.data
const packet = sharedVars.allPackets[Number(ipcMessage.id)]
if (!packet) return
const data = sharedVars.proxyCapabilities.jsonData
? sharedVars.packetDom.serializeData(packet.data, 2)
: packet.data && packet.data.data !== undefined
? String(packet.data.data)
: ''
sharedVars.ipcRenderer.send('copyToClipboard', data)
})

sharedVars.ipcRenderer.on('copyHexData', (event, arg) => {
const ipcMessage = JSON.parse(arg)
let data = ''
for (const byte of sharedVars.allPackets[ipcMessage.id].raw) {
const packet = sharedVars.allPackets[Number(ipcMessage.id)]
if (!packet || !packet.raw) return
for (const byte of packet.raw) {
data += byte.toString(16).padStart(2, '0')
data += ' '
}
Expand All @@ -24,9 +31,11 @@ exports.setup = function (passedSharedVars) {
sharedVars.ipcRenderer.on('copyTeleportCommand', (event, arg) => {
console.log(sharedVars.allPackets)
const ipcMessage = JSON.parse(arg)
const data = sharedVars.allPackets[ipcMessage.id].data
const packet = sharedVars.allPackets[Number(ipcMessage.id)]
if (!packet || !packet.data) return
const data = packet.data

let clipData = '/tp @p ' + ((datasharedVars.packetsUpdated = false.flags & 0x01) ? '~' : '') + ((data.x === 0 && (data.flags & 0x01)) ? '' : data.x) +
let clipData = '/tp @p ' + ((data.flags & 0x01) ? '~' : '') + ((data.x === 0 && (data.flags & 0x01)) ? '' : data.x) +
((data.flags & 0x02) ? ' ~' : ' ') + ((data.y === 0 && (data.flags & 0x03)) ? '' : data.y) +
((data.flags & 0x04) ? ' ~' : ' ') + ((data.z === 0 && (data.flags & 0x04)) ? '' : data.z)

Expand Down Expand Up @@ -59,13 +68,127 @@ exports.setup = function (passedSharedVars) {
window.updateFilteringPackets()
})

sharedVars.ipcRenderer.on('loadLogData', (event, arg) => {
sharedVars.allPackets = JSON.parse(arg)
for (const packet of sharedVars.allPackets) {
sharedVars.packetDom.addPacketToDOM(packet)
sharedVars.ipcRenderer.on('loadLogStart', (event, request) => {
const { requestId, payload } = request

try {
window.activeLoadId = payload.loadId
window.loadLogRunning = true

if (typeof window.deselectPacket === 'function') {
window.deselectPacket()
}

sharedVars.allPackets = []
sharedVars.allPacketsHTML = []
sharedVars.hiddenPacketsAmount = 0
sharedVars.packetsUpdated = false
if (sharedVars.packetList) {
sharedVars.packetList.innerHTML = ''
}

console.log(
`Loading log: ${payload.filePath} (${payload.fileSize} bytes)`
)

sharedVars.ipcRenderer.send(
`loadLogStart-ack-${requestId}`,
{
success: true
}
)
} catch (err) {
sharedVars.ipcRenderer.send(
`loadLogStart-ack-${requestId}`,
{
error: err.message
}
)
}
})

sharedVars.ipcRenderer.on('loadLogChunk', (event, request) => {
const { requestId, payload } = request

try {
if (payload.loadId !== window.activeLoadId) {
throw new Error('Invalid load session')
}

sharedVars.packetDom.addPackets(payload.packets, true)

sharedVars.ipcRenderer.send(
`loadLogChunk-ack-${requestId}`,
{
success: true,
packetCount: sharedVars.allPackets.length
}
)
} catch (err) {
sharedVars.ipcRenderer.send(
`loadLogChunk-ack-${requestId}`,
{
error: err.message
}
)
}
})

sharedVars.ipcRenderer.on('loadLogFinish', (event, request) => {
const { requestId, payload } = request

try {
if (payload.loadId !== window.activeLoadId) {
throw new Error('Invalid load session')
}

sharedVars.packetDom.refresh()

console.log(
`Loaded ${payload.packetCount} packets`
)

window.activeLoadId = null
window.loadLogRunning = false

sharedVars.ipcRenderer.send(
`loadLogFinish-ack-${requestId}`,
{
success: true
}
)
} catch (err) {
sharedVars.ipcRenderer.send(
`loadLogFinish-ack-${requestId}`,
{
error: err.message
}
)
}
})

sharedVars.ipcRenderer.on('loadLogError', (event, payload) => {
if (
payload.loadId &&
window.activeLoadId &&
payload.loadId !== window.activeLoadId
) {
return
}

window.activeLoadId = null
window.loadLogRunning = false

console.error(
'Log load failed:',
payload.error
)

alert(
`Log load failed: ${payload.error}`
)
})

sharedVars.ipcRenderer.on('loadScriptData', (event, arg) => {
window.scriptEditor.getDoc().setValue(arg)
sharedVars.ipcRenderer.send('scriptStateChange', JSON.stringify({ //
Expand All @@ -79,9 +202,9 @@ exports.setup = function (passedSharedVars) {
document.getElementById('btnScriptSave').title = arg
})

sharedVars.ipcRenderer.on('disableBtnScriptSave', (event, arg) => {
document.getElementById('btnScriptSave').disabled = true
document.getElementById('btnScriptSave').title = ''
})
sharedVars.ipcRenderer.on('disableBtnScriptSave', (event, arg) => {
document.getElementById('btnScriptSave').disabled = true
document.getElementById('btnScriptSave').title = ''
})

}
Loading