aboutsummaryrefslogtreecommitdiff
path: root/pkg/packets
diff options
context:
space:
mode:
authorArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2024-06-15 13:58:30 +0300
committerGitHub <noreply@github.com>2024-06-15 13:58:30 +0300
commit77e4b066cb8d506b4bc944ab4eb2d6e4679e2202 (patch)
tree1d549eca619ed36cb881e487cb054c4643ac8376 /pkg/packets
parentchange project name to sdp.go (diff)
downloadsdp.go-77e4b066cb8d506b4bc944ab4eb2d6e4679e2202.tar.gz
sdp.go-77e4b066cb8d506b4bc944ab4eb2d6e4679e2202.tar.bz2
sdp.go-77e4b066cb8d506b4bc944ab4eb2d6e4679e2202.zip
enable multithreading with goroutines (#20)
Diffstat (limited to 'pkg/packets')
-rw-r--r--pkg/packets/headers.go42
-rw-r--r--pkg/packets/packets.go89
2 files changed, 36 insertions, 95 deletions
diff --git a/pkg/packets/headers.go b/pkg/packets/headers.go
index 6c5ab10..bee8ddf 100644
--- a/pkg/packets/headers.go
+++ b/pkg/packets/headers.go
@@ -2,25 +2,11 @@ package packets
2 2
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/writer" 5 "github.com/pektezol/sdp.go/pkg/types"
6) 6)
7 7
8type Headers struct { 8func ParseHeaders(reader *bitreader.Reader, demo *types.Demo) types.Headers {
9 DemoFileStamp string 9 headers := types.Headers{
10 DemoProtocol int32
11 NetworkProtocol int32
12 ServerName string
13 ClientName string
14 MapName string
15 GameDirectory string
16 PlaybackTime float32
17 PlaybackTicks int32
18 PlaybackFrames int32
19 SignOnLength int32
20}
21
22func ParseHeaders(reader *bitreader.Reader) Headers {
23 headers := Headers{
24 DemoFileStamp: reader.TryReadString(), 10 DemoFileStamp: reader.TryReadString(),
25 DemoProtocol: int32(reader.TryReadSInt32()), 11 DemoProtocol: int32(reader.TryReadSInt32()),
26 NetworkProtocol: int32(reader.TryReadSInt32()), 12 NetworkProtocol: int32(reader.TryReadSInt32()),
@@ -42,16 +28,16 @@ func ParseHeaders(reader *bitreader.Reader) Headers {
42 if headers.NetworkProtocol != 2001 { 28 if headers.NetworkProtocol != 2001 {
43 panic("this parser only supports demos from portal 2") 29 panic("this parser only supports demos from portal 2")
44 } 30 }
45 writer.AppendLine("\nDemo File Stamp: %s", headers.DemoFileStamp) 31 demo.Writer.AppendLine("\nDemo File Stamp: %s", headers.DemoFileStamp)
46 writer.AppendLine("Demo Protocol: %d", headers.DemoProtocol) 32 demo.Writer.AppendLine("Demo Protocol: %d", headers.DemoProtocol)
47 writer.AppendLine("Network Protocol: %d", headers.NetworkProtocol) 33 demo.Writer.AppendLine("Network Protocol: %d", headers.NetworkProtocol)
48 writer.AppendLine("Server Name: %s", headers.ServerName) 34 demo.Writer.AppendLine("Server Name: %s", headers.ServerName)
49 writer.AppendLine("Client Name: %s", headers.ClientName) 35 demo.Writer.AppendLine("Client Name: %s", headers.ClientName)
50 writer.AppendLine("Map Name: %s", headers.MapName) 36 demo.Writer.AppendLine("Map Name: %s", headers.MapName)
51 writer.AppendLine("Game Directory: %s", headers.GameDirectory) 37 demo.Writer.AppendLine("Game Directory: %s", headers.GameDirectory)
52 writer.AppendLine("Playback Time: %f", headers.PlaybackTime) 38 demo.Writer.AppendLine("Playback Time: %f", headers.PlaybackTime)
53 writer.AppendLine("Playback Ticks: %d", headers.PlaybackTicks) 39 demo.Writer.AppendLine("Playback Ticks: %d", headers.PlaybackTicks)
54 writer.AppendLine("Playback Frames: %d", headers.PlaybackFrames) 40 demo.Writer.AppendLine("Playback Frames: %d", headers.PlaybackFrames)
55 writer.AppendLine("Sign On Length: %d\n", headers.SignOnLength) 41 demo.Writer.AppendLine("Sign On Length: %d\n", headers.SignOnLength)
56 return headers 42 return headers
57} 43}
diff --git a/pkg/packets/packets.go b/pkg/packets/packets.go
index 1bf3f57..6ae8a44 100644
--- a/pkg/packets/packets.go
+++ b/pkg/packets/packets.go
@@ -3,100 +3,55 @@ package packets
3import ( 3import (
4 "github.com/pektezol/bitreader" 4 "github.com/pektezol/bitreader"
5 "github.com/pektezol/sdp.go/pkg/classes" 5 "github.com/pektezol/sdp.go/pkg/classes"
6 "github.com/pektezol/sdp.go/pkg/writer" 6 "github.com/pektezol/sdp.go/pkg/types"
7) 7)
8 8
9type MessageType uint8 9func ParseMessage(reader *bitreader.Reader, demo *types.Demo) types.Message {
10 10 message := types.Message{
11const ( 11 PacketType: types.MessageType(reader.TryReadUInt8()),
12 SignOn MessageType = iota + 1
13 Packet
14 SyncTick
15 ConsoleCmd
16 UserCmd
17 DataTables
18 Stop
19 CustomData
20 StringTables
21)
22
23type Message struct {
24 PacketType MessageType
25 TickNumber int32
26 SlotNumber uint8
27 Data any
28}
29
30func ParseMessage(reader *bitreader.Reader) Message {
31 message := Message{
32 PacketType: MessageType(reader.TryReadUInt8()),
33 TickNumber: reader.TryReadSInt32(), 12 TickNumber: reader.TryReadSInt32(),
34 SlotNumber: reader.TryReadUInt8(), 13 SlotNumber: reader.TryReadUInt8(),
35 } 14 }
36 writer.AppendLine("[%d] %s (%d):", message.TickNumber, message.PacketType.String(), message.PacketType) 15 demo.Writer.AppendLine("[%d] %s (%d):", message.TickNumber, message.PacketType.String(), message.PacketType)
37 switch message.PacketType { 16 switch message.PacketType {
38 case SignOn: 17 case types.SignOn:
39 signOn := classes.SignOn{} 18 signOn := classes.SignOn{}
40 signOn.ParseSignOn(reader) 19 signOn.ParseSignOn(reader, demo)
41 message.Data = signOn 20 message.Data = signOn
42 case Packet: 21 case types.Packet:
43 packet := classes.Packet{} 22 packet := classes.Packet{}
44 packet.ParsePacket(reader) 23 packet.ParsePacket(reader, demo)
45 message.Data = packet 24 message.Data = packet
46 case SyncTick: 25 case types.SyncTick:
47 syncTick := classes.SyncTick{} 26 syncTick := classes.SyncTick{}
48 syncTick.ParseSyncTick() 27 syncTick.ParseSyncTick()
49 message.Data = syncTick 28 message.Data = syncTick
50 case ConsoleCmd: 29 case types.ConsoleCmd:
51 consoleCmd := classes.ConsoleCmd{} 30 consoleCmd := classes.ConsoleCmd{}
52 consoleCmd.ParseConsoleCmd(reader) 31 consoleCmd.ParseConsoleCmd(reader, demo)
53 message.Data = consoleCmd 32 message.Data = consoleCmd
54 case UserCmd: 33 case types.UserCmd:
55 userCmd := classes.UserCmd{} 34 userCmd := classes.UserCmd{}
56 userCmd.ParseUserCmd(reader) 35 userCmd.ParseUserCmd(reader, demo)
57 message.Data = userCmd 36 message.Data = userCmd
58 case DataTables: 37 case types.DataTables:
59 dataTables := classes.DataTables{} 38 dataTables := classes.DataTables{}
60 dataTables.ParseDataTables(reader) 39 dataTables.ParseDataTables(reader, demo)
61 message.Data = dataTables 40 message.Data = dataTables
62 case Stop: 41 case types.Stop:
63 stop := classes.Stop{} 42 stop := classes.Stop{}
64 stop.ParseStop(reader) 43 stop.ParseStop(reader, demo)
65 message.Data = stop 44 message.Data = stop
66 case CustomData: // TODO: not sar data 45 case types.CustomData: // TODO: not sar data
67 customData := classes.CustomData{} 46 customData := classes.CustomData{}
68 customData.ParseCustomData(reader, message.TickNumber, uint8(message.PacketType)) 47 customData.ParseCustomData(reader, message.TickNumber, uint8(message.PacketType), demo)
69 message.Data = customData 48 message.Data = customData
70 case StringTables: // TODO: parsing string table data 49 case types.StringTables: // TODO: parsing string table data
71 stringTables := classes.StringTables{} 50 stringTables := classes.StringTables{}
72 stringTables.ParseStringTables(reader) 51 stringTables.ParseStringTables(reader, demo)
73 message.Data = stringTables 52 message.Data = stringTables
74 default: 53 default:
75 panic("invalid packet type") 54 panic("invalid packet type")
76 } 55 }
77 return message 56 return message
78} 57}
79
80func (t MessageType) String() string {
81 switch t {
82 case SignOn:
83 return "SIGNON"
84 case Packet:
85 return "PACKET"
86 case SyncTick:
87 return "SYNCTICK"
88 case ConsoleCmd:
89 return "CONSOLECMD"
90 case UserCmd:
91 return "USERCMD"
92 case DataTables:
93 return "DATATABLES"
94 case Stop:
95 return "STOP"
96 case CustomData:
97 return "CUSTOMDATA"
98 case StringTables:
99 return "STRINGTABLES"
100 }
101 return "INVALID"
102}