Skip to content
This repository was archived by the owner on Jan 30, 2024. It is now read-only.

Commit 836bd84

Browse files
committed
introduce an alive server cycler
1 parent 53ea3cf commit 836bd84

File tree

11 files changed

+196
-19
lines changed

11 files changed

+196
-19
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
.vscode
1+
.vscode
2+
*temp*

aliveServers.go

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package ttRequests
2+
3+
import (
4+
"errors"
5+
"time"
6+
7+
gocron "github.com/go-co-op/gocron"
8+
)
9+
10+
type AliveServer struct {
11+
Primary_server string
12+
Servers [2]serverType
13+
}
14+
15+
type serverType struct {
16+
Name string
17+
Id uint8
18+
CfxId string
19+
DirectUrl string
20+
CfxUrl string
21+
AliveUrl string
22+
Alive bool
23+
}
24+
25+
var servers [2]serverType
26+
var aliveToggle bool = false
27+
var AliveServers AliveServer
28+
29+
func checkInit() {
30+
if aliveToggle != true {
31+
Init()
32+
}
33+
}
34+
35+
func cronAlive() {
36+
cron := gocron.NewScheduler(time.UTC)
37+
38+
cron.Every("45s").Do(checkServers)
39+
cron.StartBlocking()
40+
}
41+
42+
func Init() {
43+
aliveToggle = true
44+
servers = [2]serverType{
45+
{
46+
Name: "NY-1",
47+
Id: 1,
48+
CfxId: "2epova",
49+
DirectUrl: "http://server.tycoon.community:30120",
50+
CfxUrl: "https://tycoon-2epova.users.cfx.re",
51+
AliveUrl: "",
52+
Alive: false,
53+
},
54+
{
55+
Name: "NY-2",
56+
Id: 2,
57+
CfxId: "njyvop",
58+
DirectUrl: "http://server.tycoon.community:30121",
59+
CfxUrl: "https://tycoon-njyvop.users.cfx.re",
60+
AliveUrl: "",
61+
Alive: false,
62+
},
63+
}
64+
// AliveServers.Primary_server = servers[0].AliveUrl
65+
AliveServers.Primary_server = ""
66+
AliveServers.Servers = servers
67+
checkServers()
68+
// cron.Every("5s").Do(checkServers)
69+
go cronAlive()
70+
}
71+
72+
func checkServers() {
73+
aliveDown := 0
74+
for i := range &AliveServers.Servers {
75+
server := &AliveServers.Servers[i]
76+
aliveCheck(server)
77+
if server.Alive {
78+
AliveServers.Primary_server = server.AliveUrl
79+
} else {
80+
aliveDown++
81+
}
82+
}
83+
if aliveDown == len(&AliveServers.Servers) {
84+
AliveServers.Primary_server = ""
85+
}
86+
// fmt.Printf("AliveServers: %+v\n", AliveServers)
87+
}
88+
89+
func aliveCheck(server *serverType) {
90+
first, err := GetNoParse_(server.DirectUrl + "/status/alive")
91+
if err != nil || (first.StatusCode != 200 && first.StatusCode != 204) {
92+
second, err := GetNoParse_(server.CfxUrl + "/status/alive")
93+
94+
if err != nil || (second.StatusCode != 200 && second.StatusCode != 204) {
95+
server.AliveUrl = server.DirectUrl
96+
server.Alive = false
97+
} else {
98+
server.AliveUrl = server.CfxUrl
99+
server.Alive = true
100+
}
101+
} else {
102+
server.AliveUrl = server.DirectUrl
103+
server.Alive = true
104+
}
105+
}
106+
107+
func PrimaryServerUrl() (string, error) {
108+
if AliveServers.Primary_server != "" {
109+
return AliveServers.Primary_server, nil
110+
} else {
111+
return "", errors.New("No online servers")
112+
}
113+
}
114+
115+
func ServerSpec(id uint8) (*serverType, error) {
116+
if id < 1 || id > 2 {
117+
return nil, errors.New("Server ID is out of range")
118+
}
119+
return &AliveServers.Servers[id-1], nil
120+
}
121+
122+
func ServerSpecAlive(id uint8) (*serverType, error) {
123+
server := &AliveServers.Servers[id-1]
124+
if server.Alive {
125+
return server, nil
126+
} else {
127+
return nil, errors.New("Requested server is not alive")
128+
}
129+
}

go.mod

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
11
module github.com/Elfshot/tt-api-wrapper
22

33
go 1.18
4+
5+
require github.com/go-co-op/gocron v1.15.0
6+
7+
require (
8+
github.com/robfig/cron/v3 v3.0.1 // indirect
9+
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
10+
)

go.sum

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
2+
github.com/go-co-op/gocron v1.15.0 h1:XmiPazahD9aq0/QdK5toCVHfgTXfrZ/s83RpAgzr6SM=
3+
github.com/go-co-op/gocron v1.15.0/go.mod h1:On9zUZTv7FBeuj9D/cdYyAWcPUiLqqAx7nsPHd0EmKM=
4+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
5+
github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
6+
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
7+
github.com/stretchr/testify v1.7.5 h1:s5PTfem8p8EbKQOctVV53k6jCJt3UX4IEJzwh+C324Q=
8+
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
9+
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
10+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

httpRequest.go

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package tt_requests
1+
package ttRequests
22

33
import (
44
"encoding/json"
@@ -11,7 +11,7 @@ import (
1111

1212
var client = &http.Client{}
1313

14-
func _Get(url string, strucVar any) (*any, error) {
14+
func Get_(url string, strucVar any) (*any, error) {
1515
res, resErr := request(url)
1616
if resErr != nil {
1717
return nil, resErr
@@ -25,13 +25,20 @@ func _Get(url string, strucVar any) (*any, error) {
2525
return &strucVar, nil
2626
}
2727

28-
func _GetNoParse(url string) (*string, error) {
29-
res, resErr := request(url)
30-
if resErr != nil {
31-
return nil, resErr
28+
func GetNoParse_(url string) (*http.Response, error) {
29+
req, err := http.NewRequest("GET", url, nil)
30+
if err != nil {
31+
return nil, err
3232
}
33+
req.Header.Set("X-Tycoon-Key", os.Getenv("TYCOON_KEY_PRIVATE"))
3334

34-
return &res, nil
35+
resp, err := client.Do(req)
36+
if err != nil { // Pass on any HTTP error
37+
fmt.Println(err)
38+
return nil, errors.New("HTTP Error: " + err.Error())
39+
}
40+
41+
return resp, nil
3542
}
3643

3744
func parse(body string, parsed any) (*any, error) {
@@ -47,7 +54,11 @@ func parse(body string, parsed any) (*any, error) {
4754
func request(url string) (string, error) {
4855
// Make the request
4956
req, err := http.NewRequest("GET", url, nil)
50-
req.Header.Set("X-Tycoon-Key", os.Getenv("TYCOON_KEY"))
57+
if err != nil {
58+
return "", err
59+
}
60+
61+
req.Header.Set("X-Tycoon-Key", os.Getenv("TYCOON_KEY_PRIVATE"))
5162

5263
resp, err := client.Do(req)
5364
if err != nil { // Pass on any HTTP error

models/dataadv.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package tt_requests_models
1+
package ttRequests_models
22

33
type UserData struct {
44
User_id uint32

models/fxplayers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package tt_requests_models
1+
package ttRequests_models
22

33
type FxPlayers []struct {
44
Endpoint string `json:"endpoint"`

models/players.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package tt_requests_models
1+
package ttRequests_models
22

33
// Dunno how I'd implement the mixed json array so...
44
//

models/sotd.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package tt_requests_models
1+
package ttRequests_models
22

33
type Sotd struct {
44
Aptitude string `json:"aptitude"`

ttRequests.go

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,29 @@
1-
package tt_requests
1+
package ttRequests
22

33
import (
44
"fmt"
55

66
models "github.com/Elfshot/tt-api-wrapper/models"
77
)
88

9+
func primaryGet(append string, struc any) (*any, error) {
10+
server, servErr := PrimaryServerUrl()
11+
if servErr != nil {
12+
return nil, servErr
13+
}
14+
15+
_, err := Get_(server+append, struc)
16+
if err != nil {
17+
return nil, err
18+
}
19+
20+
return &struc, nil
21+
}
22+
923
func Get_DataAdv(playerId uint32) (data *models.UserData, Error error) {
1024
var res models.UserData
11-
_, err := _Get(fmt.Sprintf("https://tycoon-2epova.users.cfx.re/status/dataadv/%d", playerId), &res)
25+
_, err := primaryGet(fmt.Sprintf("/status/dataadv/%d", playerId), &res)
26+
1227
if err != nil {
1328
return nil, err
1429
}
@@ -17,7 +32,8 @@ func Get_DataAdv(playerId uint32) (data *models.UserData, Error error) {
1732

1833
func Get_Players() (data *models.Players, Error error) {
1934
var res models.Players
20-
_, err := _Get("https://tycoon-2epova.users.cfx.re/status/players.json", &res)
35+
_, err := primaryGet("/status/players.json", &res)
36+
2137
if err != nil {
2238
return nil, err
2339
}
@@ -26,7 +42,8 @@ func Get_Players() (data *models.Players, Error error) {
2642

2743
func Get_FxPlayers() (data *models.FxPlayers, Error error) {
2844
var res models.FxPlayers
29-
_, err := _Get("https://tycoon-2epova.users.cfx.re/players.json", &res)
45+
_, err := primaryGet("/players.json", &res)
46+
3047
if err != nil {
3148
return nil, err
3249
}
@@ -35,7 +52,8 @@ func Get_FxPlayers() (data *models.FxPlayers, Error error) {
3552

3653
func Get_Sotd() (data *models.Sotd, Error error) {
3754
var res models.Sotd
38-
_, err := _Get("https://tycoon-2epova.users.cfx.re/status/sotd.json", &res)
55+
_, err := primaryGet("/status/sotd.json", &res)
56+
3957
if err != nil {
4058
return nil, err
4159
}

0 commit comments

Comments
 (0)