aboutsummaryrefslogtreecommitdiff
path: root/pkg/packets/packets.go
diff options
context:
space:
mode:
authorArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2023-09-12 20:53:09 +0300
committerArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2023-09-16 21:39:42 +0300
commit82871ba1bac1d62f69e1933b66659e62d2e5e063 (patch)
treea906310fba89b670bcfda9625a6d776553d482f6 /pkg/packets/packets.go
parentnet/svc messages finally getting parsed correctly (diff)
downloadsdp.go-82871ba1bac1d62f69e1933b66659e62d2e5e063.tar.gz
sdp.go-82871ba1bac1d62f69e1933b66659e62d2e5e063.tar.bz2
sdp.go-82871ba1bac1d62f69e1933b66659e62d2e5e063.zip
another rewrite, v1.0.0
Diffstat (limited to 'pkg/packets/packets.go')
-rw-r--r--pkg/packets/packets.go125
1 files changed, 125 insertions, 0 deletions
diff --git a/pkg/packets/packets.go b/pkg/packets/packets.go
new file mode 100644
index 0000000..a84da21
--- /dev/null
+++ b/pkg/packets/packets.go
@@ -0,0 +1,125 @@
1package packets
2
3import (
4 "bytes"
5
6 "github.com/pektezol/bitreader"
7 "github.com/pektezol/demoparser/pkg/classes"
8 "github.com/pektezol/demoparser/pkg/messages"
9)
10
11type PacketMessageInfo struct {
12 PacketType int8
13 TickNumber int32
14 SlotNumber int8
15 Data any
16}
17
18const MSSC = 2
19
20func ParsePackets(reader *bitreader.ReaderType) PacketMessageInfo {
21 packetType := reader.TryReadBits(8)
22 tickNumber := reader.TryReadBits(32)
23 slotNumber := reader.TryReadBits(8)
24 var packetData any
25 switch packetType {
26 case 1: // SignOn
27 signOn := SignOn{}
28 for count := 0; count < MSSC; count++ {
29 signOn.PacketInfo = append(signOn.PacketInfo, classes.ParseCmdInfo(reader))
30 }
31 signOn.InSequence = int32(reader.TryReadBits(32))
32 signOn.OutSequence = int32(reader.TryReadBits(32))
33 signOn.Size = int32(reader.TryReadInt32())
34 data := reader.TryReadBytesToSlice(int(signOn.Size))
35 packetReader := bitreader.Reader(bytes.NewReader(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
45 packet := Packet{}
46 for count := 0; count < MSSC; count++ {
47 packet.PacketInfo = append(packet.PacketInfo, classes.ParseCmdInfo(reader))
48 }
49 packet.InSequence = int32(reader.TryReadBits(32))
50 packet.OutSequence = int32(reader.TryReadBits(32))
51 packet.Size = int32(reader.TryReadInt32())
52 data := reader.TryReadBytesToSlice(int(packet.Size))
53 packetReader := bitreader.Reader(bytes.NewReader(data), true)
54 for {
55 messageType, err := packetReader.ReadBits(6)
56 if err != nil {
57 break
58 }
59 packet.Data = append(packet.Data, messages.ParseMessages(int(messageType), packetReader))
60 }
61 packetData = packet
62 case 3: // SyncTick
63 syncTick := SyncTick{}
64 packetData = syncTick
65 case 4: // ConsoleCmd
66 size := reader.TryReadInt32()
67 consoleCmd := ConsoleCmd{
68 Size: int32(size),
69 Data: reader.TryReadStringLen(int(size)),
70 }
71 packetData = consoleCmd
72 case 5: // UserCmd
73 userCmd := UserCmd{}
74 userCmd.Cmd = int32(reader.TryReadInt32())
75 userCmd.Size = int32(reader.TryReadInt32())
76 data := reader.TryReadBytesToSlice(int(userCmd.Size))
77 userCmd.Data = classes.ParseUserCmdInfo(data)
78 packetData = userCmd
79 case 6: // DataTables
80 dataTables := DataTables{}
81 dataTables.Size = int32(reader.TryReadInt32())
82 data := reader.TryReadBytesToSlice(int(dataTables.Size))
83 dataTableReader := bitreader.Reader(bytes.NewReader(data), true)
84 count := 0
85 for dataTableReader.TryReadBool() {
86 count++
87 dataTables.SendTable = append(dataTables.SendTable, classes.ParseSendTable(dataTableReader))
88 }
89 numOfClasses := dataTableReader.TryReadBits(16)
90 for count = 0; count < int(numOfClasses); count++ {
91 dataTables.ServerClassInfo = append(dataTables.ServerClassInfo, classes.ParseServerClassInfo(dataTableReader, count, int(numOfClasses)))
92 }
93 packetData = dataTables
94 case 7: // Stop
95 stop := Stop{}
96 if reader.TryReadBool() {
97 // read remaining data
98 stop.RemainingData = []byte{}
99 }
100 packetData = stop
101 case 8: // CustomData
102 customData := CustomData{
103 Unknown: int32(reader.TryReadBits(32)),
104 Size: int32(reader.TryReadBits(32)),
105 }
106 customData.Data = string(reader.TryReadBytesToSlice(int(customData.Size)))
107 packetData = customData
108 case 9: // StringTables
109 stringTables := StringTables{
110 Size: int32(reader.TryReadInt32()),
111 }
112 data := reader.TryReadBytesToSlice(int(stringTables.Size))
113 stringTableReader := bitreader.Reader(bytes.NewReader(data), true)
114 stringTables.Data = classes.ParseStringTables(stringTableReader)
115 packetData = stringTables
116 default: // invalid
117 panic("invalid packet type")
118 }
119 return PacketMessageInfo{
120 PacketType: int8(packetType),
121 TickNumber: int32(tickNumber),
122 SlotNumber: int8(slotNumber),
123 Data: packetData,
124 }
125}