Compare commits

..

No commits in common. "6cb179b553cdd4b9ce0dc7b7fca0fefd122fa372" and "1f95f7c04217d80e313e6ff5dad907a99565c829" have entirely different histories.

3 changed files with 34 additions and 66 deletions

View File

@ -18,7 +18,11 @@
package account package account
import ( import (
"github.com/pagefaultgames/rogueserver/db" "fmt"
"os"
"strconv"
"time"
"github.com/pagefaultgames/rogueserver/defs" "github.com/pagefaultgames/rogueserver/defs"
) )
@ -29,24 +33,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) {
response := InfoResponse{Username: username, LastSessionSlot: -1} var latestSave time.Time
latestSaveID := -1
for id := range defs.SessionSlotCount {
fileName := "session"
if id != 0 {
fileName += strconv.Itoa(id)
}
highest := -1 stat, err := os.Stat(fmt.Sprintf("userdata/%x/%s.pzs", uuid, fileName))
for i := 0; i < defs.SessionSlotCount; i++ {
data, err := db.ReadSessionSaveData(uuid, i)
if err != nil { if err != nil {
continue continue
} }
if data.Timestamp > highest { if stat.ModTime().After(latestSave) {
highest = data.Timestamp latestSave = stat.ModTime()
response.LastSessionSlot = i latestSaveID = id
} }
} }
if response.LastSessionSlot < 0 || response.LastSessionSlot >= defs.SessionSlotCount { return InfoResponse{Username: username, LastSessionSlot: latestSaveID}, nil
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 LONGBLOB, timestamp TIMESTAMP)") 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 LONGBLOB, timestamp TIMESTAMP, PRIMARY KEY (uuid, slot))") tx.Exec("CREATE TABLE IF NOT EXISTS sessionSaveData (uuid BINARY(16), slot TINYINT, data BLOB, 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,7 +20,6 @@ package db
import ( import (
"bytes" "bytes"
"encoding/gob" "encoding/gob"
"github.com/pagefaultgames/rogueserver/defs" "github.com/pagefaultgames/rogueserver/defs"
) )
@ -42,74 +41,46 @@ 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
}
err = gob.NewDecoder(bytes.NewReader(data)).Decode(&system) reader := bytes.NewReader(data)
if err != nil { system := defs.SystemSaveData{}
return system, err err = gob.NewDecoder(reader).Decode(&system)
} 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("REPLACE INTO systemSaveData (uuid, data, timestamp) VALUES (?, ?, UTC_TIMESTAMP())", uuid, buf.Bytes()) _, 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())
if err != nil {
return err
}
return nil return err
} }
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)
if err != nil { return err
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
}
err = gob.NewDecoder(bytes.NewReader(data)).Decode(&session) reader := bytes.NewReader(data)
if err != nil { save := defs.SessionSaveData{}
return session, err err = gob.NewDecoder(reader).Decode(&save)
}
return session, nil 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 { 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 {
@ -117,18 +88,11 @@ 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 nil return err
} }
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)
if err != nil { return err
return err
}
return nil
} }