commit 7e62f366e7e09b32425dbb8ba9272ded1a1d192d Author: Philipp Böhm Date: Mon Sep 20 14:57:24 2021 +0200 first commit diff --git a/cmd/main.go b/cmd/main.go new file mode 100644 index 0000000..08008be --- /dev/null +++ b/cmd/main.go @@ -0,0 +1,21 @@ +package main + +import ( + "log" + "net/http" + + "git.snrd.de/Spaenny/postgres" + "git.snrd.de/Spaenny/web" +) + +func main() { + dsn := "postgres://postgres:secret@localhost/postgres?sslmode=disable" + + store, err := postgres.NewStore(dsn) + if err != nil { + log.Fatal(err) + } + + h := web.NewHandler(store) + http.ListenAndServe(":3000, h) +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..36f7dcc --- /dev/null +++ b/main.go @@ -0,0 +1,46 @@ +package main + +import ( + "encoding/json" + "fmt" +) + + +type Server struct { + AppID int `json:"AppID"` + Name string `json:"Name"` + Map string `json:"Map"` + Players int `json:"Players"` + MaxPlayers int `json:"MaxPlayers"` +} + +func main() { + serverJSON := `{ + "Protocol": 17, + "Name": "Spenny.TF | DM #1", + "Map": "cp_process_final", + "Folder": "tf", + "Game": "TFTrue deathmatch ", + "AppID": 440, + "Players": 0, + "MaxPlayers": 8, + "Bots": 0, + "ServerType": 1, + "ServerOS": 1, + "Visibility": false, + "VAC": true, + "Version": "6774624", + "EDF": 177, + "ExtendedServerInfo": { + "Port": 27015, + "SteamID": 90151367621494793, + "Keywords": "cp,nocrits", + "GameID": 440 + } + }` + + var server Server + json.Unmarshal([]byte(serverJSON), &server) + fmt.Println(server) +} + diff --git a/migrations/1_create_tables.down.sql b/migrations/1_create_tables.down.sql new file mode 100644 index 0000000..8be932c --- /dev/null +++ b/migrations/1_create_tables.down.sql @@ -0,0 +1,3 @@ +DROP TABLE servers; +DROP TABLE regions; +DROP TABLE gamemodes; diff --git a/migrations/1_create_tables.up.sql b/migrations/1_create_tables.up.sql new file mode 100644 index 0000000..acb90e3 --- /dev/null +++ b/migrations/1_create_tables.up.sql @@ -0,0 +1,21 @@ +CREATE TABLE servers ( + id UUID PRIMARY KEY, + region_id UUID NOT NULL REFERENCES regions(id) ON DELETE CASCADE, + gamemode_id UUID NOT NULL REFERENCES gamemodes(id) ON DELETE CASCADE, + app_id INT NOT NULL, + name TEXT NOT NULL, + map TEXT NOT NULL, + players INT, + max_players INT +); + +CREATE TABLE regions ( + id UUID PRIMARY KEY, + name TEXT NOT NULL +); + +CREATE TABLE gamemodes ( + id UUID PRIMARY KEY, + name TEXT NOT NULL, + description NOT NULL +); diff --git a/postgres/server_store.go b/postgres/server_store.go new file mode 100644 index 0000000..185a32d --- /dev/null +++ b/postgres/server_store.go @@ -0,0 +1,34 @@ +package postgres + +import ( + "fmt" + + "git.snrd.de/Spaenny/steamServer" + "github.com/google/uuid" + "github.com/jmoiron/sqlx" +) + +type ServerStore struct { + *sqlx.DB +} + +func (s *ServerStore) Server(id uuid.UUID) (steamServer.Server, error) { + var ser steamServer.Server + if err := s.Get(&ser, `SELECT * FROM servers WHERE id = $1`, id); err != nil { + return steamServer.Server{}, fmt.Errorf("error getting server: %w", err) + } + return ser, nil +} + +func (s *ServerStore) CreateServer(ser *steamServer.Server) error { + if err := s.Get(ser, `INSERT INTO servers VALUES($1, $2, $3, $4, $5, $6) RETURNUNG *`, + ser.ID, + ser.AppID, + ser.Name, + ser.Map, + ser.Player, + ser.MaxPlayers); err != nil { + return fmt.Errorf("error creating server: %w", err) + } + return nil +} diff --git a/postgres/store.go b/postgres/store.go new file mode 100644 index 0000000..91244d5 --- /dev/null +++ b/postgres/store.go @@ -0,0 +1,30 @@ +package postgres + +import ( + "fmt" + + "github.com/jmoiron/sqlx" + _ "github.com/lib/pq" + +) + +func NewStore(dataSourceName string) (*Store, error) { + db, err := sqlx.Open("postgres", dataSourceName) + if err != nil { + return nil, fmt.Errorf("error opening database %w", err) + } + + if err := db.Ping(); err != nil { + return nil, fmt.Errorf("error connecting to database %w", err) + } + + return &Store { + ServerStore: &ServerStore{DB: db}, + }, nil + +} + +type Store struct { + *ServerStore +} + diff --git a/steamServer.go b/steamServer.go new file mode 100644 index 0000000..7f7068f --- /dev/null +++ b/steamServer.go @@ -0,0 +1,21 @@ +package steamServer + +import "github.com/google/uuid" + +type Server struct { + ID uuid.UUID `db:"id"` + AppID int `json:"AppID"` + Name string `json:"Name"` + Map string `json:"Map"` + Players int `json:"Players"` + MaxPlayers int `json:"MaxPlayers"` +} + +type ServerStore interface { + Server(id uuid.UUID) (Server, error) + CreateServer(ser *Server) err +} + +type Store interface { + ServerStore +} diff --git a/web/handler.go b/web/handler.go new file mode 100644 index 0000000..d838811 --- /dev/null +++ b/web/handler.go @@ -0,0 +1,48 @@ +package web + +import ( + "html/template" + "net/http" + + "git.snrd.de/Spaenny/steamServer" + "github.com/go-chi/chi" + "github.com/go-chi/chi/middleware" +) + +func NewHandler(store steamServer.Store) *Handler { + h := &Handler { + Mux: chi.NewMux(), + store: store, + } + + h.Use(middleware.Logger) + + h.Get("/", h.Home()) + + return h +} + +type Handler struct { + *chi.Mux + + store steamServer.Store +} + +func (h *Handler) Home() http.HandlerFunc { + type data struct { + Servers []steamServer.Servers + } + + tmpl := template.Must(template.ParseFiles("templates/layout.html", "templates/home.html")) + return func(w http.ResponseWriter, r *http.Request) { + ss, err := h.store.Servers() + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + tmpl.Execute(w, data { + Servers: ss, + }) + } +}