Implement hunting AP and progress, event tasks, exchanges, games, stories and actions; connect battle and reward handling. Add CashShop plugin and installation, server purchases and entitlements, recharge rules and plugin version metadata. Distribute binary calendars independently; cache GameData in memory and fix single-connection query deadlocks. Improve automatic login and recovery diagnostics; document configuration and release flows.
62 lines
2.4 KiB
Go
62 lines
2.4 KiB
Go
package commerce
|
|
|
|
import (
|
|
"bd2server/internal/server/gamedata"
|
|
"bd2server/internal/server/player"
|
|
"bd2server/internal/server/stateio"
|
|
"bd2server/internal/server/wire"
|
|
"testing"
|
|
)
|
|
|
|
type clearInventory struct{ items []player.Item }
|
|
|
|
func (i *clearInventory) All() []player.Item { return i.items }
|
|
func clearRequest(kind, ticket uint64) []byte {
|
|
b := wire.AppendVarint(nil, 1, 1)
|
|
b = wire.AppendVarint(b, 2, kind)
|
|
row := wire.AppendVarint(nil, 1, 10)
|
|
row = wire.AppendVarint(row, 2, ticket)
|
|
row = wire.AppendVarint(row, 3, 2)
|
|
row = wire.AppendVarint(row, 4, 0)
|
|
return wire.AppendBytes(b, int(kind)+3, row)
|
|
}
|
|
func TestClearPackageRequiresServerProgressAndPremiumEntitlement(t *testing.T) {
|
|
store := stateio.NewMemory()
|
|
eco := &purchaseEconomy{}
|
|
items := &clearInventory{}
|
|
design := &gamedata.ClearPackageCatalog{Rewards: []gamedata.ClearPackageRewardDesign{{Kind: 0, GroupID: 10, TicketID: 12, TargetID: 2, RandomBoxID: 100, Type: 0}, {Kind: 0, GroupID: 10, TicketID: 77, TargetID: 2, RandomBoxID: 101, Type: 1}, {Kind: 1, GroupID: 10, TicketID: 12, TargetID: 2, RandomBoxID: 102, Type: 0}}}
|
|
s, err := NewClearPackages(store, design, eco, items)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, _, _, err = s.Handle("/ClearPackageReward", clearRequest(0, 12)); err == nil || eco.calls != 0 {
|
|
t.Fatal("client spoofed clear progress")
|
|
}
|
|
s.AttachProgress(func(pack, level uint64) bool { return pack == 2 && level == 0 }, nil)
|
|
if _, _, _, err = s.Handle("/ClearPackageReward", clearRequest(0, 77)); err == nil {
|
|
t.Fatal("unpaid premium claim accepted")
|
|
}
|
|
code, _, ok, err := s.Handle("/ClearPackageReward", clearRequest(0, 12))
|
|
if err != nil || !ok || code != 286 || eco.rewards[0].ID != 100 {
|
|
t.Fatal(code, err)
|
|
}
|
|
items.items = []player.Item{{Type: 19, ID: 77, Count: 1}}
|
|
if _, _, _, err = s.Handle("/ClearPackageReward", clearRequest(0, 77)); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
reloaded, err := NewClearPackages(store, design, eco, items)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, _, _, err = reloaded.Handle("/ClearPackageReward", clearRequest(0, 77)); err != nil || eco.calls != 2 {
|
|
t.Fatal("restart duplicated grant", err, eco.calls)
|
|
}
|
|
p, e, err := reloaded.RewardDBInfos()
|
|
if err != nil || len(p) != 2 || len(e) != 0 {
|
|
t.Fatal(p, e, err)
|
|
}
|
|
if _, _, _, err = reloaded.Handle("/ClearPackageReward", clearRequest(1, 12)); err == nil {
|
|
t.Fatal("unimplemented evil progress granted reward")
|
|
}
|
|
}
|