diff --git a/api/proto/room/v1/room.pb.go b/api/proto/room/v1/room.pb.go index 12a43ea7..4fb41d13 100644 --- a/api/proto/room/v1/room.pb.go +++ b/api/proto/room/v1/room.pb.go @@ -6531,6 +6531,75 @@ func (x *ListRoomFeedsRequest) GetRelatedUsers() []*RoomFeedRelatedUser { return nil } +// ListRoomGiftLeaderboardRequest 查询当前 UTC 周期内的房间金币消耗榜。 +type ListRoomGiftLeaderboardRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Meta *RequestMeta `protobuf:"bytes,1,opt,name=meta,proto3" json:"meta,omitempty"` + Period string `protobuf:"bytes,2,opt,name=period,proto3" json:"period,omitempty"` + Page int32 `protobuf:"varint,3,opt,name=page,proto3" json:"page,omitempty"` + PageSize int32 `protobuf:"varint,4,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRoomGiftLeaderboardRequest) Reset() { + *x = ListRoomGiftLeaderboardRequest{} + mi := &file_proto_room_v1_room_proto_msgTypes[88] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRoomGiftLeaderboardRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRoomGiftLeaderboardRequest) ProtoMessage() {} + +func (x *ListRoomGiftLeaderboardRequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_room_v1_room_proto_msgTypes[88] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRoomGiftLeaderboardRequest.ProtoReflect.Descriptor instead. +func (*ListRoomGiftLeaderboardRequest) Descriptor() ([]byte, []int) { + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{88} +} + +func (x *ListRoomGiftLeaderboardRequest) GetMeta() *RequestMeta { + if x != nil { + return x.Meta + } + return nil +} + +func (x *ListRoomGiftLeaderboardRequest) GetPeriod() string { + if x != nil { + return x.Period + } + return "" +} + +func (x *ListRoomGiftLeaderboardRequest) GetPage() int32 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *ListRoomGiftLeaderboardRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + // RoomFeedRelatedUser 是 Mine 关系房间流的排序输入,不让 room-service 持有好友/关注事实。 type RoomFeedRelatedUser struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -6542,7 +6611,7 @@ type RoomFeedRelatedUser struct { func (x *RoomFeedRelatedUser) Reset() { *x = RoomFeedRelatedUser{} - mi := &file_proto_room_v1_room_proto_msgTypes[88] + mi := &file_proto_room_v1_room_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6554,7 +6623,7 @@ func (x *RoomFeedRelatedUser) String() string { func (*RoomFeedRelatedUser) ProtoMessage() {} func (x *RoomFeedRelatedUser) ProtoReflect() protoreflect.Message { - mi := &file_proto_room_v1_room_proto_msgTypes[88] + mi := &file_proto_room_v1_room_proto_msgTypes[89] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6567,7 +6636,7 @@ func (x *RoomFeedRelatedUser) ProtoReflect() protoreflect.Message { // Deprecated: Use RoomFeedRelatedUser.ProtoReflect.Descriptor instead. func (*RoomFeedRelatedUser) Descriptor() ([]byte, []int) { - return file_proto_room_v1_room_proto_rawDescGZIP(), []int{88} + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{89} } func (x *RoomFeedRelatedUser) GetUserId() int64 { @@ -6607,7 +6676,7 @@ type RoomListItem struct { func (x *RoomListItem) Reset() { *x = RoomListItem{} - mi := &file_proto_room_v1_room_proto_msgTypes[89] + mi := &file_proto_room_v1_room_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6619,7 +6688,7 @@ func (x *RoomListItem) String() string { func (*RoomListItem) ProtoMessage() {} func (x *RoomListItem) ProtoReflect() protoreflect.Message { - mi := &file_proto_room_v1_room_proto_msgTypes[89] + mi := &file_proto_room_v1_room_proto_msgTypes[90] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6632,7 +6701,7 @@ func (x *RoomListItem) ProtoReflect() protoreflect.Message { // Deprecated: Use RoomListItem.ProtoReflect.Descriptor instead. func (*RoomListItem) Descriptor() ([]byte, []int) { - return file_proto_room_v1_room_proto_rawDescGZIP(), []int{89} + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{90} } func (x *RoomListItem) GetRoomId() string { @@ -6744,7 +6813,7 @@ type ListRoomsResponse struct { func (x *ListRoomsResponse) Reset() { *x = ListRoomsResponse{} - mi := &file_proto_room_v1_room_proto_msgTypes[90] + mi := &file_proto_room_v1_room_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6756,7 +6825,7 @@ func (x *ListRoomsResponse) String() string { func (*ListRoomsResponse) ProtoMessage() {} func (x *ListRoomsResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_room_v1_room_proto_msgTypes[90] + mi := &file_proto_room_v1_room_proto_msgTypes[91] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6769,7 +6838,7 @@ func (x *ListRoomsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRoomsResponse.ProtoReflect.Descriptor instead. func (*ListRoomsResponse) Descriptor() ([]byte, []int) { - return file_proto_room_v1_room_proto_rawDescGZIP(), []int{90} + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{91} } func (x *ListRoomsResponse) GetRooms() []*RoomListItem { @@ -6786,6 +6855,160 @@ func (x *ListRoomsResponse) GetNextCursor() string { return "" } +// RoomGiftLeaderboardItem 是跨房间金币消耗榜卡片;score 只表达该周期房间礼物金币消耗。 +type RoomGiftLeaderboardItem struct { + state protoimpl.MessageState `protogen:"open.v1"` + Rank int64 `protobuf:"varint,1,opt,name=rank,proto3" json:"rank,omitempty"` + RoomId string `protobuf:"bytes,2,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"` + CoinSpent int64 `protobuf:"varint,3,opt,name=coin_spent,json=coinSpent,proto3" json:"coin_spent,omitempty"` + Room *RoomListItem `protobuf:"bytes,4,opt,name=room,proto3" json:"room,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RoomGiftLeaderboardItem) Reset() { + *x = RoomGiftLeaderboardItem{} + mi := &file_proto_room_v1_room_proto_msgTypes[92] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RoomGiftLeaderboardItem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoomGiftLeaderboardItem) ProtoMessage() {} + +func (x *RoomGiftLeaderboardItem) ProtoReflect() protoreflect.Message { + mi := &file_proto_room_v1_room_proto_msgTypes[92] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RoomGiftLeaderboardItem.ProtoReflect.Descriptor instead. +func (*RoomGiftLeaderboardItem) Descriptor() ([]byte, []int) { + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{92} +} + +func (x *RoomGiftLeaderboardItem) GetRank() int64 { + if x != nil { + return x.Rank + } + return 0 +} + +func (x *RoomGiftLeaderboardItem) GetRoomId() string { + if x != nil { + return x.RoomId + } + return "" +} + +func (x *RoomGiftLeaderboardItem) GetCoinSpent() int64 { + if x != nil { + return x.CoinSpent + } + return 0 +} + +func (x *RoomGiftLeaderboardItem) GetRoom() *RoomListItem { + if x != nil { + return x.Room + } + return nil +} + +// ListRoomGiftLeaderboardResponse 返回当前 UTC 周期房间金币榜。 +type ListRoomGiftLeaderboardResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*RoomGiftLeaderboardItem `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + Period string `protobuf:"bytes,3,opt,name=period,proto3" json:"period,omitempty"` + StartAtMs int64 `protobuf:"varint,4,opt,name=start_at_ms,json=startAtMs,proto3" json:"start_at_ms,omitempty"` + EndAtMs int64 `protobuf:"varint,5,opt,name=end_at_ms,json=endAtMs,proto3" json:"end_at_ms,omitempty"` + ServerTimeMs int64 `protobuf:"varint,6,opt,name=server_time_ms,json=serverTimeMs,proto3" json:"server_time_ms,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListRoomGiftLeaderboardResponse) Reset() { + *x = ListRoomGiftLeaderboardResponse{} + mi := &file_proto_room_v1_room_proto_msgTypes[93] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListRoomGiftLeaderboardResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRoomGiftLeaderboardResponse) ProtoMessage() {} + +func (x *ListRoomGiftLeaderboardResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_room_v1_room_proto_msgTypes[93] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRoomGiftLeaderboardResponse.ProtoReflect.Descriptor instead. +func (*ListRoomGiftLeaderboardResponse) Descriptor() ([]byte, []int) { + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{93} +} + +func (x *ListRoomGiftLeaderboardResponse) GetItems() []*RoomGiftLeaderboardItem { + if x != nil { + return x.Items + } + return nil +} + +func (x *ListRoomGiftLeaderboardResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +func (x *ListRoomGiftLeaderboardResponse) GetPeriod() string { + if x != nil { + return x.Period + } + return "" +} + +func (x *ListRoomGiftLeaderboardResponse) GetStartAtMs() int64 { + if x != nil { + return x.StartAtMs + } + return 0 +} + +func (x *ListRoomGiftLeaderboardResponse) GetEndAtMs() int64 { + if x != nil { + return x.EndAtMs + } + return 0 +} + +func (x *ListRoomGiftLeaderboardResponse) GetServerTimeMs() int64 { + if x != nil { + return x.ServerTimeMs + } + return 0 +} + // GetMyRoomRequest 查询当前用户自己创建的房间。 // 该查询必须由 gateway 写入鉴权后的 owner_user_id,不能从客户端接收用户 ID。 type GetMyRoomRequest struct { @@ -6798,7 +7021,7 @@ type GetMyRoomRequest struct { func (x *GetMyRoomRequest) Reset() { *x = GetMyRoomRequest{} - mi := &file_proto_room_v1_room_proto_msgTypes[91] + mi := &file_proto_room_v1_room_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6810,7 +7033,7 @@ func (x *GetMyRoomRequest) String() string { func (*GetMyRoomRequest) ProtoMessage() {} func (x *GetMyRoomRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_room_v1_room_proto_msgTypes[91] + mi := &file_proto_room_v1_room_proto_msgTypes[94] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6823,7 +7046,7 @@ func (x *GetMyRoomRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMyRoomRequest.ProtoReflect.Descriptor instead. func (*GetMyRoomRequest) Descriptor() ([]byte, []int) { - return file_proto_room_v1_room_proto_rawDescGZIP(), []int{91} + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{94} } func (x *GetMyRoomRequest) GetMeta() *RequestMeta { @@ -6853,7 +7076,7 @@ type GetMyRoomResponse struct { func (x *GetMyRoomResponse) Reset() { *x = GetMyRoomResponse{} - mi := &file_proto_room_v1_room_proto_msgTypes[92] + mi := &file_proto_room_v1_room_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6865,7 +7088,7 @@ func (x *GetMyRoomResponse) String() string { func (*GetMyRoomResponse) ProtoMessage() {} func (x *GetMyRoomResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_room_v1_room_proto_msgTypes[92] + mi := &file_proto_room_v1_room_proto_msgTypes[95] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6878,7 +7101,7 @@ func (x *GetMyRoomResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMyRoomResponse.ProtoReflect.Descriptor instead. func (*GetMyRoomResponse) Descriptor() ([]byte, []int) { - return file_proto_room_v1_room_proto_rawDescGZIP(), []int{92} + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{95} } func (x *GetMyRoomResponse) GetHasRoom() bool { @@ -6914,7 +7137,7 @@ type GetCurrentRoomRequest struct { func (x *GetCurrentRoomRequest) Reset() { *x = GetCurrentRoomRequest{} - mi := &file_proto_room_v1_room_proto_msgTypes[93] + mi := &file_proto_room_v1_room_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6926,7 +7149,7 @@ func (x *GetCurrentRoomRequest) String() string { func (*GetCurrentRoomRequest) ProtoMessage() {} func (x *GetCurrentRoomRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_room_v1_room_proto_msgTypes[93] + mi := &file_proto_room_v1_room_proto_msgTypes[96] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6939,7 +7162,7 @@ func (x *GetCurrentRoomRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCurrentRoomRequest.ProtoReflect.Descriptor instead. func (*GetCurrentRoomRequest) Descriptor() ([]byte, []int) { - return file_proto_room_v1_room_proto_rawDescGZIP(), []int{93} + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{96} } func (x *GetCurrentRoomRequest) GetMeta() *RequestMeta { @@ -6975,7 +7198,7 @@ type GetCurrentRoomResponse struct { func (x *GetCurrentRoomResponse) Reset() { *x = GetCurrentRoomResponse{} - mi := &file_proto_room_v1_room_proto_msgTypes[94] + mi := &file_proto_room_v1_room_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6987,7 +7210,7 @@ func (x *GetCurrentRoomResponse) String() string { func (*GetCurrentRoomResponse) ProtoMessage() {} func (x *GetCurrentRoomResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_room_v1_room_proto_msgTypes[94] + mi := &file_proto_room_v1_room_proto_msgTypes[97] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7000,7 +7223,7 @@ func (x *GetCurrentRoomResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetCurrentRoomResponse.ProtoReflect.Descriptor instead. func (*GetCurrentRoomResponse) Descriptor() ([]byte, []int) { - return file_proto_room_v1_room_proto_rawDescGZIP(), []int{94} + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{97} } func (x *GetCurrentRoomResponse) GetHasCurrentRoom() bool { @@ -7079,7 +7302,7 @@ type GetRoomSnapshotRequest struct { func (x *GetRoomSnapshotRequest) Reset() { *x = GetRoomSnapshotRequest{} - mi := &file_proto_room_v1_room_proto_msgTypes[95] + mi := &file_proto_room_v1_room_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7091,7 +7314,7 @@ func (x *GetRoomSnapshotRequest) String() string { func (*GetRoomSnapshotRequest) ProtoMessage() {} func (x *GetRoomSnapshotRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_room_v1_room_proto_msgTypes[95] + mi := &file_proto_room_v1_room_proto_msgTypes[98] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7104,7 +7327,7 @@ func (x *GetRoomSnapshotRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoomSnapshotRequest.ProtoReflect.Descriptor instead. func (*GetRoomSnapshotRequest) Descriptor() ([]byte, []int) { - return file_proto_room_v1_room_proto_rawDescGZIP(), []int{95} + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{98} } func (x *GetRoomSnapshotRequest) GetMeta() *RequestMeta { @@ -7141,7 +7364,7 @@ type GetRoomSnapshotResponse struct { func (x *GetRoomSnapshotResponse) Reset() { *x = GetRoomSnapshotResponse{} - mi := &file_proto_room_v1_room_proto_msgTypes[96] + mi := &file_proto_room_v1_room_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7153,7 +7376,7 @@ func (x *GetRoomSnapshotResponse) String() string { func (*GetRoomSnapshotResponse) ProtoMessage() {} func (x *GetRoomSnapshotResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_room_v1_room_proto_msgTypes[96] + mi := &file_proto_room_v1_room_proto_msgTypes[99] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7166,7 +7389,7 @@ func (x *GetRoomSnapshotResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoomSnapshotResponse.ProtoReflect.Descriptor instead. func (*GetRoomSnapshotResponse) Descriptor() ([]byte, []int) { - return file_proto_room_v1_room_proto_rawDescGZIP(), []int{96} + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{99} } func (x *GetRoomSnapshotResponse) GetRoom() *RoomSnapshot { @@ -7203,7 +7426,7 @@ type GetRoomTreasureRequest struct { func (x *GetRoomTreasureRequest) Reset() { *x = GetRoomTreasureRequest{} - mi := &file_proto_room_v1_room_proto_msgTypes[97] + mi := &file_proto_room_v1_room_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7215,7 +7438,7 @@ func (x *GetRoomTreasureRequest) String() string { func (*GetRoomTreasureRequest) ProtoMessage() {} func (x *GetRoomTreasureRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_room_v1_room_proto_msgTypes[97] + mi := &file_proto_room_v1_room_proto_msgTypes[100] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7228,7 +7451,7 @@ func (x *GetRoomTreasureRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoomTreasureRequest.ProtoReflect.Descriptor instead. func (*GetRoomTreasureRequest) Descriptor() ([]byte, []int) { - return file_proto_room_v1_room_proto_rawDescGZIP(), []int{97} + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{100} } func (x *GetRoomTreasureRequest) GetMeta() *RequestMeta { @@ -7262,7 +7485,7 @@ type GetRoomTreasureResponse struct { func (x *GetRoomTreasureResponse) Reset() { *x = GetRoomTreasureResponse{} - mi := &file_proto_room_v1_room_proto_msgTypes[98] + mi := &file_proto_room_v1_room_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7274,7 +7497,7 @@ func (x *GetRoomTreasureResponse) String() string { func (*GetRoomTreasureResponse) ProtoMessage() {} func (x *GetRoomTreasureResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_room_v1_room_proto_msgTypes[98] + mi := &file_proto_room_v1_room_proto_msgTypes[101] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7287,7 +7510,7 @@ func (x *GetRoomTreasureResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRoomTreasureResponse.ProtoReflect.Descriptor instead. func (*GetRoomTreasureResponse) Descriptor() ([]byte, []int) { - return file_proto_room_v1_room_proto_rawDescGZIP(), []int{98} + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{101} } func (x *GetRoomTreasureResponse) GetTreasure() *RoomTreasureInfo { @@ -7318,7 +7541,7 @@ type ListRoomOnlineUsersRequest struct { func (x *ListRoomOnlineUsersRequest) Reset() { *x = ListRoomOnlineUsersRequest{} - mi := &file_proto_room_v1_room_proto_msgTypes[99] + mi := &file_proto_room_v1_room_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7330,7 +7553,7 @@ func (x *ListRoomOnlineUsersRequest) String() string { func (*ListRoomOnlineUsersRequest) ProtoMessage() {} func (x *ListRoomOnlineUsersRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_room_v1_room_proto_msgTypes[99] + mi := &file_proto_room_v1_room_proto_msgTypes[102] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7343,7 +7566,7 @@ func (x *ListRoomOnlineUsersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRoomOnlineUsersRequest.ProtoReflect.Descriptor instead. func (*ListRoomOnlineUsersRequest) Descriptor() ([]byte, []int) { - return file_proto_room_v1_room_proto_rawDescGZIP(), []int{99} + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{102} } func (x *ListRoomOnlineUsersRequest) GetMeta() *RequestMeta { @@ -7394,7 +7617,7 @@ type ListRoomOnlineUsersResponse struct { func (x *ListRoomOnlineUsersResponse) Reset() { *x = ListRoomOnlineUsersResponse{} - mi := &file_proto_room_v1_room_proto_msgTypes[100] + mi := &file_proto_room_v1_room_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7406,7 +7629,7 @@ func (x *ListRoomOnlineUsersResponse) String() string { func (*ListRoomOnlineUsersResponse) ProtoMessage() {} func (x *ListRoomOnlineUsersResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_room_v1_room_proto_msgTypes[100] + mi := &file_proto_room_v1_room_proto_msgTypes[103] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7419,7 +7642,7 @@ func (x *ListRoomOnlineUsersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRoomOnlineUsersResponse.ProtoReflect.Descriptor instead. func (*ListRoomOnlineUsersResponse) Descriptor() ([]byte, []int) { - return file_proto_room_v1_room_proto_rawDescGZIP(), []int{100} + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{103} } func (x *ListRoomOnlineUsersResponse) GetUsers() []*RoomUser { @@ -7470,7 +7693,7 @@ type FollowRoomRequest struct { func (x *FollowRoomRequest) Reset() { *x = FollowRoomRequest{} - mi := &file_proto_room_v1_room_proto_msgTypes[101] + mi := &file_proto_room_v1_room_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7482,7 +7705,7 @@ func (x *FollowRoomRequest) String() string { func (*FollowRoomRequest) ProtoMessage() {} func (x *FollowRoomRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_room_v1_room_proto_msgTypes[101] + mi := &file_proto_room_v1_room_proto_msgTypes[104] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7495,7 +7718,7 @@ func (x *FollowRoomRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FollowRoomRequest.ProtoReflect.Descriptor instead. func (*FollowRoomRequest) Descriptor() ([]byte, []int) { - return file_proto_room_v1_room_proto_rawDescGZIP(), []int{101} + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{104} } func (x *FollowRoomRequest) GetMeta() *RequestMeta { @@ -7531,7 +7754,7 @@ type FollowRoomResponse struct { func (x *FollowRoomResponse) Reset() { *x = FollowRoomResponse{} - mi := &file_proto_room_v1_room_proto_msgTypes[102] + mi := &file_proto_room_v1_room_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7543,7 +7766,7 @@ func (x *FollowRoomResponse) String() string { func (*FollowRoomResponse) ProtoMessage() {} func (x *FollowRoomResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_room_v1_room_proto_msgTypes[102] + mi := &file_proto_room_v1_room_proto_msgTypes[105] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7556,7 +7779,7 @@ func (x *FollowRoomResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use FollowRoomResponse.ProtoReflect.Descriptor instead. func (*FollowRoomResponse) Descriptor() ([]byte, []int) { - return file_proto_room_v1_room_proto_rawDescGZIP(), []int{102} + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{105} } func (x *FollowRoomResponse) GetRoomId() string { @@ -7599,7 +7822,7 @@ type UnfollowRoomRequest struct { func (x *UnfollowRoomRequest) Reset() { *x = UnfollowRoomRequest{} - mi := &file_proto_room_v1_room_proto_msgTypes[103] + mi := &file_proto_room_v1_room_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7611,7 +7834,7 @@ func (x *UnfollowRoomRequest) String() string { func (*UnfollowRoomRequest) ProtoMessage() {} func (x *UnfollowRoomRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_room_v1_room_proto_msgTypes[103] + mi := &file_proto_room_v1_room_proto_msgTypes[106] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7624,7 +7847,7 @@ func (x *UnfollowRoomRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnfollowRoomRequest.ProtoReflect.Descriptor instead. func (*UnfollowRoomRequest) Descriptor() ([]byte, []int) { - return file_proto_room_v1_room_proto_rawDescGZIP(), []int{103} + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{106} } func (x *UnfollowRoomRequest) GetMeta() *RequestMeta { @@ -7659,7 +7882,7 @@ type UnfollowRoomResponse struct { func (x *UnfollowRoomResponse) Reset() { *x = UnfollowRoomResponse{} - mi := &file_proto_room_v1_room_proto_msgTypes[104] + mi := &file_proto_room_v1_room_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7671,7 +7894,7 @@ func (x *UnfollowRoomResponse) String() string { func (*UnfollowRoomResponse) ProtoMessage() {} func (x *UnfollowRoomResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_room_v1_room_proto_msgTypes[104] + mi := &file_proto_room_v1_room_proto_msgTypes[107] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7684,7 +7907,7 @@ func (x *UnfollowRoomResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnfollowRoomResponse.ProtoReflect.Descriptor instead. func (*UnfollowRoomResponse) Descriptor() ([]byte, []int) { - return file_proto_room_v1_room_proto_rawDescGZIP(), []int{104} + return file_proto_room_v1_room_proto_rawDescGZIP(), []int{107} } func (x *UnfollowRoomResponse) GetRoomId() string { @@ -8259,7 +8482,12 @@ const file_proto_room_v1_room_proto_rawDesc = "" + "\x06cursor\x18\x05 \x01(\tR\x06cursor\x12\x14\n" + "\x05limit\x18\x06 \x01(\x05R\x05limit\x12\x14\n" + "\x05query\x18\a \x01(\tR\x05query\x12G\n" + - "\rrelated_users\x18\b \x03(\v2\".hyapp.room.v1.RoomFeedRelatedUserR\frelatedUsers\"c\n" + + "\rrelated_users\x18\b \x03(\v2\".hyapp.room.v1.RoomFeedRelatedUserR\frelatedUsers\"\x99\x01\n" + + "\x1eListRoomGiftLeaderboardRequest\x12.\n" + + "\x04meta\x18\x01 \x01(\v2\x1a.hyapp.room.v1.RequestMetaR\x04meta\x12\x16\n" + + "\x06period\x18\x02 \x01(\tR\x06period\x12\x12\n" + + "\x04page\x18\x03 \x01(\x05R\x04page\x12\x1b\n" + + "\tpage_size\x18\x04 \x01(\x05R\bpageSize\"c\n" + "\x13RoomFeedRelatedUser\x12\x17\n" + "\auser_id\x18\x01 \x01(\x03R\x06userId\x123\n" + "\x16relation_updated_at_ms\x18\x02 \x01(\x03R\x13relationUpdatedAtMs\"\xb3\x03\n" + @@ -8283,7 +8511,20 @@ const file_proto_room_v1_room_proto_rawDesc = "" + "\x11ListRoomsResponse\x121\n" + "\x05rooms\x18\x01 \x03(\v2\x1b.hyapp.room.v1.RoomListItemR\x05rooms\x12\x1f\n" + "\vnext_cursor\x18\x02 \x01(\tR\n" + - "nextCursor\"f\n" + + "nextCursor\"\x96\x01\n" + + "\x17RoomGiftLeaderboardItem\x12\x12\n" + + "\x04rank\x18\x01 \x01(\x03R\x04rank\x12\x17\n" + + "\aroom_id\x18\x02 \x01(\tR\x06roomId\x12\x1d\n" + + "\n" + + "coin_spent\x18\x03 \x01(\x03R\tcoinSpent\x12/\n" + + "\x04room\x18\x04 \x01(\v2\x1b.hyapp.room.v1.RoomListItemR\x04room\"\xef\x01\n" + + "\x1fListRoomGiftLeaderboardResponse\x12<\n" + + "\x05items\x18\x01 \x03(\v2&.hyapp.room.v1.RoomGiftLeaderboardItemR\x05items\x12\x14\n" + + "\x05total\x18\x02 \x01(\x03R\x05total\x12\x16\n" + + "\x06period\x18\x03 \x01(\tR\x06period\x12\x1e\n" + + "\vstart_at_ms\x18\x04 \x01(\x03R\tstartAtMs\x12\x1a\n" + + "\tend_at_ms\x18\x05 \x01(\x03R\aendAtMs\x12$\n" + + "\x0eserver_time_ms\x18\x06 \x01(\x03R\fserverTimeMs\"f\n" + "\x10GetMyRoomRequest\x12.\n" + "\x04meta\x18\x01 \x01(\v2\x1a.hyapp.room.v1.RequestMetaR\x04meta\x12\"\n" + "\rowner_user_id\x18\x02 \x01(\x03R\vownerUserId\"\x85\x01\n" + @@ -8384,7 +8625,8 @@ const file_proto_room_v1_room_proto_rawDesc = "" + "\fUnfollowRoom\x12\".hyapp.room.v1.UnfollowRoomRequest\x1a#.hyapp.room.v1.UnfollowRoomResponse2\xee\x01\n" + "\x10RoomGuardService\x12o\n" + "\x14CheckSpeakPermission\x12*.hyapp.room.v1.CheckSpeakPermissionRequest\x1a+.hyapp.room.v1.CheckSpeakPermissionResponse\x12i\n" + - "\x12VerifyRoomPresence\x12(.hyapp.room.v1.VerifyRoomPresenceRequest\x1a).hyapp.room.v1.VerifyRoomPresenceResponse2\xb6\t\n" + + "\x12VerifyRoomPresence\x12(.hyapp.room.v1.VerifyRoomPresenceRequest\x1a).hyapp.room.v1.VerifyRoomPresenceResponse2\xb0\n" + + "\n" + "\x10RoomQueryService\x12]\n" + "\x0eAdminListRooms\x12$.hyapp.room.v1.AdminListRoomsRequest\x1a%.hyapp.room.v1.AdminListRoomsResponse\x12W\n" + "\fAdminGetRoom\x12\".hyapp.room.v1.AdminGetRoomRequest\x1a#.hyapp.room.v1.AdminGetRoomResponse\x12\x81\x01\n" + @@ -8392,7 +8634,8 @@ const file_proto_room_v1_room_proto_rawDesc = "" + "\x16AdminGetRoomSeatConfig\x12,.hyapp.room.v1.AdminGetRoomSeatConfigRequest\x1a-.hyapp.room.v1.AdminGetRoomSeatConfigResponse\x12f\n" + "\x11AdminListRoomPins\x12'.hyapp.room.v1.AdminListRoomPinsRequest\x1a(.hyapp.room.v1.AdminListRoomPinsResponse\x12N\n" + "\tListRooms\x12\x1f.hyapp.room.v1.ListRoomsRequest\x1a .hyapp.room.v1.ListRoomsResponse\x12V\n" + - "\rListRoomFeeds\x12#.hyapp.room.v1.ListRoomFeedsRequest\x1a .hyapp.room.v1.ListRoomsResponse\x12N\n" + + "\rListRoomFeeds\x12#.hyapp.room.v1.ListRoomFeedsRequest\x1a .hyapp.room.v1.ListRoomsResponse\x12x\n" + + "\x17ListRoomGiftLeaderboard\x12-.hyapp.room.v1.ListRoomGiftLeaderboardRequest\x1a..hyapp.room.v1.ListRoomGiftLeaderboardResponse\x12N\n" + "\tGetMyRoom\x12\x1f.hyapp.room.v1.GetMyRoomRequest\x1a .hyapp.room.v1.GetMyRoomResponse\x12]\n" + "\x0eGetCurrentRoom\x12$.hyapp.room.v1.GetCurrentRoomRequest\x1a%.hyapp.room.v1.GetCurrentRoomResponse\x12`\n" + "\x0fGetRoomSnapshot\x12%.hyapp.room.v1.GetRoomSnapshotRequest\x1a&.hyapp.room.v1.GetRoomSnapshotResponse\x12`\n" + @@ -8411,7 +8654,7 @@ func file_proto_room_v1_room_proto_rawDescGZIP() []byte { return file_proto_room_v1_room_proto_rawDescData } -var file_proto_room_v1_room_proto_msgTypes = make([]protoimpl.MessageInfo, 106) +var file_proto_room_v1_room_proto_msgTypes = make([]protoimpl.MessageInfo, 109) var file_proto_room_v1_room_proto_goTypes = []any{ (*RequestMeta)(nil), // 0: hyapp.room.v1.RequestMeta (*CommandResult)(nil), // 1: hyapp.room.v1.CommandResult @@ -8501,24 +8744,27 @@ var file_proto_room_v1_room_proto_goTypes = []any{ (*VerifyRoomPresenceResponse)(nil), // 85: hyapp.room.v1.VerifyRoomPresenceResponse (*ListRoomsRequest)(nil), // 86: hyapp.room.v1.ListRoomsRequest (*ListRoomFeedsRequest)(nil), // 87: hyapp.room.v1.ListRoomFeedsRequest - (*RoomFeedRelatedUser)(nil), // 88: hyapp.room.v1.RoomFeedRelatedUser - (*RoomListItem)(nil), // 89: hyapp.room.v1.RoomListItem - (*ListRoomsResponse)(nil), // 90: hyapp.room.v1.ListRoomsResponse - (*GetMyRoomRequest)(nil), // 91: hyapp.room.v1.GetMyRoomRequest - (*GetMyRoomResponse)(nil), // 92: hyapp.room.v1.GetMyRoomResponse - (*GetCurrentRoomRequest)(nil), // 93: hyapp.room.v1.GetCurrentRoomRequest - (*GetCurrentRoomResponse)(nil), // 94: hyapp.room.v1.GetCurrentRoomResponse - (*GetRoomSnapshotRequest)(nil), // 95: hyapp.room.v1.GetRoomSnapshotRequest - (*GetRoomSnapshotResponse)(nil), // 96: hyapp.room.v1.GetRoomSnapshotResponse - (*GetRoomTreasureRequest)(nil), // 97: hyapp.room.v1.GetRoomTreasureRequest - (*GetRoomTreasureResponse)(nil), // 98: hyapp.room.v1.GetRoomTreasureResponse - (*ListRoomOnlineUsersRequest)(nil), // 99: hyapp.room.v1.ListRoomOnlineUsersRequest - (*ListRoomOnlineUsersResponse)(nil), // 100: hyapp.room.v1.ListRoomOnlineUsersResponse - (*FollowRoomRequest)(nil), // 101: hyapp.room.v1.FollowRoomRequest - (*FollowRoomResponse)(nil), // 102: hyapp.room.v1.FollowRoomResponse - (*UnfollowRoomRequest)(nil), // 103: hyapp.room.v1.UnfollowRoomRequest - (*UnfollowRoomResponse)(nil), // 104: hyapp.room.v1.UnfollowRoomResponse - nil, // 105: hyapp.room.v1.RoomSnapshot.RoomExtEntry + (*ListRoomGiftLeaderboardRequest)(nil), // 88: hyapp.room.v1.ListRoomGiftLeaderboardRequest + (*RoomFeedRelatedUser)(nil), // 89: hyapp.room.v1.RoomFeedRelatedUser + (*RoomListItem)(nil), // 90: hyapp.room.v1.RoomListItem + (*ListRoomsResponse)(nil), // 91: hyapp.room.v1.ListRoomsResponse + (*RoomGiftLeaderboardItem)(nil), // 92: hyapp.room.v1.RoomGiftLeaderboardItem + (*ListRoomGiftLeaderboardResponse)(nil), // 93: hyapp.room.v1.ListRoomGiftLeaderboardResponse + (*GetMyRoomRequest)(nil), // 94: hyapp.room.v1.GetMyRoomRequest + (*GetMyRoomResponse)(nil), // 95: hyapp.room.v1.GetMyRoomResponse + (*GetCurrentRoomRequest)(nil), // 96: hyapp.room.v1.GetCurrentRoomRequest + (*GetCurrentRoomResponse)(nil), // 97: hyapp.room.v1.GetCurrentRoomResponse + (*GetRoomSnapshotRequest)(nil), // 98: hyapp.room.v1.GetRoomSnapshotRequest + (*GetRoomSnapshotResponse)(nil), // 99: hyapp.room.v1.GetRoomSnapshotResponse + (*GetRoomTreasureRequest)(nil), // 100: hyapp.room.v1.GetRoomTreasureRequest + (*GetRoomTreasureResponse)(nil), // 101: hyapp.room.v1.GetRoomTreasureResponse + (*ListRoomOnlineUsersRequest)(nil), // 102: hyapp.room.v1.ListRoomOnlineUsersRequest + (*ListRoomOnlineUsersResponse)(nil), // 103: hyapp.room.v1.ListRoomOnlineUsersResponse + (*FollowRoomRequest)(nil), // 104: hyapp.room.v1.FollowRoomRequest + (*FollowRoomResponse)(nil), // 105: hyapp.room.v1.FollowRoomResponse + (*UnfollowRoomRequest)(nil), // 106: hyapp.room.v1.UnfollowRoomRequest + (*UnfollowRoomResponse)(nil), // 107: hyapp.room.v1.UnfollowRoomResponse + nil, // 108: hyapp.room.v1.RoomSnapshot.RoomExtEntry } var file_proto_room_v1_room_proto_depIdxs = []int32{ 6, // 0: hyapp.room.v1.RoomTreasureLevel.in_room_rewards:type_name -> hyapp.room.v1.RoomTreasureRewardItem @@ -8548,7 +8794,7 @@ var file_proto_room_v1_room_proto_depIdxs = []int32{ 3, // 24: hyapp.room.v1.RoomSnapshot.mic_seats:type_name -> hyapp.room.v1.SeatState 2, // 25: hyapp.room.v1.RoomSnapshot.online_users:type_name -> hyapp.room.v1.RoomUser 4, // 26: hyapp.room.v1.RoomSnapshot.gift_rank:type_name -> hyapp.room.v1.RankItem - 105, // 27: hyapp.room.v1.RoomSnapshot.room_ext:type_name -> hyapp.room.v1.RoomSnapshot.RoomExtEntry + 108, // 27: hyapp.room.v1.RoomSnapshot.room_ext:type_name -> hyapp.room.v1.RoomSnapshot.RoomExtEntry 9, // 28: hyapp.room.v1.RoomSnapshot.treasure:type_name -> hyapp.room.v1.RoomTreasureState 0, // 29: hyapp.room.v1.CreateRoomRequest.meta:type_name -> hyapp.room.v1.RequestMeta 1, // 30: hyapp.room.v1.CreateRoomResponse.result:type_name -> hyapp.room.v1.CommandResult @@ -8630,110 +8876,115 @@ var file_proto_room_v1_room_proto_depIdxs = []int32{ 5, // 106: hyapp.room.v1.SendGiftResponse.lucky_gift:type_name -> hyapp.room.v1.LuckyGiftDrawResult 0, // 107: hyapp.room.v1.ListRoomsRequest.meta:type_name -> hyapp.room.v1.RequestMeta 0, // 108: hyapp.room.v1.ListRoomFeedsRequest.meta:type_name -> hyapp.room.v1.RequestMeta - 88, // 109: hyapp.room.v1.ListRoomFeedsRequest.related_users:type_name -> hyapp.room.v1.RoomFeedRelatedUser - 89, // 110: hyapp.room.v1.ListRoomsResponse.rooms:type_name -> hyapp.room.v1.RoomListItem - 0, // 111: hyapp.room.v1.GetMyRoomRequest.meta:type_name -> hyapp.room.v1.RequestMeta - 89, // 112: hyapp.room.v1.GetMyRoomResponse.room:type_name -> hyapp.room.v1.RoomListItem - 0, // 113: hyapp.room.v1.GetCurrentRoomRequest.meta:type_name -> hyapp.room.v1.RequestMeta - 0, // 114: hyapp.room.v1.GetRoomSnapshotRequest.meta:type_name -> hyapp.room.v1.RequestMeta - 30, // 115: hyapp.room.v1.GetRoomSnapshotResponse.room:type_name -> hyapp.room.v1.RoomSnapshot - 0, // 116: hyapp.room.v1.GetRoomTreasureRequest.meta:type_name -> hyapp.room.v1.RequestMeta - 10, // 117: hyapp.room.v1.GetRoomTreasureResponse.treasure:type_name -> hyapp.room.v1.RoomTreasureInfo - 0, // 118: hyapp.room.v1.ListRoomOnlineUsersRequest.meta:type_name -> hyapp.room.v1.RequestMeta - 2, // 119: hyapp.room.v1.ListRoomOnlineUsersResponse.users:type_name -> hyapp.room.v1.RoomUser - 0, // 120: hyapp.room.v1.FollowRoomRequest.meta:type_name -> hyapp.room.v1.RequestMeta - 0, // 121: hyapp.room.v1.UnfollowRoomRequest.meta:type_name -> hyapp.room.v1.RequestMeta - 31, // 122: hyapp.room.v1.RoomCommandService.CreateRoom:input_type -> hyapp.room.v1.CreateRoomRequest - 33, // 123: hyapp.room.v1.RoomCommandService.UpdateRoomProfile:input_type -> hyapp.room.v1.UpdateRoomProfileRequest - 35, // 124: hyapp.room.v1.RoomCommandService.JoinRoom:input_type -> hyapp.room.v1.JoinRoomRequest - 37, // 125: hyapp.room.v1.RoomCommandService.RoomHeartbeat:input_type -> hyapp.room.v1.RoomHeartbeatRequest - 39, // 126: hyapp.room.v1.RoomCommandService.LeaveRoom:input_type -> hyapp.room.v1.LeaveRoomRequest - 41, // 127: hyapp.room.v1.RoomCommandService.CloseRoom:input_type -> hyapp.room.v1.CloseRoomRequest - 48, // 128: hyapp.room.v1.RoomCommandService.AdminUpdateRoom:input_type -> hyapp.room.v1.AdminUpdateRoomRequest - 50, // 129: hyapp.room.v1.RoomCommandService.AdminDeleteRoom:input_type -> hyapp.room.v1.AdminDeleteRoomRequest - 15, // 130: hyapp.room.v1.RoomCommandService.AdminUpdateRoomTreasureConfig:input_type -> hyapp.room.v1.AdminUpdateRoomTreasureConfigRequest - 20, // 131: hyapp.room.v1.RoomCommandService.AdminUpdateRoomSeatConfig:input_type -> hyapp.room.v1.AdminUpdateRoomSeatConfigRequest - 26, // 132: hyapp.room.v1.RoomCommandService.AdminCreateRoomPin:input_type -> hyapp.room.v1.AdminCreateRoomPinRequest - 28, // 133: hyapp.room.v1.RoomCommandService.AdminCancelRoomPin:input_type -> hyapp.room.v1.AdminCancelRoomPinRequest - 52, // 134: hyapp.room.v1.RoomCommandService.MicUp:input_type -> hyapp.room.v1.MicUpRequest - 54, // 135: hyapp.room.v1.RoomCommandService.MicDown:input_type -> hyapp.room.v1.MicDownRequest - 56, // 136: hyapp.room.v1.RoomCommandService.ChangeMicSeat:input_type -> hyapp.room.v1.ChangeMicSeatRequest - 58, // 137: hyapp.room.v1.RoomCommandService.ConfirmMicPublishing:input_type -> hyapp.room.v1.ConfirmMicPublishingRequest - 60, // 138: hyapp.room.v1.RoomCommandService.SetMicMute:input_type -> hyapp.room.v1.SetMicMuteRequest - 62, // 139: hyapp.room.v1.RoomCommandService.ApplyRTCEvent:input_type -> hyapp.room.v1.ApplyRTCEventRequest - 64, // 140: hyapp.room.v1.RoomCommandService.SetMicSeatLock:input_type -> hyapp.room.v1.SetMicSeatLockRequest - 66, // 141: hyapp.room.v1.RoomCommandService.SetChatEnabled:input_type -> hyapp.room.v1.SetChatEnabledRequest - 68, // 142: hyapp.room.v1.RoomCommandService.SetRoomPassword:input_type -> hyapp.room.v1.SetRoomPasswordRequest - 70, // 143: hyapp.room.v1.RoomCommandService.SetRoomAdmin:input_type -> hyapp.room.v1.SetRoomAdminRequest - 72, // 144: hyapp.room.v1.RoomCommandService.MuteUser:input_type -> hyapp.room.v1.MuteUserRequest - 74, // 145: hyapp.room.v1.RoomCommandService.KickUser:input_type -> hyapp.room.v1.KickUserRequest - 76, // 146: hyapp.room.v1.RoomCommandService.UnbanUser:input_type -> hyapp.room.v1.UnbanUserRequest - 78, // 147: hyapp.room.v1.RoomCommandService.SystemEvictUser:input_type -> hyapp.room.v1.SystemEvictUserRequest - 80, // 148: hyapp.room.v1.RoomCommandService.SendGift:input_type -> hyapp.room.v1.SendGiftRequest - 101, // 149: hyapp.room.v1.RoomCommandService.FollowRoom:input_type -> hyapp.room.v1.FollowRoomRequest - 103, // 150: hyapp.room.v1.RoomCommandService.UnfollowRoom:input_type -> hyapp.room.v1.UnfollowRoomRequest - 82, // 151: hyapp.room.v1.RoomGuardService.CheckSpeakPermission:input_type -> hyapp.room.v1.CheckSpeakPermissionRequest - 84, // 152: hyapp.room.v1.RoomGuardService.VerifyRoomPresence:input_type -> hyapp.room.v1.VerifyRoomPresenceRequest - 44, // 153: hyapp.room.v1.RoomQueryService.AdminListRooms:input_type -> hyapp.room.v1.AdminListRoomsRequest - 46, // 154: hyapp.room.v1.RoomQueryService.AdminGetRoom:input_type -> hyapp.room.v1.AdminGetRoomRequest - 13, // 155: hyapp.room.v1.RoomQueryService.AdminGetRoomTreasureConfig:input_type -> hyapp.room.v1.AdminGetRoomTreasureConfigRequest - 18, // 156: hyapp.room.v1.RoomQueryService.AdminGetRoomSeatConfig:input_type -> hyapp.room.v1.AdminGetRoomSeatConfigRequest - 24, // 157: hyapp.room.v1.RoomQueryService.AdminListRoomPins:input_type -> hyapp.room.v1.AdminListRoomPinsRequest - 86, // 158: hyapp.room.v1.RoomQueryService.ListRooms:input_type -> hyapp.room.v1.ListRoomsRequest - 87, // 159: hyapp.room.v1.RoomQueryService.ListRoomFeeds:input_type -> hyapp.room.v1.ListRoomFeedsRequest - 91, // 160: hyapp.room.v1.RoomQueryService.GetMyRoom:input_type -> hyapp.room.v1.GetMyRoomRequest - 93, // 161: hyapp.room.v1.RoomQueryService.GetCurrentRoom:input_type -> hyapp.room.v1.GetCurrentRoomRequest - 95, // 162: hyapp.room.v1.RoomQueryService.GetRoomSnapshot:input_type -> hyapp.room.v1.GetRoomSnapshotRequest - 97, // 163: hyapp.room.v1.RoomQueryService.GetRoomTreasure:input_type -> hyapp.room.v1.GetRoomTreasureRequest - 99, // 164: hyapp.room.v1.RoomQueryService.ListRoomOnlineUsers:input_type -> hyapp.room.v1.ListRoomOnlineUsersRequest - 32, // 165: hyapp.room.v1.RoomCommandService.CreateRoom:output_type -> hyapp.room.v1.CreateRoomResponse - 34, // 166: hyapp.room.v1.RoomCommandService.UpdateRoomProfile:output_type -> hyapp.room.v1.UpdateRoomProfileResponse - 36, // 167: hyapp.room.v1.RoomCommandService.JoinRoom:output_type -> hyapp.room.v1.JoinRoomResponse - 38, // 168: hyapp.room.v1.RoomCommandService.RoomHeartbeat:output_type -> hyapp.room.v1.RoomHeartbeatResponse - 40, // 169: hyapp.room.v1.RoomCommandService.LeaveRoom:output_type -> hyapp.room.v1.LeaveRoomResponse - 42, // 170: hyapp.room.v1.RoomCommandService.CloseRoom:output_type -> hyapp.room.v1.CloseRoomResponse - 49, // 171: hyapp.room.v1.RoomCommandService.AdminUpdateRoom:output_type -> hyapp.room.v1.AdminUpdateRoomResponse - 51, // 172: hyapp.room.v1.RoomCommandService.AdminDeleteRoom:output_type -> hyapp.room.v1.AdminDeleteRoomResponse - 16, // 173: hyapp.room.v1.RoomCommandService.AdminUpdateRoomTreasureConfig:output_type -> hyapp.room.v1.AdminUpdateRoomTreasureConfigResponse - 21, // 174: hyapp.room.v1.RoomCommandService.AdminUpdateRoomSeatConfig:output_type -> hyapp.room.v1.AdminUpdateRoomSeatConfigResponse - 27, // 175: hyapp.room.v1.RoomCommandService.AdminCreateRoomPin:output_type -> hyapp.room.v1.AdminCreateRoomPinResponse - 29, // 176: hyapp.room.v1.RoomCommandService.AdminCancelRoomPin:output_type -> hyapp.room.v1.AdminCancelRoomPinResponse - 53, // 177: hyapp.room.v1.RoomCommandService.MicUp:output_type -> hyapp.room.v1.MicUpResponse - 55, // 178: hyapp.room.v1.RoomCommandService.MicDown:output_type -> hyapp.room.v1.MicDownResponse - 57, // 179: hyapp.room.v1.RoomCommandService.ChangeMicSeat:output_type -> hyapp.room.v1.ChangeMicSeatResponse - 59, // 180: hyapp.room.v1.RoomCommandService.ConfirmMicPublishing:output_type -> hyapp.room.v1.ConfirmMicPublishingResponse - 61, // 181: hyapp.room.v1.RoomCommandService.SetMicMute:output_type -> hyapp.room.v1.SetMicMuteResponse - 63, // 182: hyapp.room.v1.RoomCommandService.ApplyRTCEvent:output_type -> hyapp.room.v1.ApplyRTCEventResponse - 65, // 183: hyapp.room.v1.RoomCommandService.SetMicSeatLock:output_type -> hyapp.room.v1.SetMicSeatLockResponse - 67, // 184: hyapp.room.v1.RoomCommandService.SetChatEnabled:output_type -> hyapp.room.v1.SetChatEnabledResponse - 69, // 185: hyapp.room.v1.RoomCommandService.SetRoomPassword:output_type -> hyapp.room.v1.SetRoomPasswordResponse - 71, // 186: hyapp.room.v1.RoomCommandService.SetRoomAdmin:output_type -> hyapp.room.v1.SetRoomAdminResponse - 73, // 187: hyapp.room.v1.RoomCommandService.MuteUser:output_type -> hyapp.room.v1.MuteUserResponse - 75, // 188: hyapp.room.v1.RoomCommandService.KickUser:output_type -> hyapp.room.v1.KickUserResponse - 77, // 189: hyapp.room.v1.RoomCommandService.UnbanUser:output_type -> hyapp.room.v1.UnbanUserResponse - 79, // 190: hyapp.room.v1.RoomCommandService.SystemEvictUser:output_type -> hyapp.room.v1.SystemEvictUserResponse - 81, // 191: hyapp.room.v1.RoomCommandService.SendGift:output_type -> hyapp.room.v1.SendGiftResponse - 102, // 192: hyapp.room.v1.RoomCommandService.FollowRoom:output_type -> hyapp.room.v1.FollowRoomResponse - 104, // 193: hyapp.room.v1.RoomCommandService.UnfollowRoom:output_type -> hyapp.room.v1.UnfollowRoomResponse - 83, // 194: hyapp.room.v1.RoomGuardService.CheckSpeakPermission:output_type -> hyapp.room.v1.CheckSpeakPermissionResponse - 85, // 195: hyapp.room.v1.RoomGuardService.VerifyRoomPresence:output_type -> hyapp.room.v1.VerifyRoomPresenceResponse - 45, // 196: hyapp.room.v1.RoomQueryService.AdminListRooms:output_type -> hyapp.room.v1.AdminListRoomsResponse - 47, // 197: hyapp.room.v1.RoomQueryService.AdminGetRoom:output_type -> hyapp.room.v1.AdminGetRoomResponse - 14, // 198: hyapp.room.v1.RoomQueryService.AdminGetRoomTreasureConfig:output_type -> hyapp.room.v1.AdminGetRoomTreasureConfigResponse - 19, // 199: hyapp.room.v1.RoomQueryService.AdminGetRoomSeatConfig:output_type -> hyapp.room.v1.AdminGetRoomSeatConfigResponse - 25, // 200: hyapp.room.v1.RoomQueryService.AdminListRoomPins:output_type -> hyapp.room.v1.AdminListRoomPinsResponse - 90, // 201: hyapp.room.v1.RoomQueryService.ListRooms:output_type -> hyapp.room.v1.ListRoomsResponse - 90, // 202: hyapp.room.v1.RoomQueryService.ListRoomFeeds:output_type -> hyapp.room.v1.ListRoomsResponse - 92, // 203: hyapp.room.v1.RoomQueryService.GetMyRoom:output_type -> hyapp.room.v1.GetMyRoomResponse - 94, // 204: hyapp.room.v1.RoomQueryService.GetCurrentRoom:output_type -> hyapp.room.v1.GetCurrentRoomResponse - 96, // 205: hyapp.room.v1.RoomQueryService.GetRoomSnapshot:output_type -> hyapp.room.v1.GetRoomSnapshotResponse - 98, // 206: hyapp.room.v1.RoomQueryService.GetRoomTreasure:output_type -> hyapp.room.v1.GetRoomTreasureResponse - 100, // 207: hyapp.room.v1.RoomQueryService.ListRoomOnlineUsers:output_type -> hyapp.room.v1.ListRoomOnlineUsersResponse - 165, // [165:208] is the sub-list for method output_type - 122, // [122:165] is the sub-list for method input_type - 122, // [122:122] is the sub-list for extension type_name - 122, // [122:122] is the sub-list for extension extendee - 0, // [0:122] is the sub-list for field type_name + 89, // 109: hyapp.room.v1.ListRoomFeedsRequest.related_users:type_name -> hyapp.room.v1.RoomFeedRelatedUser + 0, // 110: hyapp.room.v1.ListRoomGiftLeaderboardRequest.meta:type_name -> hyapp.room.v1.RequestMeta + 90, // 111: hyapp.room.v1.ListRoomsResponse.rooms:type_name -> hyapp.room.v1.RoomListItem + 90, // 112: hyapp.room.v1.RoomGiftLeaderboardItem.room:type_name -> hyapp.room.v1.RoomListItem + 92, // 113: hyapp.room.v1.ListRoomGiftLeaderboardResponse.items:type_name -> hyapp.room.v1.RoomGiftLeaderboardItem + 0, // 114: hyapp.room.v1.GetMyRoomRequest.meta:type_name -> hyapp.room.v1.RequestMeta + 90, // 115: hyapp.room.v1.GetMyRoomResponse.room:type_name -> hyapp.room.v1.RoomListItem + 0, // 116: hyapp.room.v1.GetCurrentRoomRequest.meta:type_name -> hyapp.room.v1.RequestMeta + 0, // 117: hyapp.room.v1.GetRoomSnapshotRequest.meta:type_name -> hyapp.room.v1.RequestMeta + 30, // 118: hyapp.room.v1.GetRoomSnapshotResponse.room:type_name -> hyapp.room.v1.RoomSnapshot + 0, // 119: hyapp.room.v1.GetRoomTreasureRequest.meta:type_name -> hyapp.room.v1.RequestMeta + 10, // 120: hyapp.room.v1.GetRoomTreasureResponse.treasure:type_name -> hyapp.room.v1.RoomTreasureInfo + 0, // 121: hyapp.room.v1.ListRoomOnlineUsersRequest.meta:type_name -> hyapp.room.v1.RequestMeta + 2, // 122: hyapp.room.v1.ListRoomOnlineUsersResponse.users:type_name -> hyapp.room.v1.RoomUser + 0, // 123: hyapp.room.v1.FollowRoomRequest.meta:type_name -> hyapp.room.v1.RequestMeta + 0, // 124: hyapp.room.v1.UnfollowRoomRequest.meta:type_name -> hyapp.room.v1.RequestMeta + 31, // 125: hyapp.room.v1.RoomCommandService.CreateRoom:input_type -> hyapp.room.v1.CreateRoomRequest + 33, // 126: hyapp.room.v1.RoomCommandService.UpdateRoomProfile:input_type -> hyapp.room.v1.UpdateRoomProfileRequest + 35, // 127: hyapp.room.v1.RoomCommandService.JoinRoom:input_type -> hyapp.room.v1.JoinRoomRequest + 37, // 128: hyapp.room.v1.RoomCommandService.RoomHeartbeat:input_type -> hyapp.room.v1.RoomHeartbeatRequest + 39, // 129: hyapp.room.v1.RoomCommandService.LeaveRoom:input_type -> hyapp.room.v1.LeaveRoomRequest + 41, // 130: hyapp.room.v1.RoomCommandService.CloseRoom:input_type -> hyapp.room.v1.CloseRoomRequest + 48, // 131: hyapp.room.v1.RoomCommandService.AdminUpdateRoom:input_type -> hyapp.room.v1.AdminUpdateRoomRequest + 50, // 132: hyapp.room.v1.RoomCommandService.AdminDeleteRoom:input_type -> hyapp.room.v1.AdminDeleteRoomRequest + 15, // 133: hyapp.room.v1.RoomCommandService.AdminUpdateRoomTreasureConfig:input_type -> hyapp.room.v1.AdminUpdateRoomTreasureConfigRequest + 20, // 134: hyapp.room.v1.RoomCommandService.AdminUpdateRoomSeatConfig:input_type -> hyapp.room.v1.AdminUpdateRoomSeatConfigRequest + 26, // 135: hyapp.room.v1.RoomCommandService.AdminCreateRoomPin:input_type -> hyapp.room.v1.AdminCreateRoomPinRequest + 28, // 136: hyapp.room.v1.RoomCommandService.AdminCancelRoomPin:input_type -> hyapp.room.v1.AdminCancelRoomPinRequest + 52, // 137: hyapp.room.v1.RoomCommandService.MicUp:input_type -> hyapp.room.v1.MicUpRequest + 54, // 138: hyapp.room.v1.RoomCommandService.MicDown:input_type -> hyapp.room.v1.MicDownRequest + 56, // 139: hyapp.room.v1.RoomCommandService.ChangeMicSeat:input_type -> hyapp.room.v1.ChangeMicSeatRequest + 58, // 140: hyapp.room.v1.RoomCommandService.ConfirmMicPublishing:input_type -> hyapp.room.v1.ConfirmMicPublishingRequest + 60, // 141: hyapp.room.v1.RoomCommandService.SetMicMute:input_type -> hyapp.room.v1.SetMicMuteRequest + 62, // 142: hyapp.room.v1.RoomCommandService.ApplyRTCEvent:input_type -> hyapp.room.v1.ApplyRTCEventRequest + 64, // 143: hyapp.room.v1.RoomCommandService.SetMicSeatLock:input_type -> hyapp.room.v1.SetMicSeatLockRequest + 66, // 144: hyapp.room.v1.RoomCommandService.SetChatEnabled:input_type -> hyapp.room.v1.SetChatEnabledRequest + 68, // 145: hyapp.room.v1.RoomCommandService.SetRoomPassword:input_type -> hyapp.room.v1.SetRoomPasswordRequest + 70, // 146: hyapp.room.v1.RoomCommandService.SetRoomAdmin:input_type -> hyapp.room.v1.SetRoomAdminRequest + 72, // 147: hyapp.room.v1.RoomCommandService.MuteUser:input_type -> hyapp.room.v1.MuteUserRequest + 74, // 148: hyapp.room.v1.RoomCommandService.KickUser:input_type -> hyapp.room.v1.KickUserRequest + 76, // 149: hyapp.room.v1.RoomCommandService.UnbanUser:input_type -> hyapp.room.v1.UnbanUserRequest + 78, // 150: hyapp.room.v1.RoomCommandService.SystemEvictUser:input_type -> hyapp.room.v1.SystemEvictUserRequest + 80, // 151: hyapp.room.v1.RoomCommandService.SendGift:input_type -> hyapp.room.v1.SendGiftRequest + 104, // 152: hyapp.room.v1.RoomCommandService.FollowRoom:input_type -> hyapp.room.v1.FollowRoomRequest + 106, // 153: hyapp.room.v1.RoomCommandService.UnfollowRoom:input_type -> hyapp.room.v1.UnfollowRoomRequest + 82, // 154: hyapp.room.v1.RoomGuardService.CheckSpeakPermission:input_type -> hyapp.room.v1.CheckSpeakPermissionRequest + 84, // 155: hyapp.room.v1.RoomGuardService.VerifyRoomPresence:input_type -> hyapp.room.v1.VerifyRoomPresenceRequest + 44, // 156: hyapp.room.v1.RoomQueryService.AdminListRooms:input_type -> hyapp.room.v1.AdminListRoomsRequest + 46, // 157: hyapp.room.v1.RoomQueryService.AdminGetRoom:input_type -> hyapp.room.v1.AdminGetRoomRequest + 13, // 158: hyapp.room.v1.RoomQueryService.AdminGetRoomTreasureConfig:input_type -> hyapp.room.v1.AdminGetRoomTreasureConfigRequest + 18, // 159: hyapp.room.v1.RoomQueryService.AdminGetRoomSeatConfig:input_type -> hyapp.room.v1.AdminGetRoomSeatConfigRequest + 24, // 160: hyapp.room.v1.RoomQueryService.AdminListRoomPins:input_type -> hyapp.room.v1.AdminListRoomPinsRequest + 86, // 161: hyapp.room.v1.RoomQueryService.ListRooms:input_type -> hyapp.room.v1.ListRoomsRequest + 87, // 162: hyapp.room.v1.RoomQueryService.ListRoomFeeds:input_type -> hyapp.room.v1.ListRoomFeedsRequest + 88, // 163: hyapp.room.v1.RoomQueryService.ListRoomGiftLeaderboard:input_type -> hyapp.room.v1.ListRoomGiftLeaderboardRequest + 94, // 164: hyapp.room.v1.RoomQueryService.GetMyRoom:input_type -> hyapp.room.v1.GetMyRoomRequest + 96, // 165: hyapp.room.v1.RoomQueryService.GetCurrentRoom:input_type -> hyapp.room.v1.GetCurrentRoomRequest + 98, // 166: hyapp.room.v1.RoomQueryService.GetRoomSnapshot:input_type -> hyapp.room.v1.GetRoomSnapshotRequest + 100, // 167: hyapp.room.v1.RoomQueryService.GetRoomTreasure:input_type -> hyapp.room.v1.GetRoomTreasureRequest + 102, // 168: hyapp.room.v1.RoomQueryService.ListRoomOnlineUsers:input_type -> hyapp.room.v1.ListRoomOnlineUsersRequest + 32, // 169: hyapp.room.v1.RoomCommandService.CreateRoom:output_type -> hyapp.room.v1.CreateRoomResponse + 34, // 170: hyapp.room.v1.RoomCommandService.UpdateRoomProfile:output_type -> hyapp.room.v1.UpdateRoomProfileResponse + 36, // 171: hyapp.room.v1.RoomCommandService.JoinRoom:output_type -> hyapp.room.v1.JoinRoomResponse + 38, // 172: hyapp.room.v1.RoomCommandService.RoomHeartbeat:output_type -> hyapp.room.v1.RoomHeartbeatResponse + 40, // 173: hyapp.room.v1.RoomCommandService.LeaveRoom:output_type -> hyapp.room.v1.LeaveRoomResponse + 42, // 174: hyapp.room.v1.RoomCommandService.CloseRoom:output_type -> hyapp.room.v1.CloseRoomResponse + 49, // 175: hyapp.room.v1.RoomCommandService.AdminUpdateRoom:output_type -> hyapp.room.v1.AdminUpdateRoomResponse + 51, // 176: hyapp.room.v1.RoomCommandService.AdminDeleteRoom:output_type -> hyapp.room.v1.AdminDeleteRoomResponse + 16, // 177: hyapp.room.v1.RoomCommandService.AdminUpdateRoomTreasureConfig:output_type -> hyapp.room.v1.AdminUpdateRoomTreasureConfigResponse + 21, // 178: hyapp.room.v1.RoomCommandService.AdminUpdateRoomSeatConfig:output_type -> hyapp.room.v1.AdminUpdateRoomSeatConfigResponse + 27, // 179: hyapp.room.v1.RoomCommandService.AdminCreateRoomPin:output_type -> hyapp.room.v1.AdminCreateRoomPinResponse + 29, // 180: hyapp.room.v1.RoomCommandService.AdminCancelRoomPin:output_type -> hyapp.room.v1.AdminCancelRoomPinResponse + 53, // 181: hyapp.room.v1.RoomCommandService.MicUp:output_type -> hyapp.room.v1.MicUpResponse + 55, // 182: hyapp.room.v1.RoomCommandService.MicDown:output_type -> hyapp.room.v1.MicDownResponse + 57, // 183: hyapp.room.v1.RoomCommandService.ChangeMicSeat:output_type -> hyapp.room.v1.ChangeMicSeatResponse + 59, // 184: hyapp.room.v1.RoomCommandService.ConfirmMicPublishing:output_type -> hyapp.room.v1.ConfirmMicPublishingResponse + 61, // 185: hyapp.room.v1.RoomCommandService.SetMicMute:output_type -> hyapp.room.v1.SetMicMuteResponse + 63, // 186: hyapp.room.v1.RoomCommandService.ApplyRTCEvent:output_type -> hyapp.room.v1.ApplyRTCEventResponse + 65, // 187: hyapp.room.v1.RoomCommandService.SetMicSeatLock:output_type -> hyapp.room.v1.SetMicSeatLockResponse + 67, // 188: hyapp.room.v1.RoomCommandService.SetChatEnabled:output_type -> hyapp.room.v1.SetChatEnabledResponse + 69, // 189: hyapp.room.v1.RoomCommandService.SetRoomPassword:output_type -> hyapp.room.v1.SetRoomPasswordResponse + 71, // 190: hyapp.room.v1.RoomCommandService.SetRoomAdmin:output_type -> hyapp.room.v1.SetRoomAdminResponse + 73, // 191: hyapp.room.v1.RoomCommandService.MuteUser:output_type -> hyapp.room.v1.MuteUserResponse + 75, // 192: hyapp.room.v1.RoomCommandService.KickUser:output_type -> hyapp.room.v1.KickUserResponse + 77, // 193: hyapp.room.v1.RoomCommandService.UnbanUser:output_type -> hyapp.room.v1.UnbanUserResponse + 79, // 194: hyapp.room.v1.RoomCommandService.SystemEvictUser:output_type -> hyapp.room.v1.SystemEvictUserResponse + 81, // 195: hyapp.room.v1.RoomCommandService.SendGift:output_type -> hyapp.room.v1.SendGiftResponse + 105, // 196: hyapp.room.v1.RoomCommandService.FollowRoom:output_type -> hyapp.room.v1.FollowRoomResponse + 107, // 197: hyapp.room.v1.RoomCommandService.UnfollowRoom:output_type -> hyapp.room.v1.UnfollowRoomResponse + 83, // 198: hyapp.room.v1.RoomGuardService.CheckSpeakPermission:output_type -> hyapp.room.v1.CheckSpeakPermissionResponse + 85, // 199: hyapp.room.v1.RoomGuardService.VerifyRoomPresence:output_type -> hyapp.room.v1.VerifyRoomPresenceResponse + 45, // 200: hyapp.room.v1.RoomQueryService.AdminListRooms:output_type -> hyapp.room.v1.AdminListRoomsResponse + 47, // 201: hyapp.room.v1.RoomQueryService.AdminGetRoom:output_type -> hyapp.room.v1.AdminGetRoomResponse + 14, // 202: hyapp.room.v1.RoomQueryService.AdminGetRoomTreasureConfig:output_type -> hyapp.room.v1.AdminGetRoomTreasureConfigResponse + 19, // 203: hyapp.room.v1.RoomQueryService.AdminGetRoomSeatConfig:output_type -> hyapp.room.v1.AdminGetRoomSeatConfigResponse + 25, // 204: hyapp.room.v1.RoomQueryService.AdminListRoomPins:output_type -> hyapp.room.v1.AdminListRoomPinsResponse + 91, // 205: hyapp.room.v1.RoomQueryService.ListRooms:output_type -> hyapp.room.v1.ListRoomsResponse + 91, // 206: hyapp.room.v1.RoomQueryService.ListRoomFeeds:output_type -> hyapp.room.v1.ListRoomsResponse + 93, // 207: hyapp.room.v1.RoomQueryService.ListRoomGiftLeaderboard:output_type -> hyapp.room.v1.ListRoomGiftLeaderboardResponse + 95, // 208: hyapp.room.v1.RoomQueryService.GetMyRoom:output_type -> hyapp.room.v1.GetMyRoomResponse + 97, // 209: hyapp.room.v1.RoomQueryService.GetCurrentRoom:output_type -> hyapp.room.v1.GetCurrentRoomResponse + 99, // 210: hyapp.room.v1.RoomQueryService.GetRoomSnapshot:output_type -> hyapp.room.v1.GetRoomSnapshotResponse + 101, // 211: hyapp.room.v1.RoomQueryService.GetRoomTreasure:output_type -> hyapp.room.v1.GetRoomTreasureResponse + 103, // 212: hyapp.room.v1.RoomQueryService.ListRoomOnlineUsers:output_type -> hyapp.room.v1.ListRoomOnlineUsersResponse + 169, // [169:213] is the sub-list for method output_type + 125, // [125:169] is the sub-list for method input_type + 125, // [125:125] is the sub-list for extension type_name + 125, // [125:125] is the sub-list for extension extendee + 0, // [0:125] is the sub-list for field type_name } func init() { file_proto_room_v1_room_proto_init() } @@ -8749,7 +9000,7 @@ func file_proto_room_v1_room_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_proto_room_v1_room_proto_rawDesc), len(file_proto_room_v1_room_proto_rawDesc)), NumEnums: 0, - NumMessages: 106, + NumMessages: 109, NumExtensions: 0, NumServices: 3, }, diff --git a/api/proto/room/v1/room.proto b/api/proto/room/v1/room.proto index a1c9411d..a7843afd 100644 --- a/api/proto/room/v1/room.proto +++ b/api/proto/room/v1/room.proto @@ -775,6 +775,14 @@ message ListRoomFeedsRequest { 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; @@ -805,6 +813,24 @@ message ListRoomsResponse { 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 { @@ -963,6 +989,7 @@ service RoomQueryService { 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); diff --git a/api/proto/room/v1/room_grpc.pb.go b/api/proto/room/v1/room_grpc.pb.go index e6f14feb..75b53392 100644 --- a/api/proto/room/v1/room_grpc.pb.go +++ b/api/proto/room/v1/room_grpc.pb.go @@ -1340,6 +1340,7 @@ const ( RoomQueryService_AdminListRoomPins_FullMethodName = "/hyapp.room.v1.RoomQueryService/AdminListRoomPins" RoomQueryService_ListRooms_FullMethodName = "/hyapp.room.v1.RoomQueryService/ListRooms" RoomQueryService_ListRoomFeeds_FullMethodName = "/hyapp.room.v1.RoomQueryService/ListRoomFeeds" + RoomQueryService_ListRoomGiftLeaderboard_FullMethodName = "/hyapp.room.v1.RoomQueryService/ListRoomGiftLeaderboard" RoomQueryService_GetMyRoom_FullMethodName = "/hyapp.room.v1.RoomQueryService/GetMyRoom" RoomQueryService_GetCurrentRoom_FullMethodName = "/hyapp.room.v1.RoomQueryService/GetCurrentRoom" RoomQueryService_GetRoomSnapshot_FullMethodName = "/hyapp.room.v1.RoomQueryService/GetRoomSnapshot" @@ -1360,6 +1361,7 @@ type RoomQueryServiceClient interface { AdminListRoomPins(ctx context.Context, in *AdminListRoomPinsRequest, opts ...grpc.CallOption) (*AdminListRoomPinsResponse, error) ListRooms(ctx context.Context, in *ListRoomsRequest, opts ...grpc.CallOption) (*ListRoomsResponse, error) ListRoomFeeds(ctx context.Context, in *ListRoomFeedsRequest, opts ...grpc.CallOption) (*ListRoomsResponse, error) + ListRoomGiftLeaderboard(ctx context.Context, in *ListRoomGiftLeaderboardRequest, opts ...grpc.CallOption) (*ListRoomGiftLeaderboardResponse, error) GetMyRoom(ctx context.Context, in *GetMyRoomRequest, opts ...grpc.CallOption) (*GetMyRoomResponse, error) GetCurrentRoom(ctx context.Context, in *GetCurrentRoomRequest, opts ...grpc.CallOption) (*GetCurrentRoomResponse, error) GetRoomSnapshot(ctx context.Context, in *GetRoomSnapshotRequest, opts ...grpc.CallOption) (*GetRoomSnapshotResponse, error) @@ -1445,6 +1447,16 @@ func (c *roomQueryServiceClient) ListRoomFeeds(ctx context.Context, in *ListRoom return out, nil } +func (c *roomQueryServiceClient) ListRoomGiftLeaderboard(ctx context.Context, in *ListRoomGiftLeaderboardRequest, opts ...grpc.CallOption) (*ListRoomGiftLeaderboardResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListRoomGiftLeaderboardResponse) + err := c.cc.Invoke(ctx, RoomQueryService_ListRoomGiftLeaderboard_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *roomQueryServiceClient) GetMyRoom(ctx context.Context, in *GetMyRoomRequest, opts ...grpc.CallOption) (*GetMyRoomResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetMyRoomResponse) @@ -1508,6 +1520,7 @@ type RoomQueryServiceServer interface { AdminListRoomPins(context.Context, *AdminListRoomPinsRequest) (*AdminListRoomPinsResponse, error) ListRooms(context.Context, *ListRoomsRequest) (*ListRoomsResponse, error) ListRoomFeeds(context.Context, *ListRoomFeedsRequest) (*ListRoomsResponse, error) + ListRoomGiftLeaderboard(context.Context, *ListRoomGiftLeaderboardRequest) (*ListRoomGiftLeaderboardResponse, error) GetMyRoom(context.Context, *GetMyRoomRequest) (*GetMyRoomResponse, error) GetCurrentRoom(context.Context, *GetCurrentRoomRequest) (*GetCurrentRoomResponse, error) GetRoomSnapshot(context.Context, *GetRoomSnapshotRequest) (*GetRoomSnapshotResponse, error) @@ -1544,6 +1557,9 @@ func (UnimplementedRoomQueryServiceServer) ListRooms(context.Context, *ListRooms func (UnimplementedRoomQueryServiceServer) ListRoomFeeds(context.Context, *ListRoomFeedsRequest) (*ListRoomsResponse, error) { return nil, status.Error(codes.Unimplemented, "method ListRoomFeeds not implemented") } +func (UnimplementedRoomQueryServiceServer) ListRoomGiftLeaderboard(context.Context, *ListRoomGiftLeaderboardRequest) (*ListRoomGiftLeaderboardResponse, error) { + return nil, status.Error(codes.Unimplemented, "method ListRoomGiftLeaderboard not implemented") +} func (UnimplementedRoomQueryServiceServer) GetMyRoom(context.Context, *GetMyRoomRequest) (*GetMyRoomResponse, error) { return nil, status.Error(codes.Unimplemented, "method GetMyRoom not implemented") } @@ -1706,6 +1722,24 @@ func _RoomQueryService_ListRoomFeeds_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } +func _RoomQueryService_ListRoomGiftLeaderboard_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListRoomGiftLeaderboardRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RoomQueryServiceServer).ListRoomGiftLeaderboard(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RoomQueryService_ListRoomGiftLeaderboard_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RoomQueryServiceServer).ListRoomGiftLeaderboard(ctx, req.(*ListRoomGiftLeaderboardRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _RoomQueryService_GetMyRoom_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetMyRoomRequest) if err := dec(in); err != nil { @@ -1831,6 +1865,10 @@ var RoomQueryService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListRoomFeeds", Handler: _RoomQueryService_ListRoomFeeds_Handler, }, + { + MethodName: "ListRoomGiftLeaderboard", + Handler: _RoomQueryService_ListRoomGiftLeaderboard_Handler, + }, { MethodName: "GetMyRoom", Handler: _RoomQueryService_GetMyRoom_Handler, diff --git a/services/gateway-service/internal/client/room_client.go b/services/gateway-service/internal/client/room_client.go index ef141e0d..cbc4e1ed 100644 --- a/services/gateway-service/internal/client/room_client.go +++ b/services/gateway-service/internal/client/room_client.go @@ -43,6 +43,7 @@ type RoomGuardClient interface { type RoomQueryClient interface { ListRooms(ctx context.Context, req *roomv1.ListRoomsRequest) (*roomv1.ListRoomsResponse, error) ListRoomFeeds(ctx context.Context, req *roomv1.ListRoomFeedsRequest) (*roomv1.ListRoomsResponse, error) + ListRoomGiftLeaderboard(ctx context.Context, req *roomv1.ListRoomGiftLeaderboardRequest) (*roomv1.ListRoomGiftLeaderboardResponse, error) GetMyRoom(ctx context.Context, req *roomv1.GetMyRoomRequest) (*roomv1.GetMyRoomResponse, error) GetCurrentRoom(ctx context.Context, req *roomv1.GetCurrentRoomRequest) (*roomv1.GetCurrentRoomResponse, error) GetRoomSnapshot(ctx context.Context, req *roomv1.GetRoomSnapshotRequest) (*roomv1.GetRoomSnapshotResponse, error) @@ -183,6 +184,10 @@ func (c *grpcRoomQueryClient) ListRoomFeeds(ctx context.Context, req *roomv1.Lis return c.client.ListRoomFeeds(ctx, req) } +func (c *grpcRoomQueryClient) ListRoomGiftLeaderboard(ctx context.Context, req *roomv1.ListRoomGiftLeaderboardRequest) (*roomv1.ListRoomGiftLeaderboardResponse, error) { + return c.client.ListRoomGiftLeaderboard(ctx, req) +} + func (c *grpcRoomQueryClient) GetMyRoom(ctx context.Context, req *roomv1.GetMyRoomRequest) (*roomv1.GetMyRoomResponse, error) { return c.client.GetMyRoom(ctx, req) } diff --git a/services/gateway-service/internal/transport/http/activityapi/user_leaderboard_handler.go b/services/gateway-service/internal/transport/http/activityapi/user_leaderboard_handler.go index 382c2abc..1afbe771 100644 --- a/services/gateway-service/internal/transport/http/activityapi/user_leaderboard_handler.go +++ b/services/gateway-service/internal/transport/http/activityapi/user_leaderboard_handler.go @@ -71,11 +71,6 @@ type userLeaderboardRoom struct { } func (h *Handler) listUserLeaderboards(writer http.ResponseWriter, request *http.Request) { - if h.walletDB == nil { - httpkit.WriteError(writer, request, http.StatusServiceUnavailable, httpkit.CodeUpstreamError, "upstream service error") - return - } - boardType := normalizeUserLeaderboardType(request.URL.Query().Get("board_type")) if boardType == "" { httpkit.WriteError(writer, request, http.StatusBadRequest, httpkit.CodeInvalidArgument, "invalid argument") @@ -99,6 +94,14 @@ func (h *Handler) listUserLeaderboards(writer http.ResponseWriter, request *http if pageSize > userLeaderboardMaxPageSize { pageSize = userLeaderboardMaxPageSize } + if boardType == leaderboardTypeRoom { + h.listRoomGiftLeaderboards(writer, request, period, page, pageSize) + return + } + if h.walletDB == nil { + httpkit.WriteError(writer, request, http.StatusServiceUnavailable, httpkit.CodeUpstreamError, "upstream service error") + return + } now := time.Now().UTC() start, end := userLeaderboardPeriodWindow(period, now) @@ -147,6 +150,34 @@ func (h *Handler) listUserLeaderboards(writer http.ResponseWriter, request *http }) } +func (h *Handler) listRoomGiftLeaderboards(writer http.ResponseWriter, request *http.Request, period string, page int32, pageSize int32) { + if h.roomQueryClient == nil { + httpkit.WriteError(writer, request, http.StatusBadGateway, httpkit.CodeUpstreamError, "upstream service error") + return + } + resp, err := h.roomQueryClient.ListRoomGiftLeaderboard(request.Context(), &roomv1.ListRoomGiftLeaderboardRequest{ + Meta: httpkit.RoomMeta(request, "", ""), + Period: period, + Page: page, + PageSize: pageSize, + }) + if err != nil { + httpkit.WriteRPCError(writer, request, err) + return + } + httpkit.WriteOK(writer, request, userLeaderboardResponse{ + Items: userLeaderboardItemsFromRoomGiftLeaderboard(resp.GetItems()), + Total: resp.GetTotal(), + Page: page, + PageSize: pageSize, + BoardType: leaderboardTypeRoom, + Period: resp.GetPeriod(), + StartAtMS: resp.GetStartAtMs(), + EndAtMS: resp.GetEndAtMs(), + ServerTimeMS: resp.GetServerTimeMs(), + }) +} + func normalizeUserLeaderboardType(raw string) string { switch strings.ToLower(strings.TrimSpace(raw)) { case "", "sent", "send", "sender", "gift_sent", "user_sent": @@ -367,7 +398,8 @@ func userLeaderboardDimension(boardType string) (string, string) { func (h *Handler) enrichUserLeaderboardItems(request *http.Request, boardType string, items []userLeaderboardItem, myRank *userLeaderboardItem) error { if boardType == leaderboardTypeRoom { - return h.enrichRoomLeaderboardItems(request, items) + // room 榜已经由 room-service 的 zset + room_list_entries 返回卡片,不再读取完整 RoomSnapshot。 + return nil } userIDs := make([]int64, 0, len(items)+1) for _, item := range items { @@ -393,32 +425,42 @@ func (h *Handler) enrichUserLeaderboardItems(request *http.Request, boardType st return nil } -func (h *Handler) enrichRoomLeaderboardItems(request *http.Request, items []userLeaderboardItem) error { - if h.roomQueryClient == nil || len(items) == 0 { - return nil - } - seen := make(map[string]*userLeaderboardRoom, len(items)) - for i := range items { - roomID := strings.TrimSpace(items[i].RoomID) - if roomID == "" { +func userLeaderboardItemsFromRoomGiftLeaderboard(items []*roomv1.RoomGiftLeaderboardItem) []userLeaderboardItem { + out := make([]userLeaderboardItem, 0, len(items)) + for _, item := range items { + if item == nil { continue } - room, ok := seen[roomID] - if !ok { - resp, err := h.roomQueryClient.GetRoomSnapshot(request.Context(), &roomv1.GetRoomSnapshotRequest{ - Meta: httpkit.RoomMeta(request, roomID, ""), - RoomId: roomID, - ViewerUserId: auth.UserIDFromContext(request.Context()), - }) - if err != nil { - return err - } - room = roomLeaderboardRoomFromSnapshot(roomID, resp.GetRoom()) - seen[roomID] = room + roomID := item.GetRoomId() + room := userLeaderboardRoomFromListItem(item.GetRoom()) + if room == nil { + room = &userLeaderboardRoom{RoomID: roomID} } - items[i].Room = room + out = append(out, userLeaderboardItem{ + Rank: item.GetRank(), + RoomID: roomID, + GiftValue: item.GetCoinSpent(), + Room: room, + }) + } + return out +} + +func userLeaderboardRoomFromListItem(room *roomv1.RoomListItem) *userLeaderboardRoom { + if room == nil { + return nil + } + roomID := room.GetRoomId() + if roomID == "" { + return nil + } + return &userLeaderboardRoom{ + RoomID: roomID, + RoomShortID: room.GetRoomShortId(), + Title: room.GetTitle(), + CoverURL: room.GetCoverUrl(), + RoomAvatar: room.GetCoverUrl(), } - return nil } func roomLeaderboardRoomFromSnapshot(roomID string, snapshot *roomv1.RoomSnapshot) *userLeaderboardRoom { diff --git a/services/gateway-service/internal/transport/http/activityapi/user_leaderboard_handler_test.go b/services/gateway-service/internal/transport/http/activityapi/user_leaderboard_handler_test.go index 4761c1ac..4ee502ee 100644 --- a/services/gateway-service/internal/transport/http/activityapi/user_leaderboard_handler_test.go +++ b/services/gateway-service/internal/transport/http/activityapi/user_leaderboard_handler_test.go @@ -1,6 +1,7 @@ package activityapi import ( + "context" "testing" "time" @@ -58,3 +59,67 @@ func TestRoomLeaderboardRoomFromSnapshotIncludesAvatar(t *testing.T) { t.Fatalf("room avatar fields mismatch: %+v", room) } } + +func TestUserLeaderboardItemsFromRoomGiftLeaderboardUsesRoomCard(t *testing.T) { + items := userLeaderboardItemsFromRoomGiftLeaderboard([]*roomv1.RoomGiftLeaderboardItem{{ + Rank: 1, + RoomId: "room_1", + CoinSpent: 900, + Room: &roomv1.RoomListItem{ + RoomId: "room_1", + RoomShortId: "1001", + Title: "Music Room", + CoverUrl: "https://cdn.example/room.png", + }, + }}) + + if len(items) != 1 || items[0].RoomID != "room_1" || items[0].GiftValue != 900 { + t.Fatalf("room leaderboard item mismatch: %+v", items) + } + if items[0].Room == nil || items[0].Room.RoomShortID != "1001" || items[0].Room.RoomAvatar != "https://cdn.example/room.png" { + t.Fatalf("room leaderboard card mismatch: %+v", items[0].Room) + } +} + +type fakeUserLeaderboardRoomQueryClient struct { + snapshotResp *roomv1.GetRoomSnapshotResponse + snapshotErr error +} + +func (f *fakeUserLeaderboardRoomQueryClient) ListRooms(context.Context, *roomv1.ListRoomsRequest) (*roomv1.ListRoomsResponse, error) { + return &roomv1.ListRoomsResponse{}, nil +} + +func (f *fakeUserLeaderboardRoomQueryClient) ListRoomFeeds(context.Context, *roomv1.ListRoomFeedsRequest) (*roomv1.ListRoomsResponse, error) { + return &roomv1.ListRoomsResponse{}, nil +} + +func (f *fakeUserLeaderboardRoomQueryClient) ListRoomGiftLeaderboard(context.Context, *roomv1.ListRoomGiftLeaderboardRequest) (*roomv1.ListRoomGiftLeaderboardResponse, error) { + return &roomv1.ListRoomGiftLeaderboardResponse{}, nil +} + +func (f *fakeUserLeaderboardRoomQueryClient) GetMyRoom(context.Context, *roomv1.GetMyRoomRequest) (*roomv1.GetMyRoomResponse, error) { + return &roomv1.GetMyRoomResponse{}, nil +} + +func (f *fakeUserLeaderboardRoomQueryClient) GetCurrentRoom(context.Context, *roomv1.GetCurrentRoomRequest) (*roomv1.GetCurrentRoomResponse, error) { + return &roomv1.GetCurrentRoomResponse{}, nil +} + +func (f *fakeUserLeaderboardRoomQueryClient) GetRoomSnapshot(context.Context, *roomv1.GetRoomSnapshotRequest) (*roomv1.GetRoomSnapshotResponse, error) { + if f.snapshotErr != nil { + return nil, f.snapshotErr + } + if f.snapshotResp != nil { + return f.snapshotResp, nil + } + return &roomv1.GetRoomSnapshotResponse{}, nil +} + +func (f *fakeUserLeaderboardRoomQueryClient) GetRoomTreasure(context.Context, *roomv1.GetRoomTreasureRequest) (*roomv1.GetRoomTreasureResponse, error) { + return &roomv1.GetRoomTreasureResponse{}, nil +} + +func (f *fakeUserLeaderboardRoomQueryClient) ListRoomOnlineUsers(context.Context, *roomv1.ListRoomOnlineUsersRequest) (*roomv1.ListRoomOnlineUsersResponse, error) { + return &roomv1.ListRoomOnlineUsersResponse{}, nil +} diff --git a/services/gateway-service/internal/transport/http/response_test.go b/services/gateway-service/internal/transport/http/response_test.go index ef0b543a..a00e5ea4 100644 --- a/services/gateway-service/internal/transport/http/response_test.go +++ b/services/gateway-service/internal/transport/http/response_test.go @@ -721,6 +721,10 @@ func (f *fakeRoomQueryClient) ListRoomFeeds(_ context.Context, req *roomv1.ListR return &roomv1.ListRoomsResponse{}, nil } +func (f *fakeRoomQueryClient) ListRoomGiftLeaderboard(context.Context, *roomv1.ListRoomGiftLeaderboardRequest) (*roomv1.ListRoomGiftLeaderboardResponse, error) { + return &roomv1.ListRoomGiftLeaderboardResponse{}, nil +} + func (f *fakeRoomQueryClient) GetMyRoom(_ context.Context, req *roomv1.GetMyRoomRequest) (*roomv1.GetMyRoomResponse, error) { f.lastMyRoom = req if f.myRoomErr != nil { diff --git a/services/room-service/internal/app/app.go b/services/room-service/internal/app/app.go index 84f9f438..f2265d38 100644 --- a/services/room-service/internal/app/app.go +++ b/services/room-service/internal/app/app.go @@ -204,6 +204,7 @@ func New(cfg config.Config) (*App, error) { MicPublishTimeout: cfg.MicPublishTimeout, RTCUserRemover: rtcUserRemover, RoomTreasureOpenScheduler: treasureOpenScheduler, + RoomGiftLeaderboard: roomservice.NewRedisRoomGiftLeaderboardStore(redisClient), }, directory, repository, integration.NewGRPCWalletClient(walletConn), roomPublisher, outboxPublisher, luckyGiftClient) if cfg.RocketMQ.TreasureOpen.Enabled { treasureConsumer, err := rocketmqx.NewConsumer(rocketMQConsumerConfig(cfg.RocketMQ, cfg.RocketMQ.TreasureOpen.ConsumerGroup, cfg.RocketMQ.TreasureOpen.ConsumerMaxReconsumeTimes)) diff --git a/services/room-service/internal/room/service/gift.go b/services/room-service/internal/room/service/gift.go index ec92c3aa..e1e626ea 100644 --- a/services/room-service/internal/room/service/gift.go +++ b/services/room-service/internal/room/service/gift.go @@ -221,6 +221,12 @@ func (s *Service) SendGift(ctx context.Context, req *roomv1.SendGiftRequest) (*r luckyGift: luckyGift, commandPayload: commandPayload, walletDebitMS: walletDebitMS, + roomGiftLeaderboard: &RoomGiftLeaderboardIncrement{ + AppCode: appcode.FromContext(ctx), + RoomID: current.RoomID, + CoinSpent: roomGiftLeaderboardCoinSpent(billing), + OccurredAtMS: now.UnixMilli(), + }, syncEvent: &tencentim.RoomEvent{ // 同步广播只选 GiftSent 主事件作为客户端房间系统消息,Heat/Rank 通过字段携带。 EventID: giftEvent.EventID, @@ -258,6 +264,16 @@ func (s *Service) SendGift(ctx context.Context, req *roomv1.SendGiftRequest) (*r }, nil } +func roomGiftLeaderboardCoinSpent(billing *walletv1.DebitGiftResponse) int64 { + if billing == nil { + return 0 + } + if billing.GetCoinSpent() > 0 { + return billing.GetCoinSpent() + } + return billing.GetChargeAmount() +} + func (s *Service) shouldDrawLuckyGift(poolID string, giftTypeCode string) bool { if s.luckyGift == nil { return false diff --git a/services/room-service/internal/room/service/pipeline.go b/services/room-service/internal/room/service/pipeline.go index a8590bc6..6113ad06 100644 --- a/services/room-service/internal/room/service/pipeline.go +++ b/services/room-service/internal/room/service/pipeline.go @@ -158,6 +158,8 @@ func (s *Service) mutateRoom(ctx context.Context, cmd command.Command, replayabl s.projectRoomListBestEffort(ctx, result.snapshot) // 当前房间恢复读模型同样最终一致;权威校验仍以 Room Cell 快照为准。 s.projectRoomPresenceBestEffort(ctx, result.snapshot) + // 跨房间金币榜是 Redis 轻量读模型,不能影响已提交的房间状态和账务事实。 + s.recordRoomGiftLeaderboardBestEffort(ctx, result.roomGiftLeaderboard) projectionMS = elapsedMS(projectionStartedAt) } diff --git a/services/room-service/internal/room/service/repository.go b/services/room-service/internal/room/service/repository.go index d2244af2..2850cf3d 100644 --- a/services/room-service/internal/room/service/repository.go +++ b/services/room-service/internal/room/service/repository.go @@ -347,6 +347,14 @@ type RoomListQuery struct { NowMS int64 } +// RoomListEntriesByIDQuery 是榜单等定向补全房间卡片时的批量读取条件。 +type RoomListEntriesByIDQuery struct { + // AppCode 限定 App 边界,避免一个榜单读到其他 App 的同名 room_id。 + AppCode string + // RoomIDs 是榜单已经命中的房间集合;repository 必须按这些 key 精确读取。 + RoomIDs []string +} + // RoomUserFeedEntry 是“访问过/好友/关注”房间流的读模型索引。 // 它只保存用户到房间的列表关系,不复制房间卡片字段,卡片内容仍来自 room_list_entries。 type RoomUserFeedEntry struct { @@ -492,6 +500,8 @@ type Repository interface { UpsertRoomListEntry(ctx context.Context, entry RoomListEntry) error // ListRoomListEntries 按区域和 tab 查询房间列表,不访问 Room Cell 内存。 ListRoomListEntries(ctx context.Context, query RoomListQuery) ([]RoomListEntry, error) + // ListRoomListEntriesByIDs 按房间 ID 精确读取列表卡片,用于榜单展示补全。 + ListRoomListEntriesByIDs(ctx context.Context, query RoomListEntriesByIDQuery) (map[string]RoomListEntry, error) // UpsertRoomUserFeedEntry 写入用户房间关系流读模型;失败不应影响房间主链路。 UpsertRoomUserFeedEntry(ctx context.Context, entry RoomUserFeedEntry) error // ListRoomUserFeedEntries 按用户关系流读取房间卡片,不访问 Room Cell 内存集合。 diff --git a/services/room-service/internal/room/service/room_gift_leaderboard.go b/services/room-service/internal/room/service/room_gift_leaderboard.go new file mode 100644 index 00000000..cb638f42 --- /dev/null +++ b/services/room-service/internal/room/service/room_gift_leaderboard.go @@ -0,0 +1,290 @@ +package service + +import ( + "context" + "fmt" + "log/slog" + "math" + "strings" + "time" + + "github.com/redis/go-redis/v9" + roomv1 "hyapp.local/api/proto/room/v1" + "hyapp/pkg/appcode" + "hyapp/pkg/logx" + "hyapp/pkg/xerr" +) + +const ( + roomGiftLeaderboardPeriodToday = "today" + roomGiftLeaderboardPeriodWeek = "week" + roomGiftLeaderboardPeriodMonth = "month" + + defaultRoomGiftLeaderboardPageSize = 20 + maxRoomGiftLeaderboardPageSize = 100 +) + +// RoomGiftLeaderboardStore 是房间金币榜的轻量读模型边界;生产实现使用 Redis zset。 +type RoomGiftLeaderboardStore interface { + IncrementRoomGift(ctx context.Context, input RoomGiftLeaderboardIncrement) error + ListRoomGiftLeaderboard(ctx context.Context, query RoomGiftLeaderboardQuery) (RoomGiftLeaderboardPage, error) +} + +type RoomGiftLeaderboardIncrement struct { + AppCode string + RoomID string + CoinSpent int64 + OccurredAtMS int64 +} + +type RoomGiftLeaderboardQuery struct { + AppCode string + Period string + Page int + PageSize int + NowMS int64 +} + +type RoomGiftLeaderboardPage struct { + Items []RoomGiftLeaderboardEntry + Total int64 + Period string + StartAtMS int64 + EndAtMS int64 + ServerTimeMS int64 +} + +type RoomGiftLeaderboardEntry struct { + Rank int64 + RoomID string + CoinSpent int64 +} + +// RedisRoomGiftLeaderboardStore 只在 zset 中保存 room_id -> 周期金币消耗分。 +type RedisRoomGiftLeaderboardStore struct { + client *redis.Client +} + +func NewRedisRoomGiftLeaderboardStore(client *redis.Client) *RedisRoomGiftLeaderboardStore { + return &RedisRoomGiftLeaderboardStore{client: client} +} + +func (s *RedisRoomGiftLeaderboardStore) IncrementRoomGift(ctx context.Context, input RoomGiftLeaderboardIncrement) error { + if s == nil || s.client == nil { + return xerr.New(xerr.Unavailable, "room gift leaderboard store is not configured") + } + app := appcode.Normalize(input.AppCode) + roomID := strings.TrimSpace(input.RoomID) + if roomID == "" || input.CoinSpent <= 0 { + return nil + } + occurredAt := time.UnixMilli(input.OccurredAtMS).UTC() + if input.OccurredAtMS <= 0 { + occurredAt = time.Now().UTC() + } + + pipe := s.client.Pipeline() + for _, period := range []string{roomGiftLeaderboardPeriodToday, roomGiftLeaderboardPeriodWeek, roomGiftLeaderboardPeriodMonth} { + start, end := roomGiftLeaderboardWindow(period, occurredAt) + key := roomGiftLeaderboardKey(app, period, start) + pipe.ZIncrBy(ctx, key, float64(input.CoinSpent), roomID) + // Redis 榜单是可重建读模型,TTL 只需要覆盖当前周期和排查窗口。 + pipe.Expire(ctx, key, roomGiftLeaderboardTTL(period, start, end)) + } + _, err := pipe.Exec(ctx) + return err +} + +func (s *RedisRoomGiftLeaderboardStore) ListRoomGiftLeaderboard(ctx context.Context, query RoomGiftLeaderboardQuery) (RoomGiftLeaderboardPage, error) { + if s == nil || s.client == nil { + return RoomGiftLeaderboardPage{}, xerr.New(xerr.Unavailable, "room gift leaderboard store is not configured") + } + query = normalizeRoomGiftLeaderboardQuery(query) + now := time.UnixMilli(query.NowMS).UTC() + start, end := roomGiftLeaderboardWindow(query.Period, now) + key := roomGiftLeaderboardKey(appcode.Normalize(query.AppCode), query.Period, start) + offset := int64((query.Page - 1) * query.PageSize) + stop := offset + int64(query.PageSize) - 1 + + total, err := s.client.ZCard(ctx, key).Result() + if err != nil { + return RoomGiftLeaderboardPage{}, err + } + rows, err := s.client.ZRevRangeWithScores(ctx, key, offset, stop).Result() + if err != nil { + return RoomGiftLeaderboardPage{}, err + } + + items := make([]RoomGiftLeaderboardEntry, 0, len(rows)) + for i, row := range rows { + roomID, ok := row.Member.(string) + if !ok || strings.TrimSpace(roomID) == "" { + continue + } + items = append(items, RoomGiftLeaderboardEntry{ + Rank: offset + int64(i) + 1, + RoomID: roomID, + CoinSpent: int64(math.Round(row.Score)), + }) + } + return RoomGiftLeaderboardPage{ + Items: items, + Total: total, + Period: query.Period, + StartAtMS: start.UnixMilli(), + EndAtMS: end.UnixMilli(), + ServerTimeMS: now.UnixMilli(), + }, nil +} + +func (s *Service) ListRoomGiftLeaderboard(ctx context.Context, req *roomv1.ListRoomGiftLeaderboardRequest) (*roomv1.ListRoomGiftLeaderboardResponse, error) { + ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode()) + if s.roomGiftLeaderboard == nil { + return nil, xerr.New(xerr.Unavailable, "room gift leaderboard store is not configured") + } + period := normalizeRoomGiftLeaderboardPeriod(req.GetPeriod()) + if period == "" { + return nil, xerr.New(xerr.InvalidArgument, "period is invalid") + } + page := int(req.GetPage()) + if page <= 0 { + page = 1 + } + pageSize := int(req.GetPageSize()) + if pageSize <= 0 { + pageSize = defaultRoomGiftLeaderboardPageSize + } + if pageSize > maxRoomGiftLeaderboardPageSize { + pageSize = maxRoomGiftLeaderboardPageSize + } + + result, err := s.roomGiftLeaderboard.ListRoomGiftLeaderboard(ctx, RoomGiftLeaderboardQuery{ + AppCode: appcode.FromContext(ctx), + Period: period, + Page: page, + PageSize: pageSize, + NowMS: s.clock.Now().UnixMilli(), + }) + if err != nil { + return nil, err + } + + roomIDs := make([]string, 0, len(result.Items)) + for _, item := range result.Items { + roomIDs = append(roomIDs, item.RoomID) + } + cards, err := s.repository.ListRoomListEntriesByIDs(ctx, RoomListEntriesByIDQuery{ + AppCode: appcode.FromContext(ctx), + RoomIDs: roomIDs, + }) + if err != nil { + return nil, err + } + + items := make([]*roomv1.RoomGiftLeaderboardItem, 0, len(result.Items)) + for _, item := range result.Items { + protoItem := &roomv1.RoomGiftLeaderboardItem{ + Rank: item.Rank, + RoomId: item.RoomID, + CoinSpent: item.CoinSpent, + } + if card, ok := cards[item.RoomID]; ok { + protoItem.Room = roomListItemToProto(card) + } + items = append(items, protoItem) + } + return &roomv1.ListRoomGiftLeaderboardResponse{ + Items: items, + Total: result.Total, + Period: result.Period, + StartAtMs: result.StartAtMS, + EndAtMs: result.EndAtMS, + ServerTimeMs: result.ServerTimeMS, + }, nil +} + +func (s *Service) recordRoomGiftLeaderboardBestEffort(ctx context.Context, input *RoomGiftLeaderboardIncrement) { + if s == nil || s.roomGiftLeaderboard == nil || input == nil { + return + } + if err := s.roomGiftLeaderboard.IncrementRoomGift(ctx, *input); err != nil { + // 榜单 zset 是可重建读模型,失败不能回滚已提交房间命令和账务事实。 + logx.Warn(ctx, "room_gift_leaderboard_update_failed", slog.String("room_id", input.RoomID), slog.Int64("coin_spent", input.CoinSpent), slog.String("error", err.Error())) + return + } +} + +func normalizeRoomGiftLeaderboardQuery(query RoomGiftLeaderboardQuery) RoomGiftLeaderboardQuery { + query.AppCode = appcode.Normalize(query.AppCode) + query.Period = normalizeRoomGiftLeaderboardPeriod(query.Period) + if query.Period == "" { + query.Period = roomGiftLeaderboardPeriodToday + } + if query.Page <= 0 { + query.Page = 1 + } + if query.PageSize <= 0 { + query.PageSize = defaultRoomGiftLeaderboardPageSize + } + if query.PageSize > maxRoomGiftLeaderboardPageSize { + query.PageSize = maxRoomGiftLeaderboardPageSize + } + if query.NowMS <= 0 { + query.NowMS = time.Now().UTC().UnixMilli() + } + return query +} + +func normalizeRoomGiftLeaderboardPeriod(raw string) string { + switch strings.ToLower(strings.TrimSpace(raw)) { + case "", roomGiftLeaderboardPeriodToday, "day", "daily": + return roomGiftLeaderboardPeriodToday + case roomGiftLeaderboardPeriodWeek, "weekly": + return roomGiftLeaderboardPeriodWeek + case roomGiftLeaderboardPeriodMonth, "monthly": + return roomGiftLeaderboardPeriodMonth + default: + return "" + } +} + +func roomGiftLeaderboardWindow(period string, now time.Time) (time.Time, time.Time) { + dayStart := time.Date(now.UTC().Year(), now.UTC().Month(), now.UTC().Day(), 0, 0, 0, 0, time.UTC) + switch period { + case roomGiftLeaderboardPeriodWeek: + weekday := int(dayStart.Weekday()) + if weekday == 0 { + weekday = 7 + } + start := dayStart.AddDate(0, 0, 1-weekday) + return start, start.AddDate(0, 0, 7) + case roomGiftLeaderboardPeriodMonth: + start := time.Date(dayStart.Year(), dayStart.Month(), 1, 0, 0, 0, 0, time.UTC) + return start, start.AddDate(0, 1, 0) + default: + return dayStart, dayStart.AddDate(0, 0, 1) + } +} + +func roomGiftLeaderboardKey(app string, period string, start time.Time) string { + switch period { + case roomGiftLeaderboardPeriodWeek: + year, week := start.ISOWeek() + return fmt.Sprintf("room:gift_leaderboard:%s:week:%04d%02d", appcode.Normalize(app), year, week) + case roomGiftLeaderboardPeriodMonth: + return fmt.Sprintf("room:gift_leaderboard:%s:month:%04d%02d", appcode.Normalize(app), start.Year(), int(start.Month())) + default: + return fmt.Sprintf("room:gift_leaderboard:%s:day:%s", appcode.Normalize(app), start.Format("20060102")) + } +} + +func roomGiftLeaderboardTTL(period string, start time.Time, end time.Time) time.Duration { + switch period { + case roomGiftLeaderboardPeriodMonth: + return end.Sub(start) + 35*24*time.Hour + case roomGiftLeaderboardPeriodWeek: + return end.Sub(start) + 21*24*time.Hour + default: + return end.Sub(start) + 7*24*time.Hour + } +} diff --git a/services/room-service/internal/room/service/service.go b/services/room-service/internal/room/service/service.go index 8d88e991..1f5e7c82 100644 --- a/services/room-service/internal/room/service/service.go +++ b/services/room-service/internal/room/service/service.go @@ -34,6 +34,8 @@ type Config struct { RTCUserRemover integration.RTCUserRemover // RoomTreasureOpenScheduler 把倒计时开箱唤醒交给外部延迟消息,避免只靠已加载 Cell 扫描。 RoomTreasureOpenScheduler integration.RoomTreasureOpenScheduler + // RoomGiftLeaderboard 是跨房间金币榜读模型,SendGift 提交后 best-effort 写入。 + RoomGiftLeaderboard RoomGiftLeaderboardStore // Clock 允许测试注入稳定时间,生产默认使用系统时钟。 Clock clock.Clock } @@ -68,6 +70,8 @@ type Service struct { outboxPublisher integration.OutboxPublisher // roomTreasureOpenScheduler 在 countdown outbox 投递成功后安排 open_at_ms 唤醒。 roomTreasureOpenScheduler integration.RoomTreasureOpenScheduler + // roomGiftLeaderboard 只保存房间维度金币消耗 zset,不承载 Room Cell 核心状态。 + roomGiftLeaderboard RoomGiftLeaderboardStore // rtcUserRemover 在 Room Cell 提交驱逐后同步移除实时音频房连接。 rtcUserRemover integration.RTCUserRemover // draining 表示当前节点正在下线,只允许已经进入执行链路的命令收尾。 @@ -118,6 +122,8 @@ type mutationResult struct { closeInfo *RoomCloseInfo // walletDebitMS 记录 SendGift 同步扣费耗时;非钱包命令保持 0。 walletDebitMS int64 + // roomGiftLeaderboard 是 SendGift 成功后写入跨房间金币榜的轻量增量。 + roomGiftLeaderboard *RoomGiftLeaderboardIncrement } // New 初始化 room-service 领域服务。 @@ -172,6 +178,7 @@ func New(cfg Config, directory router.Directory, repository Repository, wallet i syncPublisher: syncPublisher, outboxPublisher: outboxPublisher, roomTreasureOpenScheduler: cfg.RoomTreasureOpenScheduler, + roomGiftLeaderboard: cfg.RoomGiftLeaderboard, rtcUserRemover: cfg.RTCUserRemover, cells: make(map[string]*cell.RoomCell), } diff --git a/services/room-service/internal/storage/mysql/repository.go b/services/room-service/internal/storage/mysql/repository.go index a7c4b691..5086a317 100644 --- a/services/room-service/internal/storage/mysql/repository.go +++ b/services/room-service/internal/storage/mysql/repository.go @@ -1323,6 +1323,79 @@ func (r *Repository) ListRoomListEntries(ctx context.Context, query roomservice. return entries, nil } +// ListRoomListEntriesByIDs 按榜单已命中的 room_id 批量读取列表卡片。 +func (r *Repository) ListRoomListEntriesByIDs(ctx context.Context, query roomservice.RoomListEntriesByIDQuery) (map[string]roomservice.RoomListEntry, error) { + appCode := normalizedRecordAppCode(ctx, query.AppCode) + roomIDs := uniqueRoomListIDs(query.RoomIDs) + result := make(map[string]roomservice.RoomListEntry, len(roomIDs)) + if len(roomIDs) == 0 { + return result, nil + } + + placeholders := strings.TrimRight(strings.Repeat("?,", len(roomIDs)), ",") + args := make([]any, 0, len(roomIDs)+1) + args = append(args, appCode) + for _, roomID := range roomIDs { + args = append(args, roomID) + } + rows, err := r.db.QueryContext(ctx, ` + SELECT app_code, room_id, room_short_id, visible_region_id, owner_user_id, title, cover_url, mode, status, locked, + heat, online_count, seat_count, occupied_seat_count, sort_score, created_at_ms, updated_at_ms + FROM room_list_entries + WHERE app_code = ? AND room_id IN (`+placeholders+`)`, args...) + if err != nil { + return nil, err + } + defer rows.Close() + + for rows.Next() { + var entry roomservice.RoomListEntry + if err := rows.Scan( + &entry.AppCode, + &entry.RoomID, + &entry.RoomShortID, + &entry.VisibleRegionID, + &entry.OwnerUserID, + &entry.Title, + &entry.CoverURL, + &entry.Mode, + &entry.Status, + &entry.Locked, + &entry.Heat, + &entry.OnlineCount, + &entry.SeatCount, + &entry.OccupiedSeatCount, + &entry.SortScore, + &entry.CreatedAtMS, + &entry.UpdatedAtMS, + ); err != nil { + return nil, err + } + result[entry.RoomID] = entry + } + if err := rows.Err(); err != nil { + return nil, err + } + return result, nil +} + +func uniqueRoomListIDs(values []string) []string { + seen := make(map[string]struct{}, len(values)) + out := make([]string, 0, len(values)) + for _, value := range values { + value = strings.TrimSpace(value) + if value == "" { + continue + } + if _, ok := seen[value]; ok { + continue + } + seen[value] = struct{}{} + out = append(out, value) + } + return out +} + // UpsertRoomUserFeedEntry 写入用户房间关系流索引。 func (r *Repository) UpsertRoomUserFeedEntry(ctx context.Context, entry roomservice.RoomUserFeedEntry) error { // feed 只保存用户到房间的索引;房间卡片字段仍以 room_list_entries 为准,避免复制不一致。 diff --git a/services/room-service/internal/transport/grpc/server.go b/services/room-service/internal/transport/grpc/server.go index a2fdfc09..f9417834 100644 --- a/services/room-service/internal/transport/grpc/server.go +++ b/services/room-service/internal/transport/grpc/server.go @@ -430,6 +430,13 @@ func (s *Server) ListRoomFeeds(ctx context.Context, req *roomv1.ListRoomFeedsReq return mapServiceResult(s.svc.ListRoomFeeds(ctx, req)) } +// ListRoomGiftLeaderboard 代理到 Redis zset 房间金币榜读模型。 +func (s *Server) ListRoomGiftLeaderboard(ctx context.Context, req *roomv1.ListRoomGiftLeaderboardRequest) (*roomv1.ListRoomGiftLeaderboardResponse, error) { + // 房间榜只读 room-service 维护的金币 zset,并用 room_list_entries 批量补卡片。 + ctx = contextWithMetaApp(ctx, req.GetMeta()) + return mapServiceResult(s.svc.ListRoomGiftLeaderboard(ctx, req)) +} + // GetMyRoom 代理到 Mine 顶部“我的房间”权威查询。 func (s *Server) GetMyRoom(ctx context.Context, req *roomv1.GetMyRoomRequest) (*roomv1.GetMyRoomResponse, error) { // 我的房间查询直接读取 rooms 元数据,并用快照补齐实时卡片字段,不依赖发现页投影。