feat: discount lucky gift rocket energy
This commit is contained in:
parent
6d90ddeee0
commit
c0d58525fe
@ -7,12 +7,13 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type energyRuleConfig struct {
|
type energyRuleConfig struct {
|
||||||
GoldRatio float64 `json:"goldRatio"`
|
GoldRatio float64 `json:"goldRatio"`
|
||||||
AllowedGiftTypes []string `json:"allowedGiftTypes"`
|
AllowedGiftTypes []string `json:"allowedGiftTypes"`
|
||||||
AllowedGiftTabs []string `json:"allowedGiftTabs"`
|
AllowedGiftTabs []string `json:"allowedGiftTabs"`
|
||||||
BlockedGiftTypes []string `json:"blockedGiftTypes"`
|
BlockedGiftTypes []string `json:"blockedGiftTypes"`
|
||||||
BlockedGiftTabs []string `json:"blockedGiftTabs"`
|
BlockedGiftTabs []string `json:"blockedGiftTabs"`
|
||||||
GiftRules []giftEnergyRule `json:"giftRules"`
|
GiftRules []giftEnergyRule `json:"giftRules"`
|
||||||
|
GiftTabRules []giftTabEnergyRule `json:"giftTabRules"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type giftEnergyRule struct {
|
type giftEnergyRule struct {
|
||||||
@ -25,6 +26,16 @@ type giftEnergyRule struct {
|
|||||||
Ratio float64 `json:"ratio"`
|
Ratio float64 `json:"ratio"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type giftTabEnergyRule struct {
|
||||||
|
GiftTab string `json:"giftTab"`
|
||||||
|
GiftTabs []string `json:"giftTabs"`
|
||||||
|
Enabled *bool `json:"enabled"`
|
||||||
|
Allow *bool `json:"allow"`
|
||||||
|
Energy int64 `json:"energy"`
|
||||||
|
EnergyPerUnit int64 `json:"energyPerUnit"`
|
||||||
|
Ratio float64 `json:"ratio"`
|
||||||
|
}
|
||||||
|
|
||||||
func resolveGiftEnergy(event giftEvent, snapshot configSnapshot) (int64, string) {
|
func resolveGiftEnergy(event giftEvent, snapshot configSnapshot) (int64, string) {
|
||||||
rule, err := parseEnergyRule(snapshot.EnergyRuleJSON)
|
rule, err := parseEnergyRule(snapshot.EnergyRuleJSON)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -40,6 +51,9 @@ func resolveGiftEnergy(event giftEvent, snapshot configSnapshot) (int64, string)
|
|||||||
if !isAllowedByGiftTypeAndTab(event, rule) {
|
if !isAllowedByGiftTypeAndTab(event, rule) {
|
||||||
return 0, "unsupported_gift"
|
return 0, "unsupported_gift"
|
||||||
}
|
}
|
||||||
|
if custom, ok, reason := applyGiftTabRule(event, base, rule); ok || reason != "" {
|
||||||
|
return custom, reason
|
||||||
|
}
|
||||||
ratio := rule.GoldRatio
|
ratio := rule.GoldRatio
|
||||||
if ratio <= 0 {
|
if ratio <= 0 {
|
||||||
ratio = 1
|
ratio = 1
|
||||||
@ -98,6 +112,41 @@ func applyGiftIDRule(event giftEvent, base int64, rule energyRuleConfig) (int64,
|
|||||||
return 0, false, ""
|
return 0, false, ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func applyGiftTabRule(event giftEvent, base int64, rule energyRuleConfig) (int64, bool, string) {
|
||||||
|
giftTab := normalizeGiftToken(event.GiftConfig.GiftTab)
|
||||||
|
if giftTab == "" || len(rule.GiftTabRules) == 0 {
|
||||||
|
return 0, false, ""
|
||||||
|
}
|
||||||
|
for _, item := range rule.GiftTabRules {
|
||||||
|
if !giftTabRuleMatches(item, giftTab) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if item.Enabled != nil && !*item.Enabled {
|
||||||
|
return 0, true, "gift_tab_rule_disabled"
|
||||||
|
}
|
||||||
|
if item.Allow != nil && !*item.Allow {
|
||||||
|
return 0, true, "gift_tab_rule_blocked"
|
||||||
|
}
|
||||||
|
quantity := normalizedGiftQuantity(event)
|
||||||
|
acceptUserSize := normalizedAcceptUserSize(event)
|
||||||
|
if item.Energy > 0 {
|
||||||
|
return item.Energy * quantity * acceptUserSize, true, ""
|
||||||
|
}
|
||||||
|
if item.EnergyPerUnit > 0 {
|
||||||
|
return item.EnergyPerUnit * quantity * acceptUserSize, true, ""
|
||||||
|
}
|
||||||
|
if item.Ratio > 0 {
|
||||||
|
energy := int64(math.Floor(float64(base) * item.Ratio))
|
||||||
|
if energy <= 0 {
|
||||||
|
return 0, true, "zero_energy"
|
||||||
|
}
|
||||||
|
return energy, true, ""
|
||||||
|
}
|
||||||
|
return base, true, ""
|
||||||
|
}
|
||||||
|
return 0, false, ""
|
||||||
|
}
|
||||||
|
|
||||||
func giftRuleMatches(rule giftEnergyRule, giftID int64) bool {
|
func giftRuleMatches(rule giftEnergyRule, giftID int64) bool {
|
||||||
if rule.GiftID.Int64() == giftID {
|
if rule.GiftID.Int64() == giftID {
|
||||||
return true
|
return true
|
||||||
@ -110,6 +159,18 @@ func giftRuleMatches(rule giftEnergyRule, giftID int64) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func giftTabRuleMatches(rule giftTabEnergyRule, giftTab string) bool {
|
||||||
|
if normalizeGiftToken(rule.GiftTab) == giftTab {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
for _, tab := range rule.GiftTabs {
|
||||||
|
if normalizeGiftToken(tab) == giftTab {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func isAllowedByGiftTypeAndTab(event giftEvent, rule energyRuleConfig) bool {
|
func isAllowedByGiftTypeAndTab(event giftEvent, rule energyRuleConfig) bool {
|
||||||
giftType := normalizeGiftToken(event.GiftConfig.Type)
|
giftType := normalizeGiftToken(event.GiftConfig.Type)
|
||||||
giftTab := normalizeGiftToken(event.GiftConfig.GiftTab)
|
giftTab := normalizeGiftToken(event.GiftConfig.GiftTab)
|
||||||
|
|||||||
@ -263,6 +263,53 @@ func TestGiftEnergyRulesRejectUnsupportedAndAllowConfiguredGift(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGiftTabEnergyRuleDiscountsLuckyGiftOnly(t *testing.T) {
|
||||||
|
service, db := newTestService(t)
|
||||||
|
ctx := context.Background()
|
||||||
|
seedRocketConfig(t, db)
|
||||||
|
seedLevelConfigs(t, db, []int64{1000, 2000, 3000, 4000, 5000, 6000})
|
||||||
|
|
||||||
|
if err := db.Model(&model.VoiceRoomRocketConfig{}).
|
||||||
|
Where("sys_origin = ?", "LIKEI").
|
||||||
|
Update("energy_rule_json", `{"giftTabRules":[{"giftTab":"LUCKY_GIFT","ratio":0.1}]}`).Error; err != nil {
|
||||||
|
t.Fatalf("update energy rule: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
luckyPayload := `{
|
||||||
|
"trackId":"track-lucky-ratio",
|
||||||
|
"sysOrigin":"LIKEI",
|
||||||
|
"sendUserId":"1001",
|
||||||
|
"roomId":"9001",
|
||||||
|
"quantity":1,
|
||||||
|
"giftConfig":{"id":"11","giftCandy":100,"type":"GOLD","giftTab":"LUCKY_GIFT"},
|
||||||
|
"createTime":` + strconvFormatMillis(time.Now()) + `
|
||||||
|
}`
|
||||||
|
lucky, err := service.ProcessGiftPayload(ctx, luckyPayload)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("ProcessGiftPayload(lucky) error = %v", err)
|
||||||
|
}
|
||||||
|
if !lucky.Processed || lucky.AcceptedEnergy != 10 {
|
||||||
|
t.Fatalf("lucky = %+v, want 10 energy", lucky)
|
||||||
|
}
|
||||||
|
|
||||||
|
ordinaryPayload := `{
|
||||||
|
"trackId":"track-ordinary-ratio",
|
||||||
|
"sysOrigin":"LIKEI",
|
||||||
|
"sendUserId":"1001",
|
||||||
|
"roomId":"9001",
|
||||||
|
"quantity":1,
|
||||||
|
"giftConfig":{"id":"12","giftCandy":100,"type":"GOLD","giftTab":"ORDINARY"},
|
||||||
|
"createTime":` + strconvFormatMillis(time.Now().Add(time.Second)) + `
|
||||||
|
}`
|
||||||
|
ordinary, err := service.ProcessGiftPayload(ctx, ordinaryPayload)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("ProcessGiftPayload(ordinary) error = %v", err)
|
||||||
|
}
|
||||||
|
if !ordinary.Processed || ordinary.AcceptedEnergy != 100 {
|
||||||
|
t.Fatalf("ordinary = %+v, want 100 energy", ordinary)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestInRoomRewardWorkerSnapshotsSelectsAndGrants(t *testing.T) {
|
func TestInRoomRewardWorkerSnapshotsSelectsAndGrants(t *testing.T) {
|
||||||
gateway := newFakeRocketGateway()
|
gateway := newFakeRocketGateway()
|
||||||
service, db, rdb, mr := newTestServiceWithRedis(t, gateway)
|
service, db, rdb, mr := newTestServiceWithRedis(t, gateway)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user