Move endpoint categories into their own packages
This commit is contained in:
21 files changed
+533
-452
No files matched your search
@@ -0,0 +1,61 @@
|
||||
package savedata
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
"github.com/pagefaultgames/pokerogue-server/db"
|
||||
"github.com/pagefaultgames/pokerogue-server/defs"
|
||||
)
|
||||
|
||||
type ClearResponse struct {
|
||||
Success bool `json:"success"`
|
||||
}
|
||||
|
||||
// /savedata/clear - mark session save data as cleared and delete
|
||||
func Clear(uuid []byte, slot int, seed string, save defs.SessionSaveData) (ClearResponse, error) {
|
||||
var response ClearResponse
|
||||
err := db.UpdateAccountLastActivity(uuid)
|
||||
if err != nil {
|
||||
log.Print("failed to update account last activity")
|
||||
}
|
||||
|
||||
if slot < 0 || slot >= defs.SessionSlotCount {
|
||||
return response, fmt.Errorf("slot id %d out of range", slot)
|
||||
}
|
||||
|
||||
sessionCompleted := validateSessionCompleted(save)
|
||||
|
||||
if save.GameMode == 3 && save.Seed == seed {
|
||||
waveCompleted := save.WaveIndex
|
||||
if !sessionCompleted {
|
||||
waveCompleted--
|
||||
}
|
||||
err = db.AddOrUpdateAccountDailyRun(uuid, save.Score, waveCompleted)
|
||||
if err != nil {
|
||||
log.Printf("failed to add or update daily run record: %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
if sessionCompleted {
|
||||
response.Success, err = db.TryAddSeedCompletion(uuid, save.Seed, int(save.GameMode))
|
||||
if err != nil {
|
||||
log.Printf("failed to mark seed as completed: %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
fileName := "session"
|
||||
if slot != 0 {
|
||||
fileName += strconv.Itoa(slot)
|
||||
}
|
||||
|
||||
err = os.Remove(fmt.Sprintf("userdata/%s/%s.pzs", hex.EncodeToString(uuid), fileName))
|
||||
if err != nil && !os.IsNotExist(err) {
|
||||
return response, fmt.Errorf("failed to delete save file: %s", err)
|
||||
}
|
||||
|
||||
return response, nil
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
package savedata
|
||||
|
||||
import (
|
||||
"encoding/gob"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
"github.com/klauspost/compress/zstd"
|
||||
"github.com/pagefaultgames/pokerogue-server/defs"
|
||||
)
|
||||
|
||||
func readSystemSaveData(uuid []byte) (defs.SystemSaveData, error) {
|
||||
var system defs.SystemSaveData
|
||||
|
||||
file, err := os.Open("userdata/" + hex.EncodeToString(uuid) + "/system.pzs")
|
||||
if err != nil {
|
||||
return system, fmt.Errorf("failed to open save file for reading: %s", err)
|
||||
}
|
||||
|
||||
defer file.Close()
|
||||
|
||||
zstdDecoder, err := zstd.NewReader(file)
|
||||
if err != nil {
|
||||
return system, fmt.Errorf("failed to create zstd decoder: %s", err)
|
||||
}
|
||||
|
||||
defer zstdDecoder.Close()
|
||||
|
||||
err = gob.NewDecoder(zstdDecoder).Decode(&system)
|
||||
if err != nil {
|
||||
return system, fmt.Errorf("failed to deserialize save: %s", err)
|
||||
}
|
||||
|
||||
return system, nil
|
||||
}
|
||||
|
||||
func readSessionSaveData(uuid []byte, slotID int) (defs.SessionSaveData, error) {
|
||||
var session defs.SessionSaveData
|
||||
|
||||
fileName := "session"
|
||||
if slotID != 0 {
|
||||
fileName += strconv.Itoa(slotID)
|
||||
}
|
||||
|
||||
file, err := os.Open(fmt.Sprintf("userdata/%s/%s.pzs", hex.EncodeToString(uuid), fileName))
|
||||
if err != nil {
|
||||
return session, fmt.Errorf("failed to open save file for reading: %s", err)
|
||||
}
|
||||
|
||||
defer file.Close()
|
||||
|
||||
zstdDecoder, err := zstd.NewReader(file)
|
||||
if err != nil {
|
||||
return session, fmt.Errorf("failed to create zstd decoder: %s", err)
|
||||
}
|
||||
|
||||
defer zstdDecoder.Close()
|
||||
|
||||
err = gob.NewDecoder(zstdDecoder).Decode(&session)
|
||||
if err != nil {
|
||||
return session, fmt.Errorf("failed to deserialize save: %s", err)
|
||||
}
|
||||
|
||||
return session, nil
|
||||
}
|
||||
|
||||
func validateSessionCompleted(session defs.SessionSaveData) bool {
|
||||
switch session.GameMode {
|
||||
case 0:
|
||||
return session.BattleType == 2 && session.WaveIndex == 200
|
||||
case 3:
|
||||
return session.BattleType == 2 && session.WaveIndex == 50
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package savedata
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
"github.com/pagefaultgames/pokerogue-server/db"
|
||||
"github.com/pagefaultgames/pokerogue-server/defs"
|
||||
)
|
||||
|
||||
// /savedata/delete - delete save data
|
||||
func Delete(uuid []byte, datatype, slot int) error {
|
||||
err := db.UpdateAccountLastActivity(uuid)
|
||||
if err != nil {
|
||||
log.Print("failed to update account last activity")
|
||||
}
|
||||
|
||||
hexUUID := hex.EncodeToString(uuid)
|
||||
|
||||
switch datatype {
|
||||
case 0: // System
|
||||
err := os.Remove("userdata/" + hexUUID + "/system.pzs")
|
||||
if err != nil && !os.IsNotExist(err) {
|
||||
return fmt.Errorf("failed to delete save file: %s", err)
|
||||
}
|
||||
case 1: // Session
|
||||
if slot < 0 || slot >= defs.SessionSlotCount {
|
||||
return fmt.Errorf("slot id %d out of range", slot)
|
||||
}
|
||||
|
||||
fileName := "session"
|
||||
if slot != 0 {
|
||||
fileName += strconv.Itoa(slot)
|
||||
}
|
||||
|
||||
err = os.Remove(fmt.Sprintf("userdata/%s/%s.pzs", hexUUID, fileName))
|
||||
if err != nil && !os.IsNotExist(err) {
|
||||
return fmt.Errorf("failed to delete save file: %s", err)
|
||||
}
|
||||
default:
|
||||
return fmt.Errorf("invalid data type")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
package savedata
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
|
||||
"github.com/pagefaultgames/pokerogue-server/db"
|
||||
"github.com/pagefaultgames/pokerogue-server/defs"
|
||||
)
|
||||
|
||||
// /savedata/get - get save data
|
||||
func Get(uuid []byte, datatype, slot int) (any, error) {
|
||||
switch datatype {
|
||||
case 0: // System
|
||||
system, err := readSystemSaveData(uuid)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
compensations, err := db.FetchAndClaimAccountCompensations(uuid)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to fetch compensations: %s", err)
|
||||
}
|
||||
|
||||
for k, v := range compensations {
|
||||
typeKey := strconv.Itoa(k)
|
||||
system.VoucherCounts[typeKey] += v
|
||||
}
|
||||
|
||||
return system, nil
|
||||
case 1: // Session
|
||||
if slot < 0 || slot >= defs.SessionSlotCount {
|
||||
return nil, fmt.Errorf("slot id %d out of range", slot)
|
||||
}
|
||||
|
||||
session, err := readSessionSaveData(uuid, slot)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return session, nil
|
||||
default:
|
||||
return nil, fmt.Errorf("invalid data type")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
package savedata
|
||||
|
||||
import (
|
||||
"encoding/gob"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
|
||||
"github.com/klauspost/compress/zstd"
|
||||
"github.com/pagefaultgames/pokerogue-server/db"
|
||||
"github.com/pagefaultgames/pokerogue-server/defs"
|
||||
)
|
||||
|
||||
// /savedata/update - update save data
|
||||
func Update(uuid []byte, slot int, save any) error {
|
||||
err := db.UpdateAccountLastActivity(uuid)
|
||||
if err != nil {
|
||||
log.Print("failed to update account last activity")
|
||||
}
|
||||
|
||||
hexUUID := hex.EncodeToString(uuid)
|
||||
|
||||
switch save := save.(type) {
|
||||
case defs.SystemSaveData: // System
|
||||
if save.TrainerId == 0 && save.SecretId == 0 {
|
||||
return fmt.Errorf("invalid system data")
|
||||
}
|
||||
|
||||
err = db.UpdateAccountStats(uuid, save.GameStats, save.VoucherCounts)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to update account stats: %s", err)
|
||||
}
|
||||
|
||||
err = os.MkdirAll("userdata/"+hexUUID, 0755)
|
||||
if err != nil && !os.IsExist(err) {
|
||||
return fmt.Errorf("failed to create userdata folder: %s", err)
|
||||
}
|
||||
|
||||
file, err := os.OpenFile("userdata/"+hexUUID+"/system.pzs", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to open save file for writing: %s", err)
|
||||
}
|
||||
|
||||
defer file.Close()
|
||||
|
||||
zstdEncoder, err := zstd.NewWriter(file)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create zstd encoder: %s", err)
|
||||
}
|
||||
|
||||
defer zstdEncoder.Close()
|
||||
|
||||
err = gob.NewEncoder(zstdEncoder).Encode(save)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to serialize save: %s", err)
|
||||
}
|
||||
|
||||
db.DeleteClaimedAccountCompensations(uuid)
|
||||
case defs.SessionSaveData: // Session
|
||||
if slot < 0 || slot >= defs.SessionSlotCount {
|
||||
return fmt.Errorf("slot id %d out of range", slot)
|
||||
}
|
||||
|
||||
fileName := "session"
|
||||
if slot != 0 {
|
||||
fileName += strconv.Itoa(slot)
|
||||
}
|
||||
|
||||
err = os.MkdirAll("userdata/"+hexUUID, 0755)
|
||||
if err != nil && !os.IsExist(err) {
|
||||
return fmt.Errorf(fmt.Sprintf("failed to create userdata folder: %s", err))
|
||||
}
|
||||
|
||||
file, err := os.OpenFile(fmt.Sprintf("userdata/%s/%s.pzs", hexUUID, fileName), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to open save file for writing: %s", err)
|
||||
}
|
||||
|
||||
defer file.Close()
|
||||
|
||||
zstdEncoder, err := zstd.NewWriter(file)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to create zstd encoder: %s", err)
|
||||
}
|
||||
|
||||
defer zstdEncoder.Close()
|
||||
|
||||
err = gob.NewEncoder(zstdEncoder).Encode(save)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to serialize save: %s", err)
|
||||
}
|
||||
default:
|
||||
return fmt.Errorf("invalid data type")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in new issue
Block a user