diff --git a/api/account.go b/api/account.go index 91333fa..768c6d6 100644 --- a/api/account.go +++ b/api/account.go @@ -73,7 +73,6 @@ func (s *Server) handleAccountInfo(w http.ResponseWriter, r *http.Request) { w.Write(response) } - type AccountRegisterRequest GenericAuthRequest // /account/register - register account diff --git a/api/generic.go b/api/generic.go index 2084071..f24935f 100644 --- a/api/generic.go +++ b/api/generic.go @@ -1,6 +1,7 @@ package api import ( + "encoding/gob" "net/http" ) @@ -9,6 +10,9 @@ type Server struct { } func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { + gob.Register([]interface{}{}) + gob.Register(map[string]interface{}{}) + if s.Debug { w.Header().Set("Access-Control-Allow-Headers", "*") w.Header().Set("Access-Control-Allow-Methods", "*") diff --git a/api/savedata-helper.go b/api/savedata-helper.go index bf775e8..c6bad18 100644 --- a/api/savedata-helper.go +++ b/api/savedata-helper.go @@ -13,9 +13,6 @@ import ( ) func readSystemSaveData(uuid []byte) (defs.SystemSaveData, error) { - gob.Register([]interface{}{}) - gob.Register(map[string]interface{}{}) - var system defs.SystemSaveData save, err := os.ReadFile("userdata/" + hex.EncodeToString(uuid) + "/system.pzs") @@ -44,9 +41,6 @@ func readSystemSaveData(uuid []byte) (defs.SystemSaveData, error) { } func readSessionSaveData(uuid []byte, slotId int) (defs.SessionSaveData, error) { - gob.Register([]interface{}{}) - gob.Register(map[string]interface{}{}) - var session defs.SessionSaveData fileName := "session" diff --git a/api/savedata.go b/api/savedata.go index 54929db..4dadee0 100644 --- a/api/savedata.go +++ b/api/savedata.go @@ -101,6 +101,12 @@ func (s *Server) handleSavedataUpdate(w http.ResponseWriter, r *http.Request) { return } + err = db.UpdateAccountStats(uuid, system.GameStats) + if err != nil { + http.Error(w, fmt.Sprintf("failed to update account stats: %s", err), http.StatusBadRequest) + return + } + var gobBuffer bytes.Buffer err = gob.NewEncoder(&gobBuffer).Encode(system) if err != nil { diff --git a/db/account.go b/db/account.go index d39c65a..b9d02ec 100644 --- a/db/account.go +++ b/db/account.go @@ -2,7 +2,10 @@ package db import ( "database/sql" + "fmt" + "slices" + "github.com/Flashfyre/pokerogue-server/defs" _ "github.com/go-sql-driver/mysql" ) @@ -38,6 +41,65 @@ func UpdateAccountLastActivity(uuid []byte) error { return nil } +func UpdateAccountStats(uuid []byte, stats defs.GameStats) error { + var columns = []string{"playTime", "battles", "classicSessionsPlayed", "sessionsWon", "highestEndlessWave", "highestLevel", "pokemonSeen", "pokemonDefeated", "pokemonCaught", "pokemonHatched", "eggsPulled"} + + var statCols []string + var statValues []interface{} + + m, ok := stats.(map[string]interface{}) + if !ok { + return fmt.Errorf("expected map[string]interface{}, got %T", stats) + } + + for k, v := range m { + value, ok := v.(float64) + if !ok { + return fmt.Errorf("expected float64, got %T", v) + } + + if slices.Contains(columns, k) { + statCols = append(statCols, k) + statValues = append(statValues, value) + } + } + + var statArgs []interface{} + statArgs = append(statArgs, uuid) + for range 2 { + statArgs = append(statArgs, statValues...) + } + + query := "INSERT INTO accountStats (uuid" + + for _, col := range statCols { + query += ", " + col + } + + query += ") VALUES (?" + + for range len(statCols) { + query += ", ?" + } + + query += ") ON DUPLICATE KEY UPDATE " + + for i, col := range statCols { + if i > 0 { + query += ", " + } + + query += col + " = ?" + } + + _, err := handle.Exec(query, statArgs...) + if err != nil { + return err + } + + return nil +} + func FetchUsernameFromToken(token []byte) (string, error) { var username string err := handle.QueryRow("SELECT a.username FROM accounts a JOIN sessions s ON s.uuid = a.uuid WHERE s.token = ? AND s.expire > UTC_TIMESTAMP()", token).Scan(&username)