26ed99fda6
Build and deploy / Build (push) Has been cancelled
Build and deploy / Update Contributors (push) Has been cancelled
Build and deploy / Deploy (push) Has been cancelled
62 lines
1.6 KiB
Go
62 lines
1.6 KiB
Go
package playerdb
|
|
|
|
import (
|
|
"encoding/json"
|
|
"github.com/df-mc/dragonfly/server/player"
|
|
"github.com/df-mc/dragonfly/server/world"
|
|
"github.com/df-mc/goleveldb/leveldb"
|
|
"github.com/df-mc/goleveldb/leveldb/opt"
|
|
"github.com/google/uuid"
|
|
"os"
|
|
)
|
|
|
|
// Provider is a player data provider that uses a LevelDB database to store data. The data passed on
|
|
// will first be converted to make sure it can be marshaled into JSON. This JSON (in bytes) will then
|
|
// be stored in the database under a key that is the byte representation of the player's UUID.
|
|
type Provider struct {
|
|
db *leveldb.DB
|
|
}
|
|
|
|
// NewProvider creates a new player data provider that saves and loads data using
|
|
// a LevelDB database.
|
|
func NewProvider(path string) (*Provider, error) {
|
|
if _, err := os.Stat(path); os.IsNotExist(err) {
|
|
_ = os.Mkdir(path, 0777)
|
|
}
|
|
db, err := leveldb.OpenFile(path, &opt.Options{Compression: opt.SnappyCompression})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &Provider{db: db}, nil
|
|
}
|
|
|
|
// Save ...
|
|
func (p *Provider) Save(id uuid.UUID, d player.Config, w *world.World) error {
|
|
b, err := json.Marshal(p.toJson(d, w))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return p.db.Put(id[:], b, nil)
|
|
}
|
|
|
|
// Load ...
|
|
func (p *Provider) Load(id uuid.UUID, world func(world.Dimension) *world.World) (player.Config, *world.World, error) {
|
|
b, err := p.db.Get(id[:], nil)
|
|
if err != nil {
|
|
return player.Config{}, nil, err
|
|
}
|
|
var d jsonData
|
|
err = json.Unmarshal(b, &d)
|
|
if err != nil {
|
|
return player.Config{}, nil, err
|
|
}
|
|
conf, w := p.fromJson(d, world)
|
|
|
|
return conf, w, nil
|
|
}
|
|
|
|
// Close ...
|
|
func (p *Provider) Close() error {
|
|
return p.db.Close()
|
|
}
|