diff options
| author | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2023-09-21 19:26:40 +0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-09-21 19:26:40 +0300 |
| commit | 44eefefe67a4a5f514faa4594370346fd1b54996 (patch) | |
| tree | a8853a8ecd49ddbb87c6cc19904ec6bb5419ee83 /pkg/packets/packets.go | |
| parent | add strings builder, customize ALL outputs (#6) (diff) | |
| download | sdp.go-1.1.1.tar.gz sdp.go-1.1.1.tar.bz2 sdp.go-1.1.1.zip | |
organize packets and classes (#9)v1.1.1
Diffstat (limited to 'pkg/packets/packets.go')
| -rw-r--r-- | pkg/packets/packets.go | 125 |
1 files changed, 21 insertions, 104 deletions
diff --git a/pkg/packets/packets.go b/pkg/packets/packets.go index 33350d5..b1d6a40 100644 --- a/pkg/packets/packets.go +++ b/pkg/packets/packets.go | |||
| @@ -3,7 +3,6 @@ package packets | |||
| 3 | import ( | 3 | import ( |
| 4 | "github.com/pektezol/bitreader" | 4 | "github.com/pektezol/bitreader" |
| 5 | "github.com/pektezol/demoparser/pkg/classes" | 5 | "github.com/pektezol/demoparser/pkg/classes" |
| 6 | "github.com/pektezol/demoparser/pkg/messages" | ||
| 7 | "github.com/pektezol/demoparser/pkg/writer" | 6 | "github.com/pektezol/demoparser/pkg/writer" |
| 8 | ) | 7 | ) |
| 9 | 8 | ||
| @@ -11,130 +10,49 @@ type PacketMessageInfo struct { | |||
| 11 | PacketType uint8 | 10 | PacketType uint8 |
| 12 | TickNumber int32 | 11 | TickNumber int32 |
| 13 | SlotNumber uint8 | 12 | SlotNumber uint8 |
| 14 | Data any | ||
| 15 | } | 13 | } |
| 16 | 14 | ||
| 17 | const MSSC int = 2 | ||
| 18 | |||
| 19 | func ParsePackets(reader *bitreader.Reader) PacketMessageInfo { | 15 | func ParsePackets(reader *bitreader.Reader) PacketMessageInfo { |
| 20 | packetType := reader.TryReadUInt8() | 16 | packetType := reader.TryReadUInt8() |
| 21 | tickNumber := reader.TryReadSInt32() | 17 | tickNumber := reader.TryReadSInt32() |
| 22 | slotNumber := reader.TryReadUInt8() | 18 | slotNumber := reader.TryReadUInt8() |
| 23 | var packetData any | ||
| 24 | switch packetType { | 19 | switch packetType { |
| 25 | case 1: // SignOn | 20 | case 1: // SignOn |
| 26 | signOn := SignOn{} | ||
| 27 | writer.AppendLine("[%d] %s (%d):", tickNumber, "SIGNON", packetType) | 21 | writer.AppendLine("[%d] %s (%d):", tickNumber, "SIGNON", packetType) |
| 28 | for count := 0; count < MSSC; count++ { | 22 | signOn := classes.SignOn{} |
| 29 | signOn.PacketInfo = append(signOn.PacketInfo, classes.ParseCmdInfo(reader)) | 23 | signOn.ParseSignOn(reader) |
| 30 | } | ||
| 31 | signOn.InSequence = int32(reader.TryReadBits(32)) | ||
| 32 | signOn.OutSequence = int32(reader.TryReadBits(32)) | ||
| 33 | signOn.Size = int32(reader.TryReadSInt32()) | ||
| 34 | data := reader.TryReadBytesToSlice(uint64(signOn.Size)) | ||
| 35 | packetReader := bitreader.NewReaderFromBytes(data, true) | ||
| 36 | for { | ||
| 37 | messageType, err := packetReader.ReadBits(6) | ||
| 38 | if err != nil { | ||
| 39 | break | ||
| 40 | } | ||
| 41 | signOn.Data = append(signOn.Data, messages.ParseMessages(int(messageType), packetReader)) | ||
| 42 | } | ||
| 43 | packetData = signOn | ||
| 44 | case 2: // Packet | 24 | case 2: // Packet |
| 45 | packet := Packet{} | ||
| 46 | writer.AppendLine("[%d] %s (%d):", tickNumber, "PACKET", packetType) | 25 | writer.AppendLine("[%d] %s (%d):", tickNumber, "PACKET", packetType) |
| 47 | for count := 0; count < MSSC; count++ { | 26 | packet := classes.Packet{} |
| 48 | packet.PacketInfo = append(packet.PacketInfo, classes.ParseCmdInfo(reader)) | 27 | packet.ParsePacket(reader) |
| 49 | } | ||
| 50 | packet.InSequence = int32(reader.TryReadBits(32)) | ||
| 51 | packet.OutSequence = int32(reader.TryReadBits(32)) | ||
| 52 | packet.Size = int32(reader.TryReadSInt32()) | ||
| 53 | data := reader.TryReadBytesToSlice(uint64(packet.Size)) | ||
| 54 | packetReader := bitreader.NewReaderFromBytes(data, true) | ||
| 55 | for { | ||
| 56 | messageType, err := packetReader.ReadBits(6) | ||
| 57 | if err != nil { | ||
| 58 | break | ||
| 59 | } | ||
| 60 | packet.Data = append(packet.Data, messages.ParseMessages(int(messageType), packetReader)) | ||
| 61 | } | ||
| 62 | packetData = packet | ||
| 63 | case 3: // SyncTick | 28 | case 3: // SyncTick |
| 64 | syncTick := SyncTick{} | ||
| 65 | writer.AppendLine("[%d] %s (%d):", tickNumber, "SYNCTICK", packetType) | 29 | writer.AppendLine("[%d] %s (%d):", tickNumber, "SYNCTICK", packetType) |
| 66 | packetData = syncTick | 30 | syncTick := classes.SyncTick{} |
| 31 | syncTick.ParseSyncTick() | ||
| 67 | case 4: // ConsoleCmd | 32 | case 4: // ConsoleCmd |
| 68 | consoleCmd := ConsoleCmd{} | ||
| 69 | writer.AppendLine("[%d] %s (%d):", tickNumber, "CONSOLECMD", packetType) | 33 | writer.AppendLine("[%d] %s (%d):", tickNumber, "CONSOLECMD", packetType) |
| 70 | consoleCmd.Size = reader.TryReadSInt32() | 34 | consoleCmd := classes.ConsoleCmd{} |
| 71 | consoleCmd.Data = reader.TryReadStringLength(uint64(consoleCmd.Size)) | 35 | consoleCmd.ParseConsoleCmd(reader) |
| 72 | writer.AppendLine("\t%s", consoleCmd.Data) | 36 | case 5: // UserCmd |
| 73 | packetData = consoleCmd | ||
| 74 | case 5: // UserCmd TODO: usercmdinfo refactor | ||
| 75 | userCmd := UserCmd{} | ||
| 76 | writer.AppendLine("[%d] %s (%d):", tickNumber, "USERCMD", packetType) | 37 | writer.AppendLine("[%d] %s (%d):", tickNumber, "USERCMD", packetType) |
| 77 | userCmd.Cmd = int32(reader.TryReadSInt32()) | 38 | userCmd := classes.UserCmd{} |
| 78 | userCmd.Size = int32(reader.TryReadSInt32()) | 39 | userCmd.ParseUserCmd(reader) |
| 79 | data := reader.TryReadBytesToSlice(uint64(userCmd.Size)) | 40 | case 6: // DataTables |
| 80 | userCmd.Data = classes.ParseUserCmdInfo(data) | ||
| 81 | packetData = userCmd | ||
| 82 | case 6: // DataTables TODO: prop stuff | ||
| 83 | dataTables := DataTables{} | ||
| 84 | writer.AppendLine("[%d] %s (%d):", tickNumber, "DATATABLES", packetType) | 41 | writer.AppendLine("[%d] %s (%d):", tickNumber, "DATATABLES", packetType) |
| 85 | dataTables.Size = int32(reader.TryReadSInt32()) | 42 | dataTables := classes.DataTables{} |
| 86 | data := reader.TryReadBytesToSlice(uint64(dataTables.Size)) | 43 | dataTables.ParseDataTables(reader) |
| 87 | dataTableReader := bitreader.NewReaderFromBytes(data, true) | ||
| 88 | count := 0 | ||
| 89 | for dataTableReader.TryReadBool() { | ||
| 90 | count++ | ||
| 91 | dataTables.SendTable = append(dataTables.SendTable, classes.ParseSendTable(dataTableReader)) | ||
| 92 | } | ||
| 93 | writer.AppendLine("\t%d Send Tables:", count) | ||
| 94 | writer.AppendOutputFromTemp() | ||
| 95 | numOfClasses := dataTableReader.TryReadBits(16) | ||
| 96 | for count = 0; count < int(numOfClasses); count++ { | ||
| 97 | dataTables.ServerClassInfo = append(dataTables.ServerClassInfo, classes.ParseServerClassInfo(dataTableReader, count, int(numOfClasses))) | ||
| 98 | } | ||
| 99 | writer.AppendLine("\t%d Classes:", count) | ||
| 100 | writer.AppendOutputFromTemp() | ||
| 101 | packetData = dataTables | ||
| 102 | case 7: // Stop | 44 | case 7: // Stop |
| 103 | stop := Stop{} | ||
| 104 | writer.AppendLine("[%d] %s (%d):", tickNumber, "STOP", packetType) | 45 | writer.AppendLine("[%d] %s (%d):", tickNumber, "STOP", packetType) |
| 105 | if reader.TryReadBool() { | 46 | stop := classes.Stop{} |
| 106 | stop.RemainingData = reader.TryReadBitsToSlice(uint64(reader.TryReadRemainingBits())) | 47 | stop.ParseStop(reader) |
| 107 | writer.AppendLine("\tRemaining Data: %v", stop.RemainingData) | ||
| 108 | } | ||
| 109 | packetData = stop | ||
| 110 | case 8: // CustomData TODO: not sar data | 48 | case 8: // CustomData TODO: not sar data |
| 111 | customData := CustomData{} | 49 | customData := classes.CustomData{} |
| 112 | customData.Type = reader.TryReadSInt32() | 50 | customData.ParseCustomData(reader, tickNumber, packetType) |
| 113 | customData.Size = reader.TryReadSInt32() | ||
| 114 | if customData.Type != 0 || customData.Size == 8 { | ||
| 115 | // Not SAR data | ||
| 116 | writer.AppendLine("[%d] %s (%d):", tickNumber, "CUSTOMDATA", packetType) | ||
| 117 | customData.Data = string(reader.TryReadBytesToSlice(uint64(customData.Size))) | ||
| 118 | writer.AppendLine("\t%s", customData.Data) | ||
| 119 | packetData = customData | ||
| 120 | break | ||
| 121 | } | ||
| 122 | // SAR data | ||
| 123 | sarData := classes.SarData{} | ||
| 124 | writer.AppendLine("[%d] %s (%d):", tickNumber, "SARDATA", packetType) | ||
| 125 | data := reader.TryReadBytesToSlice(uint64(customData.Size)) | ||
| 126 | sarReader := bitreader.NewReaderFromBytes(data, true) | ||
| 127 | sarData.ParseSarData(sarReader) | ||
| 128 | packetData = sarData | ||
| 129 | case 9: // StringTables TODO: parsing string table data | 51 | case 9: // StringTables TODO: parsing string table data |
| 130 | stringTables := StringTables{} | ||
| 131 | writer.AppendLine("[%d] %s (%d):", tickNumber, "STRINGTABLES", packetType) | 52 | writer.AppendLine("[%d] %s (%d):", tickNumber, "STRINGTABLES", packetType) |
| 132 | stringTables.Size = reader.TryReadSInt32() | 53 | stringTables := classes.StringTables{} |
| 133 | data := reader.TryReadBytesToSlice(uint64(stringTables.Size)) | 54 | stringTables.ParseStringTables(reader) |
| 134 | stringTableReader := bitreader.NewReaderFromBytes(data, true) | 55 | default: // Invalid |
| 135 | stringTables.Data = classes.ParseStringTables(stringTableReader) | ||
| 136 | packetData = stringTables | ||
| 137 | default: // invalid | ||
| 138 | writer.AppendLine("[%d] %s (%d):", tickNumber, "INVALID", packetType) | 56 | writer.AppendLine("[%d] %s (%d):", tickNumber, "INVALID", packetType) |
| 139 | panic("invalid packet type") | 57 | panic("invalid packet type") |
| 140 | } | 58 | } |
| @@ -142,6 +60,5 @@ func ParsePackets(reader *bitreader.Reader) PacketMessageInfo { | |||
| 142 | PacketType: packetType, | 60 | PacketType: packetType, |
| 143 | TickNumber: tickNumber, | 61 | TickNumber: tickNumber, |
| 144 | SlotNumber: slotNumber, | 62 | SlotNumber: slotNumber, |
| 145 | Data: packetData, | ||
| 146 | } | 63 | } |
| 147 | } | 64 | } |