diff --git a/api/proto/room/v1/room.pb.go b/api/proto/room/v1/room.pb.go index 6dc5bca7..d4ef6253 100644 --- a/api/proto/room/v1/room.pb.go +++ b/api/proto/room/v1/room.pb.go @@ -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, }, diff --git a/api/proto/room/v1/room.proto b/api/proto/room/v1/room.proto index bc6c2241..640ad4b3 100644 --- a/api/proto/room/v1/room.proto +++ b/api/proto/room/v1/room.proto @@ -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); } diff --git a/api/proto/room/v1/room_grpc.pb.go b/api/proto/room/v1/room_grpc.pb.go index e7cf7647..1d479788 100644 --- a/api/proto/room/v1/room_grpc.pb.go +++ b/api/proto/room/v1/room_grpc.pb.go @@ -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, diff --git a/services/game-service/configs/config.docker.yaml b/services/game-service/configs/config.docker.yaml index 331b1083..ff82c599 100644 --- a/services/game-service/configs/config.docker.yaml +++ b/services/game-service/configs/config.docker.yaml @@ -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 应用。 diff --git a/services/game-service/configs/config.tencent.example.yaml b/services/game-service/configs/config.tencent.example.yaml index ae4eb0dc..9f56f896 100644 --- a/services/game-service/configs/config.tencent.example.yaml +++ b/services/game-service/configs/config.tencent.example.yaml @@ -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 房间群自定义消息。 diff --git a/services/game-service/configs/config.yaml b/services/game-service/configs/config.yaml index c20e4de7..9d5d98ea 100644 --- a/services/game-service/configs/config.yaml +++ b/services/game-service/configs/config.yaml @@ -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 应用。 diff --git a/services/game-service/internal/app/app.go b/services/game-service/internal/app/app.go index 1fa4ae65..83ab726c 100644 --- a/services/game-service/internal/app/app.go +++ b/services/game-service/internal/app/app.go @@ -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() } diff --git a/services/game-service/internal/config/config.go b/services/game-service/internal/config/config.go index 1903874e..ee707d14 100644 --- a/services/game-service/internal/config/config.go +++ b/services/game-service/internal/config/config.go @@ -20,13 +20,15 @@ type Config struct { Environment string `yaml:"environment"` GRPCAddr string `yaml:"grpc_addr"` // HealthHTTPAddr 是给 CLB/发布脚本探活使用的 HTTP 监听地址,不承载业务流量。 - HealthHTTPAddr string `yaml:"health_http_addr"` - MySQLDSN string `yaml:"mysql_dsn"` - WalletServiceAddr string `yaml:"wallet_service_addr"` - UserServiceAddr string `yaml:"user_service_addr"` - ActivityServiceAddr string `yaml:"activity_service_addr"` - RobotServiceAddr string `yaml:"robot_service_addr"` - LaunchSessionTTL time.Duration `yaml:"launch_session_ttl"` + HealthHTTPAddr string `yaml:"health_http_addr"` + MySQLDSN string `yaml:"mysql_dsn"` + WalletServiceAddr string `yaml:"wallet_service_addr"` + UserServiceAddr string `yaml:"user_service_addr"` + ActivityServiceAddr string `yaml:"activity_service_addr"` + RobotServiceAddr string `yaml:"robot_service_addr"` + // RoomServiceAddr 用于把 room-rps 最终败者礼物提交给 Room Cell;game-service 不持有火箭状态。 + RoomServiceAddr string `yaml:"room_service_addr"` + LaunchSessionTTL time.Duration `yaml:"launch_session_ttl"` // TencentIM 是房内猜拳向房间群投递 PK 事件的腾讯 IM REST 配置;缺配置时必须显式关闭,不能靠环境变量隐式漂移。 TencentIM TencentIMConfig `yaml:"tencent_im"` RocketMQ RocketMQConfig `yaml:"rocketmq"` @@ -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 } diff --git a/services/game-service/internal/service/roomrps/service.go b/services/game-service/internal/service/roomrps/service.go index 87adeabd..9e3629af 100644 --- a/services/game-service/internal/service/roomrps/service.go +++ b/services/game-service/internal/service/roomrps/service.go @@ -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") diff --git a/services/game-service/internal/service/roomrps/service_test.go b/services/game-service/internal/service/roomrps/service_test.go index 3890f975..919e3493 100644 --- a/services/game-service/internal/service/roomrps/service_test.go +++ b/services/game-service/internal/service/roomrps/service_test.go @@ -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)} } diff --git a/services/room-service/internal/room/command/command.go b/services/room-service/internal/room/command/command.go index 63e1cd52..e4855481 100644 --- a/services/room-service/internal/room/command/command.go +++ b/services/room-service/internal/room/command/command.go @@ -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: diff --git a/services/room-service/internal/room/service/recovery.go b/services/room-service/internal/room/service/recovery.go index 31529c3d..d0b66884 100644 --- a/services/room-service/internal/room/service/recovery.go +++ b/services/room-service/internal/room/service/recovery.go @@ -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, diff --git a/services/room-service/internal/room/service/room_rocket_test.go b/services/room-service/internal/room/service/room_rocket_test.go index 2047bb14..3a44b3e6 100644 --- a/services/room-service/internal/room/service/room_rocket_test.go +++ b/services/room-service/internal/room/service/room_rocket_test.go @@ -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) diff --git a/services/room-service/internal/room/service/room_rps_gift.go b/services/room-service/internal/room/service/room_rps_gift.go new file mode 100644 index 00000000..88680c03 --- /dev/null +++ b/services/room-service/internal/room/service/room_rps_gift.go @@ -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 +} diff --git a/services/room-service/internal/transport/grpc/server.go b/services/room-service/internal/transport/grpc/server.go index f6ce8a54..f8a5abe0 100644 --- a/services/room-service/internal/transport/grpc/server.go +++ b/services/room-service/internal/transport/grpc/server.go @@ -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 转发。