Files
mc/server/player/playerdb/leveldb.go
T

62 lines
1.6 KiB
Go
Raw Normal View History

2026-07-09 08:33:57 +08:00
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()
}