From ce3ffe666de1e5018714033fbfcb44c32c0d0977 Mon Sep 17 00:00:00 2001 From: ZuoZuo <68836346+Mrz-sakura@users.noreply.github.com> Date: Sun, 31 May 2026 16:59:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DIM=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../internal/service/luckygift/service.go | 32 ++++++++++- .../service/luckygift/service_test.go | 53 +++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) diff --git a/services/activity-service/internal/service/luckygift/service.go b/services/activity-service/internal/service/luckygift/service.go index 310d4a3f..4f7ea5e8 100644 --- a/services/activity-service/internal/service/luckygift/service.go +++ b/services/activity-service/internal/service/luckygift/service.go @@ -290,7 +290,7 @@ func (s *Service) processDrawOutbox(ctx context.Context, event domain.DrawOutbox } func (s *Service) publishLuckyGiftDrawn(ctx context.Context, payload luckyGiftDrawnPayload, options WorkerOptions) error { - body, err := json.Marshal(payload) + body, err := json.Marshal(luckyGiftRoomMessagePayload(payload)) if err != nil { return err } @@ -448,6 +448,36 @@ func shouldPublishLuckyGiftRegionBroadcast(payload luckyGiftDrawnPayload) bool { return payload.VisibleRegionID > 0 && payload.EffectiveRewardCoins > 0 && payload.MultiplierPPM >= 1_000_000 } +func luckyGiftRoomMessagePayload(payload luckyGiftDrawnPayload) map[string]any { + return map[string]any{ + "event_type": "lucky_gift_drawn", + "event_id": payload.EventID, + "app_code": payload.AppCode, + "draw_id": payload.DrawID, + "command_id": payload.CommandID, + "pool_id": payload.PoolID, + "room_id": payload.RoomID, + "gift_id": payload.GiftID, + "gift_count": payload.GiftCount, + "user_id": payload.UserID, + "sender_user_id": payload.SenderUserID, + "target_user_id": payload.TargetUserID, + "visible_region_id": payload.VisibleRegionID, + "coin_spent": payload.CoinSpent, + "rule_version": payload.RuleVersion, + "experience_pool": payload.ExperiencePool, + "selected_tier_id": payload.SelectedTierID, + "multiplier_ppm": payload.MultiplierPPM, + "base_reward_coins": payload.BaseRewardCoins, + "room_atmosphere_reward_coins": payload.RoomAtmosphereRewardCoins, + "activity_subsidy_coins": payload.ActivitySubsidyCoins, + "effective_reward_coins": payload.EffectiveRewardCoins, + "stage_feedback": payload.StageFeedback, + "high_multiplier": payload.HighMultiplier, + "created_at_ms": payload.CreatedAtMS, + } +} + func luckyGiftRegionBroadcastPayload(payload luckyGiftDrawnPayload, sentAtMS int64) map[string]any { return map[string]any{ "event_type": "lucky_gift_drawn", diff --git a/services/activity-service/internal/service/luckygift/service_test.go b/services/activity-service/internal/service/luckygift/service_test.go index 8e0ed52b..ee53b26a 100644 --- a/services/activity-service/internal/service/luckygift/service_test.go +++ b/services/activity-service/internal/service/luckygift/service_test.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "errors" + "fmt" "strings" "testing" "time" @@ -160,6 +161,58 @@ func TestProcessPendingBatchDrawOutboxCreditsWalletOnceAndGrantsAllDraws(t *test } } +func TestPublishLuckyGiftDrawnOmitsBatchDrawIDsFromRoomIM(t *testing.T) { + drawIDs := make([]string, 0, 999) + for index := 0; index < 999; index++ { + drawIDs = append(drawIDs, fmt.Sprintf("lucky_draw_1780217057721_%016d", index)) + } + publisher := &fakeLuckyGiftPublisher{} + service := New(&fakeLuckyGiftRepository{}, WithRoomPublisher(publisher)) + payload := luckyGiftDrawnPayload{ + EventType: "lucky_gift_drawn", + EventID: "lucky_gift_drawn:lucky_draw_1780217057721_0000000000000000", + AppCode: "lalu", + DrawID: drawIDs[0], + DrawIDs: drawIDs, + CommandID: "cmd-gift-batch", + PoolID: "lucky", + RoomID: "lalu_9aca4db6-35f0-4490-9cbc-1a452b7fa67d", + GiftID: "31", + GiftCount: 999, + UserID: 42, + SenderUserID: 42, + TargetUserID: 99, + VisibleRegionID: 210, + CoinSpent: 99900, + RuleVersion: 2, + ExperiencePool: "advanced", + SelectedTierID: "advanced_1x", + MultiplierPPM: 1000000, + BaseRewardCoins: 73983, + RoomAtmosphereRewardCoins: 0, + ActivitySubsidyCoins: 0, + EffectiveRewardCoins: 73983, + CreatedAtMS: 1780217057721, + } + + if err := service.publishLuckyGiftDrawn(context.Background(), payload, WorkerOptions{PublishTimeout: time.Second}); err != nil { + t.Fatalf("publishLuckyGiftDrawn failed: %v", err) + } + if len(publisher.last.PayloadJSON) >= 12*1024 { + t.Fatalf("room IM payload should stay below Tencent 12KB limit, got %d bytes", len(publisher.last.PayloadJSON)) + } + var body map[string]any + if err := json.Unmarshal(publisher.last.PayloadJSON, &body); err != nil { + t.Fatalf("decode room IM payload failed: %v", err) + } + if _, exists := body["draw_ids"]; exists { + t.Fatalf("room IM payload must not include internal draw_ids") + } + if body["draw_id"] != drawIDs[0] || body["event_id"] != payload.EventID || body["gift_count"].(float64) != 999 { + t.Fatalf("room IM payload lost display fields: %+v", body) + } +} + func TestProcessPendingDrawOutboxGrantsRewardWhenRoomIMFails(t *testing.T) { payload, _ := json.Marshal(map[string]any{ "event_type": "lucky_gift_drawn",