Add daily run rankings

pull/1/head
Flashfyre 2024-03-17 13:18:51 -04:00
parent 71889f7daa
commit ff98047caa
7 changed files with 168 additions and 111 deletions

View File

@ -2,6 +2,8 @@ package api
import ( import (
"encoding/base64" "encoding/base64"
"encoding/json"
"fmt"
"log" "log"
"net/http" "net/http"
"time" "time"
@ -34,3 +36,20 @@ func InitDailyRun() {
func (s *Server) HandleSeed(w http.ResponseWriter, r *http.Request) { func (s *Server) HandleSeed(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(dailyRunSeed)) w.Write([]byte(dailyRunSeed))
} }
// /daily/rankings - fetch daily rankings
func (s *Server) HandleRankings(w http.ResponseWriter, r *http.Request) {
rankings, err := db.GetRankings()
if err != nil {
log.Print("failed to retrieve rankings")
}
response, err := json.Marshal(rankings)
if err != nil {
http.Error(w, fmt.Sprintf("failed to marshal response json: %s", err), http.StatusInternalServerError)
return
}
w.Write(response)
}

View File

@ -52,6 +52,8 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
case "/daily/seed": case "/daily/seed":
s.HandleSeed(w, r) s.HandleSeed(w, r)
case "/daily/rankings":
s.HandleRankings(w, r)
} }
} }

View File

@ -8,11 +8,12 @@ import (
"os" "os"
"strconv" "strconv"
"github.com/Flashfyre/pokerogue-server/defs"
"github.com/klauspost/compress/zstd" "github.com/klauspost/compress/zstd"
) )
func GetSystemSaveData(uuid []byte) (SystemSaveData, error) { func GetSystemSaveData(uuid []byte) (defs.SystemSaveData, error) {
var system SystemSaveData var system defs.SystemSaveData
save, err := os.ReadFile("userdata/" + hex.EncodeToString(uuid) + "/system.pzs") save, err := os.ReadFile("userdata/" + hex.EncodeToString(uuid) + "/system.pzs")
if err != nil { if err != nil {
@ -39,8 +40,8 @@ func GetSystemSaveData(uuid []byte) (SystemSaveData, error) {
return system, nil return system, nil
} }
func GetSessionSaveData(uuid []byte, slotId int) (SessionSaveData, error) { func GetSessionSaveData(uuid []byte, slotId int) (defs.SessionSaveData, error) {
var session SessionSaveData var session defs.SessionSaveData
fileName := "session" fileName := "session"
if slotId != 0 { if slotId != 0 {
@ -72,7 +73,7 @@ func GetSessionSaveData(uuid []byte, slotId int) (SessionSaveData, error) {
return session, nil return session, nil
} }
func ValidateSessionCompleted(session SessionSaveData) bool { func ValidateSessionCompleted(session defs.SessionSaveData) bool {
switch session.GameMode { switch session.GameMode {
case 0: case 0:
return session.WaveIndex == 200 return session.WaveIndex == 200

View File

@ -12,6 +12,7 @@ import (
"strconv" "strconv"
"github.com/Flashfyre/pokerogue-server/db" "github.com/Flashfyre/pokerogue-server/db"
"github.com/Flashfyre/pokerogue-server/defs"
"github.com/klauspost/compress/zstd" "github.com/klauspost/compress/zstd"
) )
@ -90,7 +91,7 @@ func (s *Server) HandleSavedataUpdate(w http.ResponseWriter, r *http.Request) {
switch r.URL.Query().Get("datatype") { switch r.URL.Query().Get("datatype") {
case "0": // System case "0": // System
var system SystemSaveData var system defs.SystemSaveData
err = json.NewDecoder(r.Body).Decode(&system) err = json.NewDecoder(r.Body).Decode(&system)
if err != nil { if err != nil {
http.Error(w, fmt.Sprintf("failed to decode request body: %s", err), http.StatusBadRequest) http.Error(w, fmt.Sprintf("failed to decode request body: %s", err), http.StatusBadRequest)
@ -145,7 +146,7 @@ func (s *Server) HandleSavedataUpdate(w http.ResponseWriter, r *http.Request) {
fileName += strconv.Itoa(slotId) fileName += strconv.Itoa(slotId)
} }
var session SessionSaveData var session defs.SessionSaveData
err = json.NewDecoder(r.Body).Decode(&session) err = json.NewDecoder(r.Body).Decode(&session)
if err != nil { if err != nil {
http.Error(w, fmt.Sprintf("failed to decode request body: %s", err), http.StatusBadRequest) http.Error(w, fmt.Sprintf("failed to decode request body: %s", err), http.StatusBadRequest)
@ -268,7 +269,7 @@ func (s *Server) HandleSavedataClear(w http.ResponseWriter, r *http.Request) {
return return
} }
var session SessionSaveData var session defs.SessionSaveData
err = json.NewDecoder(r.Body).Decode(&session) err = json.NewDecoder(r.Body).Decode(&session)
if err != nil { if err != nil {
http.Error(w, fmt.Sprintf("failed to decode request body: %s", err), http.StatusBadRequest) http.Error(w, fmt.Sprintf("failed to decode request body: %s", err), http.StatusBadRequest)

View File

@ -1,5 +1,9 @@
package db package db
import (
"github.com/Flashfyre/pokerogue-server/defs"
)
func TryAddDailyRun(seed string) error { func TryAddDailyRun(seed string) error {
_, err := handle.Exec("INSERT INTO dailyRuns (seed, date) VALUES (?, UTC_DATE()) ON DUPLICATE KEY UPDATE date = date", seed) _, err := handle.Exec("INSERT INTO dailyRuns (seed, date) VALUES (?, UTC_DATE()) ON DUPLICATE KEY UPDATE date = date", seed)
if err != nil { if err != nil {
@ -8,3 +12,26 @@ func TryAddDailyRun(seed string) error {
return nil return nil
} }
func GetRankings() ([]defs.DailyRanking, error) {
var rankings []defs.DailyRanking
results, err := handle.Query("SELECT RANK() OVER (ORDER BY sc.score DESC, sc.timestamp), a.username, sc.score FROM seedCompletions sc JOIN dailyRuns dr ON dr.seed = sc.seed JOIN accounts a ON sc.uuid = a.uuid WHERE dr.date = UTC_DATE()")
if err != nil {
return rankings, err
}
defer results.Close()
for results.Next() {
ranking := defs.DailyRanking{}
err = results.Scan(&ranking.Rank, &ranking.Username, &ranking.Score)
if err != nil {
return rankings, err
}
rankings = append(rankings, ranking)
}
return rankings, nil
}

7
defs/daily.go Normal file
View File

@ -0,0 +1,7 @@
package defs
type DailyRanking struct {
Rank int `json:"rank"`
Username string `json:"username"`
Score int `json:"score"`
}

View File

@ -1,4 +1,4 @@
package api package defs
type SystemSaveData struct { type SystemSaveData struct {
TrainerId int `json:"trainerId"` TrainerId int `json:"trainerId"`