Compare commits

..

3 Commits

Author SHA1 Message Date
maru
6cb179b553
Clean up savedata.go 2024-05-07 20:38:12 -04:00
Up
405a578e8c manually parse all save states for now 2024-05-07 19:33:21 -04:00
Up
0d6539a87b
continue on existing save (#3)
* long blob

* fix continue

* one slot only?

* fallback if there is no slot data yet

* Revert "one slot only?"

This reverts commit 20997e9cd8.
2024-05-07 19:14:07 -04:00
3 changed files with 66 additions and 34 deletions

View File

@ -18,11 +18,7 @@
package account package account
import ( import (
"fmt" "github.com/pagefaultgames/rogueserver/db"
"os"
"strconv"
"time"
"github.com/pagefaultgames/rogueserver/defs" "github.com/pagefaultgames/rogueserver/defs"
) )
@ -33,24 +29,24 @@ type InfoResponse struct {
// /account/info - get account info // /account/info - get account info
func Info(username string, uuid []byte) (InfoResponse, error) { func Info(username string, uuid []byte) (InfoResponse, error) {
var latestSave time.Time response := InfoResponse{Username: username, LastSessionSlot: -1}
latestSaveID := -1
for id := range defs.SessionSlotCount {
fileName := "session"
if id != 0 {
fileName += strconv.Itoa(id)
}
stat, err := os.Stat(fmt.Sprintf("userdata/%x/%s.pzs", uuid, fileName)) highest := -1
for i := 0; i < defs.SessionSlotCount; i++ {
data, err := db.ReadSessionSaveData(uuid, i)
if err != nil { if err != nil {
continue continue
} }
if stat.ModTime().After(latestSave) { if data.Timestamp > highest {
latestSave = stat.ModTime() highest = data.Timestamp
latestSaveID = id response.LastSessionSlot = i
} }
} }
return InfoResponse{Username: username, LastSessionSlot: latestSaveID}, nil if response.LastSessionSlot < 0 || response.LastSessionSlot >= defs.SessionSlotCount {
response.LastSessionSlot = -1
}
return response, nil
} }

View File

@ -42,8 +42,8 @@ func Init(username, password, protocol, address, database string) error {
if err != nil { if err != nil {
panic(err) panic(err)
} }
tx.Exec("CREATE TABLE IF NOT EXISTS systemSaveData (uuid BINARY(16) PRIMARY KEY, data BLOB, timestamp TIMESTAMP)") tx.Exec("CREATE TABLE IF NOT EXISTS systemSaveData (uuid BINARY(16) PRIMARY KEY, data LONGBLOB, timestamp TIMESTAMP)")
tx.Exec("CREATE TABLE IF NOT EXISTS sessionSaveData (uuid BINARY(16), slot TINYINT, data BLOB, timestamp TIMESTAMP, PRIMARY KEY (uuid, slot))") tx.Exec("CREATE TABLE IF NOT EXISTS sessionSaveData (uuid BINARY(16), slot TINYINT, data LONGBLOB, timestamp TIMESTAMP, PRIMARY KEY (uuid, slot))")
err = tx.Commit() err = tx.Commit()
if err != nil { if err != nil {
panic(err) panic(err)

View File

@ -20,6 +20,7 @@ package db
import ( import (
"bytes" "bytes"
"encoding/gob" "encoding/gob"
"github.com/pagefaultgames/rogueserver/defs" "github.com/pagefaultgames/rogueserver/defs"
) )
@ -41,46 +42,74 @@ func TryAddDailyRunCompletion(uuid []byte, seed string, mode int) (bool, error)
} }
func ReadSystemSaveData(uuid []byte) (defs.SystemSaveData, error) { func ReadSystemSaveData(uuid []byte) (defs.SystemSaveData, error) {
var system defs.SystemSaveData
var data []byte var data []byte
err := handle.QueryRow("SELECT data FROM systemSaveData WHERE uuid = ?", uuid).Scan(&data) err := handle.QueryRow("SELECT data FROM systemSaveData WHERE uuid = ?", uuid).Scan(&data)
if err != nil {
return system, err
}
reader := bytes.NewReader(data) err = gob.NewDecoder(bytes.NewReader(data)).Decode(&system)
system := defs.SystemSaveData{} if err != nil {
err = gob.NewDecoder(reader).Decode(&system) return system, err
return system, err }
return system, nil
} }
func StoreSystemSaveData(uuid []byte, data defs.SystemSaveData) error { func StoreSystemSaveData(uuid []byte, data defs.SystemSaveData) error {
var buf bytes.Buffer var buf bytes.Buffer
err := gob.NewEncoder(&buf).Encode(data) err := gob.NewEncoder(&buf).Encode(data)
if err != nil { if err != nil {
return err return err
} }
_, err = handle.Exec("INSERT INTO systemSaveData (uuid, data, timestamp) VALUES (?, ?, UTC_TIMESTAMP()) ON DUPLICATE KEY UPDATE data = VALUES(data), timestamp = VALUES(timestamp)", uuid, buf.Bytes()) _, err = handle.Exec("REPLACE INTO systemSaveData (uuid, data, timestamp) VALUES (?, ?, UTC_TIMESTAMP())", uuid, buf.Bytes())
if err != nil {
return err
}
return err return nil
} }
func DeleteSystemSaveData(uuid []byte) error { func DeleteSystemSaveData(uuid []byte) error {
_, err := handle.Exec("DELETE FROM systemSaveData WHERE uuid = ?", uuid) _, err := handle.Exec("DELETE FROM systemSaveData WHERE uuid = ?", uuid)
return err if err != nil {
return err
}
return nil
} }
func ReadSessionSaveData(uuid []byte, slot int) (defs.SessionSaveData, error) { func ReadSessionSaveData(uuid []byte, slot int) (defs.SessionSaveData, error) {
var session defs.SessionSaveData
var data []byte var data []byte
err := handle.QueryRow("SELECT data FROM sessionSaveData WHERE uuid = ? AND slot = ?", uuid, slot).Scan(&data) err := handle.QueryRow("SELECT data FROM sessionSaveData WHERE uuid = ? AND slot = ?", uuid, slot).Scan(&data)
if err != nil {
return session, err
}
reader := bytes.NewReader(data) err = gob.NewDecoder(bytes.NewReader(data)).Decode(&session)
save := defs.SessionSaveData{} if err != nil {
err = gob.NewDecoder(reader).Decode(&save) return session, err
}
return save, err return session, nil
}
func GetLatestSessionSaveDataSlot(uuid []byte) (int, error) {
var slot int
err := handle.QueryRow("SELECT slot FROM sessionSaveData WHERE uuid = ? ORDER BY timestamp DESC, slot ASC LIMIT 1", uuid).Scan(&slot)
if err != nil {
return -1, err
}
return slot, nil
} }
func StoreSessionSaveData(uuid []byte, data defs.SessionSaveData, slot int) error { func StoreSessionSaveData(uuid []byte, data defs.SessionSaveData, slot int) error {
var buf bytes.Buffer var buf bytes.Buffer
err := gob.NewEncoder(&buf).Encode(data) err := gob.NewEncoder(&buf).Encode(data)
if err != nil { if err != nil {
@ -88,11 +117,18 @@ func StoreSessionSaveData(uuid []byte, data defs.SessionSaveData, slot int) erro
} }
_, err = handle.Exec("REPLACE INTO sessionSaveData (uuid, slot, data, timestamp) VALUES (?, ?, ?, UTC_TIMESTAMP())", uuid, slot, buf.Bytes()) _, err = handle.Exec("REPLACE INTO sessionSaveData (uuid, slot, data, timestamp) VALUES (?, ?, ?, UTC_TIMESTAMP())", uuid, slot, buf.Bytes())
if err != nil {
return err
}
return err return nil
} }
func DeleteSessionSaveData(uuid []byte, slot int) error { func DeleteSessionSaveData(uuid []byte, slot int) error {
_, err := handle.Exec("DELETE FROM sessionSaveData WHERE uuid = ? AND slot = ?", uuid, slot) _, err := handle.Exec("DELETE FROM sessionSaveData WHERE uuid = ? AND slot = ?", uuid, slot)
return err if err != nil {
return err
}
return nil
} }