Files
psn-go/encoder.go
T
2025-12-04 17:46:51 -06:00

99 lines
2.8 KiB
Go

package psn
import "github.com/jwetzell/psn-go/internal/encoders"
type Encoder struct {
SystemName string
VersionHigh uint8
VersionLow uint8
dataFrameId uint8
infoFrameId uint8
}
func (e *Encoder) ResetDataFrameId() {
e.dataFrameId = 1
}
func (e *Encoder) ResetInfoFrameId() {
e.infoFrameId = 1
}
func (e *Encoder) GetInfoPackets(timestamp uint64, trackers []*Tracker) [][]byte {
systemNameChunk := encoders.EncodeInfoSystemNameChunk(e.SystemName)
trackerChunks := [][]byte{}
for _, tracker := range trackers {
trackerChunks = append(trackerChunks, tracker.GetInfoChunk())
}
infoPackets := [][]byte{}
trackerChunksLists := [][][]byte{}
currentTrackerList := [][]byte{}
currentInfoPacketSize := PACKET_HEADER_SIZE + len(systemNameChunk) + CHUNK_HEADER_SIZE
for _, trackerChunk := range trackerChunks {
if (currentInfoPacketSize + len(trackerChunk)) > MAX_UDP_PACKET_SIZE {
trackerChunksLists = append(trackerChunksLists, currentTrackerList)
currentTrackerList = [][]byte{}
currentInfoPacketSize = 0
}
currentTrackerList = append(currentTrackerList, trackerChunk)
currentInfoPacketSize += len(trackerChunk)
}
trackerChunksLists = append(trackerChunksLists, currentTrackerList)
header := encoders.EncodePacketHeaderChunk(timestamp, e.VersionHigh, e.VersionLow, e.infoFrameId, uint8(len(trackerChunksLists)))
for _, trackerChunkList := range trackerChunksLists {
infoPackets = append(infoPackets, encoders.EncodeInfoPacketChunk(header, systemNameChunk, encoders.EncodeInfoTrackerListChunk(trackerChunkList)))
}
if e.infoFrameId == 255 {
e.infoFrameId = 0
} else {
e.infoFrameId += 1
}
return infoPackets
}
func (e *Encoder) GetDataPackets(timestamp uint64, trackers []*Tracker) [][]byte {
trackerChunks := [][]byte{}
for _, tracker := range trackers {
trackerChunks = append(trackerChunks, tracker.GetDataChunk())
}
dataPackets := [][]byte{}
trackerChunksLists := [][][]byte{}
currentTrackerList := [][]byte{}
currentDataPacketSize := PACKET_HEADER_SIZE + CHUNK_HEADER_SIZE
for _, trackerChunk := range trackerChunks {
if (currentDataPacketSize + len(trackerChunk)) > MAX_UDP_PACKET_SIZE {
trackerChunksLists = append(trackerChunksLists, currentTrackerList)
currentTrackerList = [][]byte{}
currentDataPacketSize = 0
}
currentTrackerList = append(currentTrackerList, trackerChunk)
currentDataPacketSize += len(trackerChunk)
}
trackerChunksLists = append(trackerChunksLists, currentTrackerList)
header := encoders.EncodePacketHeaderChunk(timestamp, e.VersionHigh, e.VersionLow, e.dataFrameId, uint8(len(trackerChunksLists)))
for _, trackerChunkList := range trackerChunksLists {
dataPackets = append(dataPackets, encoders.EncodeDataPacketChunk(header, encoders.EncodeDataTrackerListChunk(trackerChunkList)))
}
if e.dataFrameId == 255 {
e.dataFrameId = 0
} else {
e.dataFrameId += 1
}
return dataPackets
}