aboutsummaryrefslogtreecommitdiff
path: root/cmd/parser.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--cmd/parser.go107
1 files changed, 80 insertions, 27 deletions
diff --git a/cmd/parser.go b/cmd/parser.go
index b4cbba4..f21d91f 100644
--- a/cmd/parser.go
+++ b/cmd/parser.go
@@ -1,53 +1,106 @@
1package main 1package main
2 2
3import ( 3import (
4 "errors"
4 "fmt" 5 "fmt"
5 "os" 6 "os"
7 "strings"
6 8
7 "github.com/pektezol/bitreader" 9 "github.com/pektezol/bitreader"
8 "github.com/pektezol/demoparser/pkg/packets" 10 "github.com/pektezol/sdp.go/pkg/packets"
9 "github.com/pektezol/demoparser/pkg/writer" 11 "github.com/pektezol/sdp.go/pkg/writer"
10) 12)
11 13
14type Demo struct {
15 Headers packets.Headers `json:"headers"`
16 Messages []packets.Message `json:"messages"`
17}
18
19type Parser struct {
20 DemoPath string
21 writer strings.Builder
22}
23
24func NewParser(demoPath string) *Parser {
25 return &Parser{
26 DemoPath: demoPath,
27 }
28}
29
12const littleEndian bool = true 30const littleEndian bool = true
13 31
14func main() { 32func main() {
15 if len(os.Args) != 2 { 33 if len(os.Args) != 2 {
16 panic("specify file in command line arguments") 34 fmt.Println("specify file in command line arguments")
35 os.Exit(1)
17 } 36 }
18 writer.AppendLine("Generated By: github.com/pektezol/demoparser") 37 parser := NewParser(os.Args[1])
19 files, err := os.ReadDir(os.Args[1]) 38 _, err := parser.ParseDemos()
20 if err != nil { // If it's not a directory 39 if err != nil {
21 file, err := os.Open(os.Args[1]) 40 fmt.Println(err.Error())
22 if err != nil { 41 os.Exit(1)
23 panic(err)
24 }
25 writer.AppendLine("\nFile Name: %s", file.Name())
26 reader := bitreader.NewReader(file, littleEndian)
27 demoParserHandler(reader)
28 defer file.Close()
29 fmt.Println(writer.GetString())
30 return
31 } 42 }
32 for _, fileinfo := range files { // If it is a directory 43 fmt.Println(parser.GetOutput())
33 file, err := os.Open(os.Args[1] + fileinfo.Name()) 44}
45
46func (p *Parser) GetOutput() string {
47 return p.writer.String()
48}
49
50func (p *Parser) ParseDemos() ([]Demo, error) {
51 writer.AppendLine("Generated By: github.com/pektezol/sdp.go")
52 files, err := os.ReadDir(p.DemoPath)
53 if err != nil {
54 // not a directory
55 file, err := os.Open(p.DemoPath)
34 if err != nil { 56 if err != nil {
35 panic(err) 57 return []Demo{}, err
36 } 58 }
37 writer.AppendLine("\nFile Name: %s", file.Name())
38 reader := bitreader.NewReader(file, littleEndian)
39 demoParserHandler(reader)
40 defer file.Close() 59 defer file.Close()
60 reader := bitreader.NewReader(file, littleEndian)
61 demo := demoParserHandler(reader, file.Name())
62 p.writer = writer.GetWriter()
63 return []Demo{demo}, nil
64 } else {
65 demos := []Demo{}
66 // directory
67 for _, fileinfo := range files {
68 if len(fileinfo.Name()) > 4 && fileinfo.Name()[len(fileinfo.Name())-4:] == ".dem" {
69 file, err := os.Open(p.DemoPath + fileinfo.Name())
70 if err != nil {
71 return []Demo{}, err
72 }
73 defer file.Close()
74 reader := bitreader.NewReader(file, littleEndian)
75 demo := demoParserHandler(reader, file.Name())
76 demos = append(demos, demo)
77 }
78 }
79 p.writer = writer.GetWriter()
80 if len(demos) == 0 {
81 return demos, errors.New("no demo found in given directory")
82 }
83 return demos, nil
41 } 84 }
42 fmt.Println(writer.GetString())
43} 85}
44 86
45func demoParserHandler(reader *bitreader.Reader) { 87func demoParserHandler(reader *bitreader.Reader, filename string) Demo {
46 packets.ParseHeaders(reader) 88 demo := Demo{}
89 writer.AppendLine("\nFile Name: %s", filename)
90 // this is for recovering after a panic inside parse headers and packet.
91 // this approach was taken since error handling bitreader functions would take a long time.
92 defer func() {
93 if err := recover(); err != nil {
94 writer.AppendLine("failed to parse demo: %v", err)
95 }
96 }()
97 demo.Headers = packets.ParseHeaders(reader)
47 for { 98 for {
48 packet := packets.ParsePackets(reader) 99 message := packets.ParseMessage(reader)
49 if packet.PacketType == 7 { 100 demo.Messages = append(demo.Messages, message)
101 if message.PacketType == 7 {
50 break 102 break
51 } 103 }
52 } 104 }
105 return demo
53} 106}