2026-05-29 19:56:14 +08:00

1109 lines
34 KiB
Protocol Buffer
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

syntax = "proto3";
package hyapp.room.v1;
option go_package = "hyapp.local/api/proto/room/v1;roomv1";
// RequestMeta 固定承载所有命令的调用元信息。
// room-service 用它串起幂等、追踪、路由和业务操作者身份。
message RequestMeta {
string request_id = 1;
string command_id = 2;
int64 actor_user_id = 3;
// room_id 是命令路由、持久化和腾讯 IM/RTC 映射共同依赖的必填字段。
// CreateRoom 时必须满足 ^[A-Za-z0-9_-]{1,48}$。
string room_id = 4;
string gateway_node_id = 5;
string session_id = 6;
int64 sent_at_ms = 7;
string app_code = 8;
}
// CommandResult 统一返回命令是否真正落地,以及落地后的房间版本。
message CommandResult {
bool applied = 1;
int64 room_version = 2;
int64 server_time_ms = 3;
}
// RoomUser 只表达 room-service 需要保存的房间内轻量用户态。
message RoomUser {
int64 user_id = 1;
string role = 2;
int64 joined_at_ms = 3;
int64 last_seen_at_ms = 4;
}
// RoomOnlineUser 是在线用户列表的展示读模型。
// role 保留进房 presence 语义room_role 只表达房间管理员身份is_owner 单独表达房主身份。
message RoomOnlineUser {
int64 user_id = 1;
string role = 2;
string room_role = 3;
int64 gift_value = 4;
int64 joined_at_ms = 5;
int64 last_seen_at_ms = 6;
bool is_owner = 7;
}
// SeatState 表达单个麦位当前占用和 RTC 发流确认状态。
message SeatState {
int32 seat_no = 1;
int64 user_id = 2;
bool locked = 3;
// publish_state 为空表示空麦或未进入发流流程;上麦后先进入 pending_publish确认后进入 publishing。
string publish_state = 4;
// mic_session_id 是单次上麦发流会话 ID所有客户端确认或 RTC webhook 必须带回它。
string mic_session_id = 5;
// publish_deadline_ms 是 pending_publish 必须确认发流的截止时间。
int64 publish_deadline_ms = 6;
// mic_session_room_version 是创建本次 mic_session 的房间版本,用于丢弃旧版本 RTC 事件。
int64 mic_session_room_version = 7;
// last_publish_event_time_ms 记录已接受的最新 RTC/客户端发流事件时间。
int64 last_publish_event_time_ms = 8;
// mic_muted 是服务端可见的麦克风静音状态,用于同步其他用户 UI。
bool mic_muted = 9;
// seat_status 是服务端派生的展示状态empty/locked/occupied/publishing/muted。
string seat_status = 10;
}
// RankItem 表达房间内本地礼物榜项目。
message RankItem {
int64 user_id = 1;
int64 score = 2;
int64 gift_value = 3;
int64 updated_at_ms = 4;
}
// LuckyGiftDrawResult 是 SendGift 同步返回给当前送礼用户的幸运礼物抽奖表现。
message LuckyGiftDrawResult {
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;
}
// RoomTreasureRewardItem 是后台配置给客户端展示的宝箱奖励候选项。
message RoomTreasureRewardItem {
string reward_item_id = 1;
int64 resource_group_id = 2;
int64 weight = 3;
string display_name = 4;
string icon_url = 5;
}
// RoomTreasureLevel 暴露单个等级宝箱的物料、阈值和三类奖励池。
message RoomTreasureLevel {
int32 level = 1;
int64 energy_threshold = 2;
string cover_url = 3;
string animation_url = 4;
string opening_animation_url = 5;
string opened_image_url = 6;
repeated RoomTreasureRewardItem in_room_rewards = 7;
repeated RoomTreasureRewardItem top1_rewards = 8;
repeated RoomTreasureRewardItem igniter_rewards = 9;
}
// RoomTreasureRewardGrant 是一次宝箱打开后给某个用户结算出的具体奖励。
message RoomTreasureRewardGrant {
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;
}
// RoomTreasureState 是 Room Cell 持有并随快照恢复的当前宝箱状态。
message RoomTreasureState {
int32 current_level = 1;
int64 current_progress = 2;
int64 energy_threshold = 3;
string status = 4;
int64 countdown_started_at_ms = 5;
int64 open_at_ms = 6;
int64 opened_at_ms = 7;
int64 reset_at_ms = 8;
int64 top1_user_id = 9;
int64 igniter_user_id = 10;
string box_id = 11;
int64 config_version = 12;
repeated RoomTreasureRewardGrant last_rewards = 13;
}
// RoomTreasureInfo 是 App 初始化宝箱 UI 的完整读模型。
message RoomTreasureInfo {
bool enabled = 1;
repeated RoomTreasureLevel levels = 2;
RoomTreasureState state = 3;
int64 server_time_ms = 4;
string broadcast_scope = 5;
int64 open_delay_ms = 6;
int64 broadcast_delay_ms = 7;
string reward_stack_policy = 8;
}
// RoomTreasureGiftEnergyRule 是后台配置的礼物能量覆盖规则。
message RoomTreasureGiftEnergyRule {
string rule_id = 1;
string gift_id = 2;
string gift_type_code = 3;
int64 multiplier_ppm = 4;
int64 fixed_energy = 5;
bool excluded = 6;
}
// AdminRoomTreasureConfig 是后台管理读写的完整宝箱配置。
message AdminRoomTreasureConfig {
string app_code = 1;
bool enabled = 2;
int64 config_version = 3;
string energy_source = 4;
int64 open_delay_ms = 5;
bool broadcast_enabled = 6;
string broadcast_scope = 7;
int64 broadcast_delay_ms = 8;
string reward_stack_policy = 9;
repeated RoomTreasureLevel levels = 10;
repeated RoomTreasureGiftEnergyRule gift_energy_rules = 11;
int64 updated_by_admin_id = 12;
int64 created_at_ms = 13;
int64 updated_at_ms = 14;
}
message AdminGetRoomTreasureConfigRequest {
RequestMeta meta = 1;
}
message AdminGetRoomTreasureConfigResponse {
AdminRoomTreasureConfig config = 1;
int64 server_time_ms = 2;
}
message AdminUpdateRoomTreasureConfigRequest {
RequestMeta meta = 1;
AdminRoomTreasureConfig config = 2;
int64 admin_id = 3;
}
message AdminUpdateRoomTreasureConfigResponse {
AdminRoomTreasureConfig config = 1;
int64 server_time_ms = 2;
}
message AdminRoomSeatConfig {
repeated int32 candidate_seat_counts = 1;
repeated int32 allowed_seat_counts = 2;
int32 default_seat_count = 3;
int64 updated_at_ms = 4;
}
message AdminGetRoomSeatConfigRequest {
RequestMeta meta = 1;
}
message AdminGetRoomSeatConfigResponse {
AdminRoomSeatConfig config = 1;
int64 server_time_ms = 2;
}
message AdminUpdateRoomSeatConfigRequest {
RequestMeta meta = 1;
repeated int32 allowed_seat_counts = 2;
int32 default_seat_count = 3;
}
message AdminUpdateRoomSeatConfigResponse {
AdminRoomSeatConfig config = 1;
int64 server_time_ms = 2;
}
message AdminRoomPinRoom {
string room_id = 1;
string room_short_id = 2;
int64 visible_region_id = 3;
int64 owner_user_id = 4;
string title = 5;
string cover_url = 6;
string status = 7;
}
message AdminRoomPin {
int64 id = 1;
int64 visible_region_id = 2;
string room_id = 3;
int64 weight = 4;
string status = 5;
int64 pinned_at_ms = 6;
int64 expires_at_ms = 7;
int64 cancelled_at_ms = 8;
uint64 created_by_admin_id = 9;
uint64 cancelled_by_admin_id = 10;
int64 created_at_ms = 11;
int64 updated_at_ms = 12;
AdminRoomPinRoom room = 13;
}
message AdminListRoomPinsRequest {
RequestMeta meta = 1;
int32 page = 2;
int32 page_size = 3;
string keyword = 4;
string status = 5;
int64 visible_region_id = 6;
}
message AdminListRoomPinsResponse {
repeated AdminRoomPin pins = 1;
int64 total = 2;
int64 server_time_ms = 3;
}
message AdminCreateRoomPinRequest {
RequestMeta meta = 1;
string room_id = 2;
int64 weight = 3;
int64 duration_days = 4;
uint64 admin_id = 5;
}
message AdminCreateRoomPinResponse {
AdminRoomPin pin = 1;
int64 server_time_ms = 2;
}
message AdminCancelRoomPinRequest {
RequestMeta meta = 1;
int64 pin_id = 2;
uint64 admin_id = 3;
}
message AdminCancelRoomPinResponse {
AdminRoomPin pin = 1;
int64 server_time_ms = 2;
}
// RoomBanState 表达单个房间 ban 的治理状态。
message RoomBanState {
int64 user_id = 1;
int64 actor_user_id = 2;
int64 created_at_ms = 3;
// expires_at_ms 为 0 表示永久 ban非 0 表示该 UTC 毫秒后可重新进房。
int64 expires_at_ms = 4;
}
// RoomSnapshot 把 room-service 对外需要暴露的房间投影集中返回。
message RoomSnapshot {
string room_id = 1;
int64 owner_user_id = 2;
string mode = 4;
string status = 5;
bool chat_enabled = 6;
repeated SeatState mic_seats = 7;
repeated RoomUser online_users = 8;
repeated int64 admin_user_ids = 9;
repeated int64 ban_user_ids = 10;
repeated int64 mute_user_ids = 11;
repeated RankItem gift_rank = 12;
map<string, string> room_ext = 13;
int64 heat = 14;
int64 version = 15;
string app_code = 16;
string room_short_id = 17;
int64 visible_region_id = 18;
// locked 只表达房间是否需要入房密码;具体密码哈希不对外映射到 HTTP JSON。
bool locked = 19;
// treasure 是语音房宝箱当前状态;配置物料通过 GetRoomTreasure 单独读取,避免快照过大。
RoomTreasureState treasure = 20;
// ban_states 保存 ban 的过期边界ban_user_ids 仍只服务简单集合判断。
repeated RoomBanState ban_states = 21;
}
// RoomBackgroundImage 是房间维度保存过的背景图素材。
// 保存列表归属于 room-service当前生效背景仍写入 RoomSnapshot.room_ext["background_url"]。
message RoomBackgroundImage {
int64 background_id = 1;
string room_id = 2;
string image_url = 3;
int64 created_by_user_id = 4;
int64 created_at_ms = 5;
int64 updated_at_ms = 6;
}
message SaveRoomBackgroundRequest {
RequestMeta meta = 1;
string room_id = 2;
string image_url = 3;
}
message SaveRoomBackgroundResponse {
RoomBackgroundImage background = 1;
int64 server_time_ms = 2;
}
message ListRoomBackgroundsRequest {
RequestMeta meta = 1;
string room_id = 2;
int64 viewer_user_id = 3;
}
message ListRoomBackgroundsResponse {
repeated RoomBackgroundImage backgrounds = 1;
string selected_background_url = 2;
int64 server_time_ms = 3;
}
message SetRoomBackgroundRequest {
RequestMeta meta = 1;
int64 background_id = 2;
}
message SetRoomBackgroundResponse {
CommandResult result = 1;
RoomSnapshot room = 2;
RoomBackgroundImage background = 3;
}
// CreateRoomRequest 创建一个新的房间执行单元。
// 必填语义meta.room_id、meta.command_id、meta.actor_user_id、mode 和 room_name。
// 同一个 meta.actor_user_id 只能作为 owner 创建一个房间;重复创建返回 Conflict。
message CreateRoomRequest {
RequestMeta meta = 1;
// seat_count 为空或 0 时使用后台房间配置默认值;正数必须命中后台启用座位数。
int32 seat_count = 2;
// mode 必须非空;当前只作为房间状态字段保存和透出。
string mode = 3;
// visible_region_id 由 gateway 按创建者 user-service region_id 填充0 表示 GLOBAL 兜底列表桶。
int64 visible_region_id = 4;
// room_name 是客户端创建房间时填写的展示名称room-service 会写入 RoomSnapshot.room_ext["title"]。
string room_name = 5;
// room_avatar 是客户端可选上传的展示头像;为空时 room-service 写入默认系统头像。
string room_avatar = 6;
// room_description 是房间简介,只作为房间扩展资料保存,不参与 Room Cell 高频状态决策。
string room_description = 7;
// room_short_id 是房间短 ID首版直接等于创建者当前 default/current display_user_id。
string room_short_id = 8;
}
// CreateRoomResponse 返回新建后的房间快照。
message CreateRoomResponse {
CommandResult result = 1;
RoomSnapshot room = 2;
}
// UpdateRoomProfileRequest 修改房间展示资料和麦位数量。
// 该命令只允许当前在房间 presence 内的 owner 执行,座位数必须命中后台启用配置。
message UpdateRoomProfileRequest {
RequestMeta meta = 1;
optional string room_name = 2;
optional string room_avatar = 3;
optional string room_description = 4;
optional int32 seat_count = 5;
}
// UpdateRoomProfileResponse 返回修改后的最新房间快照。
message UpdateRoomProfileResponse {
CommandResult result = 1;
RoomSnapshot room = 2;
}
// JoinRoomRequest 把用户 presence 接入房间业务态。
message JoinRoomRequest {
RequestMeta meta = 1;
string role = 2;
// password 只用于本次入房校验room-service 不把明文写入 command log 或快照。
string password = 3;
}
// JoinRoomResponse 返回加入后的房间快照。
message JoinRoomResponse {
CommandResult result = 1;
RoomUser user = 2;
RoomSnapshot room = 3;
}
// RoomHeartbeatRequest 显式刷新已经存在的房间业务 presence。
// 它不能替代 JoinRoom用户不在房间时必须拒绝避免心跳把已离开的用户重新加入房间。
message RoomHeartbeatRequest {
RequestMeta meta = 1;
}
// RoomHeartbeatResponse 返回刷新后的用户 presence 和房间快照。
message RoomHeartbeatResponse {
CommandResult result = 1;
RoomUser user = 2;
RoomSnapshot room = 3;
}
// LeaveRoomRequest 把用户从房间 presence 移出。
message LeaveRoomRequest {
RequestMeta meta = 1;
}
// LeaveRoomResponse 返回离房后的房间快照。
message LeaveRoomResponse {
CommandResult result = 1;
RoomSnapshot room = 2;
}
// CloseRoomRequest 关闭房间并清理业务 presence 和麦位。
message CloseRoomRequest {
RequestMeta meta = 1;
string reason = 2;
}
// CloseRoomResponse 返回关闭后的房间快照。
message CloseRoomResponse {
CommandResult result = 1;
RoomSnapshot room = 2;
}
// AdminRoomListItem 是后台房间管理卡片;它来自 room-service owner 读模型,不允许后台直连房间库。
message AdminRoomListItem {
string room_id = 1;
string room_short_id = 2;
int64 visible_region_id = 3;
int64 owner_user_id = 4;
string title = 5;
string cover_url = 6;
string mode = 7;
string status = 8;
string close_reason = 9;
uint64 closed_by_admin_id = 10;
string closed_by_admin_name = 11;
int64 closed_at_ms = 12;
int64 heat = 13;
int32 online_count = 14;
int32 seat_count = 15;
int32 occupied_seat_count = 16;
int64 sort_score = 17;
int64 created_at_ms = 18;
int64 updated_at_ms = 19;
}
message AdminListRoomsRequest {
RequestMeta meta = 1;
int32 page = 2;
int32 page_size = 3;
string keyword = 4;
string status = 5;
int64 visible_region_id = 6;
string sort_by = 7;
string sort_direction = 8;
}
message AdminListRoomsResponse {
repeated AdminRoomListItem rooms = 1;
int64 total = 2;
int64 server_time_ms = 3;
}
message AdminGetRoomRequest {
RequestMeta meta = 1;
string room_id = 2;
}
message AdminGetRoomResponse {
AdminRoomListItem room = 1;
int64 server_time_ms = 2;
}
message AdminUpdateRoomRequest {
RequestMeta meta = 1;
optional string title = 2;
optional string cover_url = 3;
optional string description = 4;
optional string mode = 5;
optional string status = 6;
optional int64 visible_region_id = 7;
string close_reason = 8;
uint64 admin_id = 9;
string admin_name = 10;
}
message AdminUpdateRoomResponse {
CommandResult result = 1;
RoomSnapshot room = 2;
}
message AdminDeleteRoomRequest {
RequestMeta meta = 1;
uint64 admin_id = 2;
string admin_name = 3;
}
message AdminDeleteRoomResponse {
CommandResult result = 1;
RoomSnapshot room = 2;
}
// MicUpRequest 申请把用户放到指定麦位。
message MicUpRequest {
RequestMeta meta = 1;
int32 seat_no = 2;
}
// MicUpResponse 返回最新房间快照与目标麦位。
message MicUpResponse {
CommandResult result = 1;
int32 seat_no = 2;
RoomSnapshot room = 3;
string mic_session_id = 4;
int64 publish_deadline_ms = 5;
}
// MicDownRequest 把用户从当前麦位移下。
message MicDownRequest {
RequestMeta meta = 1;
int64 target_user_id = 2;
// reason 为空表示主动下麦;系统自动释放麦位时会写入稳定原因,例如 publish_timeout。
string reason = 3;
}
// MicDownResponse 返回最新房间快照与目标麦位。
message MicDownResponse {
CommandResult result = 1;
int32 seat_no = 2;
RoomSnapshot room = 3;
}
// ChangeMicSeatRequest 直接调整指定用户所在麦位。
message ChangeMicSeatRequest {
RequestMeta meta = 1;
int64 target_user_id = 2;
int32 seat_no = 3;
}
// ChangeMicSeatResponse 返回变更后的房间快照。
message ChangeMicSeatResponse {
CommandResult result = 1;
RoomSnapshot room = 2;
}
// ConfirmMicPublishingRequest 确认当前 mic_session 已经在 RTC 侧成功发布音频。
// 客户端 SDK 回调和后续 RTC webhook 都必须带 mic_session_id、room_version 和 event_time_ms。
message ConfirmMicPublishingRequest {
RequestMeta meta = 1;
// target_user_id 为空时默认确认 actor_user_idRTC webhook 入口可显式指定目标用户。
int64 target_user_id = 2;
string mic_session_id = 3;
int64 room_version = 4;
int64 event_time_ms = 5;
string source = 6;
}
// ConfirmMicPublishingResponse 返回确认后的最新房间快照。
message ConfirmMicPublishingResponse {
CommandResult result = 1;
int32 seat_no = 2;
RoomSnapshot room = 3;
}
// SetMicMuteRequest 修改麦位上的服务端可见静音态。
message SetMicMuteRequest {
RequestMeta meta = 1;
// target_user_id 为空时默认修改 actor_user_id 自己的麦克风静音态。
int64 target_user_id = 2;
bool muted = 3;
}
// SetMicMuteResponse 返回静音态变更后的最新房间快照。
message SetMicMuteResponse {
CommandResult result = 1;
int32 seat_no = 2;
RoomSnapshot room = 3;
}
// ApplyRTCEventRequest 把可信 RTC 服务端回调转换成 Room Cell 命令。
// event_type 当前只接受 audio_started、audio_stopped、room_exited。
message ApplyRTCEventRequest {
RequestMeta meta = 1;
int64 target_user_id = 2;
string event_type = 3;
int64 event_time_ms = 4;
string reason = 5;
string source = 6;
string external_event_id = 7;
}
// ApplyRTCEventResponse 返回 RTC 事件落房间状态后的快照。
message ApplyRTCEventResponse {
CommandResult result = 1;
int32 seat_no = 2;
RoomSnapshot room = 3;
}
// SetMicSeatLockRequest 锁定或解锁指定麦位。
message SetMicSeatLockRequest {
RequestMeta meta = 1;
int32 seat_no = 2;
bool locked = 3;
}
// SetMicSeatLockResponse 返回锁麦后的最新房间快照。
message SetMicSeatLockResponse {
CommandResult result = 1;
RoomSnapshot room = 2;
}
// SetChatEnabledRequest 开启或关闭房间公屏。
message SetChatEnabledRequest {
RequestMeta meta = 1;
bool enabled = 2;
}
// SetChatEnabledResponse 返回聊天开关变更后的最新房间快照。
message SetChatEnabledResponse {
CommandResult result = 1;
RoomSnapshot room = 2;
}
// SetRoomPasswordRequest 设置或清空房间入房密码。
// locked=true 时 password 必须非空locked=false 表示清空密码并解除锁房。
message SetRoomPasswordRequest {
RequestMeta meta = 1;
bool locked = 2;
string password = 3;
}
// SetRoomPasswordResponse 返回锁房状态变更后的最新房间快照。
message SetRoomPasswordResponse {
CommandResult result = 1;
RoomSnapshot room = 2;
}
// SetRoomAdminRequest 添加或移除房间管理员。
message SetRoomAdminRequest {
RequestMeta meta = 1;
int64 target_user_id = 2;
bool enabled = 3;
}
// SetRoomAdminResponse 返回管理员集合变更后的最新房间快照。
message SetRoomAdminResponse {
CommandResult result = 1;
RoomSnapshot room = 2;
}
// MuteUserRequest 修改房间内禁言态。
message MuteUserRequest {
RequestMeta meta = 1;
int64 target_user_id = 2;
bool muted = 3;
}
// MuteUserResponse 返回最新房间快照。
message MuteUserResponse {
CommandResult result = 1;
RoomSnapshot room = 2;
}
// KickUserRequest 把指定用户踢出房间。
message KickUserRequest {
RequestMeta meta = 1;
int64 target_user_id = 2;
// duration_ms 为 0 表示永久 ban大于 0 表示从服务端当前 UTC 时间起禁止进房的时长。
int64 duration_ms = 3;
}
// KickUserResponse 返回最新房间快照。
message KickUserResponse {
CommandResult result = 1;
RoomSnapshot room = 2;
// rtc_kicked 表示 room-service 已通过 TRTC 服务端接口移除目标用户;失败不回滚房间踢人事实。
bool rtc_kicked = 3;
// rtc_kick_error 仅用于调用方排障和告警,客户端展示仍以统一错误码和房间状态为准。
string rtc_kick_error = 4;
}
// UnbanUserRequest 解除房间内 ban用户仍需重新 JoinRoom。
message UnbanUserRequest {
RequestMeta meta = 1;
int64 target_user_id = 2;
}
// UnbanUserResponse 返回解封后的最新房间快照。
message UnbanUserResponse {
CommandResult result = 1;
RoomSnapshot room = 2;
}
// SystemEvictUserRequest 是平台级封禁、风控或后台治理触发的系统驱逐入口。
// 该命令仍由 Room Cell 修改房间状态;调用方不能直接写房间 presence 或麦位。
message SystemEvictUserRequest {
RequestMeta meta = 1;
int64 target_user_id = 2;
int64 operator_user_id = 3;
string reason = 4;
// ban_from_room 为 true 时把用户加入当前房间 ban 集合,防止同一房间恢复入口重新进入。
bool ban_from_room = 5;
}
// SystemEvictUserResponse 返回系统驱逐的房间状态和外部 RTC 副作用结果。
message SystemEvictUserResponse {
bool had_current_room = 1;
CommandResult result = 2;
RoomSnapshot room = 3;
string room_id = 4;
bool rtc_kicked = 5;
string rtc_kick_error = 6;
}
// SendGiftRequest 是首版房间内最重要的变现命令。
message SendGiftRequest {
RequestMeta meta = 1;
// target_user_id 是兼容旧客户端的单目标字段;新客户端优先使用 target_user_ids。
int64 target_user_id = 2;
string gift_id = 3;
int32 gift_count = 4;
// target_type 当前只提交 user后续扩展 all_mic、all_room、couple 时不再改 HTTP 契约。
string target_type = 5;
repeated int64 target_user_ids = 6;
string pool_id = 7;
// target_is_host 由 gateway 根据 user-service active host profile 注入room-service 只透传给 wallet-service。
bool target_is_host = 8;
// target_host_region_id 是主播所属区域,后续结算按该区域匹配 Host & Agency 政策。
int64 target_host_region_id = 9;
// target_agency_owner_user_id 是送礼瞬间主播上级代理收款用户;为空表示当前无代理或代理关系不可结算。
int64 target_agency_owner_user_id = 10;
}
// SendGiftResponse 返回扣费成功并落到房间后的状态结果。
message SendGiftResponse {
CommandResult result = 1;
string billing_receipt_id = 2;
int64 room_heat = 3;
repeated RankItem gift_rank = 4;
RoomSnapshot room = 5;
RoomTreasureState treasure = 6;
LuckyGiftDrawResult lucky_gift = 7;
}
// CheckSpeakPermissionRequest 让腾讯云 IM 发言回调或 gateway 在公屏前同步问房间业务态。
message CheckSpeakPermissionRequest {
string room_id = 1;
int64 user_id = 2;
string app_code = 3;
}
// CheckSpeakPermissionResponse 返回当前用户是否允许发言。
message CheckSpeakPermissionResponse {
bool allowed = 1;
string reason = 2;
int64 room_version = 3;
}
// VerifyRoomPresenceRequest 让外部 IM 入口在进群前确认用户业务上仍在房间内。
message VerifyRoomPresenceRequest {
string room_id = 1;
int64 user_id = 2;
string session_id = 3;
string request_id = 4;
string app_code = 5;
}
// VerifyRoomPresenceResponse 返回用户是否仍然属于该房间。
message VerifyRoomPresenceResponse {
bool present = 1;
string reason = 2;
int64 room_version = 3;
}
// ListRoomsRequest 查询当前用户所在区域可见的房间列表。
// visible_region_id 必须来自 gateway 对 user-service 的 GetUser 结果,客户端不能直接提交。
message ListRoomsRequest {
RequestMeta meta = 1;
int64 viewer_user_id = 2;
int64 visible_region_id = 3;
string tab = 4;
string cursor = 5;
int32 limit = 6;
string query = 7;
}
// ListRoomFeedsRequest 查询 Mine 页 visited/friend/following/followed 房间流。
// 它和公共房间发现列表分离,避免把用户关系流误建模成房间全集过滤。
message ListRoomFeedsRequest {
RequestMeta meta = 1;
int64 viewer_user_id = 2;
int64 visible_region_id = 3;
string tab = 4;
string cursor = 5;
int32 limit = 6;
string query = 7;
// related_users 只用于 friend/following关系事实由 gateway 从 user-service 读取后传入。
repeated RoomFeedRelatedUser related_users = 8;
}
// ListRoomGiftLeaderboardRequest 查询当前 UTC 周期内的房间金币消耗榜。
message ListRoomGiftLeaderboardRequest {
RequestMeta meta = 1;
string period = 2;
int32 page = 3;
int32 page_size = 4;
}
// RoomFeedRelatedUser 是 Mine 关系房间流的排序输入,不让 room-service 持有好友/关注事实。
message RoomFeedRelatedUser {
int64 user_id = 1;
int64 relation_updated_at_ms = 2;
}
// RoomListItem 是房间发现页卡片读模型,不承载完整 Room Cell 状态。
message RoomListItem {
string room_id = 1;
int64 owner_user_id = 2;
string title = 4;
string cover_url = 5;
string mode = 6;
string status = 7;
int64 heat = 8;
int32 online_count = 9;
int32 seat_count = 10;
int32 occupied_seat_count = 11;
int64 visible_region_id = 12;
string app_code = 13;
string room_short_id = 14;
bool locked = 15;
}
// ListRoomsResponse 返回一页房间卡片和下一页不透明 cursor。
message ListRoomsResponse {
repeated RoomListItem rooms = 1;
string next_cursor = 2;
}
// RoomGiftLeaderboardItem 是跨房间金币消耗榜卡片score 只表达该周期房间礼物金币消耗。
message RoomGiftLeaderboardItem {
int64 rank = 1;
string room_id = 2;
int64 coin_spent = 3;
RoomListItem room = 4;
}
// ListRoomGiftLeaderboardResponse 返回当前 UTC 周期房间金币榜。
message ListRoomGiftLeaderboardResponse {
repeated RoomGiftLeaderboardItem items = 1;
int64 total = 2;
string period = 3;
int64 start_at_ms = 4;
int64 end_at_ms = 5;
int64 server_time_ms = 6;
}
// GetMyRoomRequest 查询当前用户自己创建的房间。
// 该查询必须由 gateway 写入鉴权后的 owner_user_id不能从客户端接收用户 ID。
message GetMyRoomRequest {
RequestMeta meta = 1;
int64 owner_user_id = 2;
}
// GetMyRoomResponse 返回 Mine 顶部“我的房间”权威卡片。
// 它直接读取 rooms 元数据并用 Room Cell 快照补充实时卡片字段,不依赖发现页投影是否已经写入。
message GetMyRoomResponse {
bool has_room = 1;
RoomListItem room = 2;
int64 server_time_ms = 3;
}
// GetCurrentRoomRequest 查询当前用户是否仍有可恢复的房间 presence。
// 该查询必须由 gateway 写入鉴权后的 user_id客户端不能提交 user_id。
message GetCurrentRoomRequest {
RequestMeta meta = 1;
int64 user_id = 2;
}
// GetCurrentRoomResponse 是 App 启动、回前台和网络恢复时的房间恢复探测结果。
// 它只表达是否需要恢复,不会隐式 JoinRoom 或刷新 presence。
message GetCurrentRoomResponse {
bool has_current_room = 1;
string room_id = 2;
int64 room_version = 3;
string role = 4;
string mic_session_id = 5;
string publish_state = 6;
bool need_join_im_group = 7;
bool need_rtc_token = 8;
int64 server_time_ms = 9;
}
// GetRoomSnapshotRequest 主动读取当前房间完整快照。
// 该查询必须由 gateway 写入鉴权后的 viewer_user_id客户端不能提交 viewer_user_id。
message GetRoomSnapshotRequest {
RequestMeta meta = 1;
string room_id = 2;
int64 viewer_user_id = 3;
}
// GetRoomSnapshotResponse 返回 Room Cell 当前快照;只读,不刷新 presence。
message GetRoomSnapshotResponse {
RoomSnapshot room = 1;
int64 server_time_ms = 2;
// is_followed 表达 viewer 是否已经关注该房间;它来自 room_follows 关系表,不属于 Room Cell 核心快照。
bool is_followed = 3;
}
// GetRoomTreasureRequest 主动读取当前房间宝箱配置物料和进度状态。
// 该查询必须由 gateway 写入鉴权后的 viewer_user_id客户端不能提交 viewer_user_id。
message GetRoomTreasureRequest {
RequestMeta meta = 1;
string room_id = 2;
int64 viewer_user_id = 3;
}
message GetRoomTreasureResponse {
RoomTreasureInfo treasure = 1;
int64 server_time_ms = 2;
}
// ListRoomOnlineUsersRequest 分页查询房间在线用户,不让客户端拉完整 RoomSnapshot 做列表分页。
message ListRoomOnlineUsersRequest {
RequestMeta meta = 1;
string room_id = 2;
int64 viewer_user_id = 3;
int32 page = 4;
int32 page_size = 5;
string sort = 6;
}
message ListRoomOnlineUsersResponse {
repeated RoomUser users = 1;
int64 total = 2;
int32 page = 3;
int32 page_size = 4;
int64 server_time_ms = 5;
repeated RoomOnlineUser items = 6;
}
// RoomBannedUser 是房间黑名单列表的轻量治理读模型;用户展示资料由 gateway 批量补齐。
message RoomBannedUser {
int64 user_id = 1;
int64 actor_user_id = 2;
int64 created_at_ms = 3;
// unban_at_ms 为 0 表示永久 ban非 0 表示该 UTC 毫秒后自动允许重新进房。
int64 unban_at_ms = 4;
int64 remaining_ms = 5;
bool permanent = 6;
}
// ListRoomBannedUsersRequest 分页查询房间当前仍有效的黑名单。
message ListRoomBannedUsersRequest {
RequestMeta meta = 1;
string room_id = 2;
int64 viewer_user_id = 3;
int32 page = 4;
int32 page_size = 5;
}
message ListRoomBannedUsersResponse {
repeated RoomBannedUser items = 1;
int64 total = 2;
int32 page = 3;
int32 page_size = 4;
int64 server_time_ms = 5;
}
// FollowRoomRequest 建立当前用户对房间的关注关系。
// 该关系是 room-service 的用户-房间低频关系事实,不进入 Room Cell command log。
message FollowRoomRequest {
RequestMeta meta = 1;
string room_id = 2;
int64 user_id = 3;
}
message FollowRoomResponse {
string room_id = 1;
bool followed = 2;
int64 followed_at_ms = 3;
int64 server_time_ms = 4;
}
// UnfollowRoomRequest 取消当前用户对房间的关注关系;未关注时按幂等成功处理。
message UnfollowRoomRequest {
RequestMeta meta = 1;
string room_id = 2;
int64 user_id = 3;
}
message UnfollowRoomResponse {
string room_id = 1;
bool followed = 2;
int64 server_time_ms = 3;
}
// RoomCommandService 承载所有会改变房间状态的命令。
service RoomCommandService {
rpc CreateRoom(CreateRoomRequest) returns (CreateRoomResponse);
rpc UpdateRoomProfile(UpdateRoomProfileRequest) returns (UpdateRoomProfileResponse);
rpc SaveRoomBackground(SaveRoomBackgroundRequest) returns (SaveRoomBackgroundResponse);
rpc SetRoomBackground(SetRoomBackgroundRequest) returns (SetRoomBackgroundResponse);
rpc JoinRoom(JoinRoomRequest) returns (JoinRoomResponse);
rpc RoomHeartbeat(RoomHeartbeatRequest) returns (RoomHeartbeatResponse);
rpc LeaveRoom(LeaveRoomRequest) returns (LeaveRoomResponse);
rpc CloseRoom(CloseRoomRequest) returns (CloseRoomResponse);
rpc AdminUpdateRoom(AdminUpdateRoomRequest) returns (AdminUpdateRoomResponse);
rpc AdminDeleteRoom(AdminDeleteRoomRequest) returns (AdminDeleteRoomResponse);
rpc AdminUpdateRoomTreasureConfig(AdminUpdateRoomTreasureConfigRequest) returns (AdminUpdateRoomTreasureConfigResponse);
rpc AdminUpdateRoomSeatConfig(AdminUpdateRoomSeatConfigRequest) returns (AdminUpdateRoomSeatConfigResponse);
rpc AdminCreateRoomPin(AdminCreateRoomPinRequest) returns (AdminCreateRoomPinResponse);
rpc AdminCancelRoomPin(AdminCancelRoomPinRequest) returns (AdminCancelRoomPinResponse);
rpc MicUp(MicUpRequest) returns (MicUpResponse);
rpc MicDown(MicDownRequest) returns (MicDownResponse);
rpc ChangeMicSeat(ChangeMicSeatRequest) returns (ChangeMicSeatResponse);
rpc ConfirmMicPublishing(ConfirmMicPublishingRequest) returns (ConfirmMicPublishingResponse);
rpc SetMicMute(SetMicMuteRequest) returns (SetMicMuteResponse);
rpc ApplyRTCEvent(ApplyRTCEventRequest) returns (ApplyRTCEventResponse);
rpc SetMicSeatLock(SetMicSeatLockRequest) returns (SetMicSeatLockResponse);
rpc SetChatEnabled(SetChatEnabledRequest) returns (SetChatEnabledResponse);
rpc SetRoomPassword(SetRoomPasswordRequest) returns (SetRoomPasswordResponse);
rpc SetRoomAdmin(SetRoomAdminRequest) returns (SetRoomAdminResponse);
rpc MuteUser(MuteUserRequest) returns (MuteUserResponse);
rpc KickUser(KickUserRequest) returns (KickUserResponse);
rpc UnbanUser(UnbanUserRequest) returns (UnbanUserResponse);
rpc SystemEvictUser(SystemEvictUserRequest) returns (SystemEvictUserResponse);
rpc SendGift(SendGiftRequest) returns (SendGiftResponse);
rpc FollowRoom(FollowRoomRequest) returns (FollowRoomResponse);
rpc UnfollowRoom(UnfollowRoomRequest) returns (UnfollowRoomResponse);
}
// RoomGuardService 提供给腾讯云 IM 回调或 gateway 做实时守卫查询。
service RoomGuardService {
rpc CheckSpeakPermission(CheckSpeakPermissionRequest) returns (CheckSpeakPermissionResponse);
rpc VerifyRoomPresence(VerifyRoomPresenceRequest) returns (VerifyRoomPresenceResponse);
}
// RoomQueryService 承载不会改变 Room Cell 状态的读模型查询。
service RoomQueryService {
rpc AdminListRooms(AdminListRoomsRequest) returns (AdminListRoomsResponse);
rpc AdminGetRoom(AdminGetRoomRequest) returns (AdminGetRoomResponse);
rpc AdminGetRoomTreasureConfig(AdminGetRoomTreasureConfigRequest) returns (AdminGetRoomTreasureConfigResponse);
rpc AdminGetRoomSeatConfig(AdminGetRoomSeatConfigRequest) returns (AdminGetRoomSeatConfigResponse);
rpc AdminListRoomPins(AdminListRoomPinsRequest) returns (AdminListRoomPinsResponse);
rpc ListRooms(ListRoomsRequest) returns (ListRoomsResponse);
rpc ListRoomFeeds(ListRoomFeedsRequest) returns (ListRoomsResponse);
rpc ListRoomGiftLeaderboard(ListRoomGiftLeaderboardRequest) returns (ListRoomGiftLeaderboardResponse);
rpc GetMyRoom(GetMyRoomRequest) returns (GetMyRoomResponse);
rpc GetCurrentRoom(GetCurrentRoomRequest) returns (GetCurrentRoomResponse);
rpc GetRoomSnapshot(GetRoomSnapshotRequest) returns (GetRoomSnapshotResponse);
rpc ListRoomBackgrounds(ListRoomBackgroundsRequest) returns (ListRoomBackgroundsResponse);
rpc GetRoomTreasure(GetRoomTreasureRequest) returns (GetRoomTreasureResponse);
rpc ListRoomOnlineUsers(ListRoomOnlineUsersRequest) returns (ListRoomOnlineUsersResponse);
rpc ListRoomBannedUsers(ListRoomBannedUsersRequest) returns (ListRoomBannedUsersResponse);
}