aboutsummaryrefslogtreecommitdiff
path: root/pkg/api/api0/storage.go
blob: a6de4cd529572bca7b4fb65a6ff722b8f1d11724 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package api0

import (
	"crypto/sha256"
	"net/netip"
	"time"
)

// Account contains information about a registered account.
type Account struct {
	// UID is the player's Origin UID. It is required and unique.
	UID uint64

	// Username is the player's last known in-game username (their EAID). It is
	// optional and case insensitive.
	Username string

	// AuthIP is the IP used for the current auth session.
	AuthIP netip.Addr

	// AuthToken is the random token generated for the current auth session.
	AuthToken string

	// AuthTokenExpiry is the expiry date of the current auth token.
	AuthTokenExpiry time.Time

	// LastServerID is the ID of the last server the account connected to.
	LastServerID string
}

func (a Account) IsOnOwnServer() bool {
	return a.LastServerID == "self"
}

// AccountStorage stores information about registered users. It must be safe
// for concurrent use.
type AccountStorage interface {
	// GetUIDsByUsername gets all known UIDs matching username. If none match, a
	// nil/zero-length slice is returned. If another error occurs, err is
	// non-nil.
	GetUIDsByUsername(username string) ([]uint64, error)

	// GetAccount gets the player matching uid. If none exists, nil is returned.
	// If another error occurs, err is non-nil.
	GetAccount(uid uint64) (*Account, error)

	// SaveAccount creates or replaces an account by its uid.
	SaveAccount(a *Account) error
}

// PdataStorage stores player data for users. It should not make any assumptions
// on the contents of the stored blobs (including validity). It may compress the
// stored data. It must be safe for concurrent use.
type PdataStorage interface {
	// GetPdataHash gets the current pdata hash for uid. If there is not any
	// pdata for uid, exists is false. If another error occurs, err is non-nil.
	GetPdataHash(uid uint64) (hash [sha256.Size]byte, exists bool, err error)

	// GetPdataCached gets the pdata for uid. If there is not any pdata for uid,
	// exists is false. If the provided hash is nonzero and the current pdata
	// matches, buf is nil. If another error occurs, err is non-nil.
	GetPdataCached(uid uint64, sha [sha256.Size]byte) (buf []byte, exists bool, err error)

	// SetPdata sets the raw pdata for uid, returning the actual size stored.
	SetPdata(uid uint64, buf []byte) (n int, err error)
}