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
67
| initializer.RegisterTournamentEnd(func(ctx context.Context, logger runtime.Logger, db *sql.DB, nk runtime.NakamaModule, tournament *api.Tournament, end, reset int64) error {
// Reward tournament leader with 10,000 coins and a rare item
topRecord, _, _, _, err := nk.TournamentRecordsList(ctx, tournament.Id, nil, 1, "", 0)
if err != nil {
return runtime.NewError("error getting tournament records", 13)
}
winnerId := topRecord[0].OwnerId
// Give the player 10,000 coins
changeset := map[string]int64 {
"coins": 10000,
}
nk.WalletUpdate(ctx, winnerId, changeset, nil, true)
// Get the player's existing inventory
storageRead := &runtime.StorageRead{
Collection: "inventory",
Key: winnerId,
UserID: winnerId,
}
result, err := nk.StorageRead(ctx, []*runtime.StorageRead { storageRead })
if err != nil {
return runtime.NewError("error reading player inventory", 13)
}
var inventory map[string]int
if len(result) > 0 {
if err := json.Unmarshal([]byte(result[0].Value), &inventory); err != nil {
logger.Error("error unmarshaling inventory", err)
return runtime.NewError("error unmarshaling inventory", 13)
}
} else {
inventory = make(map[string]int)
}
// Add the rare item or increase quantity
if _, ok := inventory["rare-sword"]; !ok {
inventory["rare-sword"] = 1
} else {
inventory["rare-sword"] += 1
}
// Write the updated inventory to the storage engine
inventoryJson, err := json.Marshal(inventory)
if err != nil {
return runtime.NewError("error marshaling inventory", 13)
}
storageWrite := &runtime.StorageWrite{
Collection: "inventory",
Key: winnerId,
UserID: winnerId,
PermissionWrite: 0,
PermissionRead: 1,
Value: string(inventoryJson),
}
_, err = nk.StorageWrite(ctx, []*runtime.StorageWrite { storageWrite })
if err != nil {
return runtime.NewError("error writing inventory", 13)
}
return nil
})
|