修复IM消息

This commit is contained in:
ZuoZuo 2026-05-31 16:59:32 +08:00
parent 88584f1329
commit ce3ffe666d
2 changed files with 84 additions and 1 deletions

View File

@ -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",

View File

@ -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",