diff --git a/api/account/info.go b/api/account/info.go index fa491a8..868d17b 100644 --- a/api/account/info.go +++ b/api/account/info.go @@ -18,11 +18,7 @@ package account import ( - "fmt" - "os" - "strconv" - "time" - + "github.com/pagefaultgames/rogueserver/db" "github.com/pagefaultgames/rogueserver/defs" ) @@ -33,24 +29,16 @@ type InfoResponse struct { // /account/info - get account info func Info(username string, uuid []byte) (InfoResponse, error) { - var latestSave time.Time - latestSaveID := -1 - for id := range defs.SessionSlotCount { - fileName := "session" - if id != 0 { - fileName += strconv.Itoa(id) - } + response := InfoResponse{Username: username, LastSessionSlot: -1} - stat, err := os.Stat(fmt.Sprintf("userdata/%x/%s.pzs", uuid, fileName)) - if err != nil { - continue - } - - if stat.ModTime().After(latestSave) { - latestSave = stat.ModTime() - latestSaveID = id - } + slot, err := db.GetLatestSessionSaveDataSlot(uuid) + if err != nil { + response.LastSessionSlot = -1 } - return InfoResponse{Username: username, LastSessionSlot: latestSaveID}, nil + if slot >= defs.SessionSlotCount { + response.LastSessionSlot = -1 + } + + return response, nil } diff --git a/db/db.go b/db/db.go index 049ded2..05e92c4 100644 --- a/db/db.go +++ b/db/db.go @@ -42,8 +42,8 @@ func Init(username, password, protocol, address, database string) error { if err != nil { 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 sessionSaveData (uuid BINARY(16), slot TINYINT, data BLOB, timestamp TIMESTAMP, PRIMARY KEY (uuid, slot))") + 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 LONGBLOB, timestamp TIMESTAMP, PRIMARY KEY (uuid, slot))") err = tx.Commit() if err != nil { panic(err) diff --git a/db/savedata.go b/db/savedata.go index fb36c65..1f48953 100644 --- a/db/savedata.go +++ b/db/savedata.go @@ -79,6 +79,16 @@ func ReadSessionSaveData(uuid []byte, slot int) (defs.SessionSaveData, error) { return save, err } +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 { var buf bytes.Buffer