133 lines
2.9 KiB
Go
133 lines
2.9 KiB
Go
package routes
|
|
|
|
import (
|
|
"database/sql"
|
|
"encoding/json"
|
|
"log"
|
|
"net/http"
|
|
"time"
|
|
|
|
"git.1e99.eu/1e99/2b2t/models"
|
|
)
|
|
|
|
func GetPlayerCounts(db *sql.DB, logger *log.Logger) http.HandlerFunc {
|
|
return func(res http.ResponseWriter, req *http.Request) {
|
|
query := req.URL.Query()
|
|
|
|
// In minutes
|
|
var now = time.Now().Unix() / 60
|
|
var timeRange, precision int64
|
|
switch query.Get("range") {
|
|
case "1h":
|
|
timeRange = 60
|
|
precision = 1
|
|
|
|
case "6h":
|
|
timeRange = 6 * 60
|
|
precision = 1
|
|
|
|
case "1d":
|
|
timeRange = 60 * 24
|
|
precision = 5
|
|
|
|
case "7d":
|
|
timeRange = 7 * 60 * 24
|
|
precision = 30
|
|
|
|
case "30d":
|
|
timeRange = 30 * 60 * 24
|
|
precision = 2 * 60
|
|
|
|
case "356d":
|
|
timeRange = 356 * 60 * 24
|
|
precision = 60 * 24
|
|
|
|
default:
|
|
http.Error(res, "invalid time range", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
rows, err := db.Query(`
|
|
SELECT c.time, c.playing, c.normal_queue, c.priority_queue
|
|
FROM player_count c
|
|
WHERE
|
|
c.time BETWEEN ? AND ? AND
|
|
MOD(c.time, ?) = 0;`,
|
|
(now - timeRange), now, precision,
|
|
)
|
|
if err != nil {
|
|
http.Error(res, "", http.StatusInternalServerError)
|
|
logger.Printf("Failed to query for player count: %s", err)
|
|
return
|
|
}
|
|
defer rows.Close()
|
|
|
|
counts := []models.PlayerCount{}
|
|
for rows.Next() {
|
|
var count models.PlayerCount
|
|
err = rows.Scan(&count.Time, &count.Playing, &count.NormalQueue, &count.PriorityQueue)
|
|
if err != nil {
|
|
http.Error(res, "", http.StatusInternalServerError)
|
|
logger.Printf("Failed to scan player count row: %s", err)
|
|
return
|
|
}
|
|
|
|
counts = append(counts, count)
|
|
}
|
|
|
|
err = rows.Err()
|
|
if err != nil {
|
|
http.Error(res, "", http.StatusInternalServerError)
|
|
logger.Printf("Failed to query for player count: %s", err)
|
|
return
|
|
}
|
|
|
|
json.NewEncoder(res).Encode(&counts)
|
|
}
|
|
}
|
|
|
|
func SubmitPlayerCounts(db *sql.DB, logger *log.Logger) http.HandlerFunc {
|
|
return func(res http.ResponseWriter, req *http.Request) {
|
|
row := db.QueryRow(`
|
|
SELECT w.name
|
|
FROM worker w
|
|
WHERE w.token = ?;`,
|
|
req.Header.Get("X-Token"),
|
|
)
|
|
|
|
var name string
|
|
err := row.Scan(&name)
|
|
switch {
|
|
case err == sql.ErrNoRows:
|
|
http.Error(res, "", http.StatusUnauthorized)
|
|
return
|
|
|
|
case err != nil:
|
|
http.Error(res, "", http.StatusInternalServerError)
|
|
logger.Printf("Failed to query for workers: %s", err)
|
|
return
|
|
}
|
|
|
|
var count models.PlayerCount
|
|
err = json.NewDecoder(req.Body).Decode(&count)
|
|
if err != nil {
|
|
http.Error(res, "malformed json", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
_, err = db.Exec(`
|
|
INSERT INTO
|
|
player_count (time, playing, normal_queue, priority_queue)
|
|
VALUES (?, ?, ?, ?)
|
|
ON CONFLICT DO NOTHING;`,
|
|
count.Time, count.Playing, count.NormalQueue, count.PriorityQueue,
|
|
)
|
|
if err != nil {
|
|
http.Error(res, "", http.StatusInternalServerError)
|
|
logger.Printf("Failed to insert player count data: %s", err)
|
|
return
|
|
}
|
|
|
|
logger.Printf("Worker \"%s\" submitted player count %+v", name, count)
|
|
}
|
|
}
|