-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.go
113 lines (98 loc) · 2.58 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package main
import (
"flag"
"fmt"
"github.com/glebarez/sqlite"
"github.com/wows-tools/wows-stats/backend"
"github.com/wows-tools/wows-stats/model"
"github.com/wows-tools/wows-stats/stats"
"go.uber.org/zap"
"golang.org/x/exp/constraints"
"gorm.io/gorm"
"moul.io/zapgorm2"
"os"
"time"
)
func min[T constraints.Ordered](a, b T) T {
if a < b {
return a
}
return b
}
func main() {
var (
apiKey string
server string
debug bool
output string
skipScraping bool
skipGeneration bool
)
flag.StringVar(&apiKey, "apikey", "", "Wargaming.net API key")
flag.StringVar(&server, "server", "", "World of Warships server")
flag.BoolVar(&debug, "debug", false, "Enable debug mode")
flag.StringVar(&output, "output", "", "Output file path (required)")
flag.BoolVar(&skipScraping, "skip-scraping", false, "Skip scraping data")
flag.BoolVar(&skipGeneration, "skip-generation", false, "Skip report generation")
flag.Parse()
if apiKey == "" || server == "" || output == "" {
flag.PrintDefaults()
os.Exit(1)
}
var loggerConfig zap.Config
if debug {
loggerConfig = zap.NewDevelopmentConfig()
} else {
loggerConfig = zap.NewProductionConfig()
}
logger, err := loggerConfig.Build()
if err != nil {
fmt.Printf("Error initializing logger: %s\n", err.Error())
os.Exit(-1)
}
defer logger.Sync()
glogger := zapgorm2.New(logger)
glogger.SlowThreshold = time.Millisecond * 100000
sugar := logger.Sugar()
mainLogger := sugar.With("component", "main")
dbName := server + "-stats.db"
db, err := gorm.Open(sqlite.Open(dbName), &gorm.Config{Logger: glogger})
if err != nil {
panic("failed to connect database")
}
sqldb, err := db.DB()
if err != nil {
panic("failed to set max connections")
}
sqldb.SetMaxOpenConns(2)
Schemas := []interface{}{
&model.Player{},
&model.PreviousClan{},
&model.Clan{},
&model.Scan{},
&model.Version{},
&model.WowsVersion{},
}
// Migrate the schema
var version model.Version
version.Version = 0
version.Name = "version"
db.FirstOrInit(&version, version)
if version.Version < model.DBVersion {
db.AutoMigrate(Schemas...)
db.Model(&version).Update("version", model.DBVersion)
}
api := backend.NewBackend(apiKey, server, sugar.With("component", "backend"), db)
// api.PrefixBreak = 100
// api.ClanBreak = 10
if !skipScraping {
err = api.ScrapAll()
if err != nil {
mainLogger.Errorf("first scan errored with: %s", err.Error())
}
}
if !skipGeneration {
statsServer := stats.NewStatsServer(output, sugar.With("component", "stats_server"), db, server)
statsServer.GenerateReport()
}
}