66 "os"
77 "time"
88
9- sdk "agones.dev/agones/sdks/go"
10- mcpinger "github.com/Raqbit/mc-pinger"
9+ ping "github.com/saulmaldonado/agones-mc-monitor/pkg"
1110)
1211
1312var host string
@@ -29,36 +28,26 @@ func init() {
2928}
3029
3130func main () {
32- // connect to local SDK server
33- client , err := sdk .NewSDK ()
31+ pinger , err := ping .NewTimed (host , uint16 (port ), timeout )
3432
3533 if err != nil {
3634 log .Fatal (err )
3735 }
3836
3937 // Ping server until startup
40- _ , err = pingUntilSuccessful (retry )
38+ err = pingUntilStartup (retry , interval , pinger )
4139
4240 // Exit in case of unsuccessful startup
4341 if err != nil {
4442 logger .Println (err )
4543 logger .Fatal ("Fatal Mincraft server. Exiting..." )
4644 }
4745
48- // Signal that server is ready for players
49- err = client .Ready ()
50-
51- if err != nil {
52- log .Fatal (err )
53- }
54-
55- logger .Println ("Server Ready" )
56-
5746 // Pause before starting next ping cycle
5847 time .Sleep (interval )
5948
6049 // Ping infinitely or until after a series of unsuccessful pings
61- err = pingUntilFatal (retry , client )
50+ err = pingUntilFatal (retry , interval , pinger )
6251
6352 // Exit in case of fatal server
6453 if err != nil {
@@ -67,55 +56,48 @@ func main() {
6756 }
6857}
6958
70- // Creates a pinger with Context containing timeout
71- func ping () (* mcpinger.ServerInfo , error ) {
72- pinger := mcpinger .NewTimed (host , uint16 (port ), timeout )
73- return pinger .Ping ()
74- }
75-
76- // Creates pings the server on an interval until the first sucessful ping which then will return the server info response
77- // After a series of failed retries an error will be returned indicating a fatal server
78- func pingUntilSuccessful (retry uint ) (* mcpinger.ServerInfo , error ) {
79- info , err := ping ()
80-
81- for err != nil && retry > 0 {
82- logger .Println (err )
83- logger .Printf ("Unsuccessful ping. retrying in %v..." , interval )
84- time .Sleep (interval )
85-
86- info , err = ping ()
87- retry --
88- }
59+ // Pings server with the specified retries until the server returns a complete response
60+ // Will also signal the local Agones server with Ready()
61+ // Returns an error if the pings or singaling local Agones server fails
62+ func pingUntilStartup (retry uint , interval time.Duration , pinger * ping.AgonesPinger ) error {
63+ err := retryPing (retry , interval , pinger .ReadyPingWithTimeout )
8964
90- // Server will respond with an empty JSON object if its starting up
91- // Pings will continue to happen until the server returns the expected response
92- for info .Players .Max == 0 {
93- logger .Println ("Minecraft server starting up..." )
94- time .Sleep (interval )
95- info , err = ping ()
65+ if err != nil {
66+ return err
9667 }
9768
98- return info , err
69+ logger .Println ("Server ready" )
70+ return nil
9971}
10072
10173// Pings the server infinitely or the server fails to reposnd after a series of retries
10274// Signals to local SDK that server is healthy
103- func pingUntilFatal (retry uint , client * sdk. SDK ) error {
75+ func pingUntilFatal (retry uint , interval time. Duration , pinger * ping. AgonesPinger ) error {
10476 for {
105- _ , err := pingUntilSuccessful (retry )
77+ err := retryPing (retry , interval , pinger . HealthPingWithTimeout )
10678
10779 if err != nil {
10880 return err
10981 }
11082
111- // Signal that server is healthy
112- err = client .Health ()
83+ logger .Printf ("Server healthy" )
84+ time .Sleep (interval )
85+ }
86+ }
11387
114- if err != nil {
115- logger .Fatal (err )
116- }
88+ // Retry wrapper function that will retry the given ping function with the specified attempts and intervals
89+ // until it dosen't return an error or until all attempts have been made
90+ func retryPing (attempts uint , interval time.Duration , p func () error ) error {
91+ err := p ()
11792
118- logger .Printf ("Server healthy" )
93+ for err != nil && attempts > 0 {
94+ logger .Println (err )
95+ logger .Printf ("Unsuccessful ping. retrying in %v..." , interval )
11996 time .Sleep (interval )
97+
98+ err = p ()
99+ attempts --
120100 }
101+
102+ return err
121103}
0 commit comments