diff --git a/cmd/main.go b/cmd/main.go index fa9ddca..d5009ab 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -22,7 +22,7 @@ type Server struct { } func main() { - dsn := "postgres://postgres:secret@postgres:5432/postgres?sslmode=disable" + dsn := "postgres://postgres:secret@u0k.de:5432/postgres?sslmode=disable" store, err := postgres.NewStore(dsn) if err != nil { @@ -32,13 +32,13 @@ func main() { ss, err := store.Servers() if err != nil { - log.Fatal("There is no server in the list.") + log.Fatal("There is an issue with the databse: %w", err) } for _, s := range ss { serverString := s.ServerIP c := cron.New() - c.AddFunc("*/5 * * * *", func() { updateServers(serverString, store) }) + c.AddFunc("*/1 * * * *", func() { updateServers(serverString, store) }) c.Start() } @@ -48,10 +48,10 @@ func main() { } func updateServers(serverString string, store steamServer.Store) { - url := "http://steam-server-api:8080/server/" + serverString + url := "http://localhost:8090/server/" + serverString reqClient := http.Client { - Timeout: time.Second * 2, + Timeout: time.Second * 10, } req, err := http.NewRequest(http.MethodGet, url, nil) diff --git a/postgres/gamemode_store.go b/postgres/gamemode_store.go new file mode 100644 index 0000000..70b8420 --- /dev/null +++ b/postgres/gamemode_store.go @@ -0,0 +1,29 @@ +package postgres + +import ( + "fmt" + + "git.snrd.de/Spaenny/steamServer" + "github.com/jmoiron/sqlx" +) + +type GamemodeStore struct { + *sqlx.DB +} + +func (s *GamemodeStore) Gamemode(name string) (steamServer.Gamemode, error) { + var g steamServer.Gamemode + if err := s.Get(&g, `SELECT * FROM gamemodes WHERE name = $1`, name); err != nil { + return steamServer.Gamemode{}, fmt.Errorf("error getting gamemode id: %w", err) + } + return g, nil +} + +func (s *GamemodeStore) Gamemodes() ([]steamServer.Gamemode, error) { + var gg []steamServer.Gamemode + var query = `SELECT * FROM gamemodes ORDER BY name ASC` + if err := s.Select(&gg, query); err != nil { + return []steamServer.Gamemode{}, fmt.Errorf("error gettings servers: %w", err) + } + return gg, nil +} diff --git a/postgres/server_store.go b/postgres/server_store.go index 8771d7f..ab353d8 100644 --- a/postgres/server_store.go +++ b/postgres/server_store.go @@ -39,6 +39,15 @@ func (s *ServerStore) ServersByRegion(regionID uuid.UUID) ([]steamServer.Server, return ss, nil } +func (s *ServerStore) ServersByRegionAndGamemode(regionID uuid.UUID, gamemodeID uuid.UUID) ([]steamServer.Server, error) { + var ss []steamServer.Server + var query = `SELECT * FROM servers WHERE gamemode_id = $1 AND region_id = $2` + if err := s.Select(&ss, query, regionID, gamemodeID); err != nil { + return []steamServer.Server{}, fmt.Errorf("error gettings region servers: %w", err) + } + return ss, nil +} + func (s *ServerStore) ServersByGamemode(gamemodeID uuid.UUID) ([]steamServer.Server, error) { var ss []steamServer.Server diff --git a/postgres/store.go b/postgres/store.go index c1e7dc2..7ed0fb3 100644 --- a/postgres/store.go +++ b/postgres/store.go @@ -21,6 +21,7 @@ func NewStore(dataSourceName string) (*Store, error) { return &Store { ServerStore: &ServerStore{DB: db}, RegionStore: &RegionStore{DB: db}, + GamemodeStore: &GamemodeStore{DB: db}, }, nil } @@ -28,5 +29,6 @@ func NewStore(dataSourceName string) (*Store, error) { type Store struct { *ServerStore *RegionStore + *GamemodeStore } diff --git a/steamServer.go b/steamServer.go index e067aeb..acdc01d 100644 --- a/steamServer.go +++ b/steamServer.go @@ -1,6 +1,8 @@ package steamServer -import "github.com/google/uuid" +import ( + "github.com/google/uuid" +) type Server struct { ID uuid.UUID `db:"id"` @@ -19,10 +21,16 @@ type Region struct { Name string `db:"name"` } +type Gamemode struct { + ID uuid.UUID `db:"id"` + Name string `db:"name"` +} + type ServerStore interface { Server(id uuid.UUID) (Server, error) Servers() ([]Server, error) ServersByRegion(regionID uuid.UUID) ([]Server, error) + ServersByRegionAndGamemode(regionID uuid.UUID, gamemodeID uuid.UUID) ([]Server, error) ServersByGamemode(gamemodeID uuid.UUID) ([]Server, error) CreateServer(ser *Server) error UpdateServerByQuery(ser *Server, server_ip string) error @@ -32,7 +40,14 @@ type RegionStore interface { Region(name string) (Region, error) } + +type GamemodeStore interface { + Gamemode(name string) (Gamemode, error) + Gamemodes() ([]Gamemode, error) +} + type Store interface { ServerStore RegionStore + GamemodeStore } diff --git a/templates/home.html b/templates/home.html index ad28666..55f097c 100644 --- a/templates/home.html +++ b/templates/home.html @@ -6,6 +6,13 @@
+
+ +
+

All Regions

+
+
+
@@ -35,19 +42,21 @@
+ {{ $gamemodes := .Gamemodes}} + {{ $servers := .Servers}}

Serverlist

- + {{range $gamemode := $gamemodes}}
- {{range .Servers}} + {{range $server := $servers}} + {{if eq $gamemode.ID $server.GamemodeID}} {{end}} + {{end}}
- Servername + {{$gamemode.Name}} Map @@ -59,27 +68,30 @@
-

{{.Map}}

+

{{$server.Map}}

-

{{.Players}}/{{.MaxPlayers}}

+

{{$server.Players}}/{{$server.MaxPlayers}}

+ {{end}}
diff --git a/templates/region.html b/templates/region.html new file mode 100644 index 0000000..b84c58b --- /dev/null +++ b/templates/region.html @@ -0,0 +1,98 @@ + + + + + + + +
+ + + + + + + {{ $gamemodes := .Gamemodes}} + {{ $servers := .Servers}} +
+
+
+

{{.Region}}

+
+ {{range $gamemode := $gamemodes}} +
+
+ + + + + + + + + + + {{range $server := $servers}} + {{if eq $gamemode.ID $server.GamemodeID}} + + + + + + {{end}} + {{end}} + +
+ {{$gamemode.Name}} + + Map + + Players +
+ + +

{{$server.Map}}

+
+

{{$server.Players}}/{{$server.MaxPlayers}}

+
+
+
+ {{end}} +
+
+ + diff --git a/web/handler.go b/web/handler.go index baaa658..716247d 100644 --- a/web/handler.go +++ b/web/handler.go @@ -33,6 +33,7 @@ type Handler struct { func (h *Handler) Home() http.HandlerFunc { type data struct { Servers []steamServer.Server + Gamemodes []steamServer.Gamemode } tmpl := template.Must(template.ParseFiles("templates/home.html")) @@ -43,50 +44,74 @@ func (h *Handler) Home() http.HandlerFunc { return } + gg, err := h.store.Gamemodes() + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } + tmpl.Execute(w, data { Servers: ss, + Gamemodes: gg, }) } } func (h *Handler) Europe() http.HandlerFunc { type data struct { + Region string Servers []steamServer.Server + Gamemodes []steamServer.Gamemode } - - - tmpl := template.Must(template.ParseFiles("templates/home.html")) + tmpl := template.Must(template.ParseFiles("templates/region.html")) return func(w http.ResponseWriter, r *http.Request) { reg, err := h.store.Region("Europe") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } + + gg, err := h.store.Gamemodes() + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } + ss, err := h.store.ServersByRegion(reg.ID) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } - + tmpl.Execute(w, data { + Region: "Europe", Servers: ss, + Gamemodes: gg, }) } } + + func (h *Handler) America() http.HandlerFunc { type data struct { + Region string Servers []steamServer.Server + Gamemodes []steamServer.Gamemode } - tmpl := template.Must(template.ParseFiles("templates/home.html")) + tmpl := template.Must(template.ParseFiles("templates/region.html")) return func(w http.ResponseWriter, r *http.Request) { reg, err := h.store.Region("North America") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } + + gg, err := h.store.Gamemodes() + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + } + ss, err := h.store.ServersByRegion(reg.ID) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) @@ -94,7 +119,10 @@ func (h *Handler) America() http.HandlerFunc { } tmpl.Execute(w, data { + Region: "North America", Servers: ss, + Gamemodes: gg, }) } } +