first commit
This commit is contained in:
commit
7e62f366e7
8 changed files with 224 additions and 0 deletions
21
cmd/main.go
Normal file
21
cmd/main.go
Normal file
|
@ -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)
|
||||
}
|
46
main.go
Normal file
46
main.go
Normal file
|
@ -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)
|
||||
}
|
||||
|
3
migrations/1_create_tables.down.sql
Normal file
3
migrations/1_create_tables.down.sql
Normal file
|
@ -0,0 +1,3 @@
|
|||
DROP TABLE servers;
|
||||
DROP TABLE regions;
|
||||
DROP TABLE gamemodes;
|
21
migrations/1_create_tables.up.sql
Normal file
21
migrations/1_create_tables.up.sql
Normal file
|
@ -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
|
||||
);
|
34
postgres/server_store.go
Normal file
34
postgres/server_store.go
Normal file
|
@ -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
|
||||
}
|
30
postgres/store.go
Normal file
30
postgres/store.go
Normal file
|
@ -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
|
||||
}
|
||||
|
21
steamServer.go
Normal file
21
steamServer.go
Normal file
|
@ -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
|
||||
}
|
48
web/handler.go
Normal file
48
web/handler.go
Normal file
|
@ -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,
|
||||
})
|
||||
}
|
||||
}
|
Reference in a new issue