syntax = "proto3"; package hyapp.events.room.v1; option go_package = "hyapp.local/api/proto/events/room/v1;roomeventsv1"; // EventEnvelope 是 room-service outbox 的统一事件外壳。 // body 保存具体事件消息序列化后的二进制,event_type 负责告诉消费者如何解码。 message EventEnvelope { string event_id = 1; string room_id = 2; string event_type = 3; int64 room_version = 4; int64 occurred_at_ms = 5; bytes body = 6; string app_code = 7; } // RoomCreated 表达房间第一次建立成功。 message RoomCreated { int64 owner_user_id = 1; int32 seat_count = 3; string mode = 4; // room_name/room_avatar/room_description 是创建时确定的展示资料快照,消费者不需要反查 room-service。 string room_name = 5; string room_avatar = 6; string room_description = 7; } // RoomProfileUpdated 表达房间展示资料或麦位数量变更。 message RoomProfileUpdated { int64 actor_user_id = 1; string room_name = 2; string room_avatar = 3; string room_description = 4; int32 seat_count = 5; string room_background_url = 6; } // RoomBackgroundChanged 表达房主切换当前房间背景图。 message RoomBackgroundChanged { int64 actor_user_id = 1; int64 background_id = 2; string room_background_url = 3; } // RoomUserJoined 表达用户业务态进房成功。 message RoomEntryVehicleSnapshot { int64 resource_id = 1; string resource_code = 2; string name = 3; string asset_url = 4; string preview_url = 5; string animation_url = 6; string metadata_json = 7; string entitlement_id = 8; int64 expires_at_ms = 9; } message RoomUserJoined { int64 user_id = 1; string role = 2; // visible_region_id 是用户进房时所在房间的国家/区域桶,统计服务不能反查 room-service。 int64 visible_region_id = 3; RoomEntryVehicleSnapshot entry_vehicle = 4; int64 country_id = 5; int64 region_id = 6; // is_robot 标记本次进房来自房间机器人调度,统计服务必须跳过活跃用户口径。 bool is_robot = 7; // nickname/avatar/display_user_id 是进房瞬间的展示资料快照,IM 补偿投递不能再临时反查 user-service。 string nickname = 8; string avatar = 9; string display_user_id = 10; string pretty_display_user_id = 11; } // RoomUserLeft 表达用户离房成功。 message RoomUserLeft { int64 user_id = 1; } // RoomClosed 表达房间生命周期关闭完成。 message RoomClosed { int64 actor_user_id = 1; string reason = 2; } // RoomMicChanged 表达任意上下麦和换麦位动作。 message RoomMicChanged { int64 actor_user_id = 1; int64 target_user_id = 2; int32 from_seat = 3; int32 to_seat = 4; string action = 5; // mic_session_id 用于把业务麦位事件和 RTC 发流会话绑定,客户端和 webhook 都必须透传。 string mic_session_id = 6; // publish_state 透出 pending_publish/publishing/idle,避免把“占麦”和“已发流”混成一个状态。 string publish_state = 7; // reason 表示系统触发的下麦原因,例如 publish_timeout。 string reason = 8; int64 publish_deadline_ms = 9; int64 publish_event_time_ms = 10; bool mic_muted = 11; string seat_status = 12; int64 target_gift_value = 13; // target_* 是目标麦位用户的展示资料快照;它只服务 IM/UI 首帧展示,不参与权限或房态判定。 string target_nickname = 14; string target_avatar = 15; string target_display_user_id = 16; string target_pretty_display_user_id = 17; } // RoomMicSeatLocked 表达单个麦位锁定状态变更。 message RoomMicSeatLocked { int64 actor_user_id = 1; int32 seat_no = 2; bool locked = 3; } // RoomChatEnabledChanged 表达公屏开关状态变更。 message RoomChatEnabledChanged { int64 actor_user_id = 1; bool enabled = 2; } // RoomPasswordChanged 表达房间入房密码状态变更,不携带明文或哈希。 message RoomPasswordChanged { int64 actor_user_id = 1; bool locked = 2; // visible_region_id 是房间当前可见区域,activity-service 用它把锁房变化投到区域播报群。 int64 visible_region_id = 3; } // RoomAdminChanged 表达房间管理员集合变更。 message RoomAdminChanged { int64 actor_user_id = 1; int64 target_user_id = 2; bool enabled = 3; } // RoomUserMuted 表达禁言状态变更。 message RoomUserMuted { int64 actor_user_id = 1; int64 target_user_id = 2; bool muted = 3; } // RoomUserKicked 表达踢人动作。 message RoomUserKicked { int64 actor_user_id = 1; int64 target_user_id = 2; } // RoomUserUnbanned 表达解除房间 ban。 message RoomUserUnbanned { int64 actor_user_id = 1; int64 target_user_id = 2; } // RoomGiftSent 表达送礼成功且已落房间状态。 message RoomGiftSent { int64 sender_user_id = 1; int64 target_user_id = 2; string gift_id = 3; int32 gift_count = 4; int64 gift_value = 5; string billing_receipt_id = 6; int64 visible_region_id = 7; string command_id = 8; string pool_id = 9; int64 coin_spent = 10; int64 country_id = 11; int64 region_id = 12; string gift_type_code = 13; string cp_relation_type = 14; string gift_name = 15; string gift_icon_url = 16; string gift_animation_url = 17; int64 target_gift_value = 18; repeated string gift_effect_types = 19; // is_robot_gift 标记机器人房间展示用礼物事实;下游真实统计、任务和结算消费者必须跳过。 bool is_robot_gift = 20; // synthetic_lucky_gift 标记幸运礼物只用于房间表现,不写真实抽奖流水、不扣真实奖池、不发真实奖励。 bool synthetic_lucky_gift = 21; // real_room_robot_gift 标记真人房机器人送出的真实热度礼物,用于 Databi 单独统计机器人投放价值。 bool real_room_robot_gift = 22; // sender_name 是送礼入口固化的展示昵称,只用于客户端 IM 展示兜底,不作为用户主资料事实。 string sender_name = 23; string sender_avatar = 24; string sender_display_user_id = 25; string sender_pretty_display_user_id = 26; // receiver_nickname 是收礼目标在送礼瞬间的展示昵称;字段名匹配 Flutter 已有解析逻辑。 string receiver_nickname = 27; string receiver_avatar = 28; string receiver_display_user_id = 29; string receiver_pretty_display_user_id = 30; // display_mode=batch 表示这条逐目标事实只给统计、activity、CP 和礼物墙消费;房间展示由同命令的 RoomGiftBatchSent 承担。 string display_mode = 31; } // RoomGiftBatchLuckyResult 是批量送礼展示事件内的逐目标幸运礼物结果快照。 // 它只进入房间 IM 展示,不作为 activity 中奖事实,也不携带送礼人余额。 message RoomGiftBatchLuckyResult { bool enabled = 1; string draw_id = 2; string command_id = 3; string pool_id = 4; string gift_id = 5; int64 rule_version = 6; string experience_pool = 7; string selected_tier_id = 8; int64 multiplier_ppm = 9; int64 base_reward_coins = 10; int64 room_atmosphere_reward_coins = 11; int64 activity_subsidy_coins = 12; int64 effective_reward_coins = 13; string reward_status = 14; bool stage_feedback = 15; bool high_multiplier = 16; int64 created_at_ms = 17; int64 target_user_id = 18; } // RoomGiftBatchTarget 固化批量送礼中单个收礼目标的展示和结算快照。 // 目标资料来自 gateway 入站时的 user-service 快照,避免 IM bridge 再回查高频用户服务。 message RoomGiftBatchTarget { int64 target_user_id = 1; string receiver_nickname = 2; string receiver_avatar = 3; string receiver_display_user_id = 4; string receiver_pretty_display_user_id = 5; int64 gift_value = 6; int64 target_gift_value = 7; int64 coin_spent = 8; string billing_receipt_id = 9; string command_id = 10; RoomGiftBatchLuckyResult lucky_gift = 11; } // RoomGiftBatchSent 只服务新 Flutter 的多人送礼展示。 // 逐目标 RoomGiftSent 仍然写 durable outbox 作为统计、CP、礼物墙和账务消费事实。 message RoomGiftBatchSent { int64 sender_user_id = 1; string sender_name = 2; string sender_avatar = 3; string sender_display_user_id = 4; string sender_pretty_display_user_id = 5; string gift_id = 6; int32 gift_count = 7; int64 total_gift_value = 8; int64 total_coin_spent = 9; string billing_receipt_id = 10; int64 room_heat = 11; string pool_id = 12; string gift_type_code = 13; string cp_relation_type = 14; string gift_name = 15; string gift_icon_url = 16; string gift_animation_url = 17; repeated string gift_effect_types = 18; repeated int64 target_user_ids = 19; repeated RoomGiftBatchTarget targets = 20; string command_id = 21; int64 visible_region_id = 22; } // RoomRobotLuckyGiftDrawn 是机器人房间专用幸运礼物展示事件。 // 它复用客户端 lucky_gift_drawn 表现协议,但不代表真实奖池抽奖和钱包返奖事实。 message RoomRobotLuckyGiftDrawn { string draw_id = 1; string command_id = 2; int64 sender_user_id = 3; int64 target_user_id = 4; string gift_id = 5; int32 gift_count = 6; string pool_id = 7; int64 multiplier_ppm = 8; int64 base_reward_coins = 9; int64 room_atmosphere_reward_coins = 10; int64 activity_subsidy_coins = 11; int64 effective_reward_coins = 12; int64 created_at_ms = 13; int64 visible_region_id = 14; bool is_robot = 15; bool synthetic = 16; } // RoomHeatChanged 表达热度变化结果。 message RoomHeatChanged { int64 delta = 1; int64 current_heat = 2; } // RoomRankChanged 表达本地礼物榜变化结果。 message RoomRankChanged { int64 user_id = 1; int64 score = 2; int64 gift_value = 3; } message RoomRocketRewardGrant { string reward_role = 1; int64 user_id = 2; string reward_item_id = 3; int64 resource_group_id = 4; string display_name = 5; string icon_url = 6; string grant_id = 7; string status = 8; } // RoomRocketFuelChanged 表达送礼扣费成功后火箭有效燃料发生变化。 message RoomRocketFuelChanged { string rocket_id = 1; int32 level = 2; int64 added_fuel = 3; int64 effective_added_fuel = 4; int64 overflow_fuel = 5; int64 current_fuel = 6; int64 fuel_threshold = 7; string status = 8; int64 reset_at_ms = 9; int64 sender_user_id = 10; string gift_id = 11; int32 gift_count = 12; string command_id = 13; int64 visible_region_id = 14; } // RoomRocketIgnited 表达火箭燃料满后进入倒计时,并作为区域/全局播报的事实源。 message RoomRocketIgnited { string rocket_id = 1; int32 level = 2; int64 current_fuel = 3; int64 fuel_threshold = 4; int64 ignited_at_ms = 5; int64 launch_at_ms = 6; string broadcast_scope = 7; int64 visible_region_id = 8; int64 top1_user_id = 9; int64 igniter_user_id = 10; string command_id = 11; string room_short_id = 12; string rocket_cover_url = 13; int64 reset_at_ms = 14; } // RoomRocketLaunched 表达火箭已经发射,在线用户名单按发射瞬间 Room Cell presence 结算。 message RoomRocketLaunched { string rocket_id = 1; int32 level = 2; int32 next_level = 3; int64 launched_at_ms = 4; int64 reset_at_ms = 5; int64 top1_user_id = 6; int64 igniter_user_id = 7; repeated int64 in_room_user_ids = 8; repeated RoomRocketRewardGrant rewards = 9; } // RoomRocketRewardGranted 是客户端展示发奖弹窗和私有通知的最小事实。 message RoomRocketRewardGranted { string rocket_id = 1; int32 level = 2; repeated RoomRocketRewardGrant rewards = 3; }