const ByteStream = require("./ByteStream") class Protocol { constructor() { this.version = "1.0.0" this.clientVersion = 52 } createPacketHeader(messageType, payload) { const stream = new ByteStream() stream.writeUInt16(messageType) stream.writeUInt24(payload.length) return Buffer.concat([stream.getBuffer(), payload]) } createClientHello() { const stream = new ByteStream() // Protocol version stream.writeUInt32(1) // Key version stream.writeUInt32(this.clientVersion) // Major version stream.writeUInt32(52) // Minor version stream.writeUInt32(0) // Build version stream.writeUInt32(258) // Hash stream.writeString("") return this.createPacketHeader(10100, stream.getBuffer()) } createLoginMessage() { const stream = new ByteStream() // High ID stream.writeUInt32(0) // Low ID stream.writeUInt32(Math.floor(Math.random() * 1000000)) // Token stream.writeString("") // Major version stream.writeUInt32(52) // Minor version stream.writeUInt32(0) // Build version stream.writeUInt32(258) // Hash stream.writeString("") // Device stream.writeString("OpenBrawlProject") // Language stream.writeString("EN") return this.createPacketHeader(10101, stream.getBuffer()) } createKeepAlive() { const stream = new ByteStream() // Keep alive doesn't need payload return this.createPacketHeader(20108, stream.getBuffer()) } createHeartbeat() { const stream = new ByteStream() // Heartbeat with timestamp stream.writeUInt32(Date.now()) return this.createPacketHeader(0, stream.getBuffer()) } createCustomPacket() { const stream = new ByteStream() // Custom data stream.writeString("OpenBrawlProject") stream.writeUInt32(Date.now()) stream.writeUInt8(1) return this.createPacketHeader(6076, stream.getBuffer()) } } module.exports = Protocol