This commit is contained in:
zhx 2026-07-21 12:41:24 +08:00
parent 55a5a23f67
commit ec0fb81eac
15 changed files with 719 additions and 208 deletions

View File

@ -13022,6 +13022,144 @@ func (x *GetRoomRocketResponse) GetServerTimeMs() int64 {
return 0
}
// ApplyRoomRPSGiftRequest 只承载 room-rps 最终结算后真实发生的一份败者礼物。
// game-service 的预扣、平局退款和赢家本金退款都不能调用该接口。
type ApplyRoomRPSGiftRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
Meta *RequestMeta `protobuf:"bytes,1,opt,name=meta,proto3" json:"meta,omitempty"`
RoomId string `protobuf:"bytes,2,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"`
SenderUserId int64 `protobuf:"varint,3,opt,name=sender_user_id,json=senderUserId,proto3" json:"sender_user_id,omitempty"`
TargetUserId int64 `protobuf:"varint,4,opt,name=target_user_id,json=targetUserId,proto3" json:"target_user_id,omitempty"`
GiftId string `protobuf:"bytes,5,opt,name=gift_id,json=giftId,proto3" json:"gift_id,omitempty"`
HeatValue int64 `protobuf:"varint,6,opt,name=heat_value,json=heatValue,proto3" json:"heat_value,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ApplyRoomRPSGiftRequest) Reset() {
*x = ApplyRoomRPSGiftRequest{}
mi := &file_proto_room_v1_room_proto_msgTypes[161]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ApplyRoomRPSGiftRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ApplyRoomRPSGiftRequest) ProtoMessage() {}
func (x *ApplyRoomRPSGiftRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_room_v1_room_proto_msgTypes[161]
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 ApplyRoomRPSGiftRequest.ProtoReflect.Descriptor instead.
func (*ApplyRoomRPSGiftRequest) Descriptor() ([]byte, []int) {
return file_proto_room_v1_room_proto_rawDescGZIP(), []int{161}
}
func (x *ApplyRoomRPSGiftRequest) GetMeta() *RequestMeta {
if x != nil {
return x.Meta
}
return nil
}
func (x *ApplyRoomRPSGiftRequest) GetRoomId() string {
if x != nil {
return x.RoomId
}
return ""
}
func (x *ApplyRoomRPSGiftRequest) GetSenderUserId() int64 {
if x != nil {
return x.SenderUserId
}
return 0
}
func (x *ApplyRoomRPSGiftRequest) GetTargetUserId() int64 {
if x != nil {
return x.TargetUserId
}
return 0
}
func (x *ApplyRoomRPSGiftRequest) GetGiftId() string {
if x != nil {
return x.GiftId
}
return ""
}
func (x *ApplyRoomRPSGiftRequest) GetHeatValue() int64 {
if x != nil {
return x.HeatValue
}
return 0
}
type ApplyRoomRPSGiftResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
Result *CommandResult `protobuf:"bytes,1,opt,name=result,proto3" json:"result,omitempty"`
Rocket *RoomRocketState `protobuf:"bytes,2,opt,name=rocket,proto3" json:"rocket,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ApplyRoomRPSGiftResponse) Reset() {
*x = ApplyRoomRPSGiftResponse{}
mi := &file_proto_room_v1_room_proto_msgTypes[162]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ApplyRoomRPSGiftResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ApplyRoomRPSGiftResponse) ProtoMessage() {}
func (x *ApplyRoomRPSGiftResponse) ProtoReflect() protoreflect.Message {
mi := &file_proto_room_v1_room_proto_msgTypes[162]
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 ApplyRoomRPSGiftResponse.ProtoReflect.Descriptor instead.
func (*ApplyRoomRPSGiftResponse) Descriptor() ([]byte, []int) {
return file_proto_room_v1_room_proto_rawDescGZIP(), []int{162}
}
func (x *ApplyRoomRPSGiftResponse) GetResult() *CommandResult {
if x != nil {
return x.Result
}
return nil
}
func (x *ApplyRoomRPSGiftResponse) GetRocket() *RoomRocketState {
if x != nil {
return x.Rocket
}
return nil
}
// ListRoomOnlineUsersRequest 分页查询房间在线用户,不让客户端拉完整 RoomSnapshot 做列表分页。
type ListRoomOnlineUsersRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
@ -13037,7 +13175,7 @@ type ListRoomOnlineUsersRequest struct {
func (x *ListRoomOnlineUsersRequest) Reset() {
*x = ListRoomOnlineUsersRequest{}
mi := &file_proto_room_v1_room_proto_msgTypes[161]
mi := &file_proto_room_v1_room_proto_msgTypes[163]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -13049,7 +13187,7 @@ func (x *ListRoomOnlineUsersRequest) String() string {
func (*ListRoomOnlineUsersRequest) ProtoMessage() {}
func (x *ListRoomOnlineUsersRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_room_v1_room_proto_msgTypes[161]
mi := &file_proto_room_v1_room_proto_msgTypes[163]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -13062,7 +13200,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{161}
return file_proto_room_v1_room_proto_rawDescGZIP(), []int{163}
}
func (x *ListRoomOnlineUsersRequest) GetMeta() *RequestMeta {
@ -13121,7 +13259,7 @@ type ListRoomOnlineUsersResponse struct {
func (x *ListRoomOnlineUsersResponse) Reset() {
*x = ListRoomOnlineUsersResponse{}
mi := &file_proto_room_v1_room_proto_msgTypes[162]
mi := &file_proto_room_v1_room_proto_msgTypes[164]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -13133,7 +13271,7 @@ func (x *ListRoomOnlineUsersResponse) String() string {
func (*ListRoomOnlineUsersResponse) ProtoMessage() {}
func (x *ListRoomOnlineUsersResponse) ProtoReflect() protoreflect.Message {
mi := &file_proto_room_v1_room_proto_msgTypes[162]
mi := &file_proto_room_v1_room_proto_msgTypes[164]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -13146,7 +13284,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{162}
return file_proto_room_v1_room_proto_rawDescGZIP(), []int{164}
}
func (x *ListRoomOnlineUsersResponse) GetUsers() []*RoomUser {
@ -13207,7 +13345,7 @@ type RoomBannedUser struct {
func (x *RoomBannedUser) Reset() {
*x = RoomBannedUser{}
mi := &file_proto_room_v1_room_proto_msgTypes[163]
mi := &file_proto_room_v1_room_proto_msgTypes[165]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -13219,7 +13357,7 @@ func (x *RoomBannedUser) String() string {
func (*RoomBannedUser) ProtoMessage() {}
func (x *RoomBannedUser) ProtoReflect() protoreflect.Message {
mi := &file_proto_room_v1_room_proto_msgTypes[163]
mi := &file_proto_room_v1_room_proto_msgTypes[165]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -13232,7 +13370,7 @@ func (x *RoomBannedUser) ProtoReflect() protoreflect.Message {
// Deprecated: Use RoomBannedUser.ProtoReflect.Descriptor instead.
func (*RoomBannedUser) Descriptor() ([]byte, []int) {
return file_proto_room_v1_room_proto_rawDescGZIP(), []int{163}
return file_proto_room_v1_room_proto_rawDescGZIP(), []int{165}
}
func (x *RoomBannedUser) GetUserId() int64 {
@ -13291,7 +13429,7 @@ type ListRoomBannedUsersRequest struct {
func (x *ListRoomBannedUsersRequest) Reset() {
*x = ListRoomBannedUsersRequest{}
mi := &file_proto_room_v1_room_proto_msgTypes[164]
mi := &file_proto_room_v1_room_proto_msgTypes[166]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -13303,7 +13441,7 @@ func (x *ListRoomBannedUsersRequest) String() string {
func (*ListRoomBannedUsersRequest) ProtoMessage() {}
func (x *ListRoomBannedUsersRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_room_v1_room_proto_msgTypes[164]
mi := &file_proto_room_v1_room_proto_msgTypes[166]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -13316,7 +13454,7 @@ func (x *ListRoomBannedUsersRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use ListRoomBannedUsersRequest.ProtoReflect.Descriptor instead.
func (*ListRoomBannedUsersRequest) Descriptor() ([]byte, []int) {
return file_proto_room_v1_room_proto_rawDescGZIP(), []int{164}
return file_proto_room_v1_room_proto_rawDescGZIP(), []int{166}
}
func (x *ListRoomBannedUsersRequest) GetMeta() *RequestMeta {
@ -13367,7 +13505,7 @@ type ListRoomBannedUsersResponse struct {
func (x *ListRoomBannedUsersResponse) Reset() {
*x = ListRoomBannedUsersResponse{}
mi := &file_proto_room_v1_room_proto_msgTypes[165]
mi := &file_proto_room_v1_room_proto_msgTypes[167]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -13379,7 +13517,7 @@ func (x *ListRoomBannedUsersResponse) String() string {
func (*ListRoomBannedUsersResponse) ProtoMessage() {}
func (x *ListRoomBannedUsersResponse) ProtoReflect() protoreflect.Message {
mi := &file_proto_room_v1_room_proto_msgTypes[165]
mi := &file_proto_room_v1_room_proto_msgTypes[167]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -13392,7 +13530,7 @@ func (x *ListRoomBannedUsersResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use ListRoomBannedUsersResponse.ProtoReflect.Descriptor instead.
func (*ListRoomBannedUsersResponse) Descriptor() ([]byte, []int) {
return file_proto_room_v1_room_proto_rawDescGZIP(), []int{165}
return file_proto_room_v1_room_proto_rawDescGZIP(), []int{167}
}
func (x *ListRoomBannedUsersResponse) GetItems() []*RoomBannedUser {
@ -13443,7 +13581,7 @@ type FollowRoomRequest struct {
func (x *FollowRoomRequest) Reset() {
*x = FollowRoomRequest{}
mi := &file_proto_room_v1_room_proto_msgTypes[166]
mi := &file_proto_room_v1_room_proto_msgTypes[168]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -13455,7 +13593,7 @@ func (x *FollowRoomRequest) String() string {
func (*FollowRoomRequest) ProtoMessage() {}
func (x *FollowRoomRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_room_v1_room_proto_msgTypes[166]
mi := &file_proto_room_v1_room_proto_msgTypes[168]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -13468,7 +13606,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{166}
return file_proto_room_v1_room_proto_rawDescGZIP(), []int{168}
}
func (x *FollowRoomRequest) GetMeta() *RequestMeta {
@ -13504,7 +13642,7 @@ type FollowRoomResponse struct {
func (x *FollowRoomResponse) Reset() {
*x = FollowRoomResponse{}
mi := &file_proto_room_v1_room_proto_msgTypes[167]
mi := &file_proto_room_v1_room_proto_msgTypes[169]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -13516,7 +13654,7 @@ func (x *FollowRoomResponse) String() string {
func (*FollowRoomResponse) ProtoMessage() {}
func (x *FollowRoomResponse) ProtoReflect() protoreflect.Message {
mi := &file_proto_room_v1_room_proto_msgTypes[167]
mi := &file_proto_room_v1_room_proto_msgTypes[169]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -13529,7 +13667,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{167}
return file_proto_room_v1_room_proto_rawDescGZIP(), []int{169}
}
func (x *FollowRoomResponse) GetRoomId() string {
@ -13572,7 +13710,7 @@ type UnfollowRoomRequest struct {
func (x *UnfollowRoomRequest) Reset() {
*x = UnfollowRoomRequest{}
mi := &file_proto_room_v1_room_proto_msgTypes[168]
mi := &file_proto_room_v1_room_proto_msgTypes[170]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -13584,7 +13722,7 @@ func (x *UnfollowRoomRequest) String() string {
func (*UnfollowRoomRequest) ProtoMessage() {}
func (x *UnfollowRoomRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_room_v1_room_proto_msgTypes[168]
mi := &file_proto_room_v1_room_proto_msgTypes[170]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -13597,7 +13735,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{168}
return file_proto_room_v1_room_proto_rawDescGZIP(), []int{170}
}
func (x *UnfollowRoomRequest) GetMeta() *RequestMeta {
@ -13632,7 +13770,7 @@ type UnfollowRoomResponse struct {
func (x *UnfollowRoomResponse) Reset() {
*x = UnfollowRoomResponse{}
mi := &file_proto_room_v1_room_proto_msgTypes[169]
mi := &file_proto_room_v1_room_proto_msgTypes[171]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -13644,7 +13782,7 @@ func (x *UnfollowRoomResponse) String() string {
func (*UnfollowRoomResponse) ProtoMessage() {}
func (x *UnfollowRoomResponse) ProtoReflect() protoreflect.Message {
mi := &file_proto_room_v1_room_proto_msgTypes[169]
mi := &file_proto_room_v1_room_proto_msgTypes[171]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -13657,7 +13795,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{169}
return file_proto_room_v1_room_proto_rawDescGZIP(), []int{171}
}
func (x *UnfollowRoomResponse) GetRoomId() string {
@ -13697,7 +13835,7 @@ type SendGiftLuckyHit struct {
func (x *SendGiftLuckyHit) Reset() {
*x = SendGiftLuckyHit{}
mi := &file_proto_room_v1_room_proto_msgTypes[170]
mi := &file_proto_room_v1_room_proto_msgTypes[172]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -13709,7 +13847,7 @@ func (x *SendGiftLuckyHit) String() string {
func (*SendGiftLuckyHit) ProtoMessage() {}
func (x *SendGiftLuckyHit) ProtoReflect() protoreflect.Message {
mi := &file_proto_room_v1_room_proto_msgTypes[170]
mi := &file_proto_room_v1_room_proto_msgTypes[172]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -13722,7 +13860,7 @@ func (x *SendGiftLuckyHit) ProtoReflect() protoreflect.Message {
// Deprecated: Use SendGiftLuckyHit.ProtoReflect.Descriptor instead.
func (*SendGiftLuckyHit) Descriptor() ([]byte, []int) {
return file_proto_room_v1_room_proto_rawDescGZIP(), []int{170}
return file_proto_room_v1_room_proto_rawDescGZIP(), []int{172}
}
func (x *SendGiftLuckyHit) GetGiftIndex() int32 {
@ -13799,7 +13937,7 @@ type SendGiftResultV2 struct {
func (x *SendGiftResultV2) Reset() {
*x = SendGiftResultV2{}
mi := &file_proto_room_v1_room_proto_msgTypes[171]
mi := &file_proto_room_v1_room_proto_msgTypes[173]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@ -13811,7 +13949,7 @@ func (x *SendGiftResultV2) String() string {
func (*SendGiftResultV2) ProtoMessage() {}
func (x *SendGiftResultV2) ProtoReflect() protoreflect.Message {
mi := &file_proto_room_v1_room_proto_msgTypes[171]
mi := &file_proto_room_v1_room_proto_msgTypes[173]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@ -13824,7 +13962,7 @@ func (x *SendGiftResultV2) ProtoReflect() protoreflect.Message {
// Deprecated: Use SendGiftResultV2.ProtoReflect.Descriptor instead.
func (*SendGiftResultV2) Descriptor() ([]byte, []int) {
return file_proto_room_v1_room_proto_rawDescGZIP(), []int{171}
return file_proto_room_v1_room_proto_rawDescGZIP(), []int{173}
}
func (x *SendGiftResultV2) GetApiVersion() int32 {
@ -15119,7 +15257,18 @@ const file_proto_room_v1_room_proto_rawDesc = "" +
"\x0eviewer_user_id\x18\x03 \x01(\x03R\fviewerUserId\"t\n" +
"\x15GetRoomRocketResponse\x125\n" +
"\x06rocket\x18\x01 \x01(\v2\x1d.hyapp.room.v1.RoomRocketInfoR\x06rocket\x12$\n" +
"\x0eserver_time_ms\x18\x02 \x01(\x03R\fserverTimeMs\"\xd0\x01\n" +
"\x0eserver_time_ms\x18\x02 \x01(\x03R\fserverTimeMs\"\xe6\x01\n" +
"\x17ApplyRoomRPSGiftRequest\x12.\n" +
"\x04meta\x18\x01 \x01(\v2\x1a.hyapp.room.v1.RequestMetaR\x04meta\x12\x17\n" +
"\aroom_id\x18\x02 \x01(\tR\x06roomId\x12$\n" +
"\x0esender_user_id\x18\x03 \x01(\x03R\fsenderUserId\x12$\n" +
"\x0etarget_user_id\x18\x04 \x01(\x03R\ftargetUserId\x12\x17\n" +
"\agift_id\x18\x05 \x01(\tR\x06giftId\x12\x1d\n" +
"\n" +
"heat_value\x18\x06 \x01(\x03R\theatValue\"\x88\x01\n" +
"\x18ApplyRoomRPSGiftResponse\x124\n" +
"\x06result\x18\x01 \x01(\v2\x1c.hyapp.room.v1.CommandResultR\x06result\x126\n" +
"\x06rocket\x18\x02 \x01(\v2\x1e.hyapp.room.v1.RoomRocketStateR\x06rocket\"\xd0\x01\n" +
"\x1aListRoomOnlineUsersRequest\x12.\n" +
"\x04meta\x18\x01 \x01(\v2\x1a.hyapp.room.v1.RequestMetaR\x04meta\x12\x17\n" +
"\aroom_id\x18\x02 \x01(\tR\x06roomId\x12$\n" +
@ -15203,7 +15352,7 @@ const file_proto_room_v1_room_proto_rawDesc = "" +
"\rbatch_display\x18\x10 \x01(\v2#.hyapp.room.v1.SendGiftBatchDisplayR\fbatchDisplay\x12\x1b\n" +
"\troom_heat\x18\x11 \x01(\x03R\broomHeat\x124\n" +
"\tgift_rank\x18\x12 \x03(\v2\x17.hyapp.room.v1.RankItemR\bgiftRank\x12)\n" +
"\x10operation_status\x18\x13 \x01(\tR\x0foperationStatus2\xfc\x1c\n" +
"\x10operation_status\x18\x13 \x01(\tR\x0foperationStatus2\xe1\x1d\n" +
"\x12RoomCommandService\x12Q\n" +
"\n" +
"CreateRoom\x12 .hyapp.room.v1.CreateRoomRequest\x1a!.hyapp.room.v1.CreateRoomResponse\x12f\n" +
@ -15242,7 +15391,8 @@ const file_proto_room_v1_room_proto_rawDesc = "" +
"\bKickUser\x12\x1e.hyapp.room.v1.KickUserRequest\x1a\x1f.hyapp.room.v1.KickUserResponse\x12N\n" +
"\tUnbanUser\x12\x1f.hyapp.room.v1.UnbanUserRequest\x1a .hyapp.room.v1.UnbanUserResponse\x12`\n" +
"\x0fSystemEvictUser\x12%.hyapp.room.v1.SystemEvictUserRequest\x1a&.hyapp.room.v1.SystemEvictUserResponse\x12K\n" +
"\bSendGift\x12\x1e.hyapp.room.v1.SendGiftRequest\x1a\x1f.hyapp.room.v1.SendGiftResponse\x12Q\n" +
"\bSendGift\x12\x1e.hyapp.room.v1.SendGiftRequest\x1a\x1f.hyapp.room.v1.SendGiftResponse\x12c\n" +
"\x10ApplyRoomRPSGift\x12&.hyapp.room.v1.ApplyRoomRPSGiftRequest\x1a'.hyapp.room.v1.ApplyRoomRPSGiftResponse\x12Q\n" +
"\n" +
"FollowRoom\x12 .hyapp.room.v1.FollowRoomRequest\x1a!.hyapp.room.v1.FollowRoomResponse\x12W\n" +
"\fUnfollowRoom\x12\".hyapp.room.v1.UnfollowRoomRequest\x1a#.hyapp.room.v1.UnfollowRoomResponse2\xd0\x04\n" +
@ -15287,7 +15437,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, 173)
var file_proto_room_v1_room_proto_msgTypes = make([]protoimpl.MessageInfo, 175)
var file_proto_room_v1_room_proto_goTypes = []any{
(*RequestMeta)(nil), // 0: hyapp.room.v1.RequestMeta
(*CommandResult)(nil), // 1: hyapp.room.v1.CommandResult
@ -15450,21 +15600,23 @@ var file_proto_room_v1_room_proto_goTypes = []any{
(*GetRoomSnapshotResponse)(nil), // 158: hyapp.room.v1.GetRoomSnapshotResponse
(*GetRoomRocketRequest)(nil), // 159: hyapp.room.v1.GetRoomRocketRequest
(*GetRoomRocketResponse)(nil), // 160: hyapp.room.v1.GetRoomRocketResponse
(*ListRoomOnlineUsersRequest)(nil), // 161: hyapp.room.v1.ListRoomOnlineUsersRequest
(*ListRoomOnlineUsersResponse)(nil), // 162: hyapp.room.v1.ListRoomOnlineUsersResponse
(*RoomBannedUser)(nil), // 163: hyapp.room.v1.RoomBannedUser
(*ListRoomBannedUsersRequest)(nil), // 164: hyapp.room.v1.ListRoomBannedUsersRequest
(*ListRoomBannedUsersResponse)(nil), // 165: hyapp.room.v1.ListRoomBannedUsersResponse
(*FollowRoomRequest)(nil), // 166: hyapp.room.v1.FollowRoomRequest
(*FollowRoomResponse)(nil), // 167: hyapp.room.v1.FollowRoomResponse
(*UnfollowRoomRequest)(nil), // 168: hyapp.room.v1.UnfollowRoomRequest
(*UnfollowRoomResponse)(nil), // 169: hyapp.room.v1.UnfollowRoomResponse
(*SendGiftLuckyHit)(nil), // 170: hyapp.room.v1.SendGiftLuckyHit
(*SendGiftResultV2)(nil), // 171: hyapp.room.v1.SendGiftResultV2
nil, // 172: hyapp.room.v1.RoomSnapshot.RoomExtEntry
(*ApplyRoomRPSGiftRequest)(nil), // 161: hyapp.room.v1.ApplyRoomRPSGiftRequest
(*ApplyRoomRPSGiftResponse)(nil), // 162: hyapp.room.v1.ApplyRoomRPSGiftResponse
(*ListRoomOnlineUsersRequest)(nil), // 163: hyapp.room.v1.ListRoomOnlineUsersRequest
(*ListRoomOnlineUsersResponse)(nil), // 164: hyapp.room.v1.ListRoomOnlineUsersResponse
(*RoomBannedUser)(nil), // 165: hyapp.room.v1.RoomBannedUser
(*ListRoomBannedUsersRequest)(nil), // 166: hyapp.room.v1.ListRoomBannedUsersRequest
(*ListRoomBannedUsersResponse)(nil), // 167: hyapp.room.v1.ListRoomBannedUsersResponse
(*FollowRoomRequest)(nil), // 168: hyapp.room.v1.FollowRoomRequest
(*FollowRoomResponse)(nil), // 169: hyapp.room.v1.FollowRoomResponse
(*UnfollowRoomRequest)(nil), // 170: hyapp.room.v1.UnfollowRoomRequest
(*UnfollowRoomResponse)(nil), // 171: hyapp.room.v1.UnfollowRoomResponse
(*SendGiftLuckyHit)(nil), // 172: hyapp.room.v1.SendGiftLuckyHit
(*SendGiftResultV2)(nil), // 173: hyapp.room.v1.SendGiftResultV2
nil, // 174: hyapp.room.v1.RoomSnapshot.RoomExtEntry
}
var file_proto_room_v1_room_proto_depIdxs = []int32{
170, // 0: hyapp.room.v1.LuckyGiftDrawResult.hits:type_name -> hyapp.room.v1.SendGiftLuckyHit
172, // 0: hyapp.room.v1.LuckyGiftDrawResult.hits:type_name -> hyapp.room.v1.SendGiftLuckyHit
8, // 1: hyapp.room.v1.RoomRocketLevel.in_room_rewards:type_name -> hyapp.room.v1.RoomRocketRewardItem
8, // 2: hyapp.room.v1.RoomRocketLevel.top1_rewards:type_name -> hyapp.room.v1.RoomRocketRewardItem
8, // 3: hyapp.room.v1.RoomRocketLevel.igniter_rewards:type_name -> hyapp.room.v1.RoomRocketRewardItem
@ -15511,7 +15663,7 @@ var file_proto_room_v1_room_proto_depIdxs = []int32{
4, // 44: hyapp.room.v1.RoomSnapshot.mic_seats:type_name -> hyapp.room.v1.SeatState
2, // 45: hyapp.room.v1.RoomSnapshot.online_users:type_name -> hyapp.room.v1.RoomUser
5, // 46: hyapp.room.v1.RoomSnapshot.gift_rank:type_name -> hyapp.room.v1.RankItem
172, // 47: hyapp.room.v1.RoomSnapshot.room_ext:type_name -> hyapp.room.v1.RoomSnapshot.RoomExtEntry
174, // 47: hyapp.room.v1.RoomSnapshot.room_ext:type_name -> hyapp.room.v1.RoomSnapshot.RoomExtEntry
13, // 48: hyapp.room.v1.RoomSnapshot.rocket:type_name -> hyapp.room.v1.RoomRocketState
53, // 49: hyapp.room.v1.RoomSnapshot.ban_states:type_name -> hyapp.room.v1.RoomBanState
63, // 50: hyapp.room.v1.RoomSnapshot.room_border:type_name -> hyapp.room.v1.RoomDecorationResource
@ -15637,7 +15789,7 @@ var file_proto_room_v1_room_proto_depIdxs = []int32{
7, // 170: hyapp.room.v1.SendGiftResponse.lucky_gift:type_name -> hyapp.room.v1.LuckyGiftDrawResult
7, // 171: hyapp.room.v1.SendGiftResponse.lucky_gifts:type_name -> hyapp.room.v1.LuckyGiftDrawResult
129, // 172: hyapp.room.v1.SendGiftResponse.batch_display:type_name -> hyapp.room.v1.SendGiftBatchDisplay
171, // 173: hyapp.room.v1.SendGiftResponse.v2:type_name -> hyapp.room.v1.SendGiftResultV2
173, // 173: hyapp.room.v1.SendGiftResponse.v2:type_name -> hyapp.room.v1.SendGiftResultV2
0, // 174: hyapp.room.v1.ListRoomsRequest.meta:type_name -> hyapp.room.v1.RequestMeta
0, // 175: hyapp.room.v1.ListRoomsByOwnersRequest.meta:type_name -> hyapp.room.v1.RequestMeta
0, // 176: hyapp.room.v1.ListRoomFeedsRequest.meta:type_name -> hyapp.room.v1.RequestMeta
@ -15660,151 +15812,156 @@ var file_proto_room_v1_room_proto_depIdxs = []int32{
54, // 193: hyapp.room.v1.GetRoomSnapshotResponse.room:type_name -> hyapp.room.v1.RoomSnapshot
0, // 194: hyapp.room.v1.GetRoomRocketRequest.meta:type_name -> hyapp.room.v1.RequestMeta
14, // 195: hyapp.room.v1.GetRoomRocketResponse.rocket:type_name -> hyapp.room.v1.RoomRocketInfo
0, // 196: hyapp.room.v1.ListRoomOnlineUsersRequest.meta:type_name -> hyapp.room.v1.RequestMeta
2, // 197: hyapp.room.v1.ListRoomOnlineUsersResponse.users:type_name -> hyapp.room.v1.RoomUser
3, // 198: hyapp.room.v1.ListRoomOnlineUsersResponse.items:type_name -> hyapp.room.v1.RoomOnlineUser
0, // 199: hyapp.room.v1.ListRoomBannedUsersRequest.meta:type_name -> hyapp.room.v1.RequestMeta
163, // 200: hyapp.room.v1.ListRoomBannedUsersResponse.items:type_name -> hyapp.room.v1.RoomBannedUser
0, // 201: hyapp.room.v1.FollowRoomRequest.meta:type_name -> hyapp.room.v1.RequestMeta
0, // 202: hyapp.room.v1.UnfollowRoomRequest.meta:type_name -> hyapp.room.v1.RequestMeta
7, // 203: hyapp.room.v1.SendGiftResultV2.lucky_gift:type_name -> hyapp.room.v1.LuckyGiftDrawResult
7, // 204: hyapp.room.v1.SendGiftResultV2.lucky_gifts:type_name -> hyapp.room.v1.LuckyGiftDrawResult
170, // 205: hyapp.room.v1.SendGiftResultV2.lucky_hits:type_name -> hyapp.room.v1.SendGiftLuckyHit
129, // 206: hyapp.room.v1.SendGiftResultV2.batch_display:type_name -> hyapp.room.v1.SendGiftBatchDisplay
5, // 207: hyapp.room.v1.SendGiftResultV2.gift_rank:type_name -> hyapp.room.v1.RankItem
72, // 208: hyapp.room.v1.RoomCommandService.CreateRoom:input_type -> hyapp.room.v1.CreateRoomRequest
74, // 209: hyapp.room.v1.RoomCommandService.UpdateRoomProfile:input_type -> hyapp.room.v1.UpdateRoomProfileRequest
57, // 210: hyapp.room.v1.RoomCommandService.SaveRoomBackground:input_type -> hyapp.room.v1.SaveRoomBackgroundRequest
61, // 211: hyapp.room.v1.RoomCommandService.SetRoomBackground:input_type -> hyapp.room.v1.SetRoomBackgroundRequest
64, // 212: hyapp.room.v1.RoomCommandService.ApplyRoomDecoration:input_type -> hyapp.room.v1.ApplyRoomDecorationRequest
70, // 213: hyapp.room.v1.RoomCommandService.SendRoomImage:input_type -> hyapp.room.v1.SendRoomImageRequest
78, // 214: hyapp.room.v1.RoomCommandService.JoinRoom:input_type -> hyapp.room.v1.JoinRoomRequest
81, // 215: hyapp.room.v1.RoomCommandService.RoomHeartbeat:input_type -> hyapp.room.v1.RoomHeartbeatRequest
83, // 216: hyapp.room.v1.RoomCommandService.LeaveRoom:input_type -> hyapp.room.v1.LeaveRoomRequest
85, // 217: hyapp.room.v1.RoomCommandService.CloseRoom:input_type -> hyapp.room.v1.CloseRoomRequest
92, // 218: hyapp.room.v1.RoomCommandService.AdminUpdateRoom:input_type -> hyapp.room.v1.AdminUpdateRoomRequest
94, // 219: hyapp.room.v1.RoomCommandService.AdminDeleteRoom:input_type -> hyapp.room.v1.AdminDeleteRoomRequest
19, // 220: hyapp.room.v1.RoomCommandService.AdminUpdateRoomRocketConfig:input_type -> hyapp.room.v1.AdminUpdateRoomRocketConfigRequest
24, // 221: hyapp.room.v1.RoomCommandService.AdminUpdateRoomSeatConfig:input_type -> hyapp.room.v1.AdminUpdateRoomSeatConfigRequest
31, // 222: hyapp.room.v1.RoomCommandService.AdminUpdateHumanRoomRobotConfig:input_type -> hyapp.room.v1.AdminUpdateHumanRoomRobotConfigRequest
37, // 223: hyapp.room.v1.RoomCommandService.AdminCreateRoomPin:input_type -> hyapp.room.v1.AdminCreateRoomPinRequest
39, // 224: hyapp.room.v1.RoomCommandService.AdminCancelRoomPin:input_type -> hyapp.room.v1.AdminCancelRoomPinRequest
45, // 225: hyapp.room.v1.RoomCommandService.AdminCreateRobotRoom:input_type -> hyapp.room.v1.AdminCreateRobotRoomRequest
47, // 226: hyapp.room.v1.RoomCommandService.AdminSetRobotRoomStatus:input_type -> hyapp.room.v1.AdminSetRobotRoomStatusRequest
49, // 227: hyapp.room.v1.RoomCommandService.AdminRenameOwnerCountryCode:input_type -> hyapp.room.v1.AdminRenameOwnerCountryCodeRequest
96, // 228: hyapp.room.v1.RoomCommandService.MicUp:input_type -> hyapp.room.v1.MicUpRequest
98, // 229: hyapp.room.v1.RoomCommandService.MicDown:input_type -> hyapp.room.v1.MicDownRequest
100, // 230: hyapp.room.v1.RoomCommandService.ChangeMicSeat:input_type -> hyapp.room.v1.ChangeMicSeatRequest
102, // 231: hyapp.room.v1.RoomCommandService.ConfirmMicPublishing:input_type -> hyapp.room.v1.ConfirmMicPublishingRequest
104, // 232: hyapp.room.v1.RoomCommandService.MicHeartbeat:input_type -> hyapp.room.v1.MicHeartbeatRequest
106, // 233: hyapp.room.v1.RoomCommandService.SetMicMute:input_type -> hyapp.room.v1.SetMicMuteRequest
108, // 234: hyapp.room.v1.RoomCommandService.ApplyRTCEvent:input_type -> hyapp.room.v1.ApplyRTCEventRequest
110, // 235: hyapp.room.v1.RoomCommandService.SetMicSeatLock:input_type -> hyapp.room.v1.SetMicSeatLockRequest
112, // 236: hyapp.room.v1.RoomCommandService.SetChatEnabled:input_type -> hyapp.room.v1.SetChatEnabledRequest
114, // 237: hyapp.room.v1.RoomCommandService.SetRoomPassword:input_type -> hyapp.room.v1.SetRoomPasswordRequest
116, // 238: hyapp.room.v1.RoomCommandService.SetRoomAdmin:input_type -> hyapp.room.v1.SetRoomAdminRequest
118, // 239: hyapp.room.v1.RoomCommandService.MuteUser:input_type -> hyapp.room.v1.MuteUserRequest
120, // 240: hyapp.room.v1.RoomCommandService.KickUser:input_type -> hyapp.room.v1.KickUserRequest
122, // 241: hyapp.room.v1.RoomCommandService.UnbanUser:input_type -> hyapp.room.v1.UnbanUserRequest
124, // 242: hyapp.room.v1.RoomCommandService.SystemEvictUser:input_type -> hyapp.room.v1.SystemEvictUserRequest
130, // 243: hyapp.room.v1.RoomCommandService.SendGift:input_type -> hyapp.room.v1.SendGiftRequest
166, // 244: hyapp.room.v1.RoomCommandService.FollowRoom:input_type -> hyapp.room.v1.FollowRoomRequest
168, // 245: hyapp.room.v1.RoomCommandService.UnfollowRoom:input_type -> hyapp.room.v1.UnfollowRoomRequest
132, // 246: hyapp.room.v1.RoomGuardService.CheckSpeakPermission:input_type -> hyapp.room.v1.CheckSpeakPermissionRequest
134, // 247: hyapp.room.v1.RoomGuardService.VerifyRoomPresence:input_type -> hyapp.room.v1.VerifyRoomPresenceRequest
136, // 248: hyapp.room.v1.RoomGuardService.ResolveRoomAppCode:input_type -> hyapp.room.v1.ResolveRoomAppCodeRequest
66, // 249: hyapp.room.v1.RoomGuardService.AuthorizeRoomMediaUpload:input_type -> hyapp.room.v1.AuthorizeRoomMediaUploadRequest
68, // 250: hyapp.room.v1.RoomGuardService.CompleteRoomMediaUpload:input_type -> hyapp.room.v1.CompleteRoomMediaUploadRequest
88, // 251: hyapp.room.v1.RoomQueryService.AdminListRooms:input_type -> hyapp.room.v1.AdminListRoomsRequest
90, // 252: hyapp.room.v1.RoomQueryService.AdminGetRoom:input_type -> hyapp.room.v1.AdminGetRoomRequest
17, // 253: hyapp.room.v1.RoomQueryService.AdminGetRoomRocketConfig:input_type -> hyapp.room.v1.AdminGetRoomRocketConfigRequest
22, // 254: hyapp.room.v1.RoomQueryService.AdminGetRoomSeatConfig:input_type -> hyapp.room.v1.AdminGetRoomSeatConfigRequest
29, // 255: hyapp.room.v1.RoomQueryService.AdminGetHumanRoomRobotConfig:input_type -> hyapp.room.v1.AdminGetHumanRoomRobotConfigRequest
35, // 256: hyapp.room.v1.RoomQueryService.AdminListRoomPins:input_type -> hyapp.room.v1.AdminListRoomPinsRequest
43, // 257: hyapp.room.v1.RoomQueryService.AdminListRobotRooms:input_type -> hyapp.room.v1.AdminListRobotRoomsRequest
51, // 258: hyapp.room.v1.RoomQueryService.AdminFilterAvailableRoomRobots:input_type -> hyapp.room.v1.AdminFilterAvailableRoomRobotsRequest
138, // 259: hyapp.room.v1.RoomQueryService.ListRooms:input_type -> hyapp.room.v1.ListRoomsRequest
139, // 260: hyapp.room.v1.RoomQueryService.ListRoomsByOwners:input_type -> hyapp.room.v1.ListRoomsByOwnersRequest
140, // 261: hyapp.room.v1.RoomQueryService.ListRoomFeeds:input_type -> hyapp.room.v1.ListRoomFeedsRequest
141, // 262: hyapp.room.v1.RoomQueryService.ListRoomGiftLeaderboard:input_type -> hyapp.room.v1.ListRoomGiftLeaderboardRequest
147, // 263: hyapp.room.v1.RoomQueryService.ListRoomContributionRank:input_type -> hyapp.room.v1.ListRoomContributionRankRequest
149, // 264: hyapp.room.v1.RoomQueryService.GetMyRoom:input_type -> hyapp.room.v1.GetMyRoomRequest
151, // 265: hyapp.room.v1.RoomQueryService.GetCurrentRoom:input_type -> hyapp.room.v1.GetCurrentRoomRequest
153, // 266: hyapp.room.v1.RoomQueryService.BatchGetUserVoiceRoomPresences:input_type -> hyapp.room.v1.BatchGetUserVoiceRoomPresencesRequest
157, // 267: hyapp.room.v1.RoomQueryService.GetRoomSnapshot:input_type -> hyapp.room.v1.GetRoomSnapshotRequest
59, // 268: hyapp.room.v1.RoomQueryService.ListRoomBackgrounds:input_type -> hyapp.room.v1.ListRoomBackgroundsRequest
159, // 269: hyapp.room.v1.RoomQueryService.GetRoomRocket:input_type -> hyapp.room.v1.GetRoomRocketRequest
161, // 270: hyapp.room.v1.RoomQueryService.ListRoomOnlineUsers:input_type -> hyapp.room.v1.ListRoomOnlineUsersRequest
164, // 271: hyapp.room.v1.RoomQueryService.ListRoomBannedUsers:input_type -> hyapp.room.v1.ListRoomBannedUsersRequest
73, // 272: hyapp.room.v1.RoomCommandService.CreateRoom:output_type -> hyapp.room.v1.CreateRoomResponse
75, // 273: hyapp.room.v1.RoomCommandService.UpdateRoomProfile:output_type -> hyapp.room.v1.UpdateRoomProfileResponse
58, // 274: hyapp.room.v1.RoomCommandService.SaveRoomBackground:output_type -> hyapp.room.v1.SaveRoomBackgroundResponse
62, // 275: hyapp.room.v1.RoomCommandService.SetRoomBackground:output_type -> hyapp.room.v1.SetRoomBackgroundResponse
65, // 276: hyapp.room.v1.RoomCommandService.ApplyRoomDecoration:output_type -> hyapp.room.v1.ApplyRoomDecorationResponse
71, // 277: hyapp.room.v1.RoomCommandService.SendRoomImage:output_type -> hyapp.room.v1.SendRoomImageResponse
80, // 278: hyapp.room.v1.RoomCommandService.JoinRoom:output_type -> hyapp.room.v1.JoinRoomResponse
82, // 279: hyapp.room.v1.RoomCommandService.RoomHeartbeat:output_type -> hyapp.room.v1.RoomHeartbeatResponse
84, // 280: hyapp.room.v1.RoomCommandService.LeaveRoom:output_type -> hyapp.room.v1.LeaveRoomResponse
86, // 281: hyapp.room.v1.RoomCommandService.CloseRoom:output_type -> hyapp.room.v1.CloseRoomResponse
93, // 282: hyapp.room.v1.RoomCommandService.AdminUpdateRoom:output_type -> hyapp.room.v1.AdminUpdateRoomResponse
95, // 283: hyapp.room.v1.RoomCommandService.AdminDeleteRoom:output_type -> hyapp.room.v1.AdminDeleteRoomResponse
20, // 284: hyapp.room.v1.RoomCommandService.AdminUpdateRoomRocketConfig:output_type -> hyapp.room.v1.AdminUpdateRoomRocketConfigResponse
25, // 285: hyapp.room.v1.RoomCommandService.AdminUpdateRoomSeatConfig:output_type -> hyapp.room.v1.AdminUpdateRoomSeatConfigResponse
32, // 286: hyapp.room.v1.RoomCommandService.AdminUpdateHumanRoomRobotConfig:output_type -> hyapp.room.v1.AdminUpdateHumanRoomRobotConfigResponse
38, // 287: hyapp.room.v1.RoomCommandService.AdminCreateRoomPin:output_type -> hyapp.room.v1.AdminCreateRoomPinResponse
40, // 288: hyapp.room.v1.RoomCommandService.AdminCancelRoomPin:output_type -> hyapp.room.v1.AdminCancelRoomPinResponse
46, // 289: hyapp.room.v1.RoomCommandService.AdminCreateRobotRoom:output_type -> hyapp.room.v1.AdminCreateRobotRoomResponse
48, // 290: hyapp.room.v1.RoomCommandService.AdminSetRobotRoomStatus:output_type -> hyapp.room.v1.AdminSetRobotRoomStatusResponse
50, // 291: hyapp.room.v1.RoomCommandService.AdminRenameOwnerCountryCode:output_type -> hyapp.room.v1.AdminRenameOwnerCountryCodeResponse
97, // 292: hyapp.room.v1.RoomCommandService.MicUp:output_type -> hyapp.room.v1.MicUpResponse
99, // 293: hyapp.room.v1.RoomCommandService.MicDown:output_type -> hyapp.room.v1.MicDownResponse
101, // 294: hyapp.room.v1.RoomCommandService.ChangeMicSeat:output_type -> hyapp.room.v1.ChangeMicSeatResponse
103, // 295: hyapp.room.v1.RoomCommandService.ConfirmMicPublishing:output_type -> hyapp.room.v1.ConfirmMicPublishingResponse
105, // 296: hyapp.room.v1.RoomCommandService.MicHeartbeat:output_type -> hyapp.room.v1.MicHeartbeatResponse
107, // 297: hyapp.room.v1.RoomCommandService.SetMicMute:output_type -> hyapp.room.v1.SetMicMuteResponse
109, // 298: hyapp.room.v1.RoomCommandService.ApplyRTCEvent:output_type -> hyapp.room.v1.ApplyRTCEventResponse
111, // 299: hyapp.room.v1.RoomCommandService.SetMicSeatLock:output_type -> hyapp.room.v1.SetMicSeatLockResponse
113, // 300: hyapp.room.v1.RoomCommandService.SetChatEnabled:output_type -> hyapp.room.v1.SetChatEnabledResponse
115, // 301: hyapp.room.v1.RoomCommandService.SetRoomPassword:output_type -> hyapp.room.v1.SetRoomPasswordResponse
117, // 302: hyapp.room.v1.RoomCommandService.SetRoomAdmin:output_type -> hyapp.room.v1.SetRoomAdminResponse
119, // 303: hyapp.room.v1.RoomCommandService.MuteUser:output_type -> hyapp.room.v1.MuteUserResponse
121, // 304: hyapp.room.v1.RoomCommandService.KickUser:output_type -> hyapp.room.v1.KickUserResponse
123, // 305: hyapp.room.v1.RoomCommandService.UnbanUser:output_type -> hyapp.room.v1.UnbanUserResponse
125, // 306: hyapp.room.v1.RoomCommandService.SystemEvictUser:output_type -> hyapp.room.v1.SystemEvictUserResponse
131, // 307: hyapp.room.v1.RoomCommandService.SendGift:output_type -> hyapp.room.v1.SendGiftResponse
167, // 308: hyapp.room.v1.RoomCommandService.FollowRoom:output_type -> hyapp.room.v1.FollowRoomResponse
169, // 309: hyapp.room.v1.RoomCommandService.UnfollowRoom:output_type -> hyapp.room.v1.UnfollowRoomResponse
133, // 310: hyapp.room.v1.RoomGuardService.CheckSpeakPermission:output_type -> hyapp.room.v1.CheckSpeakPermissionResponse
135, // 311: hyapp.room.v1.RoomGuardService.VerifyRoomPresence:output_type -> hyapp.room.v1.VerifyRoomPresenceResponse
137, // 312: hyapp.room.v1.RoomGuardService.ResolveRoomAppCode:output_type -> hyapp.room.v1.ResolveRoomAppCodeResponse
67, // 313: hyapp.room.v1.RoomGuardService.AuthorizeRoomMediaUpload:output_type -> hyapp.room.v1.AuthorizeRoomMediaUploadResponse
69, // 314: hyapp.room.v1.RoomGuardService.CompleteRoomMediaUpload:output_type -> hyapp.room.v1.CompleteRoomMediaUploadResponse
89, // 315: hyapp.room.v1.RoomQueryService.AdminListRooms:output_type -> hyapp.room.v1.AdminListRoomsResponse
91, // 316: hyapp.room.v1.RoomQueryService.AdminGetRoom:output_type -> hyapp.room.v1.AdminGetRoomResponse
18, // 317: hyapp.room.v1.RoomQueryService.AdminGetRoomRocketConfig:output_type -> hyapp.room.v1.AdminGetRoomRocketConfigResponse
23, // 318: hyapp.room.v1.RoomQueryService.AdminGetRoomSeatConfig:output_type -> hyapp.room.v1.AdminGetRoomSeatConfigResponse
30, // 319: hyapp.room.v1.RoomQueryService.AdminGetHumanRoomRobotConfig:output_type -> hyapp.room.v1.AdminGetHumanRoomRobotConfigResponse
36, // 320: hyapp.room.v1.RoomQueryService.AdminListRoomPins:output_type -> hyapp.room.v1.AdminListRoomPinsResponse
44, // 321: hyapp.room.v1.RoomQueryService.AdminListRobotRooms:output_type -> hyapp.room.v1.AdminListRobotRoomsResponse
52, // 322: hyapp.room.v1.RoomQueryService.AdminFilterAvailableRoomRobots:output_type -> hyapp.room.v1.AdminFilterAvailableRoomRobotsResponse
144, // 323: hyapp.room.v1.RoomQueryService.ListRooms:output_type -> hyapp.room.v1.ListRoomsResponse
144, // 324: hyapp.room.v1.RoomQueryService.ListRoomsByOwners:output_type -> hyapp.room.v1.ListRoomsResponse
144, // 325: hyapp.room.v1.RoomQueryService.ListRoomFeeds:output_type -> hyapp.room.v1.ListRoomsResponse
146, // 326: hyapp.room.v1.RoomQueryService.ListRoomGiftLeaderboard:output_type -> hyapp.room.v1.ListRoomGiftLeaderboardResponse
148, // 327: hyapp.room.v1.RoomQueryService.ListRoomContributionRank:output_type -> hyapp.room.v1.ListRoomContributionRankResponse
150, // 328: hyapp.room.v1.RoomQueryService.GetMyRoom:output_type -> hyapp.room.v1.GetMyRoomResponse
152, // 329: hyapp.room.v1.RoomQueryService.GetCurrentRoom:output_type -> hyapp.room.v1.GetCurrentRoomResponse
156, // 330: hyapp.room.v1.RoomQueryService.BatchGetUserVoiceRoomPresences:output_type -> hyapp.room.v1.BatchGetUserVoiceRoomPresencesResponse
158, // 331: hyapp.room.v1.RoomQueryService.GetRoomSnapshot:output_type -> hyapp.room.v1.GetRoomSnapshotResponse
60, // 332: hyapp.room.v1.RoomQueryService.ListRoomBackgrounds:output_type -> hyapp.room.v1.ListRoomBackgroundsResponse
160, // 333: hyapp.room.v1.RoomQueryService.GetRoomRocket:output_type -> hyapp.room.v1.GetRoomRocketResponse
162, // 334: hyapp.room.v1.RoomQueryService.ListRoomOnlineUsers:output_type -> hyapp.room.v1.ListRoomOnlineUsersResponse
165, // 335: hyapp.room.v1.RoomQueryService.ListRoomBannedUsers:output_type -> hyapp.room.v1.ListRoomBannedUsersResponse
272, // [272:336] is the sub-list for method output_type
208, // [208:272] is the sub-list for method input_type
208, // [208:208] is the sub-list for extension type_name
208, // [208:208] is the sub-list for extension extendee
0, // [0:208] is the sub-list for field type_name
0, // 196: hyapp.room.v1.ApplyRoomRPSGiftRequest.meta:type_name -> hyapp.room.v1.RequestMeta
1, // 197: hyapp.room.v1.ApplyRoomRPSGiftResponse.result:type_name -> hyapp.room.v1.CommandResult
13, // 198: hyapp.room.v1.ApplyRoomRPSGiftResponse.rocket:type_name -> hyapp.room.v1.RoomRocketState
0, // 199: hyapp.room.v1.ListRoomOnlineUsersRequest.meta:type_name -> hyapp.room.v1.RequestMeta
2, // 200: hyapp.room.v1.ListRoomOnlineUsersResponse.users:type_name -> hyapp.room.v1.RoomUser
3, // 201: hyapp.room.v1.ListRoomOnlineUsersResponse.items:type_name -> hyapp.room.v1.RoomOnlineUser
0, // 202: hyapp.room.v1.ListRoomBannedUsersRequest.meta:type_name -> hyapp.room.v1.RequestMeta
165, // 203: hyapp.room.v1.ListRoomBannedUsersResponse.items:type_name -> hyapp.room.v1.RoomBannedUser
0, // 204: hyapp.room.v1.FollowRoomRequest.meta:type_name -> hyapp.room.v1.RequestMeta
0, // 205: hyapp.room.v1.UnfollowRoomRequest.meta:type_name -> hyapp.room.v1.RequestMeta
7, // 206: hyapp.room.v1.SendGiftResultV2.lucky_gift:type_name -> hyapp.room.v1.LuckyGiftDrawResult
7, // 207: hyapp.room.v1.SendGiftResultV2.lucky_gifts:type_name -> hyapp.room.v1.LuckyGiftDrawResult
172, // 208: hyapp.room.v1.SendGiftResultV2.lucky_hits:type_name -> hyapp.room.v1.SendGiftLuckyHit
129, // 209: hyapp.room.v1.SendGiftResultV2.batch_display:type_name -> hyapp.room.v1.SendGiftBatchDisplay
5, // 210: hyapp.room.v1.SendGiftResultV2.gift_rank:type_name -> hyapp.room.v1.RankItem
72, // 211: hyapp.room.v1.RoomCommandService.CreateRoom:input_type -> hyapp.room.v1.CreateRoomRequest
74, // 212: hyapp.room.v1.RoomCommandService.UpdateRoomProfile:input_type -> hyapp.room.v1.UpdateRoomProfileRequest
57, // 213: hyapp.room.v1.RoomCommandService.SaveRoomBackground:input_type -> hyapp.room.v1.SaveRoomBackgroundRequest
61, // 214: hyapp.room.v1.RoomCommandService.SetRoomBackground:input_type -> hyapp.room.v1.SetRoomBackgroundRequest
64, // 215: hyapp.room.v1.RoomCommandService.ApplyRoomDecoration:input_type -> hyapp.room.v1.ApplyRoomDecorationRequest
70, // 216: hyapp.room.v1.RoomCommandService.SendRoomImage:input_type -> hyapp.room.v1.SendRoomImageRequest
78, // 217: hyapp.room.v1.RoomCommandService.JoinRoom:input_type -> hyapp.room.v1.JoinRoomRequest
81, // 218: hyapp.room.v1.RoomCommandService.RoomHeartbeat:input_type -> hyapp.room.v1.RoomHeartbeatRequest
83, // 219: hyapp.room.v1.RoomCommandService.LeaveRoom:input_type -> hyapp.room.v1.LeaveRoomRequest
85, // 220: hyapp.room.v1.RoomCommandService.CloseRoom:input_type -> hyapp.room.v1.CloseRoomRequest
92, // 221: hyapp.room.v1.RoomCommandService.AdminUpdateRoom:input_type -> hyapp.room.v1.AdminUpdateRoomRequest
94, // 222: hyapp.room.v1.RoomCommandService.AdminDeleteRoom:input_type -> hyapp.room.v1.AdminDeleteRoomRequest
19, // 223: hyapp.room.v1.RoomCommandService.AdminUpdateRoomRocketConfig:input_type -> hyapp.room.v1.AdminUpdateRoomRocketConfigRequest
24, // 224: hyapp.room.v1.RoomCommandService.AdminUpdateRoomSeatConfig:input_type -> hyapp.room.v1.AdminUpdateRoomSeatConfigRequest
31, // 225: hyapp.room.v1.RoomCommandService.AdminUpdateHumanRoomRobotConfig:input_type -> hyapp.room.v1.AdminUpdateHumanRoomRobotConfigRequest
37, // 226: hyapp.room.v1.RoomCommandService.AdminCreateRoomPin:input_type -> hyapp.room.v1.AdminCreateRoomPinRequest
39, // 227: hyapp.room.v1.RoomCommandService.AdminCancelRoomPin:input_type -> hyapp.room.v1.AdminCancelRoomPinRequest
45, // 228: hyapp.room.v1.RoomCommandService.AdminCreateRobotRoom:input_type -> hyapp.room.v1.AdminCreateRobotRoomRequest
47, // 229: hyapp.room.v1.RoomCommandService.AdminSetRobotRoomStatus:input_type -> hyapp.room.v1.AdminSetRobotRoomStatusRequest
49, // 230: hyapp.room.v1.RoomCommandService.AdminRenameOwnerCountryCode:input_type -> hyapp.room.v1.AdminRenameOwnerCountryCodeRequest
96, // 231: hyapp.room.v1.RoomCommandService.MicUp:input_type -> hyapp.room.v1.MicUpRequest
98, // 232: hyapp.room.v1.RoomCommandService.MicDown:input_type -> hyapp.room.v1.MicDownRequest
100, // 233: hyapp.room.v1.RoomCommandService.ChangeMicSeat:input_type -> hyapp.room.v1.ChangeMicSeatRequest
102, // 234: hyapp.room.v1.RoomCommandService.ConfirmMicPublishing:input_type -> hyapp.room.v1.ConfirmMicPublishingRequest
104, // 235: hyapp.room.v1.RoomCommandService.MicHeartbeat:input_type -> hyapp.room.v1.MicHeartbeatRequest
106, // 236: hyapp.room.v1.RoomCommandService.SetMicMute:input_type -> hyapp.room.v1.SetMicMuteRequest
108, // 237: hyapp.room.v1.RoomCommandService.ApplyRTCEvent:input_type -> hyapp.room.v1.ApplyRTCEventRequest
110, // 238: hyapp.room.v1.RoomCommandService.SetMicSeatLock:input_type -> hyapp.room.v1.SetMicSeatLockRequest
112, // 239: hyapp.room.v1.RoomCommandService.SetChatEnabled:input_type -> hyapp.room.v1.SetChatEnabledRequest
114, // 240: hyapp.room.v1.RoomCommandService.SetRoomPassword:input_type -> hyapp.room.v1.SetRoomPasswordRequest
116, // 241: hyapp.room.v1.RoomCommandService.SetRoomAdmin:input_type -> hyapp.room.v1.SetRoomAdminRequest
118, // 242: hyapp.room.v1.RoomCommandService.MuteUser:input_type -> hyapp.room.v1.MuteUserRequest
120, // 243: hyapp.room.v1.RoomCommandService.KickUser:input_type -> hyapp.room.v1.KickUserRequest
122, // 244: hyapp.room.v1.RoomCommandService.UnbanUser:input_type -> hyapp.room.v1.UnbanUserRequest
124, // 245: hyapp.room.v1.RoomCommandService.SystemEvictUser:input_type -> hyapp.room.v1.SystemEvictUserRequest
130, // 246: hyapp.room.v1.RoomCommandService.SendGift:input_type -> hyapp.room.v1.SendGiftRequest
161, // 247: hyapp.room.v1.RoomCommandService.ApplyRoomRPSGift:input_type -> hyapp.room.v1.ApplyRoomRPSGiftRequest
168, // 248: hyapp.room.v1.RoomCommandService.FollowRoom:input_type -> hyapp.room.v1.FollowRoomRequest
170, // 249: hyapp.room.v1.RoomCommandService.UnfollowRoom:input_type -> hyapp.room.v1.UnfollowRoomRequest
132, // 250: hyapp.room.v1.RoomGuardService.CheckSpeakPermission:input_type -> hyapp.room.v1.CheckSpeakPermissionRequest
134, // 251: hyapp.room.v1.RoomGuardService.VerifyRoomPresence:input_type -> hyapp.room.v1.VerifyRoomPresenceRequest
136, // 252: hyapp.room.v1.RoomGuardService.ResolveRoomAppCode:input_type -> hyapp.room.v1.ResolveRoomAppCodeRequest
66, // 253: hyapp.room.v1.RoomGuardService.AuthorizeRoomMediaUpload:input_type -> hyapp.room.v1.AuthorizeRoomMediaUploadRequest
68, // 254: hyapp.room.v1.RoomGuardService.CompleteRoomMediaUpload:input_type -> hyapp.room.v1.CompleteRoomMediaUploadRequest
88, // 255: hyapp.room.v1.RoomQueryService.AdminListRooms:input_type -> hyapp.room.v1.AdminListRoomsRequest
90, // 256: hyapp.room.v1.RoomQueryService.AdminGetRoom:input_type -> hyapp.room.v1.AdminGetRoomRequest
17, // 257: hyapp.room.v1.RoomQueryService.AdminGetRoomRocketConfig:input_type -> hyapp.room.v1.AdminGetRoomRocketConfigRequest
22, // 258: hyapp.room.v1.RoomQueryService.AdminGetRoomSeatConfig:input_type -> hyapp.room.v1.AdminGetRoomSeatConfigRequest
29, // 259: hyapp.room.v1.RoomQueryService.AdminGetHumanRoomRobotConfig:input_type -> hyapp.room.v1.AdminGetHumanRoomRobotConfigRequest
35, // 260: hyapp.room.v1.RoomQueryService.AdminListRoomPins:input_type -> hyapp.room.v1.AdminListRoomPinsRequest
43, // 261: hyapp.room.v1.RoomQueryService.AdminListRobotRooms:input_type -> hyapp.room.v1.AdminListRobotRoomsRequest
51, // 262: hyapp.room.v1.RoomQueryService.AdminFilterAvailableRoomRobots:input_type -> hyapp.room.v1.AdminFilterAvailableRoomRobotsRequest
138, // 263: hyapp.room.v1.RoomQueryService.ListRooms:input_type -> hyapp.room.v1.ListRoomsRequest
139, // 264: hyapp.room.v1.RoomQueryService.ListRoomsByOwners:input_type -> hyapp.room.v1.ListRoomsByOwnersRequest
140, // 265: hyapp.room.v1.RoomQueryService.ListRoomFeeds:input_type -> hyapp.room.v1.ListRoomFeedsRequest
141, // 266: hyapp.room.v1.RoomQueryService.ListRoomGiftLeaderboard:input_type -> hyapp.room.v1.ListRoomGiftLeaderboardRequest
147, // 267: hyapp.room.v1.RoomQueryService.ListRoomContributionRank:input_type -> hyapp.room.v1.ListRoomContributionRankRequest
149, // 268: hyapp.room.v1.RoomQueryService.GetMyRoom:input_type -> hyapp.room.v1.GetMyRoomRequest
151, // 269: hyapp.room.v1.RoomQueryService.GetCurrentRoom:input_type -> hyapp.room.v1.GetCurrentRoomRequest
153, // 270: hyapp.room.v1.RoomQueryService.BatchGetUserVoiceRoomPresences:input_type -> hyapp.room.v1.BatchGetUserVoiceRoomPresencesRequest
157, // 271: hyapp.room.v1.RoomQueryService.GetRoomSnapshot:input_type -> hyapp.room.v1.GetRoomSnapshotRequest
59, // 272: hyapp.room.v1.RoomQueryService.ListRoomBackgrounds:input_type -> hyapp.room.v1.ListRoomBackgroundsRequest
159, // 273: hyapp.room.v1.RoomQueryService.GetRoomRocket:input_type -> hyapp.room.v1.GetRoomRocketRequest
163, // 274: hyapp.room.v1.RoomQueryService.ListRoomOnlineUsers:input_type -> hyapp.room.v1.ListRoomOnlineUsersRequest
166, // 275: hyapp.room.v1.RoomQueryService.ListRoomBannedUsers:input_type -> hyapp.room.v1.ListRoomBannedUsersRequest
73, // 276: hyapp.room.v1.RoomCommandService.CreateRoom:output_type -> hyapp.room.v1.CreateRoomResponse
75, // 277: hyapp.room.v1.RoomCommandService.UpdateRoomProfile:output_type -> hyapp.room.v1.UpdateRoomProfileResponse
58, // 278: hyapp.room.v1.RoomCommandService.SaveRoomBackground:output_type -> hyapp.room.v1.SaveRoomBackgroundResponse
62, // 279: hyapp.room.v1.RoomCommandService.SetRoomBackground:output_type -> hyapp.room.v1.SetRoomBackgroundResponse
65, // 280: hyapp.room.v1.RoomCommandService.ApplyRoomDecoration:output_type -> hyapp.room.v1.ApplyRoomDecorationResponse
71, // 281: hyapp.room.v1.RoomCommandService.SendRoomImage:output_type -> hyapp.room.v1.SendRoomImageResponse
80, // 282: hyapp.room.v1.RoomCommandService.JoinRoom:output_type -> hyapp.room.v1.JoinRoomResponse
82, // 283: hyapp.room.v1.RoomCommandService.RoomHeartbeat:output_type -> hyapp.room.v1.RoomHeartbeatResponse
84, // 284: hyapp.room.v1.RoomCommandService.LeaveRoom:output_type -> hyapp.room.v1.LeaveRoomResponse
86, // 285: hyapp.room.v1.RoomCommandService.CloseRoom:output_type -> hyapp.room.v1.CloseRoomResponse
93, // 286: hyapp.room.v1.RoomCommandService.AdminUpdateRoom:output_type -> hyapp.room.v1.AdminUpdateRoomResponse
95, // 287: hyapp.room.v1.RoomCommandService.AdminDeleteRoom:output_type -> hyapp.room.v1.AdminDeleteRoomResponse
20, // 288: hyapp.room.v1.RoomCommandService.AdminUpdateRoomRocketConfig:output_type -> hyapp.room.v1.AdminUpdateRoomRocketConfigResponse
25, // 289: hyapp.room.v1.RoomCommandService.AdminUpdateRoomSeatConfig:output_type -> hyapp.room.v1.AdminUpdateRoomSeatConfigResponse
32, // 290: hyapp.room.v1.RoomCommandService.AdminUpdateHumanRoomRobotConfig:output_type -> hyapp.room.v1.AdminUpdateHumanRoomRobotConfigResponse
38, // 291: hyapp.room.v1.RoomCommandService.AdminCreateRoomPin:output_type -> hyapp.room.v1.AdminCreateRoomPinResponse
40, // 292: hyapp.room.v1.RoomCommandService.AdminCancelRoomPin:output_type -> hyapp.room.v1.AdminCancelRoomPinResponse
46, // 293: hyapp.room.v1.RoomCommandService.AdminCreateRobotRoom:output_type -> hyapp.room.v1.AdminCreateRobotRoomResponse
48, // 294: hyapp.room.v1.RoomCommandService.AdminSetRobotRoomStatus:output_type -> hyapp.room.v1.AdminSetRobotRoomStatusResponse
50, // 295: hyapp.room.v1.RoomCommandService.AdminRenameOwnerCountryCode:output_type -> hyapp.room.v1.AdminRenameOwnerCountryCodeResponse
97, // 296: hyapp.room.v1.RoomCommandService.MicUp:output_type -> hyapp.room.v1.MicUpResponse
99, // 297: hyapp.room.v1.RoomCommandService.MicDown:output_type -> hyapp.room.v1.MicDownResponse
101, // 298: hyapp.room.v1.RoomCommandService.ChangeMicSeat:output_type -> hyapp.room.v1.ChangeMicSeatResponse
103, // 299: hyapp.room.v1.RoomCommandService.ConfirmMicPublishing:output_type -> hyapp.room.v1.ConfirmMicPublishingResponse
105, // 300: hyapp.room.v1.RoomCommandService.MicHeartbeat:output_type -> hyapp.room.v1.MicHeartbeatResponse
107, // 301: hyapp.room.v1.RoomCommandService.SetMicMute:output_type -> hyapp.room.v1.SetMicMuteResponse
109, // 302: hyapp.room.v1.RoomCommandService.ApplyRTCEvent:output_type -> hyapp.room.v1.ApplyRTCEventResponse
111, // 303: hyapp.room.v1.RoomCommandService.SetMicSeatLock:output_type -> hyapp.room.v1.SetMicSeatLockResponse
113, // 304: hyapp.room.v1.RoomCommandService.SetChatEnabled:output_type -> hyapp.room.v1.SetChatEnabledResponse
115, // 305: hyapp.room.v1.RoomCommandService.SetRoomPassword:output_type -> hyapp.room.v1.SetRoomPasswordResponse
117, // 306: hyapp.room.v1.RoomCommandService.SetRoomAdmin:output_type -> hyapp.room.v1.SetRoomAdminResponse
119, // 307: hyapp.room.v1.RoomCommandService.MuteUser:output_type -> hyapp.room.v1.MuteUserResponse
121, // 308: hyapp.room.v1.RoomCommandService.KickUser:output_type -> hyapp.room.v1.KickUserResponse
123, // 309: hyapp.room.v1.RoomCommandService.UnbanUser:output_type -> hyapp.room.v1.UnbanUserResponse
125, // 310: hyapp.room.v1.RoomCommandService.SystemEvictUser:output_type -> hyapp.room.v1.SystemEvictUserResponse
131, // 311: hyapp.room.v1.RoomCommandService.SendGift:output_type -> hyapp.room.v1.SendGiftResponse
162, // 312: hyapp.room.v1.RoomCommandService.ApplyRoomRPSGift:output_type -> hyapp.room.v1.ApplyRoomRPSGiftResponse
169, // 313: hyapp.room.v1.RoomCommandService.FollowRoom:output_type -> hyapp.room.v1.FollowRoomResponse
171, // 314: hyapp.room.v1.RoomCommandService.UnfollowRoom:output_type -> hyapp.room.v1.UnfollowRoomResponse
133, // 315: hyapp.room.v1.RoomGuardService.CheckSpeakPermission:output_type -> hyapp.room.v1.CheckSpeakPermissionResponse
135, // 316: hyapp.room.v1.RoomGuardService.VerifyRoomPresence:output_type -> hyapp.room.v1.VerifyRoomPresenceResponse
137, // 317: hyapp.room.v1.RoomGuardService.ResolveRoomAppCode:output_type -> hyapp.room.v1.ResolveRoomAppCodeResponse
67, // 318: hyapp.room.v1.RoomGuardService.AuthorizeRoomMediaUpload:output_type -> hyapp.room.v1.AuthorizeRoomMediaUploadResponse
69, // 319: hyapp.room.v1.RoomGuardService.CompleteRoomMediaUpload:output_type -> hyapp.room.v1.CompleteRoomMediaUploadResponse
89, // 320: hyapp.room.v1.RoomQueryService.AdminListRooms:output_type -> hyapp.room.v1.AdminListRoomsResponse
91, // 321: hyapp.room.v1.RoomQueryService.AdminGetRoom:output_type -> hyapp.room.v1.AdminGetRoomResponse
18, // 322: hyapp.room.v1.RoomQueryService.AdminGetRoomRocketConfig:output_type -> hyapp.room.v1.AdminGetRoomRocketConfigResponse
23, // 323: hyapp.room.v1.RoomQueryService.AdminGetRoomSeatConfig:output_type -> hyapp.room.v1.AdminGetRoomSeatConfigResponse
30, // 324: hyapp.room.v1.RoomQueryService.AdminGetHumanRoomRobotConfig:output_type -> hyapp.room.v1.AdminGetHumanRoomRobotConfigResponse
36, // 325: hyapp.room.v1.RoomQueryService.AdminListRoomPins:output_type -> hyapp.room.v1.AdminListRoomPinsResponse
44, // 326: hyapp.room.v1.RoomQueryService.AdminListRobotRooms:output_type -> hyapp.room.v1.AdminListRobotRoomsResponse
52, // 327: hyapp.room.v1.RoomQueryService.AdminFilterAvailableRoomRobots:output_type -> hyapp.room.v1.AdminFilterAvailableRoomRobotsResponse
144, // 328: hyapp.room.v1.RoomQueryService.ListRooms:output_type -> hyapp.room.v1.ListRoomsResponse
144, // 329: hyapp.room.v1.RoomQueryService.ListRoomsByOwners:output_type -> hyapp.room.v1.ListRoomsResponse
144, // 330: hyapp.room.v1.RoomQueryService.ListRoomFeeds:output_type -> hyapp.room.v1.ListRoomsResponse
146, // 331: hyapp.room.v1.RoomQueryService.ListRoomGiftLeaderboard:output_type -> hyapp.room.v1.ListRoomGiftLeaderboardResponse
148, // 332: hyapp.room.v1.RoomQueryService.ListRoomContributionRank:output_type -> hyapp.room.v1.ListRoomContributionRankResponse
150, // 333: hyapp.room.v1.RoomQueryService.GetMyRoom:output_type -> hyapp.room.v1.GetMyRoomResponse
152, // 334: hyapp.room.v1.RoomQueryService.GetCurrentRoom:output_type -> hyapp.room.v1.GetCurrentRoomResponse
156, // 335: hyapp.room.v1.RoomQueryService.BatchGetUserVoiceRoomPresences:output_type -> hyapp.room.v1.BatchGetUserVoiceRoomPresencesResponse
158, // 336: hyapp.room.v1.RoomQueryService.GetRoomSnapshot:output_type -> hyapp.room.v1.GetRoomSnapshotResponse
60, // 337: hyapp.room.v1.RoomQueryService.ListRoomBackgrounds:output_type -> hyapp.room.v1.ListRoomBackgroundsResponse
160, // 338: hyapp.room.v1.RoomQueryService.GetRoomRocket:output_type -> hyapp.room.v1.GetRoomRocketResponse
164, // 339: hyapp.room.v1.RoomQueryService.ListRoomOnlineUsers:output_type -> hyapp.room.v1.ListRoomOnlineUsersResponse
167, // 340: hyapp.room.v1.RoomQueryService.ListRoomBannedUsers:output_type -> hyapp.room.v1.ListRoomBannedUsersResponse
276, // [276:341] is the sub-list for method output_type
211, // [211:276] is the sub-list for method input_type
211, // [211:211] is the sub-list for extension type_name
211, // [211:211] is the sub-list for extension extendee
0, // [0:211] is the sub-list for field type_name
}
func init() { file_proto_room_v1_room_proto_init() }
@ -15820,7 +15977,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: 173,
NumMessages: 175,
NumExtensions: 0,
NumServices: 3,
},

View File

@ -1595,6 +1595,22 @@ message GetRoomRocketResponse {
int64 server_time_ms = 2;
}
// ApplyRoomRPSGiftRequest room-rps
// game-service 退退
message ApplyRoomRPSGiftRequest {
RequestMeta meta = 1;
string room_id = 2;
int64 sender_user_id = 3;
int64 target_user_id = 4;
string gift_id = 5;
int64 heat_value = 6;
}
message ApplyRoomRPSGiftResponse {
CommandResult result = 1;
RoomRocketState rocket = 2;
}
// ListRoomOnlineUsersRequest 线 RoomSnapshot
message ListRoomOnlineUsersRequest {
RequestMeta meta = 1;
@ -1708,6 +1724,8 @@ service RoomCommandService {
rpc UnbanUser(UnbanUserRequest) returns (UnbanUserResponse);
rpc SystemEvictUser(SystemEvictUserRequest) returns (SystemEvictUserResponse);
rpc SendGift(SendGiftRequest) returns (SendGiftResponse);
// ApplyRoomRPSGift game-service 退Room Cell owner
rpc ApplyRoomRPSGift(ApplyRoomRPSGiftRequest) returns (ApplyRoomRPSGiftResponse);
rpc FollowRoom(FollowRoomRequest) returns (FollowRoomResponse);
rpc UnfollowRoom(UnfollowRoomRequest) returns (UnfollowRoomResponse);
}

View File

@ -55,6 +55,7 @@ const (
RoomCommandService_UnbanUser_FullMethodName = "/hyapp.room.v1.RoomCommandService/UnbanUser"
RoomCommandService_SystemEvictUser_FullMethodName = "/hyapp.room.v1.RoomCommandService/SystemEvictUser"
RoomCommandService_SendGift_FullMethodName = "/hyapp.room.v1.RoomCommandService/SendGift"
RoomCommandService_ApplyRoomRPSGift_FullMethodName = "/hyapp.room.v1.RoomCommandService/ApplyRoomRPSGift"
RoomCommandService_FollowRoom_FullMethodName = "/hyapp.room.v1.RoomCommandService/FollowRoom"
RoomCommandService_UnfollowRoom_FullMethodName = "/hyapp.room.v1.RoomCommandService/UnfollowRoom"
)
@ -101,6 +102,8 @@ type RoomCommandServiceClient interface {
UnbanUser(ctx context.Context, in *UnbanUserRequest, opts ...grpc.CallOption) (*UnbanUserResponse, error)
SystemEvictUser(ctx context.Context, in *SystemEvictUserRequest, opts ...grpc.CallOption) (*SystemEvictUserResponse, error)
SendGift(ctx context.Context, in *SendGiftRequest, opts ...grpc.CallOption) (*SendGiftResponse, error)
// ApplyRoomRPSGift 由 game-service 在赢家退款成功后调用Room Cell 仍是火箭状态唯一 owner。
ApplyRoomRPSGift(ctx context.Context, in *ApplyRoomRPSGiftRequest, opts ...grpc.CallOption) (*ApplyRoomRPSGiftResponse, error)
FollowRoom(ctx context.Context, in *FollowRoomRequest, opts ...grpc.CallOption) (*FollowRoomResponse, error)
UnfollowRoom(ctx context.Context, in *UnfollowRoomRequest, opts ...grpc.CallOption) (*UnfollowRoomResponse, error)
}
@ -473,6 +476,16 @@ func (c *roomCommandServiceClient) SendGift(ctx context.Context, in *SendGiftReq
return out, nil
}
func (c *roomCommandServiceClient) ApplyRoomRPSGift(ctx context.Context, in *ApplyRoomRPSGiftRequest, opts ...grpc.CallOption) (*ApplyRoomRPSGiftResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(ApplyRoomRPSGiftResponse)
err := c.cc.Invoke(ctx, RoomCommandService_ApplyRoomRPSGift_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *roomCommandServiceClient) FollowRoom(ctx context.Context, in *FollowRoomRequest, opts ...grpc.CallOption) (*FollowRoomResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(FollowRoomResponse)
@ -535,6 +548,8 @@ type RoomCommandServiceServer interface {
UnbanUser(context.Context, *UnbanUserRequest) (*UnbanUserResponse, error)
SystemEvictUser(context.Context, *SystemEvictUserRequest) (*SystemEvictUserResponse, error)
SendGift(context.Context, *SendGiftRequest) (*SendGiftResponse, error)
// ApplyRoomRPSGift 由 game-service 在赢家退款成功后调用Room Cell 仍是火箭状态唯一 owner。
ApplyRoomRPSGift(context.Context, *ApplyRoomRPSGiftRequest) (*ApplyRoomRPSGiftResponse, error)
FollowRoom(context.Context, *FollowRoomRequest) (*FollowRoomResponse, error)
UnfollowRoom(context.Context, *UnfollowRoomRequest) (*UnfollowRoomResponse, error)
mustEmbedUnimplementedRoomCommandServiceServer()
@ -655,6 +670,9 @@ func (UnimplementedRoomCommandServiceServer) SystemEvictUser(context.Context, *S
func (UnimplementedRoomCommandServiceServer) SendGift(context.Context, *SendGiftRequest) (*SendGiftResponse, error) {
return nil, status.Error(codes.Unimplemented, "method SendGift not implemented")
}
func (UnimplementedRoomCommandServiceServer) ApplyRoomRPSGift(context.Context, *ApplyRoomRPSGiftRequest) (*ApplyRoomRPSGiftResponse, error) {
return nil, status.Error(codes.Unimplemented, "method ApplyRoomRPSGift not implemented")
}
func (UnimplementedRoomCommandServiceServer) FollowRoom(context.Context, *FollowRoomRequest) (*FollowRoomResponse, error) {
return nil, status.Error(codes.Unimplemented, "method FollowRoom not implemented")
}
@ -1330,6 +1348,24 @@ func _RoomCommandService_SendGift_Handler(srv interface{}, ctx context.Context,
return interceptor(ctx, in, info, handler)
}
func _RoomCommandService_ApplyRoomRPSGift_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ApplyRoomRPSGiftRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(RoomCommandServiceServer).ApplyRoomRPSGift(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: RoomCommandService_ApplyRoomRPSGift_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(RoomCommandServiceServer).ApplyRoomRPSGift(ctx, req.(*ApplyRoomRPSGiftRequest))
}
return interceptor(ctx, in, info, handler)
}
func _RoomCommandService_FollowRoom_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(FollowRoomRequest)
if err := dec(in); err != nil {
@ -1517,6 +1553,10 @@ var RoomCommandService_ServiceDesc = grpc.ServiceDesc{
MethodName: "SendGift",
Handler: _RoomCommandService_SendGift_Handler,
},
{
MethodName: "ApplyRoomRPSGift",
Handler: _RoomCommandService_ApplyRoomRPSGift_Handler,
},
{
MethodName: "FollowRoom",
Handler: _RoomCommandService_FollowRoom_Handler,

View File

@ -8,6 +8,7 @@ wallet_service_addr: "wallet-service:13004"
user_service_addr: "user-service:13005"
activity_service_addr: "activity-service:13006"
robot_service_addr: "robot-service:13011"
room_service_addr: "room-service:13001"
launch_session_ttl: "15m"
tencent_im:
# Docker/testbox 联调房内猜拳 PK 房间群消息;必须和 gateway/room 使用同一个 IM 应用。

View File

@ -8,6 +8,7 @@ wallet_service_addr: "wallet-service:13004"
user_service_addr: "user-service:13005"
activity_service_addr: "10.2.1.16:13006"
robot_service_addr: "10.2.1.16:13011"
room_service_addr: "10.2.1.16:13001"
launch_session_ttl: "15m"
tencent_im:
# 房内猜拳发起、应战、揭晓和结算事件都走腾讯 IM 房间群自定义消息。

View File

@ -8,6 +8,7 @@ wallet_service_addr: "127.0.0.1:13004"
user_service_addr: "127.0.0.1:13005"
activity_service_addr: "127.0.0.1:13006"
robot_service_addr: "127.0.0.1:13011"
room_service_addr: "127.0.0.1:13001"
launch_session_ttl: "15m"
tencent_im:
# 本地联调房内猜拳 PK 房间群消息;必须和 gateway/room 使用同一个 IM 应用。

View File

@ -11,6 +11,7 @@ import (
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
gamev1 "hyapp.local/api/proto/game/v1"
roomv1 "hyapp.local/api/proto/room/v1"
"hyapp/pkg/appcode"
"hyapp/pkg/gamemq"
"hyapp/pkg/grpchealth"
@ -41,6 +42,7 @@ type App struct {
userConn *grpc.ClientConn
activityConn *grpc.ClientConn
robotConn *grpc.ClientConn
roomConn *grpc.ClientConn
outboxProducer *rocketmqx.Producer
// outboxPartitions 缓存真实 App 列表并让双实例从不同轮转起点公平 claim。
outboxPartitions *outboxpartition.Partitions
@ -85,8 +87,18 @@ func New(cfg config.Config) (*App, error) {
_ = repo.Close()
return nil, err
}
roomConn, err := grpc.Dial(cfg.RoomServiceAddr, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
_ = robotConn.Close()
_ = activityConn.Close()
_ = userConn.Close()
_ = walletConn.Close()
_ = repo.Close()
return nil, err
}
listener, err := net.Listen("tcp", cfg.GRPCAddr)
if err != nil {
_ = roomConn.Close()
_ = robotConn.Close()
_ = activityConn.Close()
_ = userConn.Close()
@ -99,6 +111,7 @@ func New(cfg config.Config) (*App, error) {
outboxProducer, err = rocketmqx.NewProducer(rocketMQProducerConfig(cfg.RocketMQ))
if err != nil {
_ = listener.Close()
_ = roomConn.Close()
_ = robotConn.Close()
_ = activityConn.Close()
_ = userConn.Close()
@ -120,6 +133,7 @@ func New(cfg config.Config) (*App, error) {
roomRPSPublisher, err = roomrpsservice.NewTencentIMPublisher(cfg.TencentIM.RESTConfig())
if err != nil {
_ = listener.Close()
_ = roomConn.Close()
_ = robotConn.Close()
_ = activityConn.Close()
_ = userConn.Close()
@ -132,7 +146,7 @@ func New(cfg config.Config) (*App, error) {
logx.Warn(context.Background(), "room_rps_im_disabled", slog.String("reason", "tencent_im.enabled=false"))
}
// 房内猜拳独立于骰子和独立猜拳:配置、挑战状态机和 IM 事件全部由 room-rps service 承接transport 只做 RPC 适配。
roomRPSSvc := roomrpsservice.New(roomrpsservice.Config{}, userClient, roomRPSPublisher, walletClient, repo)
roomRPSSvc := roomrpsservice.New(roomrpsservice.Config{}, userClient, roomRPSPublisher, walletClient, repo, roomv1.NewRoomCommandServiceClient(roomConn))
transport := grpcserver.NewServer(svc, diceSvc, roomRPSSvc)
gamev1.RegisterGameAppServiceServer(server, transport)
gamev1.RegisterGameCallbackServiceServer(server, transport)
@ -149,6 +163,7 @@ func New(cfg config.Config) (*App, error) {
})
if err != nil {
_ = listener.Close()
_ = roomConn.Close()
_ = robotConn.Close()
_ = activityConn.Close()
_ = userConn.Close()
@ -158,7 +173,7 @@ func New(cfg config.Config) (*App, error) {
}
outboxCtx, outboxCancel := context.WithCancel(context.Background())
return &App{server: server, listener: listener, health: health, healthHTTP: healthHTTP, repo: repo, walletConn: walletConn, userConn: userConn, activityConn: activityConn, robotConn: robotConn, outboxProducer: outboxProducer, outboxPartitions: outboxpartition.New(cfg.OutboxWorker.AppCodes, outboxpartition.DefaultDiscoveryRefreshInterval), outboxCtx: outboxCtx, outboxCancel: outboxCancel, cfg: cfg}, nil
return &App{server: server, listener: listener, health: health, healthHTTP: healthHTTP, repo: repo, walletConn: walletConn, userConn: userConn, activityConn: activityConn, robotConn: robotConn, roomConn: roomConn, outboxProducer: outboxProducer, outboxPartitions: outboxpartition.New(cfg.OutboxWorker.AppCodes, outboxpartition.DefaultDiscoveryRefreshInterval), outboxCtx: outboxCtx, outboxCancel: outboxCancel, cfg: cfg}, nil
}
func (a *App) Run() error {
@ -197,6 +212,9 @@ func (a *App) Close() {
if a.robotConn != nil {
_ = a.robotConn.Close()
}
if a.roomConn != nil {
_ = a.roomConn.Close()
}
if a.repo != nil {
_ = a.repo.Close()
}

View File

@ -26,6 +26,8 @@ type Config struct {
UserServiceAddr string `yaml:"user_service_addr"`
ActivityServiceAddr string `yaml:"activity_service_addr"`
RobotServiceAddr string `yaml:"robot_service_addr"`
// RoomServiceAddr 用于把 room-rps 最终败者礼物提交给 Room Cellgame-service 不持有火箭状态。
RoomServiceAddr string `yaml:"room_service_addr"`
LaunchSessionTTL time.Duration `yaml:"launch_session_ttl"`
// TencentIM 是房内猜拳向房间群投递 PK 事件的腾讯 IM REST 配置;缺配置时必须显式关闭,不能靠环境变量隐式漂移。
TencentIM TencentIMConfig `yaml:"tencent_im"`
@ -117,6 +119,7 @@ func Default() Config {
UserServiceAddr: "127.0.0.1:13005",
ActivityServiceAddr: "127.0.0.1:13006",
RobotServiceAddr: "127.0.0.1:13011",
RoomServiceAddr: "127.0.0.1:13001",
LaunchSessionTTL: 15 * time.Minute,
TencentIM: TencentIMConfig{
AdminIdentifier: "administrator",
@ -196,6 +199,10 @@ func (cfg *Config) Normalize() error {
if cfg.RobotServiceAddr == "" {
return fmt.Errorf("robot_service_addr is required")
}
cfg.RoomServiceAddr = strings.TrimSpace(cfg.RoomServiceAddr)
if cfg.RoomServiceAddr == "" {
return fmt.Errorf("room_service_addr is required")
}
if cfg.LaunchSessionTTL <= 0 {
cfg.LaunchSessionTTL = 15 * time.Minute
}

View File

@ -13,8 +13,10 @@ import (
"sync"
"time"
"google.golang.org/grpc"
"google.golang.org/protobuf/proto"
gamev1 "hyapp.local/api/proto/game/v1"
roomv1 "hyapp.local/api/proto/room/v1"
userv1 "hyapp.local/api/proto/user/v1"
walletv1 "hyapp.local/api/proto/wallet/v1"
"hyapp/pkg/appcode"
@ -72,6 +74,11 @@ type WalletClient interface {
ApplyGameCoinChange(ctx context.Context, req *walletv1.ApplyGameCoinChangeRequest) (*walletv1.ApplyGameCoinChangeResponse, error)
}
// RoomClient 只暴露 PK 结算礼物进入 Room Cell 的能力;火箭状态和规则始终由 room-service 持有。
type RoomClient interface {
ApplyRoomRPSGift(ctx context.Context, req *roomv1.ApplyRoomRPSGiftRequest, opts ...grpc.CallOption) (*roomv1.ApplyRoomRPSGiftResponse, error)
}
// ConfigStore 是 room-rps 配置的持久化边界service 只关心完整配置快照,表结构和 JSON 编码留在 MySQL 仓储层。
type ConfigStore interface {
GetRoomRPSConfig(ctx context.Context, appCode string, gameID string) (*gamev1.RoomRPSConfig, error)
@ -94,6 +101,7 @@ type Service struct {
user UserClient
gifts GiftCatalogClient
wallet WalletClient
room RoomClient
pub Publisher
store ConfigStore
@ -117,6 +125,7 @@ func New(config Config, user UserClient, publisher Publisher, extras ...any) *Se
var gifts GiftCatalogClient
var wallet WalletClient
var store ConfigStore
var room RoomClient
for _, extra := range extras {
if typed, ok := extra.(GiftCatalogClient); ok {
// room-rps 运行配置只保存四个 gift_id后台不再携带展示字段时必须从 wallet-service 读取真实礼物快照。
@ -130,12 +139,17 @@ func New(config Config, user UserClient, publisher Publisher, extras ...any) *Se
// MySQL 是配置事实源;没有仓储的测试场景才落回进程内 map避免把运行态差异写成前端兜底。
store = typed
}
if typed, ok := extra.(RoomClient); ok {
// PK 最终败者礼物必须进入 Room Cell不能由 game-service 自己修改火箭状态。
room = typed
}
}
return &Service{
config: config,
user: user,
gifts: gifts,
wallet: wallet,
room: room,
pub: publisher,
store: store,
configs: make(map[string]*gamev1.RoomRPSConfig),
@ -921,6 +935,9 @@ func (s *Service) settleChallenge(ctx context.Context, requestID string, challen
return settled, err
}
settled.Initiator.BalanceAfter = balanceAfter
if err := s.applySettledGiftToRoom(ctx, requestID, settled, settled.GetChallenger().GetUserId(), settled.GetInitiator().GetUserId()); err != nil {
return settled, err
}
settled.SettlementStatus = SettlementSettled
return settled, nil
case settled.GetChallenger().GetUserId():
@ -930,6 +947,9 @@ func (s *Service) settleChallenge(ctx context.Context, requestID string, challen
return settled, err
}
settled.Challenger.BalanceAfter = balanceAfter
if err := s.applySettledGiftToRoom(ctx, requestID, settled, settled.GetInitiator().GetUserId(), settled.GetChallenger().GetUserId()); err != nil {
return settled, err
}
settled.SettlementStatus = SettlementSettled
return settled, nil
default:
@ -937,6 +957,32 @@ func (s *Service) settleChallenge(ctx context.Context, requestID string, challen
}
}
func (s *Service) applySettledGiftToRoom(ctx context.Context, requestID string, challenge *gamev1.RoomRPSChallenge, loserUserID int64, winnerUserID int64) error {
if s.room == nil {
// 仅保留给不装配跨服务依赖的隔离单测;生产 App.New 始终注入 room client缺地址会在启动阶段失败。
return nil
}
if challenge == nil || loserUserID <= 0 || winnerUserID <= 0 || challenge.GetStakeCoin() <= 0 {
return xerr.New(xerr.InvalidArgument, "room rps settled gift is incomplete")
}
// challenge_id 对应一局最多一份真实礼物;赢家退款重放后再次调用也只会命中 Room Cell command log。
_, err := s.room.ApplyRoomRPSGift(ctx, &roomv1.ApplyRoomRPSGiftRequest{
Meta: &roomv1.RequestMeta{
AppCode: challenge.GetAppCode(),
RequestId: strings.TrimSpace(requestID),
CommandId: "room_rps_gift_" + challenge.GetChallengeId(),
ActorUserId: loserUserID,
RoomId: challenge.GetRoomId(),
},
RoomId: challenge.GetRoomId(),
SenderUserId: loserUserID,
TargetUserId: winnerUserID,
GiftId: roomRPSChallengeGiftID(challenge),
HeatValue: challenge.GetStakeCoin(),
})
return err
}
func (s *Service) refundPendingChallenge(ctx context.Context, requestID string, challenge *gamev1.RoomRPSChallenge) (*gamev1.RoomRPSChallenge, error) {
if challenge == nil || challenge.GetInitiator().GetUserId() <= 0 || challenge.GetStakeCoin() <= 0 {
return nil, xerr.New(xerr.InvalidArgument, "room rps pending refund challenge is incomplete")

View File

@ -6,7 +6,9 @@ import (
"testing"
"time"
"google.golang.org/grpc"
gamev1 "hyapp.local/api/proto/game/v1"
roomv1 "hyapp.local/api/proto/room/v1"
walletv1 "hyapp.local/api/proto/wallet/v1"
"hyapp/pkg/xerr"
)
@ -324,7 +326,8 @@ func TestAcceptChallengeRejectsInsufficientCoinBalance(t *testing.T) {
func TestAcceptChallengeRecordsChallengerCoinBalance(t *testing.T) {
wallet := newFakeRoomRPSWallet(map[int64]int64{41: 1000, 42: 500})
svc := New(Config{}, nil, nil, wallet)
room := &fakeRoomRPSRoom{}
svc := New(Config{}, nil, nil, wallet, room)
svc.now = func() time.Time { return time.UnixMilli(1770000000000) }
created, _, err := svc.CreateChallenge(context.Background(), &gamev1.CreateRoomRPSChallengeRequest{
@ -356,6 +359,13 @@ func TestAcceptChallengeRecordsChallengerCoinBalance(t *testing.T) {
if got := wallet.ops(); fmt.Sprint(got) != "[debit debit refund]" {
t.Fatalf("winner settlement should only debit both and refund winner, got ops=%v", got)
}
if len(room.requests) != 1 {
t.Fatalf("settled PK must apply exactly one loser gift to room rocket, got %d", len(room.requests))
}
rocketGift := room.requests[0]
if rocketGift.GetSenderUserId() != 41 || rocketGift.GetTargetUserId() != 42 || rocketGift.GetGiftId() != "10001" || rocketGift.GetHeatValue() != 100 {
t.Fatalf("room rocket gift must describe loser -> winner and server stake: %+v", rocketGift)
}
}
func TestAcceptChallengeReturnsTakenWhenAnotherUserAlreadyAccepted(t *testing.T) {
@ -585,6 +595,15 @@ type fakeRoomRPSWallet struct {
replays map[string]*walletv1.ApplyGameCoinChangeResponse
}
type fakeRoomRPSRoom struct {
requests []*roomv1.ApplyRoomRPSGiftRequest
}
func (f *fakeRoomRPSRoom) ApplyRoomRPSGift(_ context.Context, req *roomv1.ApplyRoomRPSGiftRequest, _ ...grpc.CallOption) (*roomv1.ApplyRoomRPSGiftResponse, error) {
f.requests = append(f.requests, req)
return &roomv1.ApplyRoomRPSGiftResponse{}, nil
}
func newFakeRoomRPSWallet(balances map[int64]int64) *fakeRoomRPSWallet {
return &fakeRoomRPSWallet{balances: balances, replays: make(map[string]*walletv1.ApplyGameCoinChangeResponse)}
}

View File

@ -585,6 +585,34 @@ type SendGift struct {
// Type 返回命令类型。
func (SendGift) Type() string { return "send_gift" }
// ApplyRoomRPSGift 记录房内 PK 最终结算后唯一真实支付的败者礼物。
// 它只恢复火箭状态,不重复执行钱包改账,也不冒充普通 SendGift 产生第二份礼物事实。
type ApplyRoomRPSGift struct {
Base
TargetUserID int64 `json:"target_user_id"`
GiftID string `json:"gift_id"`
HeatValue int64 `json:"heat_value"`
RocketTouched bool `json:"rocket_touched,omitempty"`
RocketAddedFuel int64 `json:"rocket_added_fuel,omitempty"`
RocketEffectiveFuel int64 `json:"rocket_effective_fuel,omitempty"`
RocketOverflowFuel int64 `json:"rocket_overflow_fuel,omitempty"`
RocketLevel int32 `json:"rocket_level,omitempty"`
RocketFuel int64 `json:"rocket_fuel,omitempty"`
RocketStatus string `json:"rocket_status,omitempty"`
RocketFuelThreshold int64 `json:"rocket_fuel_threshold,omitempty"`
RocketIgnitedAtMS int64 `json:"rocket_ignited_at_ms,omitempty"`
RocketLaunchAtMS int64 `json:"rocket_launch_at_ms,omitempty"`
RocketResetAtMS int64 `json:"rocket_reset_at_ms,omitempty"`
RocketTop1UserID int64 `json:"rocket_top1_user_id,omitempty"`
RocketIgniterUserID int64 `json:"rocket_igniter_user_id,omitempty"`
RocketID string `json:"rocket_id,omitempty"`
RocketConfigVersion int64 `json:"rocket_config_version,omitempty"`
RocketPendingLaunches []RocketPendingLaunch `json:"rocket_pending_launches,omitempty"`
RocketCurrentContributions []RocketContribution `json:"rocket_current_contributions,omitempty"`
}
func (ApplyRoomRPSGift) Type() string { return "apply_room_rps_gift" }
// GiftTargetHostScope 记录一个接收方在 gateway 入站时看到的主播工资入账资格。
type GiftTargetHostScope struct {
TargetUserID int64 `json:"target_user_id"`
@ -881,6 +909,8 @@ func Deserialize(commandType string, payload []byte) (Command, error) {
cmd = &UnbanUser{}
case SendGift{}.Type():
cmd = &SendGift{}
case ApplyRoomRPSGift{}.Type():
cmd = &ApplyRoomRPSGift{}
case LaunchRoomRocket{}.Type():
cmd = &LaunchRoomRocket{}
default:

View File

@ -533,6 +533,12 @@ func replay(current *state.RoomState, cmd command.Command, committedAtMS int64)
current.Rocket = rocketStateFromSettledGift(typed)
}
current.Version++
case *command.ApplyRoomRPSGift:
// PK 账务已在 game/wallet owner 完成;恢复只应用首次提交时固化的火箭快照,绝不能再次扣费或补普通礼物热度。
if typed.RocketTouched {
current.Rocket = rocketStateFromRoomRPSGift(typed)
}
current.Version++
case *command.LaunchRoomRocket:
if current.Rocket == nil || !rocketPendingLaunchExists(current.Rocket.PendingLaunches, typed.RocketID, typed.Level) {
@ -579,6 +585,24 @@ func rocketStateFromSettledGift(cmd *command.SendGift) *state.RocketState {
}
}
func rocketStateFromRoomRPSGift(cmd *command.ApplyRoomRPSGift) *state.RocketState {
return &state.RocketState{
CurrentLevel: cmd.RocketLevel,
CurrentFuel: cmd.RocketFuel,
FuelThreshold: cmd.RocketFuelThreshold,
Status: cmd.RocketStatus,
IgnitedAtMS: cmd.RocketIgnitedAtMS,
LaunchAtMS: cmd.RocketLaunchAtMS,
ResetAtMS: cmd.RocketResetAtMS,
Top1UserID: cmd.RocketTop1UserID,
IgniterUserID: cmd.RocketIgniterUserID,
RocketID: cmd.RocketID,
ConfigVersion: cmd.RocketConfigVersion,
PendingLaunches: rocketPendingLaunchesFromCommand(cmd.RocketPendingLaunches),
CurrentContributions: rocketContributionsFromCommand(cmd.RocketCurrentContributions),
}
}
func rocketStateFromLaunchCommand(cmd *command.LaunchRoomRocket) *state.RocketState {
return &state.RocketState{
CurrentLevel: cmd.CurrentLevel,

View File

@ -1361,6 +1361,34 @@ func TestRoomRocketGiftOverflowAndImmediateNextLevel(t *testing.T) {
}
}
func TestApplyRoomRPSGiftChargesRocketOnceWithoutOrdinaryGiftFact(t *testing.T) {
ctx := context.Background()
repository := mysqltest.NewRepository(t)
now := &fixedRoomRocketClock{now: time.Date(2026, 5, 20, 12, 0, 0, 0, time.UTC)}
svc := newRocketTestServiceWithDirectIM(t, repository, &rocketTestWallet{}, now, nil, newRecordingRoomDirectIMPublisher())
writeRocketConfig(t, ctx, repository, rocketConfigForTest(1000, 1000))
createRocketRoom(t, ctx, svc, "room-rps-rocket", 101, 9001)
req := &roomv1.ApplyRoomRPSGiftRequest{
Meta: &roomv1.RequestMeta{AppCode: "lalu", RequestId: "req-rps", CommandId: "room_rps_gift_challenge-1", ActorUserId: 202, RoomId: "room-rps-rocket"},
RoomId: "room-rps-rocket", SenderUserId: 202, TargetUserId: 101, GiftId: "10001", HeatValue: 100,
}
first, err := svc.ApplyRoomRPSGift(ctx, req)
if err != nil {
t.Fatalf("ApplyRoomRPSGift() error = %v", err)
}
replay, err := svc.ApplyRoomRPSGift(ctx, req)
if err != nil {
t.Fatalf("ApplyRoomRPSGift() replay error = %v", err)
}
if first.GetRocket().GetCurrentFuel() != 100 || replay.GetRocket().GetCurrentFuel() != 100 || replay.GetResult().GetApplied() {
t.Fatalf("PK gift must fuel once and replay from command log: first=%+v replay=%+v", first, replay)
}
if got := outboxEventCounts(t, ctx, repository)["RoomGiftSent"]; got != 0 {
t.Fatalf("PK settlement must not fabricate an ordinary RoomGiftSent fact, got %d", got)
}
}
func TestRoomRocketProgressCoalescesOneSecondWindow(t *testing.T) {
ctx := context.Background()
repository := mysqltest.NewRepository(t)

View File

@ -0,0 +1,107 @@
package service
import (
"context"
"strings"
"time"
roomv1 "hyapp.local/api/proto/room/v1"
walletv1 "hyapp.local/api/proto/wallet/v1"
"hyapp/pkg/appcode"
"hyapp/pkg/xerr"
"hyapp/services/room-service/internal/room/command"
"hyapp/services/room-service/internal/room/outbox"
"hyapp/services/room-service/internal/room/rank"
"hyapp/services/room-service/internal/room/state"
)
// ApplyRoomRPSGift 把 room-rps 最终由败者支付的一份礼物应用到火箭。
// 钱包已由 game-service 结算,因此本入口只接受服务端锁定的 heat_value并用 command_id 保证重试不重复充能。
func (s *Service) ApplyRoomRPSGift(ctx context.Context, req *roomv1.ApplyRoomRPSGiftRequest) (*roomv1.ApplyRoomRPSGiftResponse, error) {
ctx = contextFromMeta(ctx, req.GetMeta())
if req.GetSenderUserId() <= 0 || req.GetTargetUserId() <= 0 || strings.TrimSpace(req.GetGiftId()) == "" || req.GetHeatValue() <= 0 {
return nil, xerr.New(xerr.InvalidArgument, "room rps settled gift is incomplete")
}
cmd := command.ApplyRoomRPSGift{
Base: baseFromMeta(req.GetMeta()),
TargetUserID: req.GetTargetUserId(),
GiftID: strings.TrimSpace(req.GetGiftId()),
HeatValue: req.GetHeatValue(),
}
cmd.Base.Room = strings.TrimSpace(req.GetRoomId())
cmd.Base.ActorID = req.GetSenderUserId()
result, err := s.mutateRoom(ctx, cmd, true, func(now time.Time, current *state.RoomState, _ *rank.LocalRank) (mutationResult, []outbox.Record, error) {
roomMeta, exists, err := s.repository.GetRoomMeta(ctx, cmd.RoomID())
if err != nil {
return mutationResult{}, nil, err
}
if !exists {
return mutationResult{}, nil, xerr.New(xerr.NotFound, "room not found")
}
cfg, err := s.roomRocketConfig(ctx)
if err != nil {
return mutationResult{}, nil, err
}
// 复用普通送礼的唯一火箭规则实现,但不进入钱包、房间热度、礼物榜或 RoomGiftSent 链路。
giftCmd := command.SendGift{Base: cmd.Base, TargetUserID: cmd.TargetUserID, TargetUserIDs: []int64{cmd.TargetUserID}, GiftID: cmd.GiftID, GiftCount: 1, HeatValue: cmd.HeatValue}
settledGift := giftCmd
billing := &walletv1.DebitGiftResponse{HeatValue: cmd.HeatValue}
rocketApply, err := s.applyRoomRocketGift(now, current, cfg, giftCmd, &settledGift, billing, roomMeta)
if err != nil {
return mutationResult{}, nil, err
}
copyRoomRPSRocketSnapshot(&cmd, settledGift)
payload, err := command.Serialize(cmd)
if err != nil {
return mutationResult{}, nil, err
}
current.Version++
records := make([]outbox.Record, 0, 1)
var progress *roomRocketProgressPending
if rocketApply.progressEvent != nil {
progressRecord, err := outbox.Build(current.RoomID, "RoomRocketFuelChanged", current.Version, now, rocketApply.progressEvent)
if err != nil {
return mutationResult{}, nil, err
}
progressRecord.AppCode = appcode.FromContext(ctx)
if progressRecord.Envelope != nil {
progressRecord.Envelope.AppCode = progressRecord.AppCode
}
progress = &roomRocketProgressPending{record: progressRecord, rocketID: rocketApply.progressEvent.GetRocketId(), level: rocketApply.progressEvent.GetLevel(), currentFuel: rocketApply.progressEvent.GetCurrentFuel(), roomVersion: current.Version}
}
if rocketApply.ignited != nil {
ignitedRecord, err := outbox.Build(current.RoomID, "RoomRocketIgnited", current.Version, now, rocketApply.ignited)
if err != nil {
return mutationResult{}, nil, err
}
records = append(records, ignitedRecord)
}
return mutationResult{snapshot: current.ToProto(), commandPayload: payload, roomRocketProgress: progress}, records, nil
})
if err != nil {
return nil, err
}
return &roomv1.ApplyRoomRPSGiftResponse{Result: commandResult(result.applied, result.snapshot.GetVersion(), s.clock.Now()), Rocket: result.snapshot.GetRocket()}, nil
}
func copyRoomRPSRocketSnapshot(target *command.ApplyRoomRPSGift, source command.SendGift) {
target.RocketTouched = source.RocketTouched
target.RocketAddedFuel = source.RocketAddedFuel
target.RocketEffectiveFuel = source.RocketEffectiveFuel
target.RocketOverflowFuel = source.RocketOverflowFuel
target.RocketLevel = source.RocketLevel
target.RocketFuel = source.RocketFuel
target.RocketStatus = source.RocketStatus
target.RocketFuelThreshold = source.RocketFuelThreshold
target.RocketIgnitedAtMS = source.RocketIgnitedAtMS
target.RocketLaunchAtMS = source.RocketLaunchAtMS
target.RocketResetAtMS = source.RocketResetAtMS
target.RocketTop1UserID = source.RocketTop1UserID
target.RocketIgniterUserID = source.RocketIgniterUserID
target.RocketID = source.RocketID
target.RocketConfigVersion = source.RocketConfigVersion
target.RocketPendingLaunches = source.RocketPendingLaunches
target.RocketCurrentContributions = source.RocketCurrentContributions
}

View File

@ -439,6 +439,20 @@ func (s *Server) SendGift(ctx context.Context, req *roomv1.SendGiftRequest) (*ro
return mapServiceResult(s.svc.SendGift(ctx, req))
}
// ApplyRoomRPSGift 接收 game-service 已完成结算的败者礼物,并路由到房间 owner 节点的 Room Cell。
func (s *Server) ApplyRoomRPSGift(ctx context.Context, req *roomv1.ApplyRoomRPSGiftRequest) (*roomv1.ApplyRoomRPSGiftResponse, error) {
if req == nil || req.GetMeta() == nil {
return nil, xerr.ToGRPCError(xerr.New(xerr.InvalidArgument, "room rps settled gift meta is required"))
}
ctx = contextWithMetaApp(ctx, req.GetMeta())
if resp, forwarded, err := forwardCommand(s, ctx, req.GetMeta(), func(callCtx context.Context, client roomv1.RoomCommandServiceClient) (*roomv1.ApplyRoomRPSGiftResponse, error) {
return client.ApplyRoomRPSGift(callCtx, req)
}); forwarded || err != nil {
return resp, err
}
return mapServiceResult(s.svc.ApplyRoomRPSGift(ctx, req))
}
// FollowRoom 建立用户对房间的关注关系。
func (s *Server) FollowRoom(ctx context.Context, req *roomv1.FollowRoomRequest) (*roomv1.FollowRoomResponse, error) {
// 房间关注是用户-房间关系事实,不改变 Room Cell 核心状态,因此不需要 owner 转发。