diff --git a/api/proto/user/v1/user.pb.go b/api/proto/user/v1/user.pb.go index caac3154..d5e5097d 100644 --- a/api/proto/user/v1/user.pb.go +++ b/api/proto/user/v1/user.pb.go @@ -3591,8 +3591,11 @@ type CPRelationship struct { NeededForNextLevel int64 `protobuf:"varint,13,opt,name=needed_for_next_level,json=neededForNextLevel,proto3" json:"needed_for_next_level,omitempty"` LevelProgressPercent int32 `protobuf:"varint,14,opt,name=level_progress_percent,json=levelProgressPercent,proto3" json:"level_progress_percent,omitempty"` MaxLevel bool `protobuf:"varint,15,opt,name=max_level,json=maxLevel,proto3" json:"max_level,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // breakup_cost_coins 是当前关系类型后台配置的解除费用;active 关系返回配置值,ended 关系返回实际支付值。 + BreakupCostCoins int64 `protobuf:"varint,16,opt,name=breakup_cost_coins,json=breakupCostCoins,proto3" json:"breakup_cost_coins,omitempty"` + EndedAtMs int64 `protobuf:"varint,17,opt,name=ended_at_ms,json=endedAtMs,proto3" json:"ended_at_ms,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CPRelationship) Reset() { @@ -3723,6 +3726,20 @@ func (x *CPRelationship) GetMaxLevel() bool { return false } +func (x *CPRelationship) GetBreakupCostCoins() int64 { + if x != nil { + return x.BreakupCostCoins + } + return 0 +} + +func (x *CPRelationship) GetEndedAtMs() int64 { + if x != nil { + return x.EndedAtMs + } + return 0 +} + type ListCPApplicationsRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Meta *RequestMeta `protobuf:"bytes,1,opt,name=meta,proto3" json:"meta,omitempty"` @@ -4219,6 +4236,446 @@ func (x *ListCPRelationshipsResponse) GetTotal() int64 { return 0 } +type PrepareBreakCPRelationshipRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Meta *RequestMeta `protobuf:"bytes,1,opt,name=meta,proto3" json:"meta,omitempty"` + UserId int64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + RelationshipId string `protobuf:"bytes,3,opt,name=relationship_id,json=relationshipId,proto3" json:"relationship_id,omitempty"` + CommandId string `protobuf:"bytes,4,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PrepareBreakCPRelationshipRequest) Reset() { + *x = PrepareBreakCPRelationshipRequest{} + mi := &file_proto_user_v1_user_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PrepareBreakCPRelationshipRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PrepareBreakCPRelationshipRequest) ProtoMessage() {} + +func (x *PrepareBreakCPRelationshipRequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_user_v1_user_proto_msgTypes[57] + 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 PrepareBreakCPRelationshipRequest.ProtoReflect.Descriptor instead. +func (*PrepareBreakCPRelationshipRequest) Descriptor() ([]byte, []int) { + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{57} +} + +func (x *PrepareBreakCPRelationshipRequest) GetMeta() *RequestMeta { + if x != nil { + return x.Meta + } + return nil +} + +func (x *PrepareBreakCPRelationshipRequest) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *PrepareBreakCPRelationshipRequest) GetRelationshipId() string { + if x != nil { + return x.RelationshipId + } + return "" +} + +func (x *PrepareBreakCPRelationshipRequest) GetCommandId() string { + if x != nil { + return x.CommandId + } + return "" +} + +type PrepareBreakCPRelationshipResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Relationship *CPRelationship `protobuf:"bytes,1,opt,name=relationship,proto3" json:"relationship,omitempty"` + CommandId string `protobuf:"bytes,2,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + BreakupCostCoins int64 `protobuf:"varint,4,opt,name=breakup_cost_coins,json=breakupCostCoins,proto3" json:"breakup_cost_coins,omitempty"` + WalletTransactionId string `protobuf:"bytes,5,opt,name=wallet_transaction_id,json=walletTransactionId,proto3" json:"wallet_transaction_id,omitempty"` + CoinBalanceAfter int64 `protobuf:"varint,6,opt,name=coin_balance_after,json=coinBalanceAfter,proto3" json:"coin_balance_after,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PrepareBreakCPRelationshipResponse) Reset() { + *x = PrepareBreakCPRelationshipResponse{} + mi := &file_proto_user_v1_user_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PrepareBreakCPRelationshipResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PrepareBreakCPRelationshipResponse) ProtoMessage() {} + +func (x *PrepareBreakCPRelationshipResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_user_v1_user_proto_msgTypes[58] + 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 PrepareBreakCPRelationshipResponse.ProtoReflect.Descriptor instead. +func (*PrepareBreakCPRelationshipResponse) Descriptor() ([]byte, []int) { + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{58} +} + +func (x *PrepareBreakCPRelationshipResponse) GetRelationship() *CPRelationship { + if x != nil { + return x.Relationship + } + return nil +} + +func (x *PrepareBreakCPRelationshipResponse) GetCommandId() string { + if x != nil { + return x.CommandId + } + return "" +} + +func (x *PrepareBreakCPRelationshipResponse) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *PrepareBreakCPRelationshipResponse) GetBreakupCostCoins() int64 { + if x != nil { + return x.BreakupCostCoins + } + return 0 +} + +func (x *PrepareBreakCPRelationshipResponse) GetWalletTransactionId() string { + if x != nil { + return x.WalletTransactionId + } + return "" +} + +func (x *PrepareBreakCPRelationshipResponse) GetCoinBalanceAfter() int64 { + if x != nil { + return x.CoinBalanceAfter + } + return 0 +} + +type ConfirmBreakCPRelationshipRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Meta *RequestMeta `protobuf:"bytes,1,opt,name=meta,proto3" json:"meta,omitempty"` + UserId int64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + RelationshipId string `protobuf:"bytes,3,opt,name=relationship_id,json=relationshipId,proto3" json:"relationship_id,omitempty"` + CommandId string `protobuf:"bytes,4,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` + WalletTransactionId string `protobuf:"bytes,5,opt,name=wallet_transaction_id,json=walletTransactionId,proto3" json:"wallet_transaction_id,omitempty"` + PaidCoinAmount int64 `protobuf:"varint,6,opt,name=paid_coin_amount,json=paidCoinAmount,proto3" json:"paid_coin_amount,omitempty"` + CoinBalanceAfter int64 `protobuf:"varint,7,opt,name=coin_balance_after,json=coinBalanceAfter,proto3" json:"coin_balance_after,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ConfirmBreakCPRelationshipRequest) Reset() { + *x = ConfirmBreakCPRelationshipRequest{} + mi := &file_proto_user_v1_user_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ConfirmBreakCPRelationshipRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConfirmBreakCPRelationshipRequest) ProtoMessage() {} + +func (x *ConfirmBreakCPRelationshipRequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_user_v1_user_proto_msgTypes[59] + 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 ConfirmBreakCPRelationshipRequest.ProtoReflect.Descriptor instead. +func (*ConfirmBreakCPRelationshipRequest) Descriptor() ([]byte, []int) { + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{59} +} + +func (x *ConfirmBreakCPRelationshipRequest) GetMeta() *RequestMeta { + if x != nil { + return x.Meta + } + return nil +} + +func (x *ConfirmBreakCPRelationshipRequest) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *ConfirmBreakCPRelationshipRequest) GetRelationshipId() string { + if x != nil { + return x.RelationshipId + } + return "" +} + +func (x *ConfirmBreakCPRelationshipRequest) GetCommandId() string { + if x != nil { + return x.CommandId + } + return "" +} + +func (x *ConfirmBreakCPRelationshipRequest) GetWalletTransactionId() string { + if x != nil { + return x.WalletTransactionId + } + return "" +} + +func (x *ConfirmBreakCPRelationshipRequest) GetPaidCoinAmount() int64 { + if x != nil { + return x.PaidCoinAmount + } + return 0 +} + +func (x *ConfirmBreakCPRelationshipRequest) GetCoinBalanceAfter() int64 { + if x != nil { + return x.CoinBalanceAfter + } + return 0 +} + +type ConfirmBreakCPRelationshipResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Relationship *CPRelationship `protobuf:"bytes,1,opt,name=relationship,proto3" json:"relationship,omitempty"` + BreakupCostCoins int64 `protobuf:"varint,2,opt,name=breakup_cost_coins,json=breakupCostCoins,proto3" json:"breakup_cost_coins,omitempty"` + WalletTransactionId string `protobuf:"bytes,3,opt,name=wallet_transaction_id,json=walletTransactionId,proto3" json:"wallet_transaction_id,omitempty"` + CoinBalanceAfter int64 `protobuf:"varint,4,opt,name=coin_balance_after,json=coinBalanceAfter,proto3" json:"coin_balance_after,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ConfirmBreakCPRelationshipResponse) Reset() { + *x = ConfirmBreakCPRelationshipResponse{} + mi := &file_proto_user_v1_user_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ConfirmBreakCPRelationshipResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConfirmBreakCPRelationshipResponse) ProtoMessage() {} + +func (x *ConfirmBreakCPRelationshipResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_user_v1_user_proto_msgTypes[60] + 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 ConfirmBreakCPRelationshipResponse.ProtoReflect.Descriptor instead. +func (*ConfirmBreakCPRelationshipResponse) Descriptor() ([]byte, []int) { + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{60} +} + +func (x *ConfirmBreakCPRelationshipResponse) GetRelationship() *CPRelationship { + if x != nil { + return x.Relationship + } + return nil +} + +func (x *ConfirmBreakCPRelationshipResponse) GetBreakupCostCoins() int64 { + if x != nil { + return x.BreakupCostCoins + } + return 0 +} + +func (x *ConfirmBreakCPRelationshipResponse) GetWalletTransactionId() string { + if x != nil { + return x.WalletTransactionId + } + return "" +} + +func (x *ConfirmBreakCPRelationshipResponse) GetCoinBalanceAfter() int64 { + if x != nil { + return x.CoinBalanceAfter + } + return 0 +} + +type CancelBreakCPRelationshipRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Meta *RequestMeta `protobuf:"bytes,1,opt,name=meta,proto3" json:"meta,omitempty"` + UserId int64 `protobuf:"varint,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + RelationshipId string `protobuf:"bytes,3,opt,name=relationship_id,json=relationshipId,proto3" json:"relationship_id,omitempty"` + CommandId string `protobuf:"bytes,4,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` + Reason string `protobuf:"bytes,5,opt,name=reason,proto3" json:"reason,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CancelBreakCPRelationshipRequest) Reset() { + *x = CancelBreakCPRelationshipRequest{} + mi := &file_proto_user_v1_user_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CancelBreakCPRelationshipRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CancelBreakCPRelationshipRequest) ProtoMessage() {} + +func (x *CancelBreakCPRelationshipRequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_user_v1_user_proto_msgTypes[61] + 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 CancelBreakCPRelationshipRequest.ProtoReflect.Descriptor instead. +func (*CancelBreakCPRelationshipRequest) Descriptor() ([]byte, []int) { + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{61} +} + +func (x *CancelBreakCPRelationshipRequest) GetMeta() *RequestMeta { + if x != nil { + return x.Meta + } + return nil +} + +func (x *CancelBreakCPRelationshipRequest) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *CancelBreakCPRelationshipRequest) GetRelationshipId() string { + if x != nil { + return x.RelationshipId + } + return "" +} + +func (x *CancelBreakCPRelationshipRequest) GetCommandId() string { + if x != nil { + return x.CommandId + } + return "" +} + +func (x *CancelBreakCPRelationshipRequest) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + +type CancelBreakCPRelationshipResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + CommandId string `protobuf:"bytes,1,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CancelBreakCPRelationshipResponse) Reset() { + *x = CancelBreakCPRelationshipResponse{} + mi := &file_proto_user_v1_user_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CancelBreakCPRelationshipResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CancelBreakCPRelationshipResponse) ProtoMessage() {} + +func (x *CancelBreakCPRelationshipResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_user_v1_user_proto_msgTypes[62] + 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 CancelBreakCPRelationshipResponse.ProtoReflect.Descriptor instead. +func (*CancelBreakCPRelationshipResponse) Descriptor() ([]byte, []int) { + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{62} +} + +func (x *CancelBreakCPRelationshipResponse) GetCommandId() string { + if x != nil { + return x.CommandId + } + return "" +} + +func (x *CancelBreakCPRelationshipResponse) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + type RoomGiftCPEvent struct { state protoimpl.MessageState `protogen:"open.v1"` Meta *RequestMeta `protobuf:"bytes,1,opt,name=meta,proto3" json:"meta,omitempty"` @@ -4245,7 +4702,7 @@ type RoomGiftCPEvent struct { func (x *RoomGiftCPEvent) Reset() { *x = RoomGiftCPEvent{} - mi := &file_proto_user_v1_user_proto_msgTypes[57] + mi := &file_proto_user_v1_user_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4257,7 +4714,7 @@ func (x *RoomGiftCPEvent) String() string { func (*RoomGiftCPEvent) ProtoMessage() {} func (x *RoomGiftCPEvent) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[57] + mi := &file_proto_user_v1_user_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4270,7 +4727,7 @@ func (x *RoomGiftCPEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use RoomGiftCPEvent.ProtoReflect.Descriptor instead. func (*RoomGiftCPEvent) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{57} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{63} } func (x *RoomGiftCPEvent) GetMeta() *RequestMeta { @@ -4409,7 +4866,7 @@ type ConsumeRoomGiftCPEventRequest struct { func (x *ConsumeRoomGiftCPEventRequest) Reset() { *x = ConsumeRoomGiftCPEventRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[58] + mi := &file_proto_user_v1_user_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4421,7 +4878,7 @@ func (x *ConsumeRoomGiftCPEventRequest) String() string { func (*ConsumeRoomGiftCPEventRequest) ProtoMessage() {} func (x *ConsumeRoomGiftCPEventRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[58] + mi := &file_proto_user_v1_user_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4434,7 +4891,7 @@ func (x *ConsumeRoomGiftCPEventRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ConsumeRoomGiftCPEventRequest.ProtoReflect.Descriptor instead. func (*ConsumeRoomGiftCPEventRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{58} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{64} } func (x *ConsumeRoomGiftCPEventRequest) GetMeta() *RequestMeta { @@ -4462,7 +4919,7 @@ type ConsumeRoomGiftCPEventResponse struct { func (x *ConsumeRoomGiftCPEventResponse) Reset() { *x = ConsumeRoomGiftCPEventResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[59] + mi := &file_proto_user_v1_user_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4474,7 +4931,7 @@ func (x *ConsumeRoomGiftCPEventResponse) String() string { func (*ConsumeRoomGiftCPEventResponse) ProtoMessage() {} func (x *ConsumeRoomGiftCPEventResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[59] + mi := &file_proto_user_v1_user_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4487,7 +4944,7 @@ func (x *ConsumeRoomGiftCPEventResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ConsumeRoomGiftCPEventResponse.ProtoReflect.Descriptor instead. func (*ConsumeRoomGiftCPEventResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{59} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{65} } func (x *ConsumeRoomGiftCPEventResponse) GetConsumed() bool { @@ -4530,7 +4987,7 @@ type UserReport struct { func (x *UserReport) Reset() { *x = UserReport{} - mi := &file_proto_user_v1_user_proto_msgTypes[60] + mi := &file_proto_user_v1_user_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4542,7 +4999,7 @@ func (x *UserReport) String() string { func (*UserReport) ProtoMessage() {} func (x *UserReport) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[60] + mi := &file_proto_user_v1_user_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4555,7 +5012,7 @@ func (x *UserReport) ProtoReflect() protoreflect.Message { // Deprecated: Use UserReport.ProtoReflect.Descriptor instead. func (*UserReport) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{60} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{66} } func (x *UserReport) GetReportId() string { @@ -4644,7 +5101,7 @@ type SubmitReportRequest struct { func (x *SubmitReportRequest) Reset() { *x = SubmitReportRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[61] + mi := &file_proto_user_v1_user_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4656,7 +5113,7 @@ func (x *SubmitReportRequest) String() string { func (*SubmitReportRequest) ProtoMessage() {} func (x *SubmitReportRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[61] + mi := &file_proto_user_v1_user_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4669,7 +5126,7 @@ func (x *SubmitReportRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubmitReportRequest.ProtoReflect.Descriptor instead. func (*SubmitReportRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{61} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{67} } func (x *SubmitReportRequest) GetMeta() *RequestMeta { @@ -4730,7 +5187,7 @@ type SubmitReportResponse struct { func (x *SubmitReportResponse) Reset() { *x = SubmitReportResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[62] + mi := &file_proto_user_v1_user_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4742,7 +5199,7 @@ func (x *SubmitReportResponse) String() string { func (*SubmitReportResponse) ProtoMessage() {} func (x *SubmitReportResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[62] + mi := &file_proto_user_v1_user_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4755,7 +5212,7 @@ func (x *SubmitReportResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubmitReportResponse.ProtoReflect.Descriptor instead. func (*SubmitReportResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{62} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{68} } func (x *SubmitReportResponse) GetReport() *UserReport { @@ -4776,7 +5233,7 @@ type BatchGetUsersRequest struct { func (x *BatchGetUsersRequest) Reset() { *x = BatchGetUsersRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[63] + mi := &file_proto_user_v1_user_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4788,7 +5245,7 @@ func (x *BatchGetUsersRequest) String() string { func (*BatchGetUsersRequest) ProtoMessage() {} func (x *BatchGetUsersRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[63] + mi := &file_proto_user_v1_user_proto_msgTypes[69] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4801,7 +5258,7 @@ func (x *BatchGetUsersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchGetUsersRequest.ProtoReflect.Descriptor instead. func (*BatchGetUsersRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{63} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{69} } func (x *BatchGetUsersRequest) GetMeta() *RequestMeta { @@ -4828,7 +5285,7 @@ type BatchGetUsersResponse struct { func (x *BatchGetUsersResponse) Reset() { *x = BatchGetUsersResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[64] + mi := &file_proto_user_v1_user_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4840,7 +5297,7 @@ func (x *BatchGetUsersResponse) String() string { func (*BatchGetUsersResponse) ProtoMessage() {} func (x *BatchGetUsersResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[64] + mi := &file_proto_user_v1_user_proto_msgTypes[70] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4853,7 +5310,7 @@ func (x *BatchGetUsersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchGetUsersResponse.ProtoReflect.Descriptor instead. func (*BatchGetUsersResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{64} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{70} } func (x *BatchGetUsersResponse) GetUsers() map[int64]*User { @@ -4878,7 +5335,7 @@ type ListUserIDsRequest struct { func (x *ListUserIDsRequest) Reset() { *x = ListUserIDsRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[65] + mi := &file_proto_user_v1_user_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4890,7 +5347,7 @@ func (x *ListUserIDsRequest) String() string { func (*ListUserIDsRequest) ProtoMessage() {} func (x *ListUserIDsRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[65] + mi := &file_proto_user_v1_user_proto_msgTypes[71] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4903,7 +5360,7 @@ func (x *ListUserIDsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListUserIDsRequest.ProtoReflect.Descriptor instead. func (*ListUserIDsRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{65} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{71} } func (x *ListUserIDsRequest) GetMeta() *RequestMeta { @@ -4960,7 +5417,7 @@ type ListUserIDsResponse struct { func (x *ListUserIDsResponse) Reset() { *x = ListUserIDsResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[66] + mi := &file_proto_user_v1_user_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4972,7 +5429,7 @@ func (x *ListUserIDsResponse) String() string { func (*ListUserIDsResponse) ProtoMessage() {} func (x *ListUserIDsResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[66] + mi := &file_proto_user_v1_user_proto_msgTypes[72] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4985,7 +5442,7 @@ func (x *ListUserIDsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListUserIDsResponse.ProtoReflect.Descriptor instead. func (*ListUserIDsResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{66} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{72} } func (x *ListUserIDsResponse) GetUserIds() []int64 { @@ -5024,7 +5481,7 @@ type UpdateUserProfileRequest struct { func (x *UpdateUserProfileRequest) Reset() { *x = UpdateUserProfileRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[67] + mi := &file_proto_user_v1_user_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5036,7 +5493,7 @@ func (x *UpdateUserProfileRequest) String() string { func (*UpdateUserProfileRequest) ProtoMessage() {} func (x *UpdateUserProfileRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[67] + mi := &file_proto_user_v1_user_proto_msgTypes[73] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5049,7 +5506,7 @@ func (x *UpdateUserProfileRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateUserProfileRequest.ProtoReflect.Descriptor instead. func (*UpdateUserProfileRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{67} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{73} } func (x *UpdateUserProfileRequest) GetMeta() *RequestMeta { @@ -5104,7 +5561,7 @@ type UpdateUserProfileResponse struct { func (x *UpdateUserProfileResponse) Reset() { *x = UpdateUserProfileResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[68] + mi := &file_proto_user_v1_user_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5116,7 +5573,7 @@ func (x *UpdateUserProfileResponse) String() string { func (*UpdateUserProfileResponse) ProtoMessage() {} func (x *UpdateUserProfileResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[68] + mi := &file_proto_user_v1_user_proto_msgTypes[74] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5129,7 +5586,7 @@ func (x *UpdateUserProfileResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateUserProfileResponse.ProtoReflect.Descriptor instead. func (*UpdateUserProfileResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{68} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{74} } func (x *UpdateUserProfileResponse) GetUser() *User { @@ -5151,7 +5608,7 @@ type ChangeUserCountryRequest struct { func (x *ChangeUserCountryRequest) Reset() { *x = ChangeUserCountryRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[69] + mi := &file_proto_user_v1_user_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5163,7 +5620,7 @@ func (x *ChangeUserCountryRequest) String() string { func (*ChangeUserCountryRequest) ProtoMessage() {} func (x *ChangeUserCountryRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[69] + mi := &file_proto_user_v1_user_proto_msgTypes[75] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5176,7 +5633,7 @@ func (x *ChangeUserCountryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeUserCountryRequest.ProtoReflect.Descriptor instead. func (*ChangeUserCountryRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{69} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{75} } func (x *ChangeUserCountryRequest) GetMeta() *RequestMeta { @@ -5214,7 +5671,7 @@ type AdminChangeUserCountryRequest struct { func (x *AdminChangeUserCountryRequest) Reset() { *x = AdminChangeUserCountryRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[70] + mi := &file_proto_user_v1_user_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5226,7 +5683,7 @@ func (x *AdminChangeUserCountryRequest) String() string { func (*AdminChangeUserCountryRequest) ProtoMessage() {} func (x *AdminChangeUserCountryRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[70] + mi := &file_proto_user_v1_user_proto_msgTypes[76] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5239,7 +5696,7 @@ func (x *AdminChangeUserCountryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AdminChangeUserCountryRequest.ProtoReflect.Descriptor instead. func (*AdminChangeUserCountryRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{70} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{76} } func (x *AdminChangeUserCountryRequest) GetMeta() *RequestMeta { @@ -5291,7 +5748,7 @@ type ChangeUserCountryResponse struct { func (x *ChangeUserCountryResponse) Reset() { *x = ChangeUserCountryResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[71] + mi := &file_proto_user_v1_user_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5303,7 +5760,7 @@ func (x *ChangeUserCountryResponse) String() string { func (*ChangeUserCountryResponse) ProtoMessage() {} func (x *ChangeUserCountryResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[71] + mi := &file_proto_user_v1_user_proto_msgTypes[77] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5316,7 +5773,7 @@ func (x *ChangeUserCountryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeUserCountryResponse.ProtoReflect.Descriptor instead. func (*ChangeUserCountryResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{71} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{77} } func (x *ChangeUserCountryResponse) GetUser() *User { @@ -5371,7 +5828,7 @@ type SetUserStatusRequest struct { func (x *SetUserStatusRequest) Reset() { *x = SetUserStatusRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[72] + mi := &file_proto_user_v1_user_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5383,7 +5840,7 @@ func (x *SetUserStatusRequest) String() string { func (*SetUserStatusRequest) ProtoMessage() {} func (x *SetUserStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[72] + mi := &file_proto_user_v1_user_proto_msgTypes[78] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5396,7 +5853,7 @@ func (x *SetUserStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetUserStatusRequest.ProtoReflect.Descriptor instead. func (*SetUserStatusRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{72} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{78} } func (x *SetUserStatusRequest) GetMeta() *RequestMeta { @@ -5462,7 +5919,7 @@ type SetUserStatusResponse struct { func (x *SetUserStatusResponse) Reset() { *x = SetUserStatusResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[73] + mi := &file_proto_user_v1_user_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5474,7 +5931,7 @@ func (x *SetUserStatusResponse) String() string { func (*SetUserStatusResponse) ProtoMessage() {} func (x *SetUserStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[73] + mi := &file_proto_user_v1_user_proto_msgTypes[79] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5487,7 +5944,7 @@ func (x *SetUserStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetUserStatusResponse.ProtoReflect.Descriptor instead. func (*SetUserStatusResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{73} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{79} } func (x *SetUserStatusResponse) GetUser() *User { @@ -5587,7 +6044,7 @@ type ManagerUserBlock struct { func (x *ManagerUserBlock) Reset() { *x = ManagerUserBlock{} - mi := &file_proto_user_v1_user_proto_msgTypes[74] + mi := &file_proto_user_v1_user_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5599,7 +6056,7 @@ func (x *ManagerUserBlock) String() string { func (*ManagerUserBlock) ProtoMessage() {} func (x *ManagerUserBlock) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[74] + mi := &file_proto_user_v1_user_proto_msgTypes[80] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5612,7 +6069,7 @@ func (x *ManagerUserBlock) ProtoReflect() protoreflect.Message { // Deprecated: Use ManagerUserBlock.ProtoReflect.Descriptor instead. func (*ManagerUserBlock) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{74} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{80} } func (x *ManagerUserBlock) GetBlockId() string { @@ -5713,7 +6170,7 @@ type CreateManagerUserBlockRequest struct { func (x *CreateManagerUserBlockRequest) Reset() { *x = CreateManagerUserBlockRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[75] + mi := &file_proto_user_v1_user_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5725,7 +6182,7 @@ func (x *CreateManagerUserBlockRequest) String() string { func (*CreateManagerUserBlockRequest) ProtoMessage() {} func (x *CreateManagerUserBlockRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[75] + mi := &file_proto_user_v1_user_proto_msgTypes[81] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5738,7 +6195,7 @@ func (x *CreateManagerUserBlockRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateManagerUserBlockRequest.ProtoReflect.Descriptor instead. func (*CreateManagerUserBlockRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{75} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{81} } func (x *CreateManagerUserBlockRequest) GetMeta() *RequestMeta { @@ -5793,7 +6250,7 @@ type CreateManagerUserBlockResponse struct { func (x *CreateManagerUserBlockResponse) Reset() { *x = CreateManagerUserBlockResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[76] + mi := &file_proto_user_v1_user_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5805,7 +6262,7 @@ func (x *CreateManagerUserBlockResponse) String() string { func (*CreateManagerUserBlockResponse) ProtoMessage() {} func (x *CreateManagerUserBlockResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[76] + mi := &file_proto_user_v1_user_proto_msgTypes[82] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5818,7 +6275,7 @@ func (x *CreateManagerUserBlockResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateManagerUserBlockResponse.ProtoReflect.Descriptor instead. func (*CreateManagerUserBlockResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{76} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{82} } func (x *CreateManagerUserBlockResponse) GetBlock() *ManagerUserBlock { @@ -5847,7 +6304,7 @@ type ListManagerUserBlocksRequest struct { func (x *ListManagerUserBlocksRequest) Reset() { *x = ListManagerUserBlocksRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[77] + mi := &file_proto_user_v1_user_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5859,7 +6316,7 @@ func (x *ListManagerUserBlocksRequest) String() string { func (*ListManagerUserBlocksRequest) ProtoMessage() {} func (x *ListManagerUserBlocksRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[77] + mi := &file_proto_user_v1_user_proto_msgTypes[83] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5872,7 +6329,7 @@ func (x *ListManagerUserBlocksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListManagerUserBlocksRequest.ProtoReflect.Descriptor instead. func (*ListManagerUserBlocksRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{77} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{83} } func (x *ListManagerUserBlocksRequest) GetMeta() *RequestMeta { @@ -5912,7 +6369,7 @@ type ListManagerUserBlocksResponse struct { func (x *ListManagerUserBlocksResponse) Reset() { *x = ListManagerUserBlocksResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[78] + mi := &file_proto_user_v1_user_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5924,7 +6381,7 @@ func (x *ListManagerUserBlocksResponse) String() string { func (*ListManagerUserBlocksResponse) ProtoMessage() {} func (x *ListManagerUserBlocksResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[78] + mi := &file_proto_user_v1_user_proto_msgTypes[84] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5937,7 +6394,7 @@ func (x *ListManagerUserBlocksResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListManagerUserBlocksResponse.ProtoReflect.Descriptor instead. func (*ListManagerUserBlocksResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{78} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{84} } func (x *ListManagerUserBlocksResponse) GetBlocks() []*ManagerUserBlock { @@ -5959,7 +6416,7 @@ type UnblockManagerUserRequest struct { func (x *UnblockManagerUserRequest) Reset() { *x = UnblockManagerUserRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[79] + mi := &file_proto_user_v1_user_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5971,7 +6428,7 @@ func (x *UnblockManagerUserRequest) String() string { func (*UnblockManagerUserRequest) ProtoMessage() {} func (x *UnblockManagerUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[79] + mi := &file_proto_user_v1_user_proto_msgTypes[85] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5984,7 +6441,7 @@ func (x *UnblockManagerUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnblockManagerUserRequest.ProtoReflect.Descriptor instead. func (*UnblockManagerUserRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{79} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{85} } func (x *UnblockManagerUserRequest) GetMeta() *RequestMeta { @@ -6025,7 +6482,7 @@ type UnblockManagerUserResponse struct { func (x *UnblockManagerUserResponse) Reset() { *x = UnblockManagerUserResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[80] + mi := &file_proto_user_v1_user_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6037,7 +6494,7 @@ func (x *UnblockManagerUserResponse) String() string { func (*UnblockManagerUserResponse) ProtoMessage() {} func (x *UnblockManagerUserResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[80] + mi := &file_proto_user_v1_user_proto_msgTypes[86] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6050,7 +6507,7 @@ func (x *UnblockManagerUserResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnblockManagerUserResponse.ProtoReflect.Descriptor instead. func (*UnblockManagerUserResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{80} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{86} } func (x *UnblockManagerUserResponse) GetBlock() *ManagerUserBlock { @@ -6083,7 +6540,7 @@ type CompleteOnboardingRequest struct { func (x *CompleteOnboardingRequest) Reset() { *x = CompleteOnboardingRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[81] + mi := &file_proto_user_v1_user_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6095,7 +6552,7 @@ func (x *CompleteOnboardingRequest) String() string { func (*CompleteOnboardingRequest) ProtoMessage() {} func (x *CompleteOnboardingRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[81] + mi := &file_proto_user_v1_user_proto_msgTypes[87] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6108,7 +6565,7 @@ func (x *CompleteOnboardingRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CompleteOnboardingRequest.ProtoReflect.Descriptor instead. func (*CompleteOnboardingRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{81} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{87} } func (x *CompleteOnboardingRequest) GetMeta() *RequestMeta { @@ -6175,7 +6632,7 @@ type CompleteOnboardingResponse struct { func (x *CompleteOnboardingResponse) Reset() { *x = CompleteOnboardingResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[82] + mi := &file_proto_user_v1_user_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6187,7 +6644,7 @@ func (x *CompleteOnboardingResponse) String() string { func (*CompleteOnboardingResponse) ProtoMessage() {} func (x *CompleteOnboardingResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[82] + mi := &file_proto_user_v1_user_proto_msgTypes[88] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6200,7 +6657,7 @@ func (x *CompleteOnboardingResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CompleteOnboardingResponse.ProtoReflect.Descriptor instead. func (*CompleteOnboardingResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{82} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{88} } func (x *CompleteOnboardingResponse) GetUser() *User { @@ -6264,7 +6721,7 @@ type BindPushTokenRequest struct { func (x *BindPushTokenRequest) Reset() { *x = BindPushTokenRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[83] + mi := &file_proto_user_v1_user_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6276,7 +6733,7 @@ func (x *BindPushTokenRequest) String() string { func (*BindPushTokenRequest) ProtoMessage() {} func (x *BindPushTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[83] + mi := &file_proto_user_v1_user_proto_msgTypes[89] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6289,7 +6746,7 @@ func (x *BindPushTokenRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BindPushTokenRequest.ProtoReflect.Descriptor instead. func (*BindPushTokenRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{83} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{89} } func (x *BindPushTokenRequest) GetMeta() *RequestMeta { @@ -6365,7 +6822,7 @@ type BindPushTokenResponse struct { func (x *BindPushTokenResponse) Reset() { *x = BindPushTokenResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[84] + mi := &file_proto_user_v1_user_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6377,7 +6834,7 @@ func (x *BindPushTokenResponse) String() string { func (*BindPushTokenResponse) ProtoMessage() {} func (x *BindPushTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[84] + mi := &file_proto_user_v1_user_proto_msgTypes[90] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6390,7 +6847,7 @@ func (x *BindPushTokenResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BindPushTokenResponse.ProtoReflect.Descriptor instead. func (*BindPushTokenResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{84} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{90} } func (x *BindPushTokenResponse) GetBound() bool { @@ -6421,7 +6878,7 @@ type DeletePushTokenRequest struct { func (x *DeletePushTokenRequest) Reset() { *x = DeletePushTokenRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[85] + mi := &file_proto_user_v1_user_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6433,7 +6890,7 @@ func (x *DeletePushTokenRequest) String() string { func (*DeletePushTokenRequest) ProtoMessage() {} func (x *DeletePushTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[85] + mi := &file_proto_user_v1_user_proto_msgTypes[91] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6446,7 +6903,7 @@ func (x *DeletePushTokenRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeletePushTokenRequest.ProtoReflect.Descriptor instead. func (*DeletePushTokenRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{85} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{91} } func (x *DeletePushTokenRequest) GetMeta() *RequestMeta { @@ -6487,7 +6944,7 @@ type DeletePushTokenResponse struct { func (x *DeletePushTokenResponse) Reset() { *x = DeletePushTokenResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[86] + mi := &file_proto_user_v1_user_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6499,7 +6956,7 @@ func (x *DeletePushTokenResponse) String() string { func (*DeletePushTokenResponse) ProtoMessage() {} func (x *DeletePushTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[86] + mi := &file_proto_user_v1_user_proto_msgTypes[92] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6512,7 +6969,7 @@ func (x *DeletePushTokenResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeletePushTokenResponse.ProtoReflect.Descriptor instead. func (*DeletePushTokenResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{86} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{92} } func (x *DeletePushTokenResponse) GetDeleted() bool { @@ -6551,7 +7008,7 @@ type Country struct { func (x *Country) Reset() { *x = Country{} - mi := &file_proto_user_v1_user_proto_msgTypes[87] + mi := &file_proto_user_v1_user_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6563,7 +7020,7 @@ func (x *Country) String() string { func (*Country) ProtoMessage() {} func (x *Country) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[87] + mi := &file_proto_user_v1_user_proto_msgTypes[93] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6576,7 +7033,7 @@ func (x *Country) ProtoReflect() protoreflect.Message { // Deprecated: Use Country.ProtoReflect.Descriptor instead. func (*Country) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{87} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{93} } func (x *Country) GetCountryId() int64 { @@ -6688,7 +7145,7 @@ type Region struct { func (x *Region) Reset() { *x = Region{} - mi := &file_proto_user_v1_user_proto_msgTypes[88] + mi := &file_proto_user_v1_user_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6700,7 +7157,7 @@ func (x *Region) String() string { func (*Region) ProtoMessage() {} func (x *Region) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[88] + mi := &file_proto_user_v1_user_proto_msgTypes[94] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6713,7 +7170,7 @@ func (x *Region) ProtoReflect() protoreflect.Message { // Deprecated: Use Region.ProtoReflect.Descriptor instead. func (*Region) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{88} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{94} } func (x *Region) GetRegionId() int64 { @@ -6789,7 +7246,7 @@ type ListCountriesRequest struct { func (x *ListCountriesRequest) Reset() { *x = ListCountriesRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[89] + mi := &file_proto_user_v1_user_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6801,7 +7258,7 @@ func (x *ListCountriesRequest) String() string { func (*ListCountriesRequest) ProtoMessage() {} func (x *ListCountriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[89] + mi := &file_proto_user_v1_user_proto_msgTypes[95] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6814,7 +7271,7 @@ func (x *ListCountriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListCountriesRequest.ProtoReflect.Descriptor instead. func (*ListCountriesRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{89} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{95} } func (x *ListCountriesRequest) GetMeta() *RequestMeta { @@ -6840,7 +7297,7 @@ type ListCountriesResponse struct { func (x *ListCountriesResponse) Reset() { *x = ListCountriesResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[90] + mi := &file_proto_user_v1_user_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6852,7 +7309,7 @@ func (x *ListCountriesResponse) String() string { func (*ListCountriesResponse) ProtoMessage() {} func (x *ListCountriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[90] + mi := &file_proto_user_v1_user_proto_msgTypes[96] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6865,7 +7322,7 @@ func (x *ListCountriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListCountriesResponse.ProtoReflect.Descriptor instead. func (*ListCountriesResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{90} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{96} } func (x *ListCountriesResponse) GetCountries() []*Country { @@ -6894,7 +7351,7 @@ type UpdateCountryRequest struct { func (x *UpdateCountryRequest) Reset() { *x = UpdateCountryRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[91] + mi := &file_proto_user_v1_user_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6906,7 +7363,7 @@ func (x *UpdateCountryRequest) String() string { func (*UpdateCountryRequest) ProtoMessage() {} func (x *UpdateCountryRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[91] + mi := &file_proto_user_v1_user_proto_msgTypes[97] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6919,7 +7376,7 @@ func (x *UpdateCountryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateCountryRequest.ProtoReflect.Descriptor instead. func (*UpdateCountryRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{91} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{97} } func (x *UpdateCountryRequest) GetMeta() *RequestMeta { @@ -7001,7 +7458,7 @@ type CountryResponse struct { func (x *CountryResponse) Reset() { *x = CountryResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[92] + mi := &file_proto_user_v1_user_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7013,7 +7470,7 @@ func (x *CountryResponse) String() string { func (*CountryResponse) ProtoMessage() {} func (x *CountryResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[92] + mi := &file_proto_user_v1_user_proto_msgTypes[98] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7026,7 +7483,7 @@ func (x *CountryResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CountryResponse.ProtoReflect.Descriptor instead. func (*CountryResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{92} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{98} } func (x *CountryResponse) GetCountry() *Country { @@ -7045,7 +7502,7 @@ type ListRegistrationCountriesRequest struct { func (x *ListRegistrationCountriesRequest) Reset() { *x = ListRegistrationCountriesRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[93] + mi := &file_proto_user_v1_user_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7057,7 +7514,7 @@ func (x *ListRegistrationCountriesRequest) String() string { func (*ListRegistrationCountriesRequest) ProtoMessage() {} func (x *ListRegistrationCountriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[93] + mi := &file_proto_user_v1_user_proto_msgTypes[99] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7070,7 +7527,7 @@ func (x *ListRegistrationCountriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRegistrationCountriesRequest.ProtoReflect.Descriptor instead. func (*ListRegistrationCountriesRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{93} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{99} } func (x *ListRegistrationCountriesRequest) GetMeta() *RequestMeta { @@ -7089,7 +7546,7 @@ type ListRegistrationCountriesResponse struct { func (x *ListRegistrationCountriesResponse) Reset() { *x = ListRegistrationCountriesResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[94] + mi := &file_proto_user_v1_user_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7101,7 +7558,7 @@ func (x *ListRegistrationCountriesResponse) String() string { func (*ListRegistrationCountriesResponse) ProtoMessage() {} func (x *ListRegistrationCountriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[94] + mi := &file_proto_user_v1_user_proto_msgTypes[100] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7114,7 +7571,7 @@ func (x *ListRegistrationCountriesResponse) ProtoReflect() protoreflect.Message // Deprecated: Use ListRegistrationCountriesResponse.ProtoReflect.Descriptor instead. func (*ListRegistrationCountriesResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{94} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{100} } func (x *ListRegistrationCountriesResponse) GetCountries() []*Country { @@ -7135,7 +7592,7 @@ type LoginRiskBlockedCountry struct { func (x *LoginRiskBlockedCountry) Reset() { *x = LoginRiskBlockedCountry{} - mi := &file_proto_user_v1_user_proto_msgTypes[95] + mi := &file_proto_user_v1_user_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7147,7 +7604,7 @@ func (x *LoginRiskBlockedCountry) String() string { func (*LoginRiskBlockedCountry) ProtoMessage() {} func (x *LoginRiskBlockedCountry) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[95] + mi := &file_proto_user_v1_user_proto_msgTypes[101] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7160,7 +7617,7 @@ func (x *LoginRiskBlockedCountry) ProtoReflect() protoreflect.Message { // Deprecated: Use LoginRiskBlockedCountry.ProtoReflect.Descriptor instead. func (*LoginRiskBlockedCountry) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{95} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{101} } func (x *LoginRiskBlockedCountry) GetCountryCode() string { @@ -7193,7 +7650,7 @@ type ListLoginRiskBlockedCountriesRequest struct { func (x *ListLoginRiskBlockedCountriesRequest) Reset() { *x = ListLoginRiskBlockedCountriesRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[96] + mi := &file_proto_user_v1_user_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7205,7 +7662,7 @@ func (x *ListLoginRiskBlockedCountriesRequest) String() string { func (*ListLoginRiskBlockedCountriesRequest) ProtoMessage() {} func (x *ListLoginRiskBlockedCountriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[96] + mi := &file_proto_user_v1_user_proto_msgTypes[102] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7218,7 +7675,7 @@ func (x *ListLoginRiskBlockedCountriesRequest) ProtoReflect() protoreflect.Messa // Deprecated: Use ListLoginRiskBlockedCountriesRequest.ProtoReflect.Descriptor instead. func (*ListLoginRiskBlockedCountriesRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{96} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{102} } func (x *ListLoginRiskBlockedCountriesRequest) GetMeta() *RequestMeta { @@ -7238,7 +7695,7 @@ type ListLoginRiskBlockedCountriesResponse struct { func (x *ListLoginRiskBlockedCountriesResponse) Reset() { *x = ListLoginRiskBlockedCountriesResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[97] + mi := &file_proto_user_v1_user_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7250,7 +7707,7 @@ func (x *ListLoginRiskBlockedCountriesResponse) String() string { func (*ListLoginRiskBlockedCountriesResponse) ProtoMessage() {} func (x *ListLoginRiskBlockedCountriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[97] + mi := &file_proto_user_v1_user_proto_msgTypes[103] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7263,7 +7720,7 @@ func (x *ListLoginRiskBlockedCountriesResponse) ProtoReflect() protoreflect.Mess // Deprecated: Use ListLoginRiskBlockedCountriesResponse.ProtoReflect.Descriptor instead. func (*ListLoginRiskBlockedCountriesResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{97} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{103} } func (x *ListLoginRiskBlockedCountriesResponse) GetCountries() []*LoginRiskBlockedCountry { @@ -7290,7 +7747,7 @@ type ListRegionsRequest struct { func (x *ListRegionsRequest) Reset() { *x = ListRegionsRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[98] + mi := &file_proto_user_v1_user_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7302,7 +7759,7 @@ func (x *ListRegionsRequest) String() string { func (*ListRegionsRequest) ProtoMessage() {} func (x *ListRegionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[98] + mi := &file_proto_user_v1_user_proto_msgTypes[104] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7315,7 +7772,7 @@ func (x *ListRegionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRegionsRequest.ProtoReflect.Descriptor instead. func (*ListRegionsRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{98} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{104} } func (x *ListRegionsRequest) GetMeta() *RequestMeta { @@ -7341,7 +7798,7 @@ type ListRegionsResponse struct { func (x *ListRegionsResponse) Reset() { *x = ListRegionsResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[99] + mi := &file_proto_user_v1_user_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7353,7 +7810,7 @@ func (x *ListRegionsResponse) String() string { func (*ListRegionsResponse) ProtoMessage() {} func (x *ListRegionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[99] + mi := &file_proto_user_v1_user_proto_msgTypes[105] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7366,7 +7823,7 @@ func (x *ListRegionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRegionsResponse.ProtoReflect.Descriptor instead. func (*ListRegionsResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{99} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{105} } func (x *ListRegionsResponse) GetRegions() []*Region { @@ -7386,7 +7843,7 @@ type GetRegionRequest struct { func (x *GetRegionRequest) Reset() { *x = GetRegionRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[100] + mi := &file_proto_user_v1_user_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7398,7 +7855,7 @@ func (x *GetRegionRequest) String() string { func (*GetRegionRequest) ProtoMessage() {} func (x *GetRegionRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[100] + mi := &file_proto_user_v1_user_proto_msgTypes[106] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7411,7 +7868,7 @@ func (x *GetRegionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRegionRequest.ProtoReflect.Descriptor instead. func (*GetRegionRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{100} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{106} } func (x *GetRegionRequest) GetMeta() *RequestMeta { @@ -7443,7 +7900,7 @@ type UpdateRegionRequest struct { func (x *UpdateRegionRequest) Reset() { *x = UpdateRegionRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[101] + mi := &file_proto_user_v1_user_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7455,7 +7912,7 @@ func (x *UpdateRegionRequest) String() string { func (*UpdateRegionRequest) ProtoMessage() {} func (x *UpdateRegionRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[101] + mi := &file_proto_user_v1_user_proto_msgTypes[107] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7468,7 +7925,7 @@ func (x *UpdateRegionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateRegionRequest.ProtoReflect.Descriptor instead. func (*UpdateRegionRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{101} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{107} } func (x *UpdateRegionRequest) GetMeta() *RequestMeta { @@ -7525,7 +7982,7 @@ type ReplaceRegionCountriesRequest struct { func (x *ReplaceRegionCountriesRequest) Reset() { *x = ReplaceRegionCountriesRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[102] + mi := &file_proto_user_v1_user_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7537,7 +7994,7 @@ func (x *ReplaceRegionCountriesRequest) String() string { func (*ReplaceRegionCountriesRequest) ProtoMessage() {} func (x *ReplaceRegionCountriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[102] + mi := &file_proto_user_v1_user_proto_msgTypes[108] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7550,7 +8007,7 @@ func (x *ReplaceRegionCountriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplaceRegionCountriesRequest.ProtoReflect.Descriptor instead. func (*ReplaceRegionCountriesRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{102} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{108} } func (x *ReplaceRegionCountriesRequest) GetMeta() *RequestMeta { @@ -7590,7 +8047,7 @@ type RegionResponse struct { func (x *RegionResponse) Reset() { *x = RegionResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[103] + mi := &file_proto_user_v1_user_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7602,7 +8059,7 @@ func (x *RegionResponse) String() string { func (*RegionResponse) ProtoMessage() {} func (x *RegionResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[103] + mi := &file_proto_user_v1_user_proto_msgTypes[109] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7615,7 +8072,7 @@ func (x *RegionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RegionResponse.ProtoReflect.Descriptor instead. func (*RegionResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{103} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{109} } func (x *RegionResponse) GetRegion() *Region { @@ -7641,7 +8098,7 @@ type UserIdentity struct { func (x *UserIdentity) Reset() { *x = UserIdentity{} - mi := &file_proto_user_v1_user_proto_msgTypes[104] + mi := &file_proto_user_v1_user_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7653,7 +8110,7 @@ func (x *UserIdentity) String() string { func (*UserIdentity) ProtoMessage() {} func (x *UserIdentity) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[104] + mi := &file_proto_user_v1_user_proto_msgTypes[110] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7666,7 +8123,7 @@ func (x *UserIdentity) ProtoReflect() protoreflect.Message { // Deprecated: Use UserIdentity.ProtoReflect.Descriptor instead. func (*UserIdentity) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{104} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{110} } func (x *UserIdentity) GetUserId() int64 { @@ -7729,7 +8186,7 @@ type GetUserIdentityRequest struct { func (x *GetUserIdentityRequest) Reset() { *x = GetUserIdentityRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[105] + mi := &file_proto_user_v1_user_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7741,7 +8198,7 @@ func (x *GetUserIdentityRequest) String() string { func (*GetUserIdentityRequest) ProtoMessage() {} func (x *GetUserIdentityRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[105] + mi := &file_proto_user_v1_user_proto_msgTypes[111] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7754,7 +8211,7 @@ func (x *GetUserIdentityRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUserIdentityRequest.ProtoReflect.Descriptor instead. func (*GetUserIdentityRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{105} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{111} } func (x *GetUserIdentityRequest) GetMeta() *RequestMeta { @@ -7781,7 +8238,7 @@ type GetUserIdentityResponse struct { func (x *GetUserIdentityResponse) Reset() { *x = GetUserIdentityResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[106] + mi := &file_proto_user_v1_user_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7793,7 +8250,7 @@ func (x *GetUserIdentityResponse) String() string { func (*GetUserIdentityResponse) ProtoMessage() {} func (x *GetUserIdentityResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[106] + mi := &file_proto_user_v1_user_proto_msgTypes[112] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7806,7 +8263,7 @@ func (x *GetUserIdentityResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUserIdentityResponse.ProtoReflect.Descriptor instead. func (*GetUserIdentityResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{106} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{112} } func (x *GetUserIdentityResponse) GetIdentity() *UserIdentity { @@ -7827,7 +8284,7 @@ type ResolveDisplayUserIDRequest struct { func (x *ResolveDisplayUserIDRequest) Reset() { *x = ResolveDisplayUserIDRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[107] + mi := &file_proto_user_v1_user_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7839,7 +8296,7 @@ func (x *ResolveDisplayUserIDRequest) String() string { func (*ResolveDisplayUserIDRequest) ProtoMessage() {} func (x *ResolveDisplayUserIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[107] + mi := &file_proto_user_v1_user_proto_msgTypes[113] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7852,7 +8309,7 @@ func (x *ResolveDisplayUserIDRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ResolveDisplayUserIDRequest.ProtoReflect.Descriptor instead. func (*ResolveDisplayUserIDRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{107} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{113} } func (x *ResolveDisplayUserIDRequest) GetMeta() *RequestMeta { @@ -7879,7 +8336,7 @@ type ResolveDisplayUserIDResponse struct { func (x *ResolveDisplayUserIDResponse) Reset() { *x = ResolveDisplayUserIDResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[108] + mi := &file_proto_user_v1_user_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7891,7 +8348,7 @@ func (x *ResolveDisplayUserIDResponse) String() string { func (*ResolveDisplayUserIDResponse) ProtoMessage() {} func (x *ResolveDisplayUserIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[108] + mi := &file_proto_user_v1_user_proto_msgTypes[114] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7904,7 +8361,7 @@ func (x *ResolveDisplayUserIDResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ResolveDisplayUserIDResponse.ProtoReflect.Descriptor instead. func (*ResolveDisplayUserIDResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{108} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{114} } func (x *ResolveDisplayUserIDResponse) GetIdentity() *UserIdentity { @@ -7928,7 +8385,7 @@ type ChangeDisplayUserIDRequest struct { func (x *ChangeDisplayUserIDRequest) Reset() { *x = ChangeDisplayUserIDRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[109] + mi := &file_proto_user_v1_user_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7940,7 +8397,7 @@ func (x *ChangeDisplayUserIDRequest) String() string { func (*ChangeDisplayUserIDRequest) ProtoMessage() {} func (x *ChangeDisplayUserIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[109] + mi := &file_proto_user_v1_user_proto_msgTypes[115] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7953,7 +8410,7 @@ func (x *ChangeDisplayUserIDRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeDisplayUserIDRequest.ProtoReflect.Descriptor instead. func (*ChangeDisplayUserIDRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{109} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{115} } func (x *ChangeDisplayUserIDRequest) GetMeta() *RequestMeta { @@ -8001,7 +8458,7 @@ type ChangeDisplayUserIDResponse struct { func (x *ChangeDisplayUserIDResponse) Reset() { *x = ChangeDisplayUserIDResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[110] + mi := &file_proto_user_v1_user_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8013,7 +8470,7 @@ func (x *ChangeDisplayUserIDResponse) String() string { func (*ChangeDisplayUserIDResponse) ProtoMessage() {} func (x *ChangeDisplayUserIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[110] + mi := &file_proto_user_v1_user_proto_msgTypes[116] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8026,7 +8483,7 @@ func (x *ChangeDisplayUserIDResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeDisplayUserIDResponse.ProtoReflect.Descriptor instead. func (*ChangeDisplayUserIDResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{110} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{116} } func (x *ChangeDisplayUserIDResponse) GetIdentity() *UserIdentity { @@ -8050,7 +8507,7 @@ type ApplyPrettyDisplayUserIDRequest struct { func (x *ApplyPrettyDisplayUserIDRequest) Reset() { *x = ApplyPrettyDisplayUserIDRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[111] + mi := &file_proto_user_v1_user_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8062,7 +8519,7 @@ func (x *ApplyPrettyDisplayUserIDRequest) String() string { func (*ApplyPrettyDisplayUserIDRequest) ProtoMessage() {} func (x *ApplyPrettyDisplayUserIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[111] + mi := &file_proto_user_v1_user_proto_msgTypes[117] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8075,7 +8532,7 @@ func (x *ApplyPrettyDisplayUserIDRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplyPrettyDisplayUserIDRequest.ProtoReflect.Descriptor instead. func (*ApplyPrettyDisplayUserIDRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{111} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{117} } func (x *ApplyPrettyDisplayUserIDRequest) GetMeta() *RequestMeta { @@ -8124,7 +8581,7 @@ type ApplyPrettyDisplayUserIDResponse struct { func (x *ApplyPrettyDisplayUserIDResponse) Reset() { *x = ApplyPrettyDisplayUserIDResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[112] + mi := &file_proto_user_v1_user_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8136,7 +8593,7 @@ func (x *ApplyPrettyDisplayUserIDResponse) String() string { func (*ApplyPrettyDisplayUserIDResponse) ProtoMessage() {} func (x *ApplyPrettyDisplayUserIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[112] + mi := &file_proto_user_v1_user_proto_msgTypes[118] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8149,7 +8606,7 @@ func (x *ApplyPrettyDisplayUserIDResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplyPrettyDisplayUserIDResponse.ProtoReflect.Descriptor instead. func (*ApplyPrettyDisplayUserIDResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{112} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{118} } func (x *ApplyPrettyDisplayUserIDResponse) GetIdentity() *UserIdentity { @@ -8178,7 +8635,7 @@ type ExpirePrettyDisplayUserIDRequest struct { func (x *ExpirePrettyDisplayUserIDRequest) Reset() { *x = ExpirePrettyDisplayUserIDRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[113] + mi := &file_proto_user_v1_user_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8190,7 +8647,7 @@ func (x *ExpirePrettyDisplayUserIDRequest) String() string { func (*ExpirePrettyDisplayUserIDRequest) ProtoMessage() {} func (x *ExpirePrettyDisplayUserIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[113] + mi := &file_proto_user_v1_user_proto_msgTypes[119] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8203,7 +8660,7 @@ func (x *ExpirePrettyDisplayUserIDRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExpirePrettyDisplayUserIDRequest.ProtoReflect.Descriptor instead. func (*ExpirePrettyDisplayUserIDRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{113} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{119} } func (x *ExpirePrettyDisplayUserIDRequest) GetMeta() *RequestMeta { @@ -8237,7 +8694,7 @@ type ExpirePrettyDisplayUserIDResponse struct { func (x *ExpirePrettyDisplayUserIDResponse) Reset() { *x = ExpirePrettyDisplayUserIDResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[114] + mi := &file_proto_user_v1_user_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8249,7 +8706,7 @@ func (x *ExpirePrettyDisplayUserIDResponse) String() string { func (*ExpirePrettyDisplayUserIDResponse) ProtoMessage() {} func (x *ExpirePrettyDisplayUserIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[114] + mi := &file_proto_user_v1_user_proto_msgTypes[120] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8262,7 +8719,7 @@ func (x *ExpirePrettyDisplayUserIDResponse) ProtoReflect() protoreflect.Message // Deprecated: Use ExpirePrettyDisplayUserIDResponse.ProtoReflect.Descriptor instead. func (*ExpirePrettyDisplayUserIDResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{114} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{120} } func (x *ExpirePrettyDisplayUserIDResponse) GetIdentity() *UserIdentity { @@ -8564,7 +9021,7 @@ const file_proto_user_v1_user_proto_rawDesc = "" + "\rupdated_at_ms\x18\n" + " \x01(\x03R\vupdatedAtMs\x12\"\n" + "\rexpires_at_ms\x18\v \x01(\x03R\vexpiresAtMs\x12\"\n" + - "\rdecided_at_ms\x18\f \x01(\x03R\vdecidedAtMs\"\xdf\x04\n" + + "\rdecided_at_ms\x18\f \x01(\x03R\vdecidedAtMs\"\xad\x05\n" + "\x0eCPRelationship\x12'\n" + "\x0frelationship_id\x18\x01 \x01(\tR\x0erelationshipId\x12#\n" + "\rrelation_type\x18\x02 \x01(\tR\frelationType\x12\x16\n" + @@ -8581,7 +9038,9 @@ const file_proto_user_v1_user_proto_rawDesc = "" + "\x14next_level_threshold\x18\f \x01(\x03R\x12nextLevelThreshold\x121\n" + "\x15needed_for_next_level\x18\r \x01(\x03R\x12neededForNextLevel\x124\n" + "\x16level_progress_percent\x18\x0e \x01(\x05R\x14levelProgressPercent\x12\x1b\n" + - "\tmax_level\x18\x0f \x01(\bR\bmaxLevelJ\x04\b\b\x10\tR\bequipped\"\xcb\x01\n" + + "\tmax_level\x18\x0f \x01(\bR\bmaxLevel\x12,\n" + + "\x12breakup_cost_coins\x18\x10 \x01(\x03R\x10breakupCostCoins\x12\x1e\n" + + "\vended_at_ms\x18\x11 \x01(\x03R\tendedAtMsJ\x04\b\b\x10\tR\bequipped\"\xcb\x01\n" + "\x19ListCPApplicationsRequest\x12.\n" + "\x04meta\x18\x01 \x01(\v2\x1a.hyapp.user.v1.RequestMetaR\x04meta\x12\x17\n" + "\auser_id\x18\x02 \x01(\x03R\x06userId\x12\x1c\n" + @@ -8615,7 +9074,46 @@ const file_proto_user_v1_user_proto_rawDesc = "" + "\tpage_size\x18\x05 \x01(\x05R\bpageSize\"\x9a\x01\n" + "\x1bListCPRelationshipsResponse\x12C\n" + "\rrelationships\x18\x01 \x03(\v2\x1d.hyapp.user.v1.CPRelationshipR\rrelationships\x12\x14\n" + - "\x05total\x18\x02 \x01(\x03R\x05totalJ\x04\b\x03\x10\x04R\x1amax_count_by_relation_type\"\x99\x05\n" + + "\x05total\x18\x02 \x01(\x03R\x05totalJ\x04\b\x03\x10\x04R\x1amax_count_by_relation_type\"\xb4\x01\n" + + "!PrepareBreakCPRelationshipRequest\x12.\n" + + "\x04meta\x18\x01 \x01(\v2\x1a.hyapp.user.v1.RequestMetaR\x04meta\x12\x17\n" + + "\auser_id\x18\x02 \x01(\x03R\x06userId\x12'\n" + + "\x0frelationship_id\x18\x03 \x01(\tR\x0erelationshipId\x12\x1d\n" + + "\n" + + "command_id\x18\x04 \x01(\tR\tcommandId\"\xae\x02\n" + + "\"PrepareBreakCPRelationshipResponse\x12A\n" + + "\frelationship\x18\x01 \x01(\v2\x1d.hyapp.user.v1.CPRelationshipR\frelationship\x12\x1d\n" + + "\n" + + "command_id\x18\x02 \x01(\tR\tcommandId\x12\x16\n" + + "\x06status\x18\x03 \x01(\tR\x06status\x12,\n" + + "\x12breakup_cost_coins\x18\x04 \x01(\x03R\x10breakupCostCoins\x122\n" + + "\x15wallet_transaction_id\x18\x05 \x01(\tR\x13walletTransactionId\x12,\n" + + "\x12coin_balance_after\x18\x06 \x01(\x03R\x10coinBalanceAfter\"\xc0\x02\n" + + "!ConfirmBreakCPRelationshipRequest\x12.\n" + + "\x04meta\x18\x01 \x01(\v2\x1a.hyapp.user.v1.RequestMetaR\x04meta\x12\x17\n" + + "\auser_id\x18\x02 \x01(\x03R\x06userId\x12'\n" + + "\x0frelationship_id\x18\x03 \x01(\tR\x0erelationshipId\x12\x1d\n" + + "\n" + + "command_id\x18\x04 \x01(\tR\tcommandId\x122\n" + + "\x15wallet_transaction_id\x18\x05 \x01(\tR\x13walletTransactionId\x12(\n" + + "\x10paid_coin_amount\x18\x06 \x01(\x03R\x0epaidCoinAmount\x12,\n" + + "\x12coin_balance_after\x18\a \x01(\x03R\x10coinBalanceAfter\"\xf7\x01\n" + + "\"ConfirmBreakCPRelationshipResponse\x12A\n" + + "\frelationship\x18\x01 \x01(\v2\x1d.hyapp.user.v1.CPRelationshipR\frelationship\x12,\n" + + "\x12breakup_cost_coins\x18\x02 \x01(\x03R\x10breakupCostCoins\x122\n" + + "\x15wallet_transaction_id\x18\x03 \x01(\tR\x13walletTransactionId\x12,\n" + + "\x12coin_balance_after\x18\x04 \x01(\x03R\x10coinBalanceAfter\"\xcb\x01\n" + + " CancelBreakCPRelationshipRequest\x12.\n" + + "\x04meta\x18\x01 \x01(\v2\x1a.hyapp.user.v1.RequestMetaR\x04meta\x12\x17\n" + + "\auser_id\x18\x02 \x01(\x03R\x06userId\x12'\n" + + "\x0frelationship_id\x18\x03 \x01(\tR\x0erelationshipId\x12\x1d\n" + + "\n" + + "command_id\x18\x04 \x01(\tR\tcommandId\x12\x16\n" + + "\x06reason\x18\x05 \x01(\tR\x06reason\"Z\n" + + "!CancelBreakCPRelationshipResponse\x12\x1d\n" + + "\n" + + "command_id\x18\x01 \x01(\tR\tcommandId\x12\x16\n" + + "\x06status\x18\x02 \x01(\tR\x06status\"\x99\x05\n" + "\x0fRoomGiftCPEvent\x12.\n" + "\x04meta\x18\x01 \x01(\v2\x1a.hyapp.user.v1.RequestMetaR\x04meta\x12\x19\n" + "\bevent_id\x18\x02 \x01(\tR\aeventId\x12\x17\n" + @@ -8991,12 +9489,15 @@ const file_proto_user_v1_user_proto_rawDesc = "" + "\fDeleteFriend\x12\".hyapp.user.v1.DeleteFriendRequest\x1a#.hyapp.user.v1.DeleteFriendResponse\x12T\n" + "\vListFriends\x12!.hyapp.user.v1.ListFriendsRequest\x1a\".hyapp.user.v1.ListFriendsResponse\x12u\n" + "\x16ListFriendApplications\x12,.hyapp.user.v1.ListFriendApplicationsRequest\x1a-.hyapp.user.v1.ListFriendApplicationsResponse\x12W\n" + - "\fSubmitReport\x12\".hyapp.user.v1.SubmitReportRequest\x1a#.hyapp.user.v1.SubmitReportResponse2\xc4\x03\n" + + "\fSubmitReport\x12\".hyapp.user.v1.SubmitReportRequest\x1a#.hyapp.user.v1.SubmitReportResponse2\xcc\x06\n" + "\rUserCPService\x12i\n" + "\x12ListCPApplications\x12(.hyapp.user.v1.ListCPApplicationsRequest\x1a).hyapp.user.v1.ListCPApplicationsResponse\x12l\n" + "\x13AcceptCPApplication\x12).hyapp.user.v1.AcceptCPApplicationRequest\x1a*.hyapp.user.v1.AcceptCPApplicationResponse\x12l\n" + "\x13RejectCPApplication\x12).hyapp.user.v1.RejectCPApplicationRequest\x1a*.hyapp.user.v1.RejectCPApplicationResponse\x12l\n" + - "\x13ListCPRelationships\x12).hyapp.user.v1.ListCPRelationshipsRequest\x1a*.hyapp.user.v1.ListCPRelationshipsResponse2\x8e\x01\n" + + "\x13ListCPRelationships\x12).hyapp.user.v1.ListCPRelationshipsRequest\x1a*.hyapp.user.v1.ListCPRelationshipsResponse\x12\x81\x01\n" + + "\x1aPrepareBreakCPRelationship\x120.hyapp.user.v1.PrepareBreakCPRelationshipRequest\x1a1.hyapp.user.v1.PrepareBreakCPRelationshipResponse\x12\x81\x01\n" + + "\x1aConfirmBreakCPRelationship\x120.hyapp.user.v1.ConfirmBreakCPRelationshipRequest\x1a1.hyapp.user.v1.ConfirmBreakCPRelationshipResponse\x12~\n" + + "\x19CancelBreakCPRelationship\x12/.hyapp.user.v1.CancelBreakCPRelationshipRequest\x1a0.hyapp.user.v1.CancelBreakCPRelationshipResponse2\x8e\x01\n" + "\x15UserCPInternalService\x12u\n" + "\x16ConsumeRoomGiftCPEvent\x12,.hyapp.user.v1.ConsumeRoomGiftCPEventRequest\x1a-.hyapp.user.v1.ConsumeRoomGiftCPEventResponse2\x8d\x03\n" + "\x0fUserCronService\x12\\\n" + @@ -9041,7 +9542,7 @@ func file_proto_user_v1_user_proto_rawDescGZIP() []byte { } var file_proto_user_v1_user_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_proto_user_v1_user_proto_msgTypes = make([]protoimpl.MessageInfo, 116) +var file_proto_user_v1_user_proto_msgTypes = make([]protoimpl.MessageInfo, 122) var file_proto_user_v1_user_proto_goTypes = []any{ (UserStatus)(0), // 0: hyapp.user.v1.UserStatus (*RequestMeta)(nil), // 1: hyapp.user.v1.RequestMeta @@ -9101,65 +9602,71 @@ var file_proto_user_v1_user_proto_goTypes = []any{ (*RejectCPApplicationResponse)(nil), // 55: hyapp.user.v1.RejectCPApplicationResponse (*ListCPRelationshipsRequest)(nil), // 56: hyapp.user.v1.ListCPRelationshipsRequest (*ListCPRelationshipsResponse)(nil), // 57: hyapp.user.v1.ListCPRelationshipsResponse - (*RoomGiftCPEvent)(nil), // 58: hyapp.user.v1.RoomGiftCPEvent - (*ConsumeRoomGiftCPEventRequest)(nil), // 59: hyapp.user.v1.ConsumeRoomGiftCPEventRequest - (*ConsumeRoomGiftCPEventResponse)(nil), // 60: hyapp.user.v1.ConsumeRoomGiftCPEventResponse - (*UserReport)(nil), // 61: hyapp.user.v1.UserReport - (*SubmitReportRequest)(nil), // 62: hyapp.user.v1.SubmitReportRequest - (*SubmitReportResponse)(nil), // 63: hyapp.user.v1.SubmitReportResponse - (*BatchGetUsersRequest)(nil), // 64: hyapp.user.v1.BatchGetUsersRequest - (*BatchGetUsersResponse)(nil), // 65: hyapp.user.v1.BatchGetUsersResponse - (*ListUserIDsRequest)(nil), // 66: hyapp.user.v1.ListUserIDsRequest - (*ListUserIDsResponse)(nil), // 67: hyapp.user.v1.ListUserIDsResponse - (*UpdateUserProfileRequest)(nil), // 68: hyapp.user.v1.UpdateUserProfileRequest - (*UpdateUserProfileResponse)(nil), // 69: hyapp.user.v1.UpdateUserProfileResponse - (*ChangeUserCountryRequest)(nil), // 70: hyapp.user.v1.ChangeUserCountryRequest - (*AdminChangeUserCountryRequest)(nil), // 71: hyapp.user.v1.AdminChangeUserCountryRequest - (*ChangeUserCountryResponse)(nil), // 72: hyapp.user.v1.ChangeUserCountryResponse - (*SetUserStatusRequest)(nil), // 73: hyapp.user.v1.SetUserStatusRequest - (*SetUserStatusResponse)(nil), // 74: hyapp.user.v1.SetUserStatusResponse - (*ManagerUserBlock)(nil), // 75: hyapp.user.v1.ManagerUserBlock - (*CreateManagerUserBlockRequest)(nil), // 76: hyapp.user.v1.CreateManagerUserBlockRequest - (*CreateManagerUserBlockResponse)(nil), // 77: hyapp.user.v1.CreateManagerUserBlockResponse - (*ListManagerUserBlocksRequest)(nil), // 78: hyapp.user.v1.ListManagerUserBlocksRequest - (*ListManagerUserBlocksResponse)(nil), // 79: hyapp.user.v1.ListManagerUserBlocksResponse - (*UnblockManagerUserRequest)(nil), // 80: hyapp.user.v1.UnblockManagerUserRequest - (*UnblockManagerUserResponse)(nil), // 81: hyapp.user.v1.UnblockManagerUserResponse - (*CompleteOnboardingRequest)(nil), // 82: hyapp.user.v1.CompleteOnboardingRequest - (*CompleteOnboardingResponse)(nil), // 83: hyapp.user.v1.CompleteOnboardingResponse - (*BindPushTokenRequest)(nil), // 84: hyapp.user.v1.BindPushTokenRequest - (*BindPushTokenResponse)(nil), // 85: hyapp.user.v1.BindPushTokenResponse - (*DeletePushTokenRequest)(nil), // 86: hyapp.user.v1.DeletePushTokenRequest - (*DeletePushTokenResponse)(nil), // 87: hyapp.user.v1.DeletePushTokenResponse - (*Country)(nil), // 88: hyapp.user.v1.Country - (*Region)(nil), // 89: hyapp.user.v1.Region - (*ListCountriesRequest)(nil), // 90: hyapp.user.v1.ListCountriesRequest - (*ListCountriesResponse)(nil), // 91: hyapp.user.v1.ListCountriesResponse - (*UpdateCountryRequest)(nil), // 92: hyapp.user.v1.UpdateCountryRequest - (*CountryResponse)(nil), // 93: hyapp.user.v1.CountryResponse - (*ListRegistrationCountriesRequest)(nil), // 94: hyapp.user.v1.ListRegistrationCountriesRequest - (*ListRegistrationCountriesResponse)(nil), // 95: hyapp.user.v1.ListRegistrationCountriesResponse - (*LoginRiskBlockedCountry)(nil), // 96: hyapp.user.v1.LoginRiskBlockedCountry - (*ListLoginRiskBlockedCountriesRequest)(nil), // 97: hyapp.user.v1.ListLoginRiskBlockedCountriesRequest - (*ListLoginRiskBlockedCountriesResponse)(nil), // 98: hyapp.user.v1.ListLoginRiskBlockedCountriesResponse - (*ListRegionsRequest)(nil), // 99: hyapp.user.v1.ListRegionsRequest - (*ListRegionsResponse)(nil), // 100: hyapp.user.v1.ListRegionsResponse - (*GetRegionRequest)(nil), // 101: hyapp.user.v1.GetRegionRequest - (*UpdateRegionRequest)(nil), // 102: hyapp.user.v1.UpdateRegionRequest - (*ReplaceRegionCountriesRequest)(nil), // 103: hyapp.user.v1.ReplaceRegionCountriesRequest - (*RegionResponse)(nil), // 104: hyapp.user.v1.RegionResponse - (*UserIdentity)(nil), // 105: hyapp.user.v1.UserIdentity - (*GetUserIdentityRequest)(nil), // 106: hyapp.user.v1.GetUserIdentityRequest - (*GetUserIdentityResponse)(nil), // 107: hyapp.user.v1.GetUserIdentityResponse - (*ResolveDisplayUserIDRequest)(nil), // 108: hyapp.user.v1.ResolveDisplayUserIDRequest - (*ResolveDisplayUserIDResponse)(nil), // 109: hyapp.user.v1.ResolveDisplayUserIDResponse - (*ChangeDisplayUserIDRequest)(nil), // 110: hyapp.user.v1.ChangeDisplayUserIDRequest - (*ChangeDisplayUserIDResponse)(nil), // 111: hyapp.user.v1.ChangeDisplayUserIDResponse - (*ApplyPrettyDisplayUserIDRequest)(nil), // 112: hyapp.user.v1.ApplyPrettyDisplayUserIDRequest - (*ApplyPrettyDisplayUserIDResponse)(nil), // 113: hyapp.user.v1.ApplyPrettyDisplayUserIDResponse - (*ExpirePrettyDisplayUserIDRequest)(nil), // 114: hyapp.user.v1.ExpirePrettyDisplayUserIDRequest - (*ExpirePrettyDisplayUserIDResponse)(nil), // 115: hyapp.user.v1.ExpirePrettyDisplayUserIDResponse - nil, // 116: hyapp.user.v1.BatchGetUsersResponse.UsersEntry + (*PrepareBreakCPRelationshipRequest)(nil), // 58: hyapp.user.v1.PrepareBreakCPRelationshipRequest + (*PrepareBreakCPRelationshipResponse)(nil), // 59: hyapp.user.v1.PrepareBreakCPRelationshipResponse + (*ConfirmBreakCPRelationshipRequest)(nil), // 60: hyapp.user.v1.ConfirmBreakCPRelationshipRequest + (*ConfirmBreakCPRelationshipResponse)(nil), // 61: hyapp.user.v1.ConfirmBreakCPRelationshipResponse + (*CancelBreakCPRelationshipRequest)(nil), // 62: hyapp.user.v1.CancelBreakCPRelationshipRequest + (*CancelBreakCPRelationshipResponse)(nil), // 63: hyapp.user.v1.CancelBreakCPRelationshipResponse + (*RoomGiftCPEvent)(nil), // 64: hyapp.user.v1.RoomGiftCPEvent + (*ConsumeRoomGiftCPEventRequest)(nil), // 65: hyapp.user.v1.ConsumeRoomGiftCPEventRequest + (*ConsumeRoomGiftCPEventResponse)(nil), // 66: hyapp.user.v1.ConsumeRoomGiftCPEventResponse + (*UserReport)(nil), // 67: hyapp.user.v1.UserReport + (*SubmitReportRequest)(nil), // 68: hyapp.user.v1.SubmitReportRequest + (*SubmitReportResponse)(nil), // 69: hyapp.user.v1.SubmitReportResponse + (*BatchGetUsersRequest)(nil), // 70: hyapp.user.v1.BatchGetUsersRequest + (*BatchGetUsersResponse)(nil), // 71: hyapp.user.v1.BatchGetUsersResponse + (*ListUserIDsRequest)(nil), // 72: hyapp.user.v1.ListUserIDsRequest + (*ListUserIDsResponse)(nil), // 73: hyapp.user.v1.ListUserIDsResponse + (*UpdateUserProfileRequest)(nil), // 74: hyapp.user.v1.UpdateUserProfileRequest + (*UpdateUserProfileResponse)(nil), // 75: hyapp.user.v1.UpdateUserProfileResponse + (*ChangeUserCountryRequest)(nil), // 76: hyapp.user.v1.ChangeUserCountryRequest + (*AdminChangeUserCountryRequest)(nil), // 77: hyapp.user.v1.AdminChangeUserCountryRequest + (*ChangeUserCountryResponse)(nil), // 78: hyapp.user.v1.ChangeUserCountryResponse + (*SetUserStatusRequest)(nil), // 79: hyapp.user.v1.SetUserStatusRequest + (*SetUserStatusResponse)(nil), // 80: hyapp.user.v1.SetUserStatusResponse + (*ManagerUserBlock)(nil), // 81: hyapp.user.v1.ManagerUserBlock + (*CreateManagerUserBlockRequest)(nil), // 82: hyapp.user.v1.CreateManagerUserBlockRequest + (*CreateManagerUserBlockResponse)(nil), // 83: hyapp.user.v1.CreateManagerUserBlockResponse + (*ListManagerUserBlocksRequest)(nil), // 84: hyapp.user.v1.ListManagerUserBlocksRequest + (*ListManagerUserBlocksResponse)(nil), // 85: hyapp.user.v1.ListManagerUserBlocksResponse + (*UnblockManagerUserRequest)(nil), // 86: hyapp.user.v1.UnblockManagerUserRequest + (*UnblockManagerUserResponse)(nil), // 87: hyapp.user.v1.UnblockManagerUserResponse + (*CompleteOnboardingRequest)(nil), // 88: hyapp.user.v1.CompleteOnboardingRequest + (*CompleteOnboardingResponse)(nil), // 89: hyapp.user.v1.CompleteOnboardingResponse + (*BindPushTokenRequest)(nil), // 90: hyapp.user.v1.BindPushTokenRequest + (*BindPushTokenResponse)(nil), // 91: hyapp.user.v1.BindPushTokenResponse + (*DeletePushTokenRequest)(nil), // 92: hyapp.user.v1.DeletePushTokenRequest + (*DeletePushTokenResponse)(nil), // 93: hyapp.user.v1.DeletePushTokenResponse + (*Country)(nil), // 94: hyapp.user.v1.Country + (*Region)(nil), // 95: hyapp.user.v1.Region + (*ListCountriesRequest)(nil), // 96: hyapp.user.v1.ListCountriesRequest + (*ListCountriesResponse)(nil), // 97: hyapp.user.v1.ListCountriesResponse + (*UpdateCountryRequest)(nil), // 98: hyapp.user.v1.UpdateCountryRequest + (*CountryResponse)(nil), // 99: hyapp.user.v1.CountryResponse + (*ListRegistrationCountriesRequest)(nil), // 100: hyapp.user.v1.ListRegistrationCountriesRequest + (*ListRegistrationCountriesResponse)(nil), // 101: hyapp.user.v1.ListRegistrationCountriesResponse + (*LoginRiskBlockedCountry)(nil), // 102: hyapp.user.v1.LoginRiskBlockedCountry + (*ListLoginRiskBlockedCountriesRequest)(nil), // 103: hyapp.user.v1.ListLoginRiskBlockedCountriesRequest + (*ListLoginRiskBlockedCountriesResponse)(nil), // 104: hyapp.user.v1.ListLoginRiskBlockedCountriesResponse + (*ListRegionsRequest)(nil), // 105: hyapp.user.v1.ListRegionsRequest + (*ListRegionsResponse)(nil), // 106: hyapp.user.v1.ListRegionsResponse + (*GetRegionRequest)(nil), // 107: hyapp.user.v1.GetRegionRequest + (*UpdateRegionRequest)(nil), // 108: hyapp.user.v1.UpdateRegionRequest + (*ReplaceRegionCountriesRequest)(nil), // 109: hyapp.user.v1.ReplaceRegionCountriesRequest + (*RegionResponse)(nil), // 110: hyapp.user.v1.RegionResponse + (*UserIdentity)(nil), // 111: hyapp.user.v1.UserIdentity + (*GetUserIdentityRequest)(nil), // 112: hyapp.user.v1.GetUserIdentityRequest + (*GetUserIdentityResponse)(nil), // 113: hyapp.user.v1.GetUserIdentityResponse + (*ResolveDisplayUserIDRequest)(nil), // 114: hyapp.user.v1.ResolveDisplayUserIDRequest + (*ResolveDisplayUserIDResponse)(nil), // 115: hyapp.user.v1.ResolveDisplayUserIDResponse + (*ChangeDisplayUserIDRequest)(nil), // 116: hyapp.user.v1.ChangeDisplayUserIDRequest + (*ChangeDisplayUserIDResponse)(nil), // 117: hyapp.user.v1.ChangeDisplayUserIDResponse + (*ApplyPrettyDisplayUserIDRequest)(nil), // 118: hyapp.user.v1.ApplyPrettyDisplayUserIDRequest + (*ApplyPrettyDisplayUserIDResponse)(nil), // 119: hyapp.user.v1.ApplyPrettyDisplayUserIDResponse + (*ExpirePrettyDisplayUserIDRequest)(nil), // 120: hyapp.user.v1.ExpirePrettyDisplayUserIDRequest + (*ExpirePrettyDisplayUserIDResponse)(nil), // 121: hyapp.user.v1.ExpirePrettyDisplayUserIDResponse + nil, // 122: hyapp.user.v1.BatchGetUsersResponse.UsersEntry } var file_proto_user_v1_user_proto_depIdxs = []int32{ 1, // 0: hyapp.user.v1.ResolveAppRequest.meta:type_name -> hyapp.user.v1.RequestMeta @@ -9209,168 +9716,179 @@ var file_proto_user_v1_user_proto_depIdxs = []int32{ 48, // 44: hyapp.user.v1.RejectCPApplicationResponse.application:type_name -> hyapp.user.v1.CPApplication 1, // 45: hyapp.user.v1.ListCPRelationshipsRequest.meta:type_name -> hyapp.user.v1.RequestMeta 49, // 46: hyapp.user.v1.ListCPRelationshipsResponse.relationships:type_name -> hyapp.user.v1.CPRelationship - 1, // 47: hyapp.user.v1.RoomGiftCPEvent.meta:type_name -> hyapp.user.v1.RequestMeta - 1, // 48: hyapp.user.v1.ConsumeRoomGiftCPEventRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 58, // 49: hyapp.user.v1.ConsumeRoomGiftCPEventRequest.event:type_name -> hyapp.user.v1.RoomGiftCPEvent - 48, // 50: hyapp.user.v1.ConsumeRoomGiftCPEventResponse.application:type_name -> hyapp.user.v1.CPApplication - 49, // 51: hyapp.user.v1.ConsumeRoomGiftCPEventResponse.relationship:type_name -> hyapp.user.v1.CPRelationship - 1, // 52: hyapp.user.v1.SubmitReportRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 61, // 53: hyapp.user.v1.SubmitReportResponse.report:type_name -> hyapp.user.v1.UserReport - 1, // 54: hyapp.user.v1.BatchGetUsersRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 116, // 55: hyapp.user.v1.BatchGetUsersResponse.users:type_name -> hyapp.user.v1.BatchGetUsersResponse.UsersEntry - 1, // 56: hyapp.user.v1.ListUserIDsRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 1, // 57: hyapp.user.v1.UpdateUserProfileRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 5, // 58: hyapp.user.v1.UpdateUserProfileResponse.user:type_name -> hyapp.user.v1.User - 1, // 59: hyapp.user.v1.ChangeUserCountryRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 1, // 60: hyapp.user.v1.AdminChangeUserCountryRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 5, // 61: hyapp.user.v1.ChangeUserCountryResponse.user:type_name -> hyapp.user.v1.User - 1, // 62: hyapp.user.v1.SetUserStatusRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 0, // 63: hyapp.user.v1.SetUserStatusRequest.status:type_name -> hyapp.user.v1.UserStatus - 5, // 64: hyapp.user.v1.SetUserStatusResponse.user:type_name -> hyapp.user.v1.User - 1, // 65: hyapp.user.v1.CreateManagerUserBlockRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 75, // 66: hyapp.user.v1.CreateManagerUserBlockResponse.block:type_name -> hyapp.user.v1.ManagerUserBlock - 74, // 67: hyapp.user.v1.CreateManagerUserBlockResponse.status:type_name -> hyapp.user.v1.SetUserStatusResponse - 1, // 68: hyapp.user.v1.ListManagerUserBlocksRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 75, // 69: hyapp.user.v1.ListManagerUserBlocksResponse.blocks:type_name -> hyapp.user.v1.ManagerUserBlock - 1, // 70: hyapp.user.v1.UnblockManagerUserRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 75, // 71: hyapp.user.v1.UnblockManagerUserResponse.block:type_name -> hyapp.user.v1.ManagerUserBlock - 74, // 72: hyapp.user.v1.UnblockManagerUserResponse.status:type_name -> hyapp.user.v1.SetUserStatusResponse - 1, // 73: hyapp.user.v1.CompleteOnboardingRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 5, // 74: hyapp.user.v1.CompleteOnboardingResponse.user:type_name -> hyapp.user.v1.User - 13, // 75: hyapp.user.v1.CompleteOnboardingResponse.token:type_name -> hyapp.user.v1.AuthToken - 7, // 76: hyapp.user.v1.CompleteOnboardingResponse.invite:type_name -> hyapp.user.v1.InviteBinding - 1, // 77: hyapp.user.v1.BindPushTokenRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 1, // 78: hyapp.user.v1.DeletePushTokenRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 1, // 79: hyapp.user.v1.ListCountriesRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 88, // 80: hyapp.user.v1.ListCountriesResponse.countries:type_name -> hyapp.user.v1.Country - 1, // 81: hyapp.user.v1.UpdateCountryRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 88, // 82: hyapp.user.v1.CountryResponse.country:type_name -> hyapp.user.v1.Country - 1, // 83: hyapp.user.v1.ListRegistrationCountriesRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 88, // 84: hyapp.user.v1.ListRegistrationCountriesResponse.countries:type_name -> hyapp.user.v1.Country - 1, // 85: hyapp.user.v1.ListLoginRiskBlockedCountriesRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 96, // 86: hyapp.user.v1.ListLoginRiskBlockedCountriesResponse.countries:type_name -> hyapp.user.v1.LoginRiskBlockedCountry - 1, // 87: hyapp.user.v1.ListRegionsRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 89, // 88: hyapp.user.v1.ListRegionsResponse.regions:type_name -> hyapp.user.v1.Region - 1, // 89: hyapp.user.v1.GetRegionRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 1, // 90: hyapp.user.v1.UpdateRegionRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 1, // 91: hyapp.user.v1.ReplaceRegionCountriesRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 89, // 92: hyapp.user.v1.RegionResponse.region:type_name -> hyapp.user.v1.Region - 1, // 93: hyapp.user.v1.GetUserIdentityRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 105, // 94: hyapp.user.v1.GetUserIdentityResponse.identity:type_name -> hyapp.user.v1.UserIdentity - 1, // 95: hyapp.user.v1.ResolveDisplayUserIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 105, // 96: hyapp.user.v1.ResolveDisplayUserIDResponse.identity:type_name -> hyapp.user.v1.UserIdentity - 1, // 97: hyapp.user.v1.ChangeDisplayUserIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 105, // 98: hyapp.user.v1.ChangeDisplayUserIDResponse.identity:type_name -> hyapp.user.v1.UserIdentity - 1, // 99: hyapp.user.v1.ApplyPrettyDisplayUserIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 105, // 100: hyapp.user.v1.ApplyPrettyDisplayUserIDResponse.identity:type_name -> hyapp.user.v1.UserIdentity - 1, // 101: hyapp.user.v1.ExpirePrettyDisplayUserIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 105, // 102: hyapp.user.v1.ExpirePrettyDisplayUserIDResponse.identity:type_name -> hyapp.user.v1.UserIdentity - 5, // 103: hyapp.user.v1.BatchGetUsersResponse.UsersEntry.value:type_name -> hyapp.user.v1.User - 14, // 104: hyapp.user.v1.UserService.GetUser:input_type -> hyapp.user.v1.GetUserRequest - 16, // 105: hyapp.user.v1.UserService.BusinessUserLookup:input_type -> hyapp.user.v1.BusinessUserLookupRequest - 20, // 106: hyapp.user.v1.UserService.GetMyProfileStats:input_type -> hyapp.user.v1.GetMyProfileStatsRequest - 64, // 107: hyapp.user.v1.UserService.BatchGetUsers:input_type -> hyapp.user.v1.BatchGetUsersRequest - 66, // 108: hyapp.user.v1.UserService.ListUserIDs:input_type -> hyapp.user.v1.ListUserIDsRequest - 9, // 109: hyapp.user.v1.UserService.GetUserMicLifetimeStats:input_type -> hyapp.user.v1.GetUserMicLifetimeStatsRequest - 68, // 110: hyapp.user.v1.UserService.UpdateUserProfile:input_type -> hyapp.user.v1.UpdateUserProfileRequest - 70, // 111: hyapp.user.v1.UserService.ChangeUserCountry:input_type -> hyapp.user.v1.ChangeUserCountryRequest - 71, // 112: hyapp.user.v1.UserService.AdminChangeUserCountry:input_type -> hyapp.user.v1.AdminChangeUserCountryRequest - 73, // 113: hyapp.user.v1.UserService.SetUserStatus:input_type -> hyapp.user.v1.SetUserStatusRequest - 76, // 114: hyapp.user.v1.UserService.CreateManagerUserBlock:input_type -> hyapp.user.v1.CreateManagerUserBlockRequest - 78, // 115: hyapp.user.v1.UserService.ListManagerUserBlocks:input_type -> hyapp.user.v1.ListManagerUserBlocksRequest - 80, // 116: hyapp.user.v1.UserService.UnblockManagerUser:input_type -> hyapp.user.v1.UnblockManagerUserRequest - 82, // 117: hyapp.user.v1.UserService.CompleteOnboarding:input_type -> hyapp.user.v1.CompleteOnboardingRequest - 22, // 118: hyapp.user.v1.UserSocialService.RecordProfileVisit:input_type -> hyapp.user.v1.RecordProfileVisitRequest - 25, // 119: hyapp.user.v1.UserSocialService.ListProfileVisitors:input_type -> hyapp.user.v1.ListProfileVisitorsRequest - 27, // 120: hyapp.user.v1.UserSocialService.FollowUser:input_type -> hyapp.user.v1.FollowUserRequest - 29, // 121: hyapp.user.v1.UserSocialService.UnfollowUser:input_type -> hyapp.user.v1.UnfollowUserRequest - 32, // 122: hyapp.user.v1.UserSocialService.ListFollowing:input_type -> hyapp.user.v1.ListFollowingRequest - 34, // 123: hyapp.user.v1.UserSocialService.ApplyFriend:input_type -> hyapp.user.v1.ApplyFriendRequest - 36, // 124: hyapp.user.v1.UserSocialService.AcceptFriendApplication:input_type -> hyapp.user.v1.AcceptFriendApplicationRequest - 38, // 125: hyapp.user.v1.UserSocialService.DeleteFriend:input_type -> hyapp.user.v1.DeleteFriendRequest - 41, // 126: hyapp.user.v1.UserSocialService.ListFriends:input_type -> hyapp.user.v1.ListFriendsRequest - 44, // 127: hyapp.user.v1.UserSocialService.ListFriendApplications:input_type -> hyapp.user.v1.ListFriendApplicationsRequest - 62, // 128: hyapp.user.v1.UserSocialService.SubmitReport:input_type -> hyapp.user.v1.SubmitReportRequest - 50, // 129: hyapp.user.v1.UserCPService.ListCPApplications:input_type -> hyapp.user.v1.ListCPApplicationsRequest - 52, // 130: hyapp.user.v1.UserCPService.AcceptCPApplication:input_type -> hyapp.user.v1.AcceptCPApplicationRequest - 54, // 131: hyapp.user.v1.UserCPService.RejectCPApplication:input_type -> hyapp.user.v1.RejectCPApplicationRequest - 56, // 132: hyapp.user.v1.UserCPService.ListCPRelationships:input_type -> hyapp.user.v1.ListCPRelationshipsRequest - 59, // 133: hyapp.user.v1.UserCPInternalService.ConsumeRoomGiftCPEvent:input_type -> hyapp.user.v1.ConsumeRoomGiftCPEventRequest - 11, // 134: hyapp.user.v1.UserCronService.ProcessLoginIPRiskBatch:input_type -> hyapp.user.v1.CronBatchRequest - 11, // 135: hyapp.user.v1.UserCronService.ProcessRegionRebuildBatch:input_type -> hyapp.user.v1.CronBatchRequest - 11, // 136: hyapp.user.v1.UserCronService.CompensateMicOpenSessions:input_type -> hyapp.user.v1.CronBatchRequest - 11, // 137: hyapp.user.v1.UserCronService.ExpireManagerUserBlocks:input_type -> hyapp.user.v1.CronBatchRequest - 84, // 138: hyapp.user.v1.UserDeviceService.BindPushToken:input_type -> hyapp.user.v1.BindPushTokenRequest - 86, // 139: hyapp.user.v1.UserDeviceService.DeletePushToken:input_type -> hyapp.user.v1.DeletePushTokenRequest - 3, // 140: hyapp.user.v1.AppRegistryService.ResolveApp:input_type -> hyapp.user.v1.ResolveAppRequest - 90, // 141: hyapp.user.v1.CountryAdminService.ListCountries:input_type -> hyapp.user.v1.ListCountriesRequest - 92, // 142: hyapp.user.v1.CountryAdminService.UpdateCountry:input_type -> hyapp.user.v1.UpdateCountryRequest - 94, // 143: hyapp.user.v1.CountryQueryService.ListRegistrationCountries:input_type -> hyapp.user.v1.ListRegistrationCountriesRequest - 97, // 144: hyapp.user.v1.CountryQueryService.ListLoginRiskBlockedCountries:input_type -> hyapp.user.v1.ListLoginRiskBlockedCountriesRequest - 99, // 145: hyapp.user.v1.RegionAdminService.ListRegions:input_type -> hyapp.user.v1.ListRegionsRequest - 101, // 146: hyapp.user.v1.RegionAdminService.GetRegion:input_type -> hyapp.user.v1.GetRegionRequest - 102, // 147: hyapp.user.v1.RegionAdminService.UpdateRegion:input_type -> hyapp.user.v1.UpdateRegionRequest - 103, // 148: hyapp.user.v1.RegionAdminService.ReplaceRegionCountries:input_type -> hyapp.user.v1.ReplaceRegionCountriesRequest - 106, // 149: hyapp.user.v1.UserIdentityService.GetUserIdentity:input_type -> hyapp.user.v1.GetUserIdentityRequest - 108, // 150: hyapp.user.v1.UserIdentityService.ResolveDisplayUserID:input_type -> hyapp.user.v1.ResolveDisplayUserIDRequest - 110, // 151: hyapp.user.v1.UserIdentityService.ChangeDisplayUserID:input_type -> hyapp.user.v1.ChangeDisplayUserIDRequest - 112, // 152: hyapp.user.v1.UserIdentityService.ApplyPrettyDisplayUserID:input_type -> hyapp.user.v1.ApplyPrettyDisplayUserIDRequest - 114, // 153: hyapp.user.v1.UserIdentityService.ExpirePrettyDisplayUserID:input_type -> hyapp.user.v1.ExpirePrettyDisplayUserIDRequest - 15, // 154: hyapp.user.v1.UserService.GetUser:output_type -> hyapp.user.v1.GetUserResponse - 18, // 155: hyapp.user.v1.UserService.BusinessUserLookup:output_type -> hyapp.user.v1.BusinessUserLookupResponse - 21, // 156: hyapp.user.v1.UserService.GetMyProfileStats:output_type -> hyapp.user.v1.GetMyProfileStatsResponse - 65, // 157: hyapp.user.v1.UserService.BatchGetUsers:output_type -> hyapp.user.v1.BatchGetUsersResponse - 67, // 158: hyapp.user.v1.UserService.ListUserIDs:output_type -> hyapp.user.v1.ListUserIDsResponse - 10, // 159: hyapp.user.v1.UserService.GetUserMicLifetimeStats:output_type -> hyapp.user.v1.GetUserMicLifetimeStatsResponse - 69, // 160: hyapp.user.v1.UserService.UpdateUserProfile:output_type -> hyapp.user.v1.UpdateUserProfileResponse - 72, // 161: hyapp.user.v1.UserService.ChangeUserCountry:output_type -> hyapp.user.v1.ChangeUserCountryResponse - 72, // 162: hyapp.user.v1.UserService.AdminChangeUserCountry:output_type -> hyapp.user.v1.ChangeUserCountryResponse - 74, // 163: hyapp.user.v1.UserService.SetUserStatus:output_type -> hyapp.user.v1.SetUserStatusResponse - 77, // 164: hyapp.user.v1.UserService.CreateManagerUserBlock:output_type -> hyapp.user.v1.CreateManagerUserBlockResponse - 79, // 165: hyapp.user.v1.UserService.ListManagerUserBlocks:output_type -> hyapp.user.v1.ListManagerUserBlocksResponse - 81, // 166: hyapp.user.v1.UserService.UnblockManagerUser:output_type -> hyapp.user.v1.UnblockManagerUserResponse - 83, // 167: hyapp.user.v1.UserService.CompleteOnboarding:output_type -> hyapp.user.v1.CompleteOnboardingResponse - 23, // 168: hyapp.user.v1.UserSocialService.RecordProfileVisit:output_type -> hyapp.user.v1.RecordProfileVisitResponse - 26, // 169: hyapp.user.v1.UserSocialService.ListProfileVisitors:output_type -> hyapp.user.v1.ListProfileVisitorsResponse - 28, // 170: hyapp.user.v1.UserSocialService.FollowUser:output_type -> hyapp.user.v1.FollowUserResponse - 30, // 171: hyapp.user.v1.UserSocialService.UnfollowUser:output_type -> hyapp.user.v1.UnfollowUserResponse - 33, // 172: hyapp.user.v1.UserSocialService.ListFollowing:output_type -> hyapp.user.v1.ListFollowingResponse - 35, // 173: hyapp.user.v1.UserSocialService.ApplyFriend:output_type -> hyapp.user.v1.ApplyFriendResponse - 37, // 174: hyapp.user.v1.UserSocialService.AcceptFriendApplication:output_type -> hyapp.user.v1.AcceptFriendApplicationResponse - 39, // 175: hyapp.user.v1.UserSocialService.DeleteFriend:output_type -> hyapp.user.v1.DeleteFriendResponse - 42, // 176: hyapp.user.v1.UserSocialService.ListFriends:output_type -> hyapp.user.v1.ListFriendsResponse - 45, // 177: hyapp.user.v1.UserSocialService.ListFriendApplications:output_type -> hyapp.user.v1.ListFriendApplicationsResponse - 63, // 178: hyapp.user.v1.UserSocialService.SubmitReport:output_type -> hyapp.user.v1.SubmitReportResponse - 51, // 179: hyapp.user.v1.UserCPService.ListCPApplications:output_type -> hyapp.user.v1.ListCPApplicationsResponse - 53, // 180: hyapp.user.v1.UserCPService.AcceptCPApplication:output_type -> hyapp.user.v1.AcceptCPApplicationResponse - 55, // 181: hyapp.user.v1.UserCPService.RejectCPApplication:output_type -> hyapp.user.v1.RejectCPApplicationResponse - 57, // 182: hyapp.user.v1.UserCPService.ListCPRelationships:output_type -> hyapp.user.v1.ListCPRelationshipsResponse - 60, // 183: hyapp.user.v1.UserCPInternalService.ConsumeRoomGiftCPEvent:output_type -> hyapp.user.v1.ConsumeRoomGiftCPEventResponse - 12, // 184: hyapp.user.v1.UserCronService.ProcessLoginIPRiskBatch:output_type -> hyapp.user.v1.CronBatchResponse - 12, // 185: hyapp.user.v1.UserCronService.ProcessRegionRebuildBatch:output_type -> hyapp.user.v1.CronBatchResponse - 12, // 186: hyapp.user.v1.UserCronService.CompensateMicOpenSessions:output_type -> hyapp.user.v1.CronBatchResponse - 12, // 187: hyapp.user.v1.UserCronService.ExpireManagerUserBlocks:output_type -> hyapp.user.v1.CronBatchResponse - 85, // 188: hyapp.user.v1.UserDeviceService.BindPushToken:output_type -> hyapp.user.v1.BindPushTokenResponse - 87, // 189: hyapp.user.v1.UserDeviceService.DeletePushToken:output_type -> hyapp.user.v1.DeletePushTokenResponse - 4, // 190: hyapp.user.v1.AppRegistryService.ResolveApp:output_type -> hyapp.user.v1.ResolveAppResponse - 91, // 191: hyapp.user.v1.CountryAdminService.ListCountries:output_type -> hyapp.user.v1.ListCountriesResponse - 93, // 192: hyapp.user.v1.CountryAdminService.UpdateCountry:output_type -> hyapp.user.v1.CountryResponse - 95, // 193: hyapp.user.v1.CountryQueryService.ListRegistrationCountries:output_type -> hyapp.user.v1.ListRegistrationCountriesResponse - 98, // 194: hyapp.user.v1.CountryQueryService.ListLoginRiskBlockedCountries:output_type -> hyapp.user.v1.ListLoginRiskBlockedCountriesResponse - 100, // 195: hyapp.user.v1.RegionAdminService.ListRegions:output_type -> hyapp.user.v1.ListRegionsResponse - 104, // 196: hyapp.user.v1.RegionAdminService.GetRegion:output_type -> hyapp.user.v1.RegionResponse - 104, // 197: hyapp.user.v1.RegionAdminService.UpdateRegion:output_type -> hyapp.user.v1.RegionResponse - 104, // 198: hyapp.user.v1.RegionAdminService.ReplaceRegionCountries:output_type -> hyapp.user.v1.RegionResponse - 107, // 199: hyapp.user.v1.UserIdentityService.GetUserIdentity:output_type -> hyapp.user.v1.GetUserIdentityResponse - 109, // 200: hyapp.user.v1.UserIdentityService.ResolveDisplayUserID:output_type -> hyapp.user.v1.ResolveDisplayUserIDResponse - 111, // 201: hyapp.user.v1.UserIdentityService.ChangeDisplayUserID:output_type -> hyapp.user.v1.ChangeDisplayUserIDResponse - 113, // 202: hyapp.user.v1.UserIdentityService.ApplyPrettyDisplayUserID:output_type -> hyapp.user.v1.ApplyPrettyDisplayUserIDResponse - 115, // 203: hyapp.user.v1.UserIdentityService.ExpirePrettyDisplayUserID:output_type -> hyapp.user.v1.ExpirePrettyDisplayUserIDResponse - 154, // [154:204] is the sub-list for method output_type - 104, // [104:154] is the sub-list for method input_type - 104, // [104:104] is the sub-list for extension type_name - 104, // [104:104] is the sub-list for extension extendee - 0, // [0:104] is the sub-list for field type_name + 1, // 47: hyapp.user.v1.PrepareBreakCPRelationshipRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 49, // 48: hyapp.user.v1.PrepareBreakCPRelationshipResponse.relationship:type_name -> hyapp.user.v1.CPRelationship + 1, // 49: hyapp.user.v1.ConfirmBreakCPRelationshipRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 49, // 50: hyapp.user.v1.ConfirmBreakCPRelationshipResponse.relationship:type_name -> hyapp.user.v1.CPRelationship + 1, // 51: hyapp.user.v1.CancelBreakCPRelationshipRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 1, // 52: hyapp.user.v1.RoomGiftCPEvent.meta:type_name -> hyapp.user.v1.RequestMeta + 1, // 53: hyapp.user.v1.ConsumeRoomGiftCPEventRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 64, // 54: hyapp.user.v1.ConsumeRoomGiftCPEventRequest.event:type_name -> hyapp.user.v1.RoomGiftCPEvent + 48, // 55: hyapp.user.v1.ConsumeRoomGiftCPEventResponse.application:type_name -> hyapp.user.v1.CPApplication + 49, // 56: hyapp.user.v1.ConsumeRoomGiftCPEventResponse.relationship:type_name -> hyapp.user.v1.CPRelationship + 1, // 57: hyapp.user.v1.SubmitReportRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 67, // 58: hyapp.user.v1.SubmitReportResponse.report:type_name -> hyapp.user.v1.UserReport + 1, // 59: hyapp.user.v1.BatchGetUsersRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 122, // 60: hyapp.user.v1.BatchGetUsersResponse.users:type_name -> hyapp.user.v1.BatchGetUsersResponse.UsersEntry + 1, // 61: hyapp.user.v1.ListUserIDsRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 1, // 62: hyapp.user.v1.UpdateUserProfileRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 5, // 63: hyapp.user.v1.UpdateUserProfileResponse.user:type_name -> hyapp.user.v1.User + 1, // 64: hyapp.user.v1.ChangeUserCountryRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 1, // 65: hyapp.user.v1.AdminChangeUserCountryRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 5, // 66: hyapp.user.v1.ChangeUserCountryResponse.user:type_name -> hyapp.user.v1.User + 1, // 67: hyapp.user.v1.SetUserStatusRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 0, // 68: hyapp.user.v1.SetUserStatusRequest.status:type_name -> hyapp.user.v1.UserStatus + 5, // 69: hyapp.user.v1.SetUserStatusResponse.user:type_name -> hyapp.user.v1.User + 1, // 70: hyapp.user.v1.CreateManagerUserBlockRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 81, // 71: hyapp.user.v1.CreateManagerUserBlockResponse.block:type_name -> hyapp.user.v1.ManagerUserBlock + 80, // 72: hyapp.user.v1.CreateManagerUserBlockResponse.status:type_name -> hyapp.user.v1.SetUserStatusResponse + 1, // 73: hyapp.user.v1.ListManagerUserBlocksRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 81, // 74: hyapp.user.v1.ListManagerUserBlocksResponse.blocks:type_name -> hyapp.user.v1.ManagerUserBlock + 1, // 75: hyapp.user.v1.UnblockManagerUserRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 81, // 76: hyapp.user.v1.UnblockManagerUserResponse.block:type_name -> hyapp.user.v1.ManagerUserBlock + 80, // 77: hyapp.user.v1.UnblockManagerUserResponse.status:type_name -> hyapp.user.v1.SetUserStatusResponse + 1, // 78: hyapp.user.v1.CompleteOnboardingRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 5, // 79: hyapp.user.v1.CompleteOnboardingResponse.user:type_name -> hyapp.user.v1.User + 13, // 80: hyapp.user.v1.CompleteOnboardingResponse.token:type_name -> hyapp.user.v1.AuthToken + 7, // 81: hyapp.user.v1.CompleteOnboardingResponse.invite:type_name -> hyapp.user.v1.InviteBinding + 1, // 82: hyapp.user.v1.BindPushTokenRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 1, // 83: hyapp.user.v1.DeletePushTokenRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 1, // 84: hyapp.user.v1.ListCountriesRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 94, // 85: hyapp.user.v1.ListCountriesResponse.countries:type_name -> hyapp.user.v1.Country + 1, // 86: hyapp.user.v1.UpdateCountryRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 94, // 87: hyapp.user.v1.CountryResponse.country:type_name -> hyapp.user.v1.Country + 1, // 88: hyapp.user.v1.ListRegistrationCountriesRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 94, // 89: hyapp.user.v1.ListRegistrationCountriesResponse.countries:type_name -> hyapp.user.v1.Country + 1, // 90: hyapp.user.v1.ListLoginRiskBlockedCountriesRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 102, // 91: hyapp.user.v1.ListLoginRiskBlockedCountriesResponse.countries:type_name -> hyapp.user.v1.LoginRiskBlockedCountry + 1, // 92: hyapp.user.v1.ListRegionsRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 95, // 93: hyapp.user.v1.ListRegionsResponse.regions:type_name -> hyapp.user.v1.Region + 1, // 94: hyapp.user.v1.GetRegionRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 1, // 95: hyapp.user.v1.UpdateRegionRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 1, // 96: hyapp.user.v1.ReplaceRegionCountriesRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 95, // 97: hyapp.user.v1.RegionResponse.region:type_name -> hyapp.user.v1.Region + 1, // 98: hyapp.user.v1.GetUserIdentityRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 111, // 99: hyapp.user.v1.GetUserIdentityResponse.identity:type_name -> hyapp.user.v1.UserIdentity + 1, // 100: hyapp.user.v1.ResolveDisplayUserIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 111, // 101: hyapp.user.v1.ResolveDisplayUserIDResponse.identity:type_name -> hyapp.user.v1.UserIdentity + 1, // 102: hyapp.user.v1.ChangeDisplayUserIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 111, // 103: hyapp.user.v1.ChangeDisplayUserIDResponse.identity:type_name -> hyapp.user.v1.UserIdentity + 1, // 104: hyapp.user.v1.ApplyPrettyDisplayUserIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 111, // 105: hyapp.user.v1.ApplyPrettyDisplayUserIDResponse.identity:type_name -> hyapp.user.v1.UserIdentity + 1, // 106: hyapp.user.v1.ExpirePrettyDisplayUserIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 111, // 107: hyapp.user.v1.ExpirePrettyDisplayUserIDResponse.identity:type_name -> hyapp.user.v1.UserIdentity + 5, // 108: hyapp.user.v1.BatchGetUsersResponse.UsersEntry.value:type_name -> hyapp.user.v1.User + 14, // 109: hyapp.user.v1.UserService.GetUser:input_type -> hyapp.user.v1.GetUserRequest + 16, // 110: hyapp.user.v1.UserService.BusinessUserLookup:input_type -> hyapp.user.v1.BusinessUserLookupRequest + 20, // 111: hyapp.user.v1.UserService.GetMyProfileStats:input_type -> hyapp.user.v1.GetMyProfileStatsRequest + 70, // 112: hyapp.user.v1.UserService.BatchGetUsers:input_type -> hyapp.user.v1.BatchGetUsersRequest + 72, // 113: hyapp.user.v1.UserService.ListUserIDs:input_type -> hyapp.user.v1.ListUserIDsRequest + 9, // 114: hyapp.user.v1.UserService.GetUserMicLifetimeStats:input_type -> hyapp.user.v1.GetUserMicLifetimeStatsRequest + 74, // 115: hyapp.user.v1.UserService.UpdateUserProfile:input_type -> hyapp.user.v1.UpdateUserProfileRequest + 76, // 116: hyapp.user.v1.UserService.ChangeUserCountry:input_type -> hyapp.user.v1.ChangeUserCountryRequest + 77, // 117: hyapp.user.v1.UserService.AdminChangeUserCountry:input_type -> hyapp.user.v1.AdminChangeUserCountryRequest + 79, // 118: hyapp.user.v1.UserService.SetUserStatus:input_type -> hyapp.user.v1.SetUserStatusRequest + 82, // 119: hyapp.user.v1.UserService.CreateManagerUserBlock:input_type -> hyapp.user.v1.CreateManagerUserBlockRequest + 84, // 120: hyapp.user.v1.UserService.ListManagerUserBlocks:input_type -> hyapp.user.v1.ListManagerUserBlocksRequest + 86, // 121: hyapp.user.v1.UserService.UnblockManagerUser:input_type -> hyapp.user.v1.UnblockManagerUserRequest + 88, // 122: hyapp.user.v1.UserService.CompleteOnboarding:input_type -> hyapp.user.v1.CompleteOnboardingRequest + 22, // 123: hyapp.user.v1.UserSocialService.RecordProfileVisit:input_type -> hyapp.user.v1.RecordProfileVisitRequest + 25, // 124: hyapp.user.v1.UserSocialService.ListProfileVisitors:input_type -> hyapp.user.v1.ListProfileVisitorsRequest + 27, // 125: hyapp.user.v1.UserSocialService.FollowUser:input_type -> hyapp.user.v1.FollowUserRequest + 29, // 126: hyapp.user.v1.UserSocialService.UnfollowUser:input_type -> hyapp.user.v1.UnfollowUserRequest + 32, // 127: hyapp.user.v1.UserSocialService.ListFollowing:input_type -> hyapp.user.v1.ListFollowingRequest + 34, // 128: hyapp.user.v1.UserSocialService.ApplyFriend:input_type -> hyapp.user.v1.ApplyFriendRequest + 36, // 129: hyapp.user.v1.UserSocialService.AcceptFriendApplication:input_type -> hyapp.user.v1.AcceptFriendApplicationRequest + 38, // 130: hyapp.user.v1.UserSocialService.DeleteFriend:input_type -> hyapp.user.v1.DeleteFriendRequest + 41, // 131: hyapp.user.v1.UserSocialService.ListFriends:input_type -> hyapp.user.v1.ListFriendsRequest + 44, // 132: hyapp.user.v1.UserSocialService.ListFriendApplications:input_type -> hyapp.user.v1.ListFriendApplicationsRequest + 68, // 133: hyapp.user.v1.UserSocialService.SubmitReport:input_type -> hyapp.user.v1.SubmitReportRequest + 50, // 134: hyapp.user.v1.UserCPService.ListCPApplications:input_type -> hyapp.user.v1.ListCPApplicationsRequest + 52, // 135: hyapp.user.v1.UserCPService.AcceptCPApplication:input_type -> hyapp.user.v1.AcceptCPApplicationRequest + 54, // 136: hyapp.user.v1.UserCPService.RejectCPApplication:input_type -> hyapp.user.v1.RejectCPApplicationRequest + 56, // 137: hyapp.user.v1.UserCPService.ListCPRelationships:input_type -> hyapp.user.v1.ListCPRelationshipsRequest + 58, // 138: hyapp.user.v1.UserCPService.PrepareBreakCPRelationship:input_type -> hyapp.user.v1.PrepareBreakCPRelationshipRequest + 60, // 139: hyapp.user.v1.UserCPService.ConfirmBreakCPRelationship:input_type -> hyapp.user.v1.ConfirmBreakCPRelationshipRequest + 62, // 140: hyapp.user.v1.UserCPService.CancelBreakCPRelationship:input_type -> hyapp.user.v1.CancelBreakCPRelationshipRequest + 65, // 141: hyapp.user.v1.UserCPInternalService.ConsumeRoomGiftCPEvent:input_type -> hyapp.user.v1.ConsumeRoomGiftCPEventRequest + 11, // 142: hyapp.user.v1.UserCronService.ProcessLoginIPRiskBatch:input_type -> hyapp.user.v1.CronBatchRequest + 11, // 143: hyapp.user.v1.UserCronService.ProcessRegionRebuildBatch:input_type -> hyapp.user.v1.CronBatchRequest + 11, // 144: hyapp.user.v1.UserCronService.CompensateMicOpenSessions:input_type -> hyapp.user.v1.CronBatchRequest + 11, // 145: hyapp.user.v1.UserCronService.ExpireManagerUserBlocks:input_type -> hyapp.user.v1.CronBatchRequest + 90, // 146: hyapp.user.v1.UserDeviceService.BindPushToken:input_type -> hyapp.user.v1.BindPushTokenRequest + 92, // 147: hyapp.user.v1.UserDeviceService.DeletePushToken:input_type -> hyapp.user.v1.DeletePushTokenRequest + 3, // 148: hyapp.user.v1.AppRegistryService.ResolveApp:input_type -> hyapp.user.v1.ResolveAppRequest + 96, // 149: hyapp.user.v1.CountryAdminService.ListCountries:input_type -> hyapp.user.v1.ListCountriesRequest + 98, // 150: hyapp.user.v1.CountryAdminService.UpdateCountry:input_type -> hyapp.user.v1.UpdateCountryRequest + 100, // 151: hyapp.user.v1.CountryQueryService.ListRegistrationCountries:input_type -> hyapp.user.v1.ListRegistrationCountriesRequest + 103, // 152: hyapp.user.v1.CountryQueryService.ListLoginRiskBlockedCountries:input_type -> hyapp.user.v1.ListLoginRiskBlockedCountriesRequest + 105, // 153: hyapp.user.v1.RegionAdminService.ListRegions:input_type -> hyapp.user.v1.ListRegionsRequest + 107, // 154: hyapp.user.v1.RegionAdminService.GetRegion:input_type -> hyapp.user.v1.GetRegionRequest + 108, // 155: hyapp.user.v1.RegionAdminService.UpdateRegion:input_type -> hyapp.user.v1.UpdateRegionRequest + 109, // 156: hyapp.user.v1.RegionAdminService.ReplaceRegionCountries:input_type -> hyapp.user.v1.ReplaceRegionCountriesRequest + 112, // 157: hyapp.user.v1.UserIdentityService.GetUserIdentity:input_type -> hyapp.user.v1.GetUserIdentityRequest + 114, // 158: hyapp.user.v1.UserIdentityService.ResolveDisplayUserID:input_type -> hyapp.user.v1.ResolveDisplayUserIDRequest + 116, // 159: hyapp.user.v1.UserIdentityService.ChangeDisplayUserID:input_type -> hyapp.user.v1.ChangeDisplayUserIDRequest + 118, // 160: hyapp.user.v1.UserIdentityService.ApplyPrettyDisplayUserID:input_type -> hyapp.user.v1.ApplyPrettyDisplayUserIDRequest + 120, // 161: hyapp.user.v1.UserIdentityService.ExpirePrettyDisplayUserID:input_type -> hyapp.user.v1.ExpirePrettyDisplayUserIDRequest + 15, // 162: hyapp.user.v1.UserService.GetUser:output_type -> hyapp.user.v1.GetUserResponse + 18, // 163: hyapp.user.v1.UserService.BusinessUserLookup:output_type -> hyapp.user.v1.BusinessUserLookupResponse + 21, // 164: hyapp.user.v1.UserService.GetMyProfileStats:output_type -> hyapp.user.v1.GetMyProfileStatsResponse + 71, // 165: hyapp.user.v1.UserService.BatchGetUsers:output_type -> hyapp.user.v1.BatchGetUsersResponse + 73, // 166: hyapp.user.v1.UserService.ListUserIDs:output_type -> hyapp.user.v1.ListUserIDsResponse + 10, // 167: hyapp.user.v1.UserService.GetUserMicLifetimeStats:output_type -> hyapp.user.v1.GetUserMicLifetimeStatsResponse + 75, // 168: hyapp.user.v1.UserService.UpdateUserProfile:output_type -> hyapp.user.v1.UpdateUserProfileResponse + 78, // 169: hyapp.user.v1.UserService.ChangeUserCountry:output_type -> hyapp.user.v1.ChangeUserCountryResponse + 78, // 170: hyapp.user.v1.UserService.AdminChangeUserCountry:output_type -> hyapp.user.v1.ChangeUserCountryResponse + 80, // 171: hyapp.user.v1.UserService.SetUserStatus:output_type -> hyapp.user.v1.SetUserStatusResponse + 83, // 172: hyapp.user.v1.UserService.CreateManagerUserBlock:output_type -> hyapp.user.v1.CreateManagerUserBlockResponse + 85, // 173: hyapp.user.v1.UserService.ListManagerUserBlocks:output_type -> hyapp.user.v1.ListManagerUserBlocksResponse + 87, // 174: hyapp.user.v1.UserService.UnblockManagerUser:output_type -> hyapp.user.v1.UnblockManagerUserResponse + 89, // 175: hyapp.user.v1.UserService.CompleteOnboarding:output_type -> hyapp.user.v1.CompleteOnboardingResponse + 23, // 176: hyapp.user.v1.UserSocialService.RecordProfileVisit:output_type -> hyapp.user.v1.RecordProfileVisitResponse + 26, // 177: hyapp.user.v1.UserSocialService.ListProfileVisitors:output_type -> hyapp.user.v1.ListProfileVisitorsResponse + 28, // 178: hyapp.user.v1.UserSocialService.FollowUser:output_type -> hyapp.user.v1.FollowUserResponse + 30, // 179: hyapp.user.v1.UserSocialService.UnfollowUser:output_type -> hyapp.user.v1.UnfollowUserResponse + 33, // 180: hyapp.user.v1.UserSocialService.ListFollowing:output_type -> hyapp.user.v1.ListFollowingResponse + 35, // 181: hyapp.user.v1.UserSocialService.ApplyFriend:output_type -> hyapp.user.v1.ApplyFriendResponse + 37, // 182: hyapp.user.v1.UserSocialService.AcceptFriendApplication:output_type -> hyapp.user.v1.AcceptFriendApplicationResponse + 39, // 183: hyapp.user.v1.UserSocialService.DeleteFriend:output_type -> hyapp.user.v1.DeleteFriendResponse + 42, // 184: hyapp.user.v1.UserSocialService.ListFriends:output_type -> hyapp.user.v1.ListFriendsResponse + 45, // 185: hyapp.user.v1.UserSocialService.ListFriendApplications:output_type -> hyapp.user.v1.ListFriendApplicationsResponse + 69, // 186: hyapp.user.v1.UserSocialService.SubmitReport:output_type -> hyapp.user.v1.SubmitReportResponse + 51, // 187: hyapp.user.v1.UserCPService.ListCPApplications:output_type -> hyapp.user.v1.ListCPApplicationsResponse + 53, // 188: hyapp.user.v1.UserCPService.AcceptCPApplication:output_type -> hyapp.user.v1.AcceptCPApplicationResponse + 55, // 189: hyapp.user.v1.UserCPService.RejectCPApplication:output_type -> hyapp.user.v1.RejectCPApplicationResponse + 57, // 190: hyapp.user.v1.UserCPService.ListCPRelationships:output_type -> hyapp.user.v1.ListCPRelationshipsResponse + 59, // 191: hyapp.user.v1.UserCPService.PrepareBreakCPRelationship:output_type -> hyapp.user.v1.PrepareBreakCPRelationshipResponse + 61, // 192: hyapp.user.v1.UserCPService.ConfirmBreakCPRelationship:output_type -> hyapp.user.v1.ConfirmBreakCPRelationshipResponse + 63, // 193: hyapp.user.v1.UserCPService.CancelBreakCPRelationship:output_type -> hyapp.user.v1.CancelBreakCPRelationshipResponse + 66, // 194: hyapp.user.v1.UserCPInternalService.ConsumeRoomGiftCPEvent:output_type -> hyapp.user.v1.ConsumeRoomGiftCPEventResponse + 12, // 195: hyapp.user.v1.UserCronService.ProcessLoginIPRiskBatch:output_type -> hyapp.user.v1.CronBatchResponse + 12, // 196: hyapp.user.v1.UserCronService.ProcessRegionRebuildBatch:output_type -> hyapp.user.v1.CronBatchResponse + 12, // 197: hyapp.user.v1.UserCronService.CompensateMicOpenSessions:output_type -> hyapp.user.v1.CronBatchResponse + 12, // 198: hyapp.user.v1.UserCronService.ExpireManagerUserBlocks:output_type -> hyapp.user.v1.CronBatchResponse + 91, // 199: hyapp.user.v1.UserDeviceService.BindPushToken:output_type -> hyapp.user.v1.BindPushTokenResponse + 93, // 200: hyapp.user.v1.UserDeviceService.DeletePushToken:output_type -> hyapp.user.v1.DeletePushTokenResponse + 4, // 201: hyapp.user.v1.AppRegistryService.ResolveApp:output_type -> hyapp.user.v1.ResolveAppResponse + 97, // 202: hyapp.user.v1.CountryAdminService.ListCountries:output_type -> hyapp.user.v1.ListCountriesResponse + 99, // 203: hyapp.user.v1.CountryAdminService.UpdateCountry:output_type -> hyapp.user.v1.CountryResponse + 101, // 204: hyapp.user.v1.CountryQueryService.ListRegistrationCountries:output_type -> hyapp.user.v1.ListRegistrationCountriesResponse + 104, // 205: hyapp.user.v1.CountryQueryService.ListLoginRiskBlockedCountries:output_type -> hyapp.user.v1.ListLoginRiskBlockedCountriesResponse + 106, // 206: hyapp.user.v1.RegionAdminService.ListRegions:output_type -> hyapp.user.v1.ListRegionsResponse + 110, // 207: hyapp.user.v1.RegionAdminService.GetRegion:output_type -> hyapp.user.v1.RegionResponse + 110, // 208: hyapp.user.v1.RegionAdminService.UpdateRegion:output_type -> hyapp.user.v1.RegionResponse + 110, // 209: hyapp.user.v1.RegionAdminService.ReplaceRegionCountries:output_type -> hyapp.user.v1.RegionResponse + 113, // 210: hyapp.user.v1.UserIdentityService.GetUserIdentity:output_type -> hyapp.user.v1.GetUserIdentityResponse + 115, // 211: hyapp.user.v1.UserIdentityService.ResolveDisplayUserID:output_type -> hyapp.user.v1.ResolveDisplayUserIDResponse + 117, // 212: hyapp.user.v1.UserIdentityService.ChangeDisplayUserID:output_type -> hyapp.user.v1.ChangeDisplayUserIDResponse + 119, // 213: hyapp.user.v1.UserIdentityService.ApplyPrettyDisplayUserID:output_type -> hyapp.user.v1.ApplyPrettyDisplayUserIDResponse + 121, // 214: hyapp.user.v1.UserIdentityService.ExpirePrettyDisplayUserID:output_type -> hyapp.user.v1.ExpirePrettyDisplayUserIDResponse + 162, // [162:215] is the sub-list for method output_type + 109, // [109:162] is the sub-list for method input_type + 109, // [109:109] is the sub-list for extension type_name + 109, // [109:109] is the sub-list for extension extendee + 0, // [0:109] is the sub-list for field type_name } func init() { file_proto_user_v1_user_proto_init() } @@ -9378,15 +9896,15 @@ func file_proto_user_v1_user_proto_init() { if File_proto_user_v1_user_proto != nil { return } - file_proto_user_v1_user_proto_msgTypes[67].OneofWrappers = []any{} - file_proto_user_v1_user_proto_msgTypes[89].OneofWrappers = []any{} + file_proto_user_v1_user_proto_msgTypes[73].OneofWrappers = []any{} + file_proto_user_v1_user_proto_msgTypes[95].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_proto_user_v1_user_proto_rawDesc), len(file_proto_user_v1_user_proto_rawDesc)), NumEnums: 1, - NumMessages: 116, + NumMessages: 122, NumExtensions: 0, NumServices: 11, }, diff --git a/api/proto/user/v1/user.proto b/api/proto/user/v1/user.proto index 47b552cd..705dd540 100644 --- a/api/proto/user/v1/user.proto +++ b/api/proto/user/v1/user.proto @@ -413,6 +413,9 @@ message CPRelationship { int64 needed_for_next_level = 13; int32 level_progress_percent = 14; bool max_level = 15; + // breakup_cost_coins 是当前关系类型后台配置的解除费用;active 关系返回配置值,ended 关系返回实际支付值。 + int64 breakup_cost_coins = 16; + int64 ended_at_ms = 17; } message ListCPApplicationsRequest { @@ -467,6 +470,52 @@ message ListCPRelationshipsResponse { reserved "max_count_by_relation_type"; } +message PrepareBreakCPRelationshipRequest { + RequestMeta meta = 1; + int64 user_id = 2; + string relationship_id = 3; + string command_id = 4; +} + +message PrepareBreakCPRelationshipResponse { + CPRelationship relationship = 1; + string command_id = 2; + string status = 3; + int64 breakup_cost_coins = 4; + string wallet_transaction_id = 5; + int64 coin_balance_after = 6; +} + +message ConfirmBreakCPRelationshipRequest { + RequestMeta meta = 1; + int64 user_id = 2; + string relationship_id = 3; + string command_id = 4; + string wallet_transaction_id = 5; + int64 paid_coin_amount = 6; + int64 coin_balance_after = 7; +} + +message ConfirmBreakCPRelationshipResponse { + CPRelationship relationship = 1; + int64 breakup_cost_coins = 2; + string wallet_transaction_id = 3; + int64 coin_balance_after = 4; +} + +message CancelBreakCPRelationshipRequest { + RequestMeta meta = 1; + int64 user_id = 2; + string relationship_id = 3; + string command_id = 4; + string reason = 5; +} + +message CancelBreakCPRelationshipResponse { + string command_id = 1; + string status = 2; +} + message RoomGiftCPEvent { RequestMeta meta = 1; string event_id = 2; @@ -958,6 +1007,9 @@ service UserCPService { rpc AcceptCPApplication(AcceptCPApplicationRequest) returns (AcceptCPApplicationResponse); rpc RejectCPApplication(RejectCPApplicationRequest) returns (RejectCPApplicationResponse); rpc ListCPRelationships(ListCPRelationshipsRequest) returns (ListCPRelationshipsResponse); + rpc PrepareBreakCPRelationship(PrepareBreakCPRelationshipRequest) returns (PrepareBreakCPRelationshipResponse); + rpc ConfirmBreakCPRelationship(ConfirmBreakCPRelationshipRequest) returns (ConfirmBreakCPRelationshipResponse); + rpc CancelBreakCPRelationship(CancelBreakCPRelationshipRequest) returns (CancelBreakCPRelationshipResponse); } // UserCPInternalService 给 owner outbox 消费 worker 调用,不暴露给 App 或后台。 diff --git a/api/proto/user/v1/user_grpc.pb.go b/api/proto/user/v1/user_grpc.pb.go index c042dc99..0e3d733d 100644 --- a/api/proto/user/v1/user_grpc.pb.go +++ b/api/proto/user/v1/user_grpc.pb.go @@ -1105,10 +1105,13 @@ var UserSocialService_ServiceDesc = grpc.ServiceDesc{ } const ( - UserCPService_ListCPApplications_FullMethodName = "/hyapp.user.v1.UserCPService/ListCPApplications" - UserCPService_AcceptCPApplication_FullMethodName = "/hyapp.user.v1.UserCPService/AcceptCPApplication" - UserCPService_RejectCPApplication_FullMethodName = "/hyapp.user.v1.UserCPService/RejectCPApplication" - UserCPService_ListCPRelationships_FullMethodName = "/hyapp.user.v1.UserCPService/ListCPRelationships" + UserCPService_ListCPApplications_FullMethodName = "/hyapp.user.v1.UserCPService/ListCPApplications" + UserCPService_AcceptCPApplication_FullMethodName = "/hyapp.user.v1.UserCPService/AcceptCPApplication" + UserCPService_RejectCPApplication_FullMethodName = "/hyapp.user.v1.UserCPService/RejectCPApplication" + UserCPService_ListCPRelationships_FullMethodName = "/hyapp.user.v1.UserCPService/ListCPRelationships" + UserCPService_PrepareBreakCPRelationship_FullMethodName = "/hyapp.user.v1.UserCPService/PrepareBreakCPRelationship" + UserCPService_ConfirmBreakCPRelationship_FullMethodName = "/hyapp.user.v1.UserCPService/ConfirmBreakCPRelationship" + UserCPService_CancelBreakCPRelationship_FullMethodName = "/hyapp.user.v1.UserCPService/CancelBreakCPRelationship" ) // UserCPServiceClient is the client API for UserCPService service. @@ -1121,6 +1124,9 @@ type UserCPServiceClient interface { AcceptCPApplication(ctx context.Context, in *AcceptCPApplicationRequest, opts ...grpc.CallOption) (*AcceptCPApplicationResponse, error) RejectCPApplication(ctx context.Context, in *RejectCPApplicationRequest, opts ...grpc.CallOption) (*RejectCPApplicationResponse, error) ListCPRelationships(ctx context.Context, in *ListCPRelationshipsRequest, opts ...grpc.CallOption) (*ListCPRelationshipsResponse, error) + PrepareBreakCPRelationship(ctx context.Context, in *PrepareBreakCPRelationshipRequest, opts ...grpc.CallOption) (*PrepareBreakCPRelationshipResponse, error) + ConfirmBreakCPRelationship(ctx context.Context, in *ConfirmBreakCPRelationshipRequest, opts ...grpc.CallOption) (*ConfirmBreakCPRelationshipResponse, error) + CancelBreakCPRelationship(ctx context.Context, in *CancelBreakCPRelationshipRequest, opts ...grpc.CallOption) (*CancelBreakCPRelationshipResponse, error) } type userCPServiceClient struct { @@ -1171,6 +1177,36 @@ func (c *userCPServiceClient) ListCPRelationships(ctx context.Context, in *ListC return out, nil } +func (c *userCPServiceClient) PrepareBreakCPRelationship(ctx context.Context, in *PrepareBreakCPRelationshipRequest, opts ...grpc.CallOption) (*PrepareBreakCPRelationshipResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(PrepareBreakCPRelationshipResponse) + err := c.cc.Invoke(ctx, UserCPService_PrepareBreakCPRelationship_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userCPServiceClient) ConfirmBreakCPRelationship(ctx context.Context, in *ConfirmBreakCPRelationshipRequest, opts ...grpc.CallOption) (*ConfirmBreakCPRelationshipResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ConfirmBreakCPRelationshipResponse) + err := c.cc.Invoke(ctx, UserCPService_ConfirmBreakCPRelationship_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userCPServiceClient) CancelBreakCPRelationship(ctx context.Context, in *CancelBreakCPRelationshipRequest, opts ...grpc.CallOption) (*CancelBreakCPRelationshipResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CancelBreakCPRelationshipResponse) + err := c.cc.Invoke(ctx, UserCPService_CancelBreakCPRelationship_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // UserCPServiceServer is the server API for UserCPService service. // All implementations must embed UnimplementedUserCPServiceServer // for forward compatibility. @@ -1181,6 +1217,9 @@ type UserCPServiceServer interface { AcceptCPApplication(context.Context, *AcceptCPApplicationRequest) (*AcceptCPApplicationResponse, error) RejectCPApplication(context.Context, *RejectCPApplicationRequest) (*RejectCPApplicationResponse, error) ListCPRelationships(context.Context, *ListCPRelationshipsRequest) (*ListCPRelationshipsResponse, error) + PrepareBreakCPRelationship(context.Context, *PrepareBreakCPRelationshipRequest) (*PrepareBreakCPRelationshipResponse, error) + ConfirmBreakCPRelationship(context.Context, *ConfirmBreakCPRelationshipRequest) (*ConfirmBreakCPRelationshipResponse, error) + CancelBreakCPRelationship(context.Context, *CancelBreakCPRelationshipRequest) (*CancelBreakCPRelationshipResponse, error) mustEmbedUnimplementedUserCPServiceServer() } @@ -1203,6 +1242,15 @@ func (UnimplementedUserCPServiceServer) RejectCPApplication(context.Context, *Re func (UnimplementedUserCPServiceServer) ListCPRelationships(context.Context, *ListCPRelationshipsRequest) (*ListCPRelationshipsResponse, error) { return nil, status.Error(codes.Unimplemented, "method ListCPRelationships not implemented") } +func (UnimplementedUserCPServiceServer) PrepareBreakCPRelationship(context.Context, *PrepareBreakCPRelationshipRequest) (*PrepareBreakCPRelationshipResponse, error) { + return nil, status.Error(codes.Unimplemented, "method PrepareBreakCPRelationship not implemented") +} +func (UnimplementedUserCPServiceServer) ConfirmBreakCPRelationship(context.Context, *ConfirmBreakCPRelationshipRequest) (*ConfirmBreakCPRelationshipResponse, error) { + return nil, status.Error(codes.Unimplemented, "method ConfirmBreakCPRelationship not implemented") +} +func (UnimplementedUserCPServiceServer) CancelBreakCPRelationship(context.Context, *CancelBreakCPRelationshipRequest) (*CancelBreakCPRelationshipResponse, error) { + return nil, status.Error(codes.Unimplemented, "method CancelBreakCPRelationship not implemented") +} func (UnimplementedUserCPServiceServer) mustEmbedUnimplementedUserCPServiceServer() {} func (UnimplementedUserCPServiceServer) testEmbeddedByValue() {} @@ -1296,6 +1344,60 @@ func _UserCPService_ListCPRelationships_Handler(srv interface{}, ctx context.Con return interceptor(ctx, in, info, handler) } +func _UserCPService_PrepareBreakCPRelationship_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PrepareBreakCPRelationshipRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserCPServiceServer).PrepareBreakCPRelationship(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserCPService_PrepareBreakCPRelationship_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserCPServiceServer).PrepareBreakCPRelationship(ctx, req.(*PrepareBreakCPRelationshipRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserCPService_ConfirmBreakCPRelationship_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ConfirmBreakCPRelationshipRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserCPServiceServer).ConfirmBreakCPRelationship(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserCPService_ConfirmBreakCPRelationship_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserCPServiceServer).ConfirmBreakCPRelationship(ctx, req.(*ConfirmBreakCPRelationshipRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserCPService_CancelBreakCPRelationship_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CancelBreakCPRelationshipRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserCPServiceServer).CancelBreakCPRelationship(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserCPService_CancelBreakCPRelationship_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserCPServiceServer).CancelBreakCPRelationship(ctx, req.(*CancelBreakCPRelationshipRequest)) + } + return interceptor(ctx, in, info, handler) +} + // UserCPService_ServiceDesc is the grpc.ServiceDesc for UserCPService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -1319,6 +1421,18 @@ var UserCPService_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListCPRelationships", Handler: _UserCPService_ListCPRelationships_Handler, }, + { + MethodName: "PrepareBreakCPRelationship", + Handler: _UserCPService_PrepareBreakCPRelationship_Handler, + }, + { + MethodName: "ConfirmBreakCPRelationship", + Handler: _UserCPService_ConfirmBreakCPRelationship_Handler, + }, + { + MethodName: "CancelBreakCPRelationship", + Handler: _UserCPService_CancelBreakCPRelationship_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "proto/user/v1/user.proto", diff --git a/api/proto/wallet/v1/wallet.pb.go b/api/proto/wallet/v1/wallet.pb.go index 5057072b..3494dcad 100644 --- a/api/proto/wallet/v1/wallet.pb.go +++ b/api/proto/wallet/v1/wallet.pb.go @@ -11303,6 +11303,158 @@ func (x *PurchaseVipResponse) GetRewardItems() []*VipRewardItem { return nil } +type DebitCPBreakupFeeRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + CommandId string `protobuf:"bytes,1,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` + AppCode string `protobuf:"bytes,2,opt,name=app_code,json=appCode,proto3" json:"app_code,omitempty"` + UserId int64 `protobuf:"varint,3,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + RelationshipId string `protobuf:"bytes,4,opt,name=relationship_id,json=relationshipId,proto3" json:"relationship_id,omitempty"` + RelationType string `protobuf:"bytes,5,opt,name=relation_type,json=relationType,proto3" json:"relation_type,omitempty"` + Amount int64 `protobuf:"varint,6,opt,name=amount,proto3" json:"amount,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DebitCPBreakupFeeRequest) Reset() { + *x = DebitCPBreakupFeeRequest{} + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[127] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DebitCPBreakupFeeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DebitCPBreakupFeeRequest) ProtoMessage() {} + +func (x *DebitCPBreakupFeeRequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[127] + 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 DebitCPBreakupFeeRequest.ProtoReflect.Descriptor instead. +func (*DebitCPBreakupFeeRequest) Descriptor() ([]byte, []int) { + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{127} +} + +func (x *DebitCPBreakupFeeRequest) GetCommandId() string { + if x != nil { + return x.CommandId + } + return "" +} + +func (x *DebitCPBreakupFeeRequest) GetAppCode() string { + if x != nil { + return x.AppCode + } + return "" +} + +func (x *DebitCPBreakupFeeRequest) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *DebitCPBreakupFeeRequest) GetRelationshipId() string { + if x != nil { + return x.RelationshipId + } + return "" +} + +func (x *DebitCPBreakupFeeRequest) GetRelationType() string { + if x != nil { + return x.RelationType + } + return "" +} + +func (x *DebitCPBreakupFeeRequest) GetAmount() int64 { + if x != nil { + return x.Amount + } + return 0 +} + +type DebitCPBreakupFeeResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + TransactionId string `protobuf:"bytes,1,opt,name=transaction_id,json=transactionId,proto3" json:"transaction_id,omitempty"` + CoinSpent int64 `protobuf:"varint,2,opt,name=coin_spent,json=coinSpent,proto3" json:"coin_spent,omitempty"` + CoinBalanceAfter int64 `protobuf:"varint,3,opt,name=coin_balance_after,json=coinBalanceAfter,proto3" json:"coin_balance_after,omitempty"` + Balance *AssetBalance `protobuf:"bytes,4,opt,name=balance,proto3" json:"balance,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DebitCPBreakupFeeResponse) Reset() { + *x = DebitCPBreakupFeeResponse{} + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[128] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DebitCPBreakupFeeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DebitCPBreakupFeeResponse) ProtoMessage() {} + +func (x *DebitCPBreakupFeeResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[128] + 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 DebitCPBreakupFeeResponse.ProtoReflect.Descriptor instead. +func (*DebitCPBreakupFeeResponse) Descriptor() ([]byte, []int) { + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{128} +} + +func (x *DebitCPBreakupFeeResponse) GetTransactionId() string { + if x != nil { + return x.TransactionId + } + return "" +} + +func (x *DebitCPBreakupFeeResponse) GetCoinSpent() int64 { + if x != nil { + return x.CoinSpent + } + return 0 +} + +func (x *DebitCPBreakupFeeResponse) GetCoinBalanceAfter() int64 { + if x != nil { + return x.CoinBalanceAfter + } + return 0 +} + +func (x *DebitCPBreakupFeeResponse) GetBalance() *AssetBalance { + if x != nil { + return x.Balance + } + return nil +} + type GrantVipRequest struct { state protoimpl.MessageState `protogen:"open.v1"` CommandId string `protobuf:"bytes,1,opt,name=command_id,json=commandId,proto3" json:"command_id,omitempty"` @@ -11318,7 +11470,7 @@ type GrantVipRequest struct { func (x *GrantVipRequest) Reset() { *x = GrantVipRequest{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[127] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11330,7 +11482,7 @@ func (x *GrantVipRequest) String() string { func (*GrantVipRequest) ProtoMessage() {} func (x *GrantVipRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[127] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[129] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11343,7 +11495,7 @@ func (x *GrantVipRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GrantVipRequest.ProtoReflect.Descriptor instead. func (*GrantVipRequest) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{127} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{129} } func (x *GrantVipRequest) GetCommandId() string { @@ -11407,7 +11559,7 @@ type GrantVipResponse struct { func (x *GrantVipResponse) Reset() { *x = GrantVipResponse{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[128] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11419,7 +11571,7 @@ func (x *GrantVipResponse) String() string { func (*GrantVipResponse) ProtoMessage() {} func (x *GrantVipResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[128] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[130] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11432,7 +11584,7 @@ func (x *GrantVipResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GrantVipResponse.ProtoReflect.Descriptor instead. func (*GrantVipResponse) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{128} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{130} } func (x *GrantVipResponse) GetTransactionId() string { @@ -11479,7 +11631,7 @@ type AdminVipLevelInput struct { func (x *AdminVipLevelInput) Reset() { *x = AdminVipLevelInput{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[129] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11491,7 +11643,7 @@ func (x *AdminVipLevelInput) String() string { func (*AdminVipLevelInput) ProtoMessage() {} func (x *AdminVipLevelInput) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[129] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[131] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11504,7 +11656,7 @@ func (x *AdminVipLevelInput) ProtoReflect() protoreflect.Message { // Deprecated: Use AdminVipLevelInput.ProtoReflect.Descriptor instead. func (*AdminVipLevelInput) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{129} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{131} } func (x *AdminVipLevelInput) GetLevel() int32 { @@ -11573,7 +11725,7 @@ type ListAdminVipLevelsRequest struct { func (x *ListAdminVipLevelsRequest) Reset() { *x = ListAdminVipLevelsRequest{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[130] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11585,7 +11737,7 @@ func (x *ListAdminVipLevelsRequest) String() string { func (*ListAdminVipLevelsRequest) ProtoMessage() {} func (x *ListAdminVipLevelsRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[130] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[132] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11598,7 +11750,7 @@ func (x *ListAdminVipLevelsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAdminVipLevelsRequest.ProtoReflect.Descriptor instead. func (*ListAdminVipLevelsRequest) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{130} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{132} } func (x *ListAdminVipLevelsRequest) GetRequestId() string { @@ -11625,7 +11777,7 @@ type ListAdminVipLevelsResponse struct { func (x *ListAdminVipLevelsResponse) Reset() { *x = ListAdminVipLevelsResponse{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[131] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11637,7 +11789,7 @@ func (x *ListAdminVipLevelsResponse) String() string { func (*ListAdminVipLevelsResponse) ProtoMessage() {} func (x *ListAdminVipLevelsResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[131] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[133] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11650,7 +11802,7 @@ func (x *ListAdminVipLevelsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAdminVipLevelsResponse.ProtoReflect.Descriptor instead. func (*ListAdminVipLevelsResponse) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{131} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{133} } func (x *ListAdminVipLevelsResponse) GetLevels() []*VipLevel { @@ -11679,7 +11831,7 @@ type UpdateAdminVipLevelsRequest struct { func (x *UpdateAdminVipLevelsRequest) Reset() { *x = UpdateAdminVipLevelsRequest{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[132] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11691,7 +11843,7 @@ func (x *UpdateAdminVipLevelsRequest) String() string { func (*UpdateAdminVipLevelsRequest) ProtoMessage() {} func (x *UpdateAdminVipLevelsRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[132] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[134] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11704,7 +11856,7 @@ func (x *UpdateAdminVipLevelsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateAdminVipLevelsRequest.ProtoReflect.Descriptor instead. func (*UpdateAdminVipLevelsRequest) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{132} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{134} } func (x *UpdateAdminVipLevelsRequest) GetRequestId() string { @@ -11745,7 +11897,7 @@ type UpdateAdminVipLevelsResponse struct { func (x *UpdateAdminVipLevelsResponse) Reset() { *x = UpdateAdminVipLevelsResponse{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[133] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11757,7 +11909,7 @@ func (x *UpdateAdminVipLevelsResponse) String() string { func (*UpdateAdminVipLevelsResponse) ProtoMessage() {} func (x *UpdateAdminVipLevelsResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[133] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[135] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11770,7 +11922,7 @@ func (x *UpdateAdminVipLevelsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateAdminVipLevelsResponse.ProtoReflect.Descriptor instead. func (*UpdateAdminVipLevelsResponse) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{133} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{135} } func (x *UpdateAdminVipLevelsResponse) GetLevels() []*VipLevel { @@ -11804,7 +11956,7 @@ type CreditTaskRewardRequest struct { func (x *CreditTaskRewardRequest) Reset() { *x = CreditTaskRewardRequest{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[134] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[136] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11816,7 +11968,7 @@ func (x *CreditTaskRewardRequest) String() string { func (*CreditTaskRewardRequest) ProtoMessage() {} func (x *CreditTaskRewardRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[134] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[136] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11829,7 +11981,7 @@ func (x *CreditTaskRewardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreditTaskRewardRequest.ProtoReflect.Descriptor instead. func (*CreditTaskRewardRequest) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{134} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{136} } func (x *CreditTaskRewardRequest) GetCommandId() string { @@ -11901,7 +12053,7 @@ type CreditTaskRewardResponse struct { func (x *CreditTaskRewardResponse) Reset() { *x = CreditTaskRewardResponse{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[135] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11913,7 +12065,7 @@ func (x *CreditTaskRewardResponse) String() string { func (*CreditTaskRewardResponse) ProtoMessage() {} func (x *CreditTaskRewardResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[135] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[137] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11926,7 +12078,7 @@ func (x *CreditTaskRewardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreditTaskRewardResponse.ProtoReflect.Descriptor instead. func (*CreditTaskRewardResponse) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{135} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{137} } func (x *CreditTaskRewardResponse) GetTransactionId() string { @@ -11976,7 +12128,7 @@ type CreditLuckyGiftRewardRequest struct { func (x *CreditLuckyGiftRewardRequest) Reset() { *x = CreditLuckyGiftRewardRequest{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[136] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11988,7 +12140,7 @@ func (x *CreditLuckyGiftRewardRequest) String() string { func (*CreditLuckyGiftRewardRequest) ProtoMessage() {} func (x *CreditLuckyGiftRewardRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[136] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[138] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12001,7 +12153,7 @@ func (x *CreditLuckyGiftRewardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreditLuckyGiftRewardRequest.ProtoReflect.Descriptor instead. func (*CreditLuckyGiftRewardRequest) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{136} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{138} } func (x *CreditLuckyGiftRewardRequest) GetCommandId() string { @@ -12087,7 +12239,7 @@ type CreditLuckyGiftRewardResponse struct { func (x *CreditLuckyGiftRewardResponse) Reset() { *x = CreditLuckyGiftRewardResponse{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[137] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12099,7 +12251,7 @@ func (x *CreditLuckyGiftRewardResponse) String() string { func (*CreditLuckyGiftRewardResponse) ProtoMessage() {} func (x *CreditLuckyGiftRewardResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[137] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[139] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12112,7 +12264,7 @@ func (x *CreditLuckyGiftRewardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreditLuckyGiftRewardResponse.ProtoReflect.Descriptor instead. func (*CreditLuckyGiftRewardResponse) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{137} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{139} } func (x *CreditLuckyGiftRewardResponse) GetTransactionId() string { @@ -12164,7 +12316,7 @@ type CreditRoomTurnoverRewardRequest struct { func (x *CreditRoomTurnoverRewardRequest) Reset() { *x = CreditRoomTurnoverRewardRequest{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[138] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12176,7 +12328,7 @@ func (x *CreditRoomTurnoverRewardRequest) String() string { func (*CreditRoomTurnoverRewardRequest) ProtoMessage() {} func (x *CreditRoomTurnoverRewardRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[138] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[140] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12189,7 +12341,7 @@ func (x *CreditRoomTurnoverRewardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreditRoomTurnoverRewardRequest.ProtoReflect.Descriptor instead. func (*CreditRoomTurnoverRewardRequest) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{138} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{140} } func (x *CreditRoomTurnoverRewardRequest) GetCommandId() string { @@ -12289,7 +12441,7 @@ type CreditRoomTurnoverRewardResponse struct { func (x *CreditRoomTurnoverRewardResponse) Reset() { *x = CreditRoomTurnoverRewardResponse{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[139] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12301,7 +12453,7 @@ func (x *CreditRoomTurnoverRewardResponse) String() string { func (*CreditRoomTurnoverRewardResponse) ProtoMessage() {} func (x *CreditRoomTurnoverRewardResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[139] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[141] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12314,7 +12466,7 @@ func (x *CreditRoomTurnoverRewardResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreditRoomTurnoverRewardResponse.ProtoReflect.Descriptor instead. func (*CreditRoomTurnoverRewardResponse) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{139} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{141} } func (x *CreditRoomTurnoverRewardResponse) GetTransactionId() string { @@ -12366,7 +12518,7 @@ type ApplyGameCoinChangeRequest struct { func (x *ApplyGameCoinChangeRequest) Reset() { *x = ApplyGameCoinChangeRequest{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[140] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12378,7 +12530,7 @@ func (x *ApplyGameCoinChangeRequest) String() string { func (*ApplyGameCoinChangeRequest) ProtoMessage() {} func (x *ApplyGameCoinChangeRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[140] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[142] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12391,7 +12543,7 @@ func (x *ApplyGameCoinChangeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplyGameCoinChangeRequest.ProtoReflect.Descriptor instead. func (*ApplyGameCoinChangeRequest) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{140} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{142} } func (x *ApplyGameCoinChangeRequest) GetRequestId() string { @@ -12490,7 +12642,7 @@ type ApplyGameCoinChangeResponse struct { func (x *ApplyGameCoinChangeResponse) Reset() { *x = ApplyGameCoinChangeResponse{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[141] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12502,7 +12654,7 @@ func (x *ApplyGameCoinChangeResponse) String() string { func (*ApplyGameCoinChangeResponse) ProtoMessage() {} func (x *ApplyGameCoinChangeResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[141] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[143] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12515,7 +12667,7 @@ func (x *ApplyGameCoinChangeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ApplyGameCoinChangeResponse.ProtoReflect.Descriptor instead. func (*ApplyGameCoinChangeResponse) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{141} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{143} } func (x *ApplyGameCoinChangeResponse) GetWalletTransactionId() string { @@ -12558,7 +12710,7 @@ type RedPacketConfig struct { func (x *RedPacketConfig) Reset() { *x = RedPacketConfig{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[142] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12570,7 +12722,7 @@ func (x *RedPacketConfig) String() string { func (*RedPacketConfig) ProtoMessage() {} func (x *RedPacketConfig) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[142] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[144] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12583,7 +12735,7 @@ func (x *RedPacketConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use RedPacketConfig.ProtoReflect.Descriptor instead. func (*RedPacketConfig) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{142} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{144} } func (x *RedPacketConfig) GetAppCode() string { @@ -12682,7 +12834,7 @@ type RedPacketClaim struct { func (x *RedPacketClaim) Reset() { *x = RedPacketClaim{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[143] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[145] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12694,7 +12846,7 @@ func (x *RedPacketClaim) String() string { func (*RedPacketClaim) ProtoMessage() {} func (x *RedPacketClaim) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[143] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[145] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12707,7 +12859,7 @@ func (x *RedPacketClaim) ProtoReflect() protoreflect.Message { // Deprecated: Use RedPacketClaim.ProtoReflect.Descriptor instead. func (*RedPacketClaim) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{143} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{145} } func (x *RedPacketClaim) GetAppCode() string { @@ -12817,7 +12969,7 @@ type RedPacket struct { func (x *RedPacket) Reset() { *x = RedPacket{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[144] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[146] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12829,7 +12981,7 @@ func (x *RedPacket) String() string { func (*RedPacket) ProtoMessage() {} func (x *RedPacket) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[144] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[146] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12842,7 +12994,7 @@ func (x *RedPacket) ProtoReflect() protoreflect.Message { // Deprecated: Use RedPacket.ProtoReflect.Descriptor instead. func (*RedPacket) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{144} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{146} } func (x *RedPacket) GetAppCode() string { @@ -13009,7 +13161,7 @@ type GetRedPacketConfigRequest struct { func (x *GetRedPacketConfigRequest) Reset() { *x = GetRedPacketConfigRequest{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[145] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[147] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13021,7 +13173,7 @@ func (x *GetRedPacketConfigRequest) String() string { func (*GetRedPacketConfigRequest) ProtoMessage() {} func (x *GetRedPacketConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[145] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[147] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13034,7 +13186,7 @@ func (x *GetRedPacketConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRedPacketConfigRequest.ProtoReflect.Descriptor instead. func (*GetRedPacketConfigRequest) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{145} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{147} } func (x *GetRedPacketConfigRequest) GetRequestId() string { @@ -13061,7 +13213,7 @@ type GetRedPacketConfigResponse struct { func (x *GetRedPacketConfigResponse) Reset() { *x = GetRedPacketConfigResponse{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[146] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[148] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13073,7 +13225,7 @@ func (x *GetRedPacketConfigResponse) String() string { func (*GetRedPacketConfigResponse) ProtoMessage() {} func (x *GetRedPacketConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[146] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[148] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13086,7 +13238,7 @@ func (x *GetRedPacketConfigResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRedPacketConfigResponse.ProtoReflect.Descriptor instead. func (*GetRedPacketConfigResponse) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{146} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{148} } func (x *GetRedPacketConfigResponse) GetConfig() *RedPacketConfig { @@ -13121,7 +13273,7 @@ type UpdateRedPacketConfigRequest struct { func (x *UpdateRedPacketConfigRequest) Reset() { *x = UpdateRedPacketConfigRequest{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[147] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[149] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13133,7 +13285,7 @@ func (x *UpdateRedPacketConfigRequest) String() string { func (*UpdateRedPacketConfigRequest) ProtoMessage() {} func (x *UpdateRedPacketConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[147] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[149] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13146,7 +13298,7 @@ func (x *UpdateRedPacketConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateRedPacketConfigRequest.ProtoReflect.Descriptor instead. func (*UpdateRedPacketConfigRequest) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{147} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{149} } func (x *UpdateRedPacketConfigRequest) GetRequestId() string { @@ -13229,7 +13381,7 @@ type UpdateRedPacketConfigResponse struct { func (x *UpdateRedPacketConfigResponse) Reset() { *x = UpdateRedPacketConfigResponse{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[148] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[150] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13241,7 +13393,7 @@ func (x *UpdateRedPacketConfigResponse) String() string { func (*UpdateRedPacketConfigResponse) ProtoMessage() {} func (x *UpdateRedPacketConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[148] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[150] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13254,7 +13406,7 @@ func (x *UpdateRedPacketConfigResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateRedPacketConfigResponse.ProtoReflect.Descriptor instead. func (*UpdateRedPacketConfigResponse) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{148} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{150} } func (x *UpdateRedPacketConfigResponse) GetConfig() *RedPacketConfig { @@ -13288,7 +13440,7 @@ type CreateRedPacketRequest struct { func (x *CreateRedPacketRequest) Reset() { *x = CreateRedPacketRequest{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[149] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[151] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13300,7 +13452,7 @@ func (x *CreateRedPacketRequest) String() string { func (*CreateRedPacketRequest) ProtoMessage() {} func (x *CreateRedPacketRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[149] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[151] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13313,7 +13465,7 @@ func (x *CreateRedPacketRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateRedPacketRequest.ProtoReflect.Descriptor instead. func (*CreateRedPacketRequest) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{149} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{151} } func (x *CreateRedPacketRequest) GetRequestId() string { @@ -13390,7 +13542,7 @@ type CreateRedPacketResponse struct { func (x *CreateRedPacketResponse) Reset() { *x = CreateRedPacketResponse{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[150] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[152] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13402,7 +13554,7 @@ func (x *CreateRedPacketResponse) String() string { func (*CreateRedPacketResponse) ProtoMessage() {} func (x *CreateRedPacketResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[150] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[152] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13415,7 +13567,7 @@ func (x *CreateRedPacketResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateRedPacketResponse.ProtoReflect.Descriptor instead. func (*CreateRedPacketResponse) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{150} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{152} } func (x *CreateRedPacketResponse) GetPacket() *RedPacket { @@ -13452,7 +13604,7 @@ type ClaimRedPacketRequest struct { func (x *ClaimRedPacketRequest) Reset() { *x = ClaimRedPacketRequest{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[151] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[153] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13464,7 +13616,7 @@ func (x *ClaimRedPacketRequest) String() string { func (*ClaimRedPacketRequest) ProtoMessage() {} func (x *ClaimRedPacketRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[151] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[153] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13477,7 +13629,7 @@ func (x *ClaimRedPacketRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ClaimRedPacketRequest.ProtoReflect.Descriptor instead. func (*ClaimRedPacketRequest) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{151} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{153} } func (x *ClaimRedPacketRequest) GetRequestId() string { @@ -13527,7 +13679,7 @@ type ClaimRedPacketResponse struct { func (x *ClaimRedPacketResponse) Reset() { *x = ClaimRedPacketResponse{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[152] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[154] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13539,7 +13691,7 @@ func (x *ClaimRedPacketResponse) String() string { func (*ClaimRedPacketResponse) ProtoMessage() {} func (x *ClaimRedPacketResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[152] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[154] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13552,7 +13704,7 @@ func (x *ClaimRedPacketResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ClaimRedPacketResponse.ProtoReflect.Descriptor instead. func (*ClaimRedPacketResponse) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{152} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{154} } func (x *ClaimRedPacketResponse) GetClaim() *RedPacketClaim { @@ -13603,7 +13755,7 @@ type ListRedPacketsRequest struct { func (x *ListRedPacketsRequest) Reset() { *x = ListRedPacketsRequest{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[153] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[155] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13615,7 +13767,7 @@ func (x *ListRedPacketsRequest) String() string { func (*ListRedPacketsRequest) ProtoMessage() {} func (x *ListRedPacketsRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[153] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[155] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13628,7 +13780,7 @@ func (x *ListRedPacketsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRedPacketsRequest.ProtoReflect.Descriptor instead. func (*ListRedPacketsRequest) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{153} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{155} } func (x *ListRedPacketsRequest) GetRequestId() string { @@ -13726,7 +13878,7 @@ type ListRedPacketsResponse struct { func (x *ListRedPacketsResponse) Reset() { *x = ListRedPacketsResponse{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[154] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[156] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13738,7 +13890,7 @@ func (x *ListRedPacketsResponse) String() string { func (*ListRedPacketsResponse) ProtoMessage() {} func (x *ListRedPacketsResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[154] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[156] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13751,7 +13903,7 @@ func (x *ListRedPacketsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRedPacketsResponse.ProtoReflect.Descriptor instead. func (*ListRedPacketsResponse) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{154} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{156} } func (x *ListRedPacketsResponse) GetPackets() []*RedPacket { @@ -13788,7 +13940,7 @@ type GetRedPacketRequest struct { func (x *GetRedPacketRequest) Reset() { *x = GetRedPacketRequest{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[155] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[157] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13800,7 +13952,7 @@ func (x *GetRedPacketRequest) String() string { func (*GetRedPacketRequest) ProtoMessage() {} func (x *GetRedPacketRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[155] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[157] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13813,7 +13965,7 @@ func (x *GetRedPacketRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRedPacketRequest.ProtoReflect.Descriptor instead. func (*GetRedPacketRequest) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{155} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{157} } func (x *GetRedPacketRequest) GetRequestId() string { @@ -13861,7 +14013,7 @@ type GetRedPacketResponse struct { func (x *GetRedPacketResponse) Reset() { *x = GetRedPacketResponse{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[156] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[158] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13873,7 +14025,7 @@ func (x *GetRedPacketResponse) String() string { func (*GetRedPacketResponse) ProtoMessage() {} func (x *GetRedPacketResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[156] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[158] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13886,7 +14038,7 @@ func (x *GetRedPacketResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRedPacketResponse.ProtoReflect.Descriptor instead. func (*GetRedPacketResponse) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{156} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{158} } func (x *GetRedPacketResponse) GetPacket() *RedPacket { @@ -13914,7 +14066,7 @@ type ExpireRedPacketsRequest struct { func (x *ExpireRedPacketsRequest) Reset() { *x = ExpireRedPacketsRequest{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[157] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[159] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13926,7 +14078,7 @@ func (x *ExpireRedPacketsRequest) String() string { func (*ExpireRedPacketsRequest) ProtoMessage() {} func (x *ExpireRedPacketsRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[157] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[159] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13939,7 +14091,7 @@ func (x *ExpireRedPacketsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExpireRedPacketsRequest.ProtoReflect.Descriptor instead. func (*ExpireRedPacketsRequest) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{157} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{159} } func (x *ExpireRedPacketsRequest) GetRequestId() string { @@ -13974,7 +14126,7 @@ type ExpireRedPacketsResponse struct { func (x *ExpireRedPacketsResponse) Reset() { *x = ExpireRedPacketsResponse{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[158] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[160] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13986,7 +14138,7 @@ func (x *ExpireRedPacketsResponse) String() string { func (*ExpireRedPacketsResponse) ProtoMessage() {} func (x *ExpireRedPacketsResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[158] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[160] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13999,7 +14151,7 @@ func (x *ExpireRedPacketsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExpireRedPacketsResponse.ProtoReflect.Descriptor instead. func (*ExpireRedPacketsResponse) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{158} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{160} } func (x *ExpireRedPacketsResponse) GetExpiredCount() int32 { @@ -14035,7 +14187,7 @@ type RetryRedPacketRefundRequest struct { func (x *RetryRedPacketRefundRequest) Reset() { *x = RetryRedPacketRefundRequest{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[159] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[161] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14047,7 +14199,7 @@ func (x *RetryRedPacketRefundRequest) String() string { func (*RetryRedPacketRefundRequest) ProtoMessage() {} func (x *RetryRedPacketRefundRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[159] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[161] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14060,7 +14212,7 @@ func (x *RetryRedPacketRefundRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RetryRedPacketRefundRequest.ProtoReflect.Descriptor instead. func (*RetryRedPacketRefundRequest) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{159} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{161} } func (x *RetryRedPacketRefundRequest) GetRequestId() string { @@ -14102,7 +14254,7 @@ type RetryRedPacketRefundResponse struct { func (x *RetryRedPacketRefundResponse) Reset() { *x = RetryRedPacketRefundResponse{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[160] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[162] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14114,7 +14266,7 @@ func (x *RetryRedPacketRefundResponse) String() string { func (*RetryRedPacketRefundResponse) ProtoMessage() {} func (x *RetryRedPacketRefundResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[160] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[162] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14127,7 +14279,7 @@ func (x *RetryRedPacketRefundResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RetryRedPacketRefundResponse.ProtoReflect.Descriptor instead. func (*RetryRedPacketRefundResponse) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{160} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{162} } func (x *RetryRedPacketRefundResponse) GetPacket() *RedPacket { @@ -14166,7 +14318,7 @@ type CronBatchRequest struct { func (x *CronBatchRequest) Reset() { *x = CronBatchRequest{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[161] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[163] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14178,7 +14330,7 @@ func (x *CronBatchRequest) String() string { func (*CronBatchRequest) ProtoMessage() {} func (x *CronBatchRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[161] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[163] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14191,7 +14343,7 @@ func (x *CronBatchRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CronBatchRequest.ProtoReflect.Descriptor instead. func (*CronBatchRequest) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{161} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{163} } func (x *CronBatchRequest) GetRequestId() string { @@ -14250,7 +14402,7 @@ type CronBatchResponse struct { func (x *CronBatchResponse) Reset() { *x = CronBatchResponse{} - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[162] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[164] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -14262,7 +14414,7 @@ func (x *CronBatchResponse) String() string { func (*CronBatchResponse) ProtoMessage() {} func (x *CronBatchResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_wallet_v1_wallet_proto_msgTypes[162] + mi := &file_proto_wallet_v1_wallet_proto_msgTypes[164] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -14275,7 +14427,7 @@ func (x *CronBatchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CronBatchResponse.ProtoReflect.Descriptor instead. func (*CronBatchResponse) Descriptor() ([]byte, []int) { - return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{162} + return file_proto_wallet_v1_wallet_proto_rawDescGZIP(), []int{164} } func (x *CronBatchResponse) GetClaimedCount() int32 { @@ -15491,7 +15643,21 @@ const file_proto_wallet_v1_wallet_proto_rawDesc = "" + "\n" + "coin_spent\x18\x04 \x01(\x03R\tcoinSpent\x12,\n" + "\x12coin_balance_after\x18\x05 \x01(\x03R\x10coinBalanceAfter\x12A\n" + - "\freward_items\x18\x06 \x03(\v2\x1e.hyapp.wallet.v1.VipRewardItemR\vrewardItems\"\xec\x01\n" + + "\freward_items\x18\x06 \x03(\v2\x1e.hyapp.wallet.v1.VipRewardItemR\vrewardItems\"\xd3\x01\n" + + "\x18DebitCPBreakupFeeRequest\x12\x1d\n" + + "\n" + + "command_id\x18\x01 \x01(\tR\tcommandId\x12\x19\n" + + "\bapp_code\x18\x02 \x01(\tR\aappCode\x12\x17\n" + + "\auser_id\x18\x03 \x01(\x03R\x06userId\x12'\n" + + "\x0frelationship_id\x18\x04 \x01(\tR\x0erelationshipId\x12#\n" + + "\rrelation_type\x18\x05 \x01(\tR\frelationType\x12\x16\n" + + "\x06amount\x18\x06 \x01(\x03R\x06amount\"\xc8\x01\n" + + "\x19DebitCPBreakupFeeResponse\x12%\n" + + "\x0etransaction_id\x18\x01 \x01(\tR\rtransactionId\x12\x1d\n" + + "\n" + + "coin_spent\x18\x02 \x01(\x03R\tcoinSpent\x12,\n" + + "\x12coin_balance_after\x18\x03 \x01(\x03R\x10coinBalanceAfter\x127\n" + + "\abalance\x18\x04 \x01(\v2\x1d.hyapp.wallet.v1.AssetBalanceR\abalance\"\xec\x01\n" + "\x0fGrantVipRequest\x12\x1d\n" + "\n" + "command_id\x18\x01 \x01(\tR\tcommandId\x12\x19\n" + @@ -15786,7 +15952,7 @@ const file_proto_wallet_v1_wallet_proto_rawDesc = "" + "\x11WalletCronService\x12n\n" + "%ProcessHostSalaryDailySettlementBatch\x12!.hyapp.wallet.v1.CronBatchRequest\x1a\".hyapp.wallet.v1.CronBatchResponse\x12r\n" + ")ProcessHostSalaryHalfMonthSettlementBatch\x12!.hyapp.wallet.v1.CronBatchRequest\x1a\".hyapp.wallet.v1.CronBatchResponse\x12g\n" + - "\x1eProcessHostSalaryMonthEndBatch\x12!.hyapp.wallet.v1.CronBatchRequest\x1a\".hyapp.wallet.v1.CronBatchResponse2\x89;\n" + + "\x1eProcessHostSalaryMonthEndBatch\x12!.hyapp.wallet.v1.CronBatchRequest\x1a\".hyapp.wallet.v1.CronBatchResponse2\xf5;\n" + "\rWalletService\x12R\n" + "\tDebitGift\x12!.hyapp.wallet.v1.DebitGiftRequest\x1a\".hyapp.wallet.v1.DebitGiftResponse\x12a\n" + "\x0eBatchDebitGift\x12&.hyapp.wallet.v1.BatchDebitGiftRequest\x1a'.hyapp.wallet.v1.BatchDebitGiftResponse\x12X\n" + @@ -15840,7 +16006,8 @@ const file_proto_wallet_v1_wallet_proto_rawDesc = "" + "\x16ListWalletTransactions\x12..hyapp.wallet.v1.ListWalletTransactionsRequest\x1a/.hyapp.wallet.v1.ListWalletTransactionsResponse\x12d\n" + "\x0fListVipPackages\x12'.hyapp.wallet.v1.ListVipPackagesRequest\x1a(.hyapp.wallet.v1.ListVipPackagesResponse\x12O\n" + "\bGetMyVip\x12 .hyapp.wallet.v1.GetMyVipRequest\x1a!.hyapp.wallet.v1.GetMyVipResponse\x12X\n" + - "\vPurchaseVip\x12#.hyapp.wallet.v1.PurchaseVipRequest\x1a$.hyapp.wallet.v1.PurchaseVipResponse\x12O\n" + + "\vPurchaseVip\x12#.hyapp.wallet.v1.PurchaseVipRequest\x1a$.hyapp.wallet.v1.PurchaseVipResponse\x12j\n" + + "\x11DebitCPBreakupFee\x12).hyapp.wallet.v1.DebitCPBreakupFeeRequest\x1a*.hyapp.wallet.v1.DebitCPBreakupFeeResponse\x12O\n" + "\bGrantVip\x12 .hyapp.wallet.v1.GrantVipRequest\x1a!.hyapp.wallet.v1.GrantVipResponse\x12m\n" + "\x12ListAdminVipLevels\x12*.hyapp.wallet.v1.ListAdminVipLevelsRequest\x1a+.hyapp.wallet.v1.ListAdminVipLevelsResponse\x12s\n" + "\x14UpdateAdminVipLevels\x12,.hyapp.wallet.v1.UpdateAdminVipLevelsRequest\x1a-.hyapp.wallet.v1.UpdateAdminVipLevelsResponse\x12g\n" + @@ -15869,7 +16036,7 @@ func file_proto_wallet_v1_wallet_proto_rawDescGZIP() []byte { return file_proto_wallet_v1_wallet_proto_rawDescData } -var file_proto_wallet_v1_wallet_proto_msgTypes = make([]protoimpl.MessageInfo, 163) +var file_proto_wallet_v1_wallet_proto_msgTypes = make([]protoimpl.MessageInfo, 165) var file_proto_wallet_v1_wallet_proto_goTypes = []any{ (*DebitGiftRequest)(nil), // 0: hyapp.wallet.v1.DebitGiftRequest (*DebitGiftResponse)(nil), // 1: hyapp.wallet.v1.DebitGiftResponse @@ -15998,42 +16165,44 @@ var file_proto_wallet_v1_wallet_proto_goTypes = []any{ (*GetMyVipResponse)(nil), // 124: hyapp.wallet.v1.GetMyVipResponse (*PurchaseVipRequest)(nil), // 125: hyapp.wallet.v1.PurchaseVipRequest (*PurchaseVipResponse)(nil), // 126: hyapp.wallet.v1.PurchaseVipResponse - (*GrantVipRequest)(nil), // 127: hyapp.wallet.v1.GrantVipRequest - (*GrantVipResponse)(nil), // 128: hyapp.wallet.v1.GrantVipResponse - (*AdminVipLevelInput)(nil), // 129: hyapp.wallet.v1.AdminVipLevelInput - (*ListAdminVipLevelsRequest)(nil), // 130: hyapp.wallet.v1.ListAdminVipLevelsRequest - (*ListAdminVipLevelsResponse)(nil), // 131: hyapp.wallet.v1.ListAdminVipLevelsResponse - (*UpdateAdminVipLevelsRequest)(nil), // 132: hyapp.wallet.v1.UpdateAdminVipLevelsRequest - (*UpdateAdminVipLevelsResponse)(nil), // 133: hyapp.wallet.v1.UpdateAdminVipLevelsResponse - (*CreditTaskRewardRequest)(nil), // 134: hyapp.wallet.v1.CreditTaskRewardRequest - (*CreditTaskRewardResponse)(nil), // 135: hyapp.wallet.v1.CreditTaskRewardResponse - (*CreditLuckyGiftRewardRequest)(nil), // 136: hyapp.wallet.v1.CreditLuckyGiftRewardRequest - (*CreditLuckyGiftRewardResponse)(nil), // 137: hyapp.wallet.v1.CreditLuckyGiftRewardResponse - (*CreditRoomTurnoverRewardRequest)(nil), // 138: hyapp.wallet.v1.CreditRoomTurnoverRewardRequest - (*CreditRoomTurnoverRewardResponse)(nil), // 139: hyapp.wallet.v1.CreditRoomTurnoverRewardResponse - (*ApplyGameCoinChangeRequest)(nil), // 140: hyapp.wallet.v1.ApplyGameCoinChangeRequest - (*ApplyGameCoinChangeResponse)(nil), // 141: hyapp.wallet.v1.ApplyGameCoinChangeResponse - (*RedPacketConfig)(nil), // 142: hyapp.wallet.v1.RedPacketConfig - (*RedPacketClaim)(nil), // 143: hyapp.wallet.v1.RedPacketClaim - (*RedPacket)(nil), // 144: hyapp.wallet.v1.RedPacket - (*GetRedPacketConfigRequest)(nil), // 145: hyapp.wallet.v1.GetRedPacketConfigRequest - (*GetRedPacketConfigResponse)(nil), // 146: hyapp.wallet.v1.GetRedPacketConfigResponse - (*UpdateRedPacketConfigRequest)(nil), // 147: hyapp.wallet.v1.UpdateRedPacketConfigRequest - (*UpdateRedPacketConfigResponse)(nil), // 148: hyapp.wallet.v1.UpdateRedPacketConfigResponse - (*CreateRedPacketRequest)(nil), // 149: hyapp.wallet.v1.CreateRedPacketRequest - (*CreateRedPacketResponse)(nil), // 150: hyapp.wallet.v1.CreateRedPacketResponse - (*ClaimRedPacketRequest)(nil), // 151: hyapp.wallet.v1.ClaimRedPacketRequest - (*ClaimRedPacketResponse)(nil), // 152: hyapp.wallet.v1.ClaimRedPacketResponse - (*ListRedPacketsRequest)(nil), // 153: hyapp.wallet.v1.ListRedPacketsRequest - (*ListRedPacketsResponse)(nil), // 154: hyapp.wallet.v1.ListRedPacketsResponse - (*GetRedPacketRequest)(nil), // 155: hyapp.wallet.v1.GetRedPacketRequest - (*GetRedPacketResponse)(nil), // 156: hyapp.wallet.v1.GetRedPacketResponse - (*ExpireRedPacketsRequest)(nil), // 157: hyapp.wallet.v1.ExpireRedPacketsRequest - (*ExpireRedPacketsResponse)(nil), // 158: hyapp.wallet.v1.ExpireRedPacketsResponse - (*RetryRedPacketRefundRequest)(nil), // 159: hyapp.wallet.v1.RetryRedPacketRefundRequest - (*RetryRedPacketRefundResponse)(nil), // 160: hyapp.wallet.v1.RetryRedPacketRefundResponse - (*CronBatchRequest)(nil), // 161: hyapp.wallet.v1.CronBatchRequest - (*CronBatchResponse)(nil), // 162: hyapp.wallet.v1.CronBatchResponse + (*DebitCPBreakupFeeRequest)(nil), // 127: hyapp.wallet.v1.DebitCPBreakupFeeRequest + (*DebitCPBreakupFeeResponse)(nil), // 128: hyapp.wallet.v1.DebitCPBreakupFeeResponse + (*GrantVipRequest)(nil), // 129: hyapp.wallet.v1.GrantVipRequest + (*GrantVipResponse)(nil), // 130: hyapp.wallet.v1.GrantVipResponse + (*AdminVipLevelInput)(nil), // 131: hyapp.wallet.v1.AdminVipLevelInput + (*ListAdminVipLevelsRequest)(nil), // 132: hyapp.wallet.v1.ListAdminVipLevelsRequest + (*ListAdminVipLevelsResponse)(nil), // 133: hyapp.wallet.v1.ListAdminVipLevelsResponse + (*UpdateAdminVipLevelsRequest)(nil), // 134: hyapp.wallet.v1.UpdateAdminVipLevelsRequest + (*UpdateAdminVipLevelsResponse)(nil), // 135: hyapp.wallet.v1.UpdateAdminVipLevelsResponse + (*CreditTaskRewardRequest)(nil), // 136: hyapp.wallet.v1.CreditTaskRewardRequest + (*CreditTaskRewardResponse)(nil), // 137: hyapp.wallet.v1.CreditTaskRewardResponse + (*CreditLuckyGiftRewardRequest)(nil), // 138: hyapp.wallet.v1.CreditLuckyGiftRewardRequest + (*CreditLuckyGiftRewardResponse)(nil), // 139: hyapp.wallet.v1.CreditLuckyGiftRewardResponse + (*CreditRoomTurnoverRewardRequest)(nil), // 140: hyapp.wallet.v1.CreditRoomTurnoverRewardRequest + (*CreditRoomTurnoverRewardResponse)(nil), // 141: hyapp.wallet.v1.CreditRoomTurnoverRewardResponse + (*ApplyGameCoinChangeRequest)(nil), // 142: hyapp.wallet.v1.ApplyGameCoinChangeRequest + (*ApplyGameCoinChangeResponse)(nil), // 143: hyapp.wallet.v1.ApplyGameCoinChangeResponse + (*RedPacketConfig)(nil), // 144: hyapp.wallet.v1.RedPacketConfig + (*RedPacketClaim)(nil), // 145: hyapp.wallet.v1.RedPacketClaim + (*RedPacket)(nil), // 146: hyapp.wallet.v1.RedPacket + (*GetRedPacketConfigRequest)(nil), // 147: hyapp.wallet.v1.GetRedPacketConfigRequest + (*GetRedPacketConfigResponse)(nil), // 148: hyapp.wallet.v1.GetRedPacketConfigResponse + (*UpdateRedPacketConfigRequest)(nil), // 149: hyapp.wallet.v1.UpdateRedPacketConfigRequest + (*UpdateRedPacketConfigResponse)(nil), // 150: hyapp.wallet.v1.UpdateRedPacketConfigResponse + (*CreateRedPacketRequest)(nil), // 151: hyapp.wallet.v1.CreateRedPacketRequest + (*CreateRedPacketResponse)(nil), // 152: hyapp.wallet.v1.CreateRedPacketResponse + (*ClaimRedPacketRequest)(nil), // 153: hyapp.wallet.v1.ClaimRedPacketRequest + (*ClaimRedPacketResponse)(nil), // 154: hyapp.wallet.v1.ClaimRedPacketResponse + (*ListRedPacketsRequest)(nil), // 155: hyapp.wallet.v1.ListRedPacketsRequest + (*ListRedPacketsResponse)(nil), // 156: hyapp.wallet.v1.ListRedPacketsResponse + (*GetRedPacketRequest)(nil), // 157: hyapp.wallet.v1.GetRedPacketRequest + (*GetRedPacketResponse)(nil), // 158: hyapp.wallet.v1.GetRedPacketResponse + (*ExpireRedPacketsRequest)(nil), // 159: hyapp.wallet.v1.ExpireRedPacketsRequest + (*ExpireRedPacketsResponse)(nil), // 160: hyapp.wallet.v1.ExpireRedPacketsResponse + (*RetryRedPacketRefundRequest)(nil), // 161: hyapp.wallet.v1.RetryRedPacketRefundRequest + (*RetryRedPacketRefundResponse)(nil), // 162: hyapp.wallet.v1.RetryRedPacketRefundResponse + (*CronBatchRequest)(nil), // 163: hyapp.wallet.v1.CronBatchRequest + (*CronBatchResponse)(nil), // 164: hyapp.wallet.v1.CronBatchResponse } var file_proto_wallet_v1_wallet_proto_depIdxs = []int32{ 2, // 0: hyapp.wallet.v1.BatchDebitGiftRequest.targets:type_name -> hyapp.wallet.v1.DebitGiftTarget @@ -16095,170 +16264,173 @@ var file_proto_wallet_v1_wallet_proto_depIdxs = []int32{ 120, // 56: hyapp.wallet.v1.GetMyVipResponse.vip:type_name -> hyapp.wallet.v1.UserVip 120, // 57: hyapp.wallet.v1.PurchaseVipResponse.vip:type_name -> hyapp.wallet.v1.UserVip 118, // 58: hyapp.wallet.v1.PurchaseVipResponse.reward_items:type_name -> hyapp.wallet.v1.VipRewardItem - 120, // 59: hyapp.wallet.v1.GrantVipResponse.vip:type_name -> hyapp.wallet.v1.UserVip - 118, // 60: hyapp.wallet.v1.GrantVipResponse.reward_items:type_name -> hyapp.wallet.v1.VipRewardItem - 119, // 61: hyapp.wallet.v1.ListAdminVipLevelsResponse.levels:type_name -> hyapp.wallet.v1.VipLevel - 129, // 62: hyapp.wallet.v1.UpdateAdminVipLevelsRequest.levels:type_name -> hyapp.wallet.v1.AdminVipLevelInput - 119, // 63: hyapp.wallet.v1.UpdateAdminVipLevelsResponse.levels:type_name -> hyapp.wallet.v1.VipLevel - 6, // 64: hyapp.wallet.v1.CreditTaskRewardResponse.balance:type_name -> hyapp.wallet.v1.AssetBalance - 6, // 65: hyapp.wallet.v1.CreditLuckyGiftRewardResponse.balance:type_name -> hyapp.wallet.v1.AssetBalance - 6, // 66: hyapp.wallet.v1.CreditRoomTurnoverRewardResponse.balance:type_name -> hyapp.wallet.v1.AssetBalance - 143, // 67: hyapp.wallet.v1.RedPacket.claims:type_name -> hyapp.wallet.v1.RedPacketClaim - 142, // 68: hyapp.wallet.v1.GetRedPacketConfigResponse.config:type_name -> hyapp.wallet.v1.RedPacketConfig - 142, // 69: hyapp.wallet.v1.UpdateRedPacketConfigResponse.config:type_name -> hyapp.wallet.v1.RedPacketConfig - 144, // 70: hyapp.wallet.v1.CreateRedPacketResponse.packet:type_name -> hyapp.wallet.v1.RedPacket - 143, // 71: hyapp.wallet.v1.ClaimRedPacketResponse.claim:type_name -> hyapp.wallet.v1.RedPacketClaim - 144, // 72: hyapp.wallet.v1.ClaimRedPacketResponse.packet:type_name -> hyapp.wallet.v1.RedPacket - 144, // 73: hyapp.wallet.v1.ListRedPacketsResponse.packets:type_name -> hyapp.wallet.v1.RedPacket - 144, // 74: hyapp.wallet.v1.GetRedPacketResponse.packet:type_name -> hyapp.wallet.v1.RedPacket - 144, // 75: hyapp.wallet.v1.RetryRedPacketRefundResponse.packet:type_name -> hyapp.wallet.v1.RedPacket - 161, // 76: hyapp.wallet.v1.WalletCronService.ProcessHostSalaryDailySettlementBatch:input_type -> hyapp.wallet.v1.CronBatchRequest - 161, // 77: hyapp.wallet.v1.WalletCronService.ProcessHostSalaryHalfMonthSettlementBatch:input_type -> hyapp.wallet.v1.CronBatchRequest - 161, // 78: hyapp.wallet.v1.WalletCronService.ProcessHostSalaryMonthEndBatch:input_type -> hyapp.wallet.v1.CronBatchRequest - 0, // 79: hyapp.wallet.v1.WalletService.DebitGift:input_type -> hyapp.wallet.v1.DebitGiftRequest - 3, // 80: hyapp.wallet.v1.WalletService.BatchDebitGift:input_type -> hyapp.wallet.v1.BatchDebitGiftRequest - 7, // 81: hyapp.wallet.v1.WalletService.GetBalances:input_type -> hyapp.wallet.v1.GetBalancesRequest - 11, // 82: hyapp.wallet.v1.WalletService.GetActiveHostSalaryPolicy:input_type -> hyapp.wallet.v1.GetActiveHostSalaryPolicyRequest - 14, // 83: hyapp.wallet.v1.WalletService.GetHostSalaryProgress:input_type -> hyapp.wallet.v1.GetHostSalaryProgressRequest - 16, // 84: hyapp.wallet.v1.WalletService.AdminCreditAsset:input_type -> hyapp.wallet.v1.AdminCreditAssetRequest - 18, // 85: hyapp.wallet.v1.WalletService.AdminCreditCoinSellerStock:input_type -> hyapp.wallet.v1.AdminCreditCoinSellerStockRequest - 20, // 86: hyapp.wallet.v1.WalletService.TransferCoinFromSeller:input_type -> hyapp.wallet.v1.TransferCoinFromSellerRequest - 23, // 87: hyapp.wallet.v1.WalletService.ListCoinSellerSalaryExchangeRateTiers:input_type -> hyapp.wallet.v1.ListCoinSellerSalaryExchangeRateTiersRequest - 25, // 88: hyapp.wallet.v1.WalletService.ExchangeSalaryToCoin:input_type -> hyapp.wallet.v1.ExchangeSalaryToCoinRequest - 27, // 89: hyapp.wallet.v1.WalletService.TransferSalaryToCoinSeller:input_type -> hyapp.wallet.v1.TransferSalaryToCoinSellerRequest - 39, // 90: hyapp.wallet.v1.WalletService.ListResources:input_type -> hyapp.wallet.v1.ListResourcesRequest - 41, // 91: hyapp.wallet.v1.WalletService.GetResource:input_type -> hyapp.wallet.v1.GetResourceRequest - 43, // 92: hyapp.wallet.v1.WalletService.CreateResource:input_type -> hyapp.wallet.v1.CreateResourceRequest - 44, // 93: hyapp.wallet.v1.WalletService.UpdateResource:input_type -> hyapp.wallet.v1.UpdateResourceRequest - 45, // 94: hyapp.wallet.v1.WalletService.SetResourceStatus:input_type -> hyapp.wallet.v1.SetResourceStatusRequest - 47, // 95: hyapp.wallet.v1.WalletService.ListResourceGroups:input_type -> hyapp.wallet.v1.ListResourceGroupsRequest - 49, // 96: hyapp.wallet.v1.WalletService.GetResourceGroup:input_type -> hyapp.wallet.v1.GetResourceGroupRequest - 51, // 97: hyapp.wallet.v1.WalletService.CreateResourceGroup:input_type -> hyapp.wallet.v1.CreateResourceGroupRequest - 52, // 98: hyapp.wallet.v1.WalletService.UpdateResourceGroup:input_type -> hyapp.wallet.v1.UpdateResourceGroupRequest - 53, // 99: hyapp.wallet.v1.WalletService.SetResourceGroupStatus:input_type -> hyapp.wallet.v1.SetResourceGroupStatusRequest - 55, // 100: hyapp.wallet.v1.WalletService.ListGiftConfigs:input_type -> hyapp.wallet.v1.ListGiftConfigsRequest - 57, // 101: hyapp.wallet.v1.WalletService.ListGiftTypeConfigs:input_type -> hyapp.wallet.v1.ListGiftTypeConfigsRequest - 61, // 102: hyapp.wallet.v1.WalletService.CreateGiftConfig:input_type -> hyapp.wallet.v1.CreateGiftConfigRequest - 62, // 103: hyapp.wallet.v1.WalletService.UpdateGiftConfig:input_type -> hyapp.wallet.v1.UpdateGiftConfigRequest - 63, // 104: hyapp.wallet.v1.WalletService.SetGiftConfigStatus:input_type -> hyapp.wallet.v1.SetGiftConfigStatusRequest - 59, // 105: hyapp.wallet.v1.WalletService.UpsertGiftTypeConfig:input_type -> hyapp.wallet.v1.UpsertGiftTypeConfigRequest - 65, // 106: hyapp.wallet.v1.WalletService.GrantResource:input_type -> hyapp.wallet.v1.GrantResourceRequest - 66, // 107: hyapp.wallet.v1.WalletService.GrantResourceGroup:input_type -> hyapp.wallet.v1.GrantResourceGroupRequest - 68, // 108: hyapp.wallet.v1.WalletService.ListUserResources:input_type -> hyapp.wallet.v1.ListUserResourcesRequest - 70, // 109: hyapp.wallet.v1.WalletService.EquipUserResource:input_type -> hyapp.wallet.v1.EquipUserResourceRequest - 72, // 110: hyapp.wallet.v1.WalletService.UnequipUserResource:input_type -> hyapp.wallet.v1.UnequipUserResourceRequest - 74, // 111: hyapp.wallet.v1.WalletService.BatchGetUserEquippedResources:input_type -> hyapp.wallet.v1.BatchGetUserEquippedResourcesRequest - 77, // 112: hyapp.wallet.v1.WalletService.ListResourceGrants:input_type -> hyapp.wallet.v1.ListResourceGrantsRequest - 80, // 113: hyapp.wallet.v1.WalletService.ListResourceShopItems:input_type -> hyapp.wallet.v1.ListResourceShopItemsRequest - 82, // 114: hyapp.wallet.v1.WalletService.UpsertResourceShopItems:input_type -> hyapp.wallet.v1.UpsertResourceShopItemsRequest - 84, // 115: hyapp.wallet.v1.WalletService.SetResourceShopItemStatus:input_type -> hyapp.wallet.v1.SetResourceShopItemStatusRequest - 86, // 116: hyapp.wallet.v1.WalletService.PurchaseResourceShopItem:input_type -> hyapp.wallet.v1.PurchaseResourceShopItemRequest - 89, // 117: hyapp.wallet.v1.WalletService.ListRechargeBills:input_type -> hyapp.wallet.v1.ListRechargeBillsRequest - 92, // 118: hyapp.wallet.v1.WalletService.GetWalletOverview:input_type -> hyapp.wallet.v1.GetWalletOverviewRequest - 95, // 119: hyapp.wallet.v1.WalletService.GetWalletValueSummary:input_type -> hyapp.wallet.v1.GetWalletValueSummaryRequest - 98, // 120: hyapp.wallet.v1.WalletService.GetUserGiftWall:input_type -> hyapp.wallet.v1.GetUserGiftWallRequest - 101, // 121: hyapp.wallet.v1.WalletService.ListRechargeProducts:input_type -> hyapp.wallet.v1.ListRechargeProductsRequest - 103, // 122: hyapp.wallet.v1.WalletService.ConfirmGooglePayment:input_type -> hyapp.wallet.v1.ConfirmGooglePaymentRequest - 105, // 123: hyapp.wallet.v1.WalletService.ListAdminRechargeProducts:input_type -> hyapp.wallet.v1.ListAdminRechargeProductsRequest - 107, // 124: hyapp.wallet.v1.WalletService.CreateRechargeProduct:input_type -> hyapp.wallet.v1.CreateRechargeProductRequest - 108, // 125: hyapp.wallet.v1.WalletService.UpdateRechargeProduct:input_type -> hyapp.wallet.v1.UpdateRechargeProductRequest - 109, // 126: hyapp.wallet.v1.WalletService.DeleteRechargeProduct:input_type -> hyapp.wallet.v1.DeleteRechargeProductRequest - 113, // 127: hyapp.wallet.v1.WalletService.GetDiamondExchangeConfig:input_type -> hyapp.wallet.v1.GetDiamondExchangeConfigRequest - 116, // 128: hyapp.wallet.v1.WalletService.ListWalletTransactions:input_type -> hyapp.wallet.v1.ListWalletTransactionsRequest - 121, // 129: hyapp.wallet.v1.WalletService.ListVipPackages:input_type -> hyapp.wallet.v1.ListVipPackagesRequest - 123, // 130: hyapp.wallet.v1.WalletService.GetMyVip:input_type -> hyapp.wallet.v1.GetMyVipRequest - 125, // 131: hyapp.wallet.v1.WalletService.PurchaseVip:input_type -> hyapp.wallet.v1.PurchaseVipRequest - 127, // 132: hyapp.wallet.v1.WalletService.GrantVip:input_type -> hyapp.wallet.v1.GrantVipRequest - 130, // 133: hyapp.wallet.v1.WalletService.ListAdminVipLevels:input_type -> hyapp.wallet.v1.ListAdminVipLevelsRequest - 132, // 134: hyapp.wallet.v1.WalletService.UpdateAdminVipLevels:input_type -> hyapp.wallet.v1.UpdateAdminVipLevelsRequest - 134, // 135: hyapp.wallet.v1.WalletService.CreditTaskReward:input_type -> hyapp.wallet.v1.CreditTaskRewardRequest - 136, // 136: hyapp.wallet.v1.WalletService.CreditLuckyGiftReward:input_type -> hyapp.wallet.v1.CreditLuckyGiftRewardRequest - 138, // 137: hyapp.wallet.v1.WalletService.CreditRoomTurnoverReward:input_type -> hyapp.wallet.v1.CreditRoomTurnoverRewardRequest - 140, // 138: hyapp.wallet.v1.WalletService.ApplyGameCoinChange:input_type -> hyapp.wallet.v1.ApplyGameCoinChangeRequest - 145, // 139: hyapp.wallet.v1.WalletService.GetRedPacketConfig:input_type -> hyapp.wallet.v1.GetRedPacketConfigRequest - 147, // 140: hyapp.wallet.v1.WalletService.UpdateRedPacketConfig:input_type -> hyapp.wallet.v1.UpdateRedPacketConfigRequest - 149, // 141: hyapp.wallet.v1.WalletService.CreateRedPacket:input_type -> hyapp.wallet.v1.CreateRedPacketRequest - 151, // 142: hyapp.wallet.v1.WalletService.ClaimRedPacket:input_type -> hyapp.wallet.v1.ClaimRedPacketRequest - 153, // 143: hyapp.wallet.v1.WalletService.ListRedPackets:input_type -> hyapp.wallet.v1.ListRedPacketsRequest - 155, // 144: hyapp.wallet.v1.WalletService.GetRedPacket:input_type -> hyapp.wallet.v1.GetRedPacketRequest - 157, // 145: hyapp.wallet.v1.WalletService.ExpireRedPackets:input_type -> hyapp.wallet.v1.ExpireRedPacketsRequest - 159, // 146: hyapp.wallet.v1.WalletService.RetryRedPacketRefund:input_type -> hyapp.wallet.v1.RetryRedPacketRefundRequest - 162, // 147: hyapp.wallet.v1.WalletCronService.ProcessHostSalaryDailySettlementBatch:output_type -> hyapp.wallet.v1.CronBatchResponse - 162, // 148: hyapp.wallet.v1.WalletCronService.ProcessHostSalaryHalfMonthSettlementBatch:output_type -> hyapp.wallet.v1.CronBatchResponse - 162, // 149: hyapp.wallet.v1.WalletCronService.ProcessHostSalaryMonthEndBatch:output_type -> hyapp.wallet.v1.CronBatchResponse - 1, // 150: hyapp.wallet.v1.WalletService.DebitGift:output_type -> hyapp.wallet.v1.DebitGiftResponse - 5, // 151: hyapp.wallet.v1.WalletService.BatchDebitGift:output_type -> hyapp.wallet.v1.BatchDebitGiftResponse - 8, // 152: hyapp.wallet.v1.WalletService.GetBalances:output_type -> hyapp.wallet.v1.GetBalancesResponse - 12, // 153: hyapp.wallet.v1.WalletService.GetActiveHostSalaryPolicy:output_type -> hyapp.wallet.v1.GetActiveHostSalaryPolicyResponse - 15, // 154: hyapp.wallet.v1.WalletService.GetHostSalaryProgress:output_type -> hyapp.wallet.v1.GetHostSalaryProgressResponse - 17, // 155: hyapp.wallet.v1.WalletService.AdminCreditAsset:output_type -> hyapp.wallet.v1.AdminCreditAssetResponse - 19, // 156: hyapp.wallet.v1.WalletService.AdminCreditCoinSellerStock:output_type -> hyapp.wallet.v1.AdminCreditCoinSellerStockResponse - 21, // 157: hyapp.wallet.v1.WalletService.TransferCoinFromSeller:output_type -> hyapp.wallet.v1.TransferCoinFromSellerResponse - 24, // 158: hyapp.wallet.v1.WalletService.ListCoinSellerSalaryExchangeRateTiers:output_type -> hyapp.wallet.v1.ListCoinSellerSalaryExchangeRateTiersResponse - 26, // 159: hyapp.wallet.v1.WalletService.ExchangeSalaryToCoin:output_type -> hyapp.wallet.v1.ExchangeSalaryToCoinResponse - 28, // 160: hyapp.wallet.v1.WalletService.TransferSalaryToCoinSeller:output_type -> hyapp.wallet.v1.TransferSalaryToCoinSellerResponse - 40, // 161: hyapp.wallet.v1.WalletService.ListResources:output_type -> hyapp.wallet.v1.ListResourcesResponse - 42, // 162: hyapp.wallet.v1.WalletService.GetResource:output_type -> hyapp.wallet.v1.GetResourceResponse - 46, // 163: hyapp.wallet.v1.WalletService.CreateResource:output_type -> hyapp.wallet.v1.ResourceResponse - 46, // 164: hyapp.wallet.v1.WalletService.UpdateResource:output_type -> hyapp.wallet.v1.ResourceResponse - 46, // 165: hyapp.wallet.v1.WalletService.SetResourceStatus:output_type -> hyapp.wallet.v1.ResourceResponse - 48, // 166: hyapp.wallet.v1.WalletService.ListResourceGroups:output_type -> hyapp.wallet.v1.ListResourceGroupsResponse - 50, // 167: hyapp.wallet.v1.WalletService.GetResourceGroup:output_type -> hyapp.wallet.v1.GetResourceGroupResponse - 54, // 168: hyapp.wallet.v1.WalletService.CreateResourceGroup:output_type -> hyapp.wallet.v1.ResourceGroupResponse - 54, // 169: hyapp.wallet.v1.WalletService.UpdateResourceGroup:output_type -> hyapp.wallet.v1.ResourceGroupResponse - 54, // 170: hyapp.wallet.v1.WalletService.SetResourceGroupStatus:output_type -> hyapp.wallet.v1.ResourceGroupResponse - 56, // 171: hyapp.wallet.v1.WalletService.ListGiftConfigs:output_type -> hyapp.wallet.v1.ListGiftConfigsResponse - 58, // 172: hyapp.wallet.v1.WalletService.ListGiftTypeConfigs:output_type -> hyapp.wallet.v1.ListGiftTypeConfigsResponse - 64, // 173: hyapp.wallet.v1.WalletService.CreateGiftConfig:output_type -> hyapp.wallet.v1.GiftConfigResponse - 64, // 174: hyapp.wallet.v1.WalletService.UpdateGiftConfig:output_type -> hyapp.wallet.v1.GiftConfigResponse - 64, // 175: hyapp.wallet.v1.WalletService.SetGiftConfigStatus:output_type -> hyapp.wallet.v1.GiftConfigResponse - 60, // 176: hyapp.wallet.v1.WalletService.UpsertGiftTypeConfig:output_type -> hyapp.wallet.v1.GiftTypeConfigResponse - 67, // 177: hyapp.wallet.v1.WalletService.GrantResource:output_type -> hyapp.wallet.v1.ResourceGrantResponse - 67, // 178: hyapp.wallet.v1.WalletService.GrantResourceGroup:output_type -> hyapp.wallet.v1.ResourceGrantResponse - 69, // 179: hyapp.wallet.v1.WalletService.ListUserResources:output_type -> hyapp.wallet.v1.ListUserResourcesResponse - 71, // 180: hyapp.wallet.v1.WalletService.EquipUserResource:output_type -> hyapp.wallet.v1.EquipUserResourceResponse - 73, // 181: hyapp.wallet.v1.WalletService.UnequipUserResource:output_type -> hyapp.wallet.v1.UnequipUserResourceResponse - 76, // 182: hyapp.wallet.v1.WalletService.BatchGetUserEquippedResources:output_type -> hyapp.wallet.v1.BatchGetUserEquippedResourcesResponse - 78, // 183: hyapp.wallet.v1.WalletService.ListResourceGrants:output_type -> hyapp.wallet.v1.ListResourceGrantsResponse - 81, // 184: hyapp.wallet.v1.WalletService.ListResourceShopItems:output_type -> hyapp.wallet.v1.ListResourceShopItemsResponse - 83, // 185: hyapp.wallet.v1.WalletService.UpsertResourceShopItems:output_type -> hyapp.wallet.v1.UpsertResourceShopItemsResponse - 85, // 186: hyapp.wallet.v1.WalletService.SetResourceShopItemStatus:output_type -> hyapp.wallet.v1.ResourceShopItemResponse - 87, // 187: hyapp.wallet.v1.WalletService.PurchaseResourceShopItem:output_type -> hyapp.wallet.v1.PurchaseResourceShopItemResponse - 90, // 188: hyapp.wallet.v1.WalletService.ListRechargeBills:output_type -> hyapp.wallet.v1.ListRechargeBillsResponse - 93, // 189: hyapp.wallet.v1.WalletService.GetWalletOverview:output_type -> hyapp.wallet.v1.GetWalletOverviewResponse - 96, // 190: hyapp.wallet.v1.WalletService.GetWalletValueSummary:output_type -> hyapp.wallet.v1.GetWalletValueSummaryResponse - 99, // 191: hyapp.wallet.v1.WalletService.GetUserGiftWall:output_type -> hyapp.wallet.v1.GetUserGiftWallResponse - 102, // 192: hyapp.wallet.v1.WalletService.ListRechargeProducts:output_type -> hyapp.wallet.v1.ListRechargeProductsResponse - 104, // 193: hyapp.wallet.v1.WalletService.ConfirmGooglePayment:output_type -> hyapp.wallet.v1.ConfirmGooglePaymentResponse - 106, // 194: hyapp.wallet.v1.WalletService.ListAdminRechargeProducts:output_type -> hyapp.wallet.v1.ListAdminRechargeProductsResponse - 110, // 195: hyapp.wallet.v1.WalletService.CreateRechargeProduct:output_type -> hyapp.wallet.v1.RechargeProductResponse - 110, // 196: hyapp.wallet.v1.WalletService.UpdateRechargeProduct:output_type -> hyapp.wallet.v1.RechargeProductResponse - 111, // 197: hyapp.wallet.v1.WalletService.DeleteRechargeProduct:output_type -> hyapp.wallet.v1.DeleteRechargeProductResponse - 114, // 198: hyapp.wallet.v1.WalletService.GetDiamondExchangeConfig:output_type -> hyapp.wallet.v1.GetDiamondExchangeConfigResponse - 117, // 199: hyapp.wallet.v1.WalletService.ListWalletTransactions:output_type -> hyapp.wallet.v1.ListWalletTransactionsResponse - 122, // 200: hyapp.wallet.v1.WalletService.ListVipPackages:output_type -> hyapp.wallet.v1.ListVipPackagesResponse - 124, // 201: hyapp.wallet.v1.WalletService.GetMyVip:output_type -> hyapp.wallet.v1.GetMyVipResponse - 126, // 202: hyapp.wallet.v1.WalletService.PurchaseVip:output_type -> hyapp.wallet.v1.PurchaseVipResponse - 128, // 203: hyapp.wallet.v1.WalletService.GrantVip:output_type -> hyapp.wallet.v1.GrantVipResponse - 131, // 204: hyapp.wallet.v1.WalletService.ListAdminVipLevels:output_type -> hyapp.wallet.v1.ListAdminVipLevelsResponse - 133, // 205: hyapp.wallet.v1.WalletService.UpdateAdminVipLevels:output_type -> hyapp.wallet.v1.UpdateAdminVipLevelsResponse - 135, // 206: hyapp.wallet.v1.WalletService.CreditTaskReward:output_type -> hyapp.wallet.v1.CreditTaskRewardResponse - 137, // 207: hyapp.wallet.v1.WalletService.CreditLuckyGiftReward:output_type -> hyapp.wallet.v1.CreditLuckyGiftRewardResponse - 139, // 208: hyapp.wallet.v1.WalletService.CreditRoomTurnoverReward:output_type -> hyapp.wallet.v1.CreditRoomTurnoverRewardResponse - 141, // 209: hyapp.wallet.v1.WalletService.ApplyGameCoinChange:output_type -> hyapp.wallet.v1.ApplyGameCoinChangeResponse - 146, // 210: hyapp.wallet.v1.WalletService.GetRedPacketConfig:output_type -> hyapp.wallet.v1.GetRedPacketConfigResponse - 148, // 211: hyapp.wallet.v1.WalletService.UpdateRedPacketConfig:output_type -> hyapp.wallet.v1.UpdateRedPacketConfigResponse - 150, // 212: hyapp.wallet.v1.WalletService.CreateRedPacket:output_type -> hyapp.wallet.v1.CreateRedPacketResponse - 152, // 213: hyapp.wallet.v1.WalletService.ClaimRedPacket:output_type -> hyapp.wallet.v1.ClaimRedPacketResponse - 154, // 214: hyapp.wallet.v1.WalletService.ListRedPackets:output_type -> hyapp.wallet.v1.ListRedPacketsResponse - 156, // 215: hyapp.wallet.v1.WalletService.GetRedPacket:output_type -> hyapp.wallet.v1.GetRedPacketResponse - 158, // 216: hyapp.wallet.v1.WalletService.ExpireRedPackets:output_type -> hyapp.wallet.v1.ExpireRedPacketsResponse - 160, // 217: hyapp.wallet.v1.WalletService.RetryRedPacketRefund:output_type -> hyapp.wallet.v1.RetryRedPacketRefundResponse - 147, // [147:218] is the sub-list for method output_type - 76, // [76:147] is the sub-list for method input_type - 76, // [76:76] is the sub-list for extension type_name - 76, // [76:76] is the sub-list for extension extendee - 0, // [0:76] is the sub-list for field type_name + 6, // 59: hyapp.wallet.v1.DebitCPBreakupFeeResponse.balance:type_name -> hyapp.wallet.v1.AssetBalance + 120, // 60: hyapp.wallet.v1.GrantVipResponse.vip:type_name -> hyapp.wallet.v1.UserVip + 118, // 61: hyapp.wallet.v1.GrantVipResponse.reward_items:type_name -> hyapp.wallet.v1.VipRewardItem + 119, // 62: hyapp.wallet.v1.ListAdminVipLevelsResponse.levels:type_name -> hyapp.wallet.v1.VipLevel + 131, // 63: hyapp.wallet.v1.UpdateAdminVipLevelsRequest.levels:type_name -> hyapp.wallet.v1.AdminVipLevelInput + 119, // 64: hyapp.wallet.v1.UpdateAdminVipLevelsResponse.levels:type_name -> hyapp.wallet.v1.VipLevel + 6, // 65: hyapp.wallet.v1.CreditTaskRewardResponse.balance:type_name -> hyapp.wallet.v1.AssetBalance + 6, // 66: hyapp.wallet.v1.CreditLuckyGiftRewardResponse.balance:type_name -> hyapp.wallet.v1.AssetBalance + 6, // 67: hyapp.wallet.v1.CreditRoomTurnoverRewardResponse.balance:type_name -> hyapp.wallet.v1.AssetBalance + 145, // 68: hyapp.wallet.v1.RedPacket.claims:type_name -> hyapp.wallet.v1.RedPacketClaim + 144, // 69: hyapp.wallet.v1.GetRedPacketConfigResponse.config:type_name -> hyapp.wallet.v1.RedPacketConfig + 144, // 70: hyapp.wallet.v1.UpdateRedPacketConfigResponse.config:type_name -> hyapp.wallet.v1.RedPacketConfig + 146, // 71: hyapp.wallet.v1.CreateRedPacketResponse.packet:type_name -> hyapp.wallet.v1.RedPacket + 145, // 72: hyapp.wallet.v1.ClaimRedPacketResponse.claim:type_name -> hyapp.wallet.v1.RedPacketClaim + 146, // 73: hyapp.wallet.v1.ClaimRedPacketResponse.packet:type_name -> hyapp.wallet.v1.RedPacket + 146, // 74: hyapp.wallet.v1.ListRedPacketsResponse.packets:type_name -> hyapp.wallet.v1.RedPacket + 146, // 75: hyapp.wallet.v1.GetRedPacketResponse.packet:type_name -> hyapp.wallet.v1.RedPacket + 146, // 76: hyapp.wallet.v1.RetryRedPacketRefundResponse.packet:type_name -> hyapp.wallet.v1.RedPacket + 163, // 77: hyapp.wallet.v1.WalletCronService.ProcessHostSalaryDailySettlementBatch:input_type -> hyapp.wallet.v1.CronBatchRequest + 163, // 78: hyapp.wallet.v1.WalletCronService.ProcessHostSalaryHalfMonthSettlementBatch:input_type -> hyapp.wallet.v1.CronBatchRequest + 163, // 79: hyapp.wallet.v1.WalletCronService.ProcessHostSalaryMonthEndBatch:input_type -> hyapp.wallet.v1.CronBatchRequest + 0, // 80: hyapp.wallet.v1.WalletService.DebitGift:input_type -> hyapp.wallet.v1.DebitGiftRequest + 3, // 81: hyapp.wallet.v1.WalletService.BatchDebitGift:input_type -> hyapp.wallet.v1.BatchDebitGiftRequest + 7, // 82: hyapp.wallet.v1.WalletService.GetBalances:input_type -> hyapp.wallet.v1.GetBalancesRequest + 11, // 83: hyapp.wallet.v1.WalletService.GetActiveHostSalaryPolicy:input_type -> hyapp.wallet.v1.GetActiveHostSalaryPolicyRequest + 14, // 84: hyapp.wallet.v1.WalletService.GetHostSalaryProgress:input_type -> hyapp.wallet.v1.GetHostSalaryProgressRequest + 16, // 85: hyapp.wallet.v1.WalletService.AdminCreditAsset:input_type -> hyapp.wallet.v1.AdminCreditAssetRequest + 18, // 86: hyapp.wallet.v1.WalletService.AdminCreditCoinSellerStock:input_type -> hyapp.wallet.v1.AdminCreditCoinSellerStockRequest + 20, // 87: hyapp.wallet.v1.WalletService.TransferCoinFromSeller:input_type -> hyapp.wallet.v1.TransferCoinFromSellerRequest + 23, // 88: hyapp.wallet.v1.WalletService.ListCoinSellerSalaryExchangeRateTiers:input_type -> hyapp.wallet.v1.ListCoinSellerSalaryExchangeRateTiersRequest + 25, // 89: hyapp.wallet.v1.WalletService.ExchangeSalaryToCoin:input_type -> hyapp.wallet.v1.ExchangeSalaryToCoinRequest + 27, // 90: hyapp.wallet.v1.WalletService.TransferSalaryToCoinSeller:input_type -> hyapp.wallet.v1.TransferSalaryToCoinSellerRequest + 39, // 91: hyapp.wallet.v1.WalletService.ListResources:input_type -> hyapp.wallet.v1.ListResourcesRequest + 41, // 92: hyapp.wallet.v1.WalletService.GetResource:input_type -> hyapp.wallet.v1.GetResourceRequest + 43, // 93: hyapp.wallet.v1.WalletService.CreateResource:input_type -> hyapp.wallet.v1.CreateResourceRequest + 44, // 94: hyapp.wallet.v1.WalletService.UpdateResource:input_type -> hyapp.wallet.v1.UpdateResourceRequest + 45, // 95: hyapp.wallet.v1.WalletService.SetResourceStatus:input_type -> hyapp.wallet.v1.SetResourceStatusRequest + 47, // 96: hyapp.wallet.v1.WalletService.ListResourceGroups:input_type -> hyapp.wallet.v1.ListResourceGroupsRequest + 49, // 97: hyapp.wallet.v1.WalletService.GetResourceGroup:input_type -> hyapp.wallet.v1.GetResourceGroupRequest + 51, // 98: hyapp.wallet.v1.WalletService.CreateResourceGroup:input_type -> hyapp.wallet.v1.CreateResourceGroupRequest + 52, // 99: hyapp.wallet.v1.WalletService.UpdateResourceGroup:input_type -> hyapp.wallet.v1.UpdateResourceGroupRequest + 53, // 100: hyapp.wallet.v1.WalletService.SetResourceGroupStatus:input_type -> hyapp.wallet.v1.SetResourceGroupStatusRequest + 55, // 101: hyapp.wallet.v1.WalletService.ListGiftConfigs:input_type -> hyapp.wallet.v1.ListGiftConfigsRequest + 57, // 102: hyapp.wallet.v1.WalletService.ListGiftTypeConfigs:input_type -> hyapp.wallet.v1.ListGiftTypeConfigsRequest + 61, // 103: hyapp.wallet.v1.WalletService.CreateGiftConfig:input_type -> hyapp.wallet.v1.CreateGiftConfigRequest + 62, // 104: hyapp.wallet.v1.WalletService.UpdateGiftConfig:input_type -> hyapp.wallet.v1.UpdateGiftConfigRequest + 63, // 105: hyapp.wallet.v1.WalletService.SetGiftConfigStatus:input_type -> hyapp.wallet.v1.SetGiftConfigStatusRequest + 59, // 106: hyapp.wallet.v1.WalletService.UpsertGiftTypeConfig:input_type -> hyapp.wallet.v1.UpsertGiftTypeConfigRequest + 65, // 107: hyapp.wallet.v1.WalletService.GrantResource:input_type -> hyapp.wallet.v1.GrantResourceRequest + 66, // 108: hyapp.wallet.v1.WalletService.GrantResourceGroup:input_type -> hyapp.wallet.v1.GrantResourceGroupRequest + 68, // 109: hyapp.wallet.v1.WalletService.ListUserResources:input_type -> hyapp.wallet.v1.ListUserResourcesRequest + 70, // 110: hyapp.wallet.v1.WalletService.EquipUserResource:input_type -> hyapp.wallet.v1.EquipUserResourceRequest + 72, // 111: hyapp.wallet.v1.WalletService.UnequipUserResource:input_type -> hyapp.wallet.v1.UnequipUserResourceRequest + 74, // 112: hyapp.wallet.v1.WalletService.BatchGetUserEquippedResources:input_type -> hyapp.wallet.v1.BatchGetUserEquippedResourcesRequest + 77, // 113: hyapp.wallet.v1.WalletService.ListResourceGrants:input_type -> hyapp.wallet.v1.ListResourceGrantsRequest + 80, // 114: hyapp.wallet.v1.WalletService.ListResourceShopItems:input_type -> hyapp.wallet.v1.ListResourceShopItemsRequest + 82, // 115: hyapp.wallet.v1.WalletService.UpsertResourceShopItems:input_type -> hyapp.wallet.v1.UpsertResourceShopItemsRequest + 84, // 116: hyapp.wallet.v1.WalletService.SetResourceShopItemStatus:input_type -> hyapp.wallet.v1.SetResourceShopItemStatusRequest + 86, // 117: hyapp.wallet.v1.WalletService.PurchaseResourceShopItem:input_type -> hyapp.wallet.v1.PurchaseResourceShopItemRequest + 89, // 118: hyapp.wallet.v1.WalletService.ListRechargeBills:input_type -> hyapp.wallet.v1.ListRechargeBillsRequest + 92, // 119: hyapp.wallet.v1.WalletService.GetWalletOverview:input_type -> hyapp.wallet.v1.GetWalletOverviewRequest + 95, // 120: hyapp.wallet.v1.WalletService.GetWalletValueSummary:input_type -> hyapp.wallet.v1.GetWalletValueSummaryRequest + 98, // 121: hyapp.wallet.v1.WalletService.GetUserGiftWall:input_type -> hyapp.wallet.v1.GetUserGiftWallRequest + 101, // 122: hyapp.wallet.v1.WalletService.ListRechargeProducts:input_type -> hyapp.wallet.v1.ListRechargeProductsRequest + 103, // 123: hyapp.wallet.v1.WalletService.ConfirmGooglePayment:input_type -> hyapp.wallet.v1.ConfirmGooglePaymentRequest + 105, // 124: hyapp.wallet.v1.WalletService.ListAdminRechargeProducts:input_type -> hyapp.wallet.v1.ListAdminRechargeProductsRequest + 107, // 125: hyapp.wallet.v1.WalletService.CreateRechargeProduct:input_type -> hyapp.wallet.v1.CreateRechargeProductRequest + 108, // 126: hyapp.wallet.v1.WalletService.UpdateRechargeProduct:input_type -> hyapp.wallet.v1.UpdateRechargeProductRequest + 109, // 127: hyapp.wallet.v1.WalletService.DeleteRechargeProduct:input_type -> hyapp.wallet.v1.DeleteRechargeProductRequest + 113, // 128: hyapp.wallet.v1.WalletService.GetDiamondExchangeConfig:input_type -> hyapp.wallet.v1.GetDiamondExchangeConfigRequest + 116, // 129: hyapp.wallet.v1.WalletService.ListWalletTransactions:input_type -> hyapp.wallet.v1.ListWalletTransactionsRequest + 121, // 130: hyapp.wallet.v1.WalletService.ListVipPackages:input_type -> hyapp.wallet.v1.ListVipPackagesRequest + 123, // 131: hyapp.wallet.v1.WalletService.GetMyVip:input_type -> hyapp.wallet.v1.GetMyVipRequest + 125, // 132: hyapp.wallet.v1.WalletService.PurchaseVip:input_type -> hyapp.wallet.v1.PurchaseVipRequest + 127, // 133: hyapp.wallet.v1.WalletService.DebitCPBreakupFee:input_type -> hyapp.wallet.v1.DebitCPBreakupFeeRequest + 129, // 134: hyapp.wallet.v1.WalletService.GrantVip:input_type -> hyapp.wallet.v1.GrantVipRequest + 132, // 135: hyapp.wallet.v1.WalletService.ListAdminVipLevels:input_type -> hyapp.wallet.v1.ListAdminVipLevelsRequest + 134, // 136: hyapp.wallet.v1.WalletService.UpdateAdminVipLevels:input_type -> hyapp.wallet.v1.UpdateAdminVipLevelsRequest + 136, // 137: hyapp.wallet.v1.WalletService.CreditTaskReward:input_type -> hyapp.wallet.v1.CreditTaskRewardRequest + 138, // 138: hyapp.wallet.v1.WalletService.CreditLuckyGiftReward:input_type -> hyapp.wallet.v1.CreditLuckyGiftRewardRequest + 140, // 139: hyapp.wallet.v1.WalletService.CreditRoomTurnoverReward:input_type -> hyapp.wallet.v1.CreditRoomTurnoverRewardRequest + 142, // 140: hyapp.wallet.v1.WalletService.ApplyGameCoinChange:input_type -> hyapp.wallet.v1.ApplyGameCoinChangeRequest + 147, // 141: hyapp.wallet.v1.WalletService.GetRedPacketConfig:input_type -> hyapp.wallet.v1.GetRedPacketConfigRequest + 149, // 142: hyapp.wallet.v1.WalletService.UpdateRedPacketConfig:input_type -> hyapp.wallet.v1.UpdateRedPacketConfigRequest + 151, // 143: hyapp.wallet.v1.WalletService.CreateRedPacket:input_type -> hyapp.wallet.v1.CreateRedPacketRequest + 153, // 144: hyapp.wallet.v1.WalletService.ClaimRedPacket:input_type -> hyapp.wallet.v1.ClaimRedPacketRequest + 155, // 145: hyapp.wallet.v1.WalletService.ListRedPackets:input_type -> hyapp.wallet.v1.ListRedPacketsRequest + 157, // 146: hyapp.wallet.v1.WalletService.GetRedPacket:input_type -> hyapp.wallet.v1.GetRedPacketRequest + 159, // 147: hyapp.wallet.v1.WalletService.ExpireRedPackets:input_type -> hyapp.wallet.v1.ExpireRedPacketsRequest + 161, // 148: hyapp.wallet.v1.WalletService.RetryRedPacketRefund:input_type -> hyapp.wallet.v1.RetryRedPacketRefundRequest + 164, // 149: hyapp.wallet.v1.WalletCronService.ProcessHostSalaryDailySettlementBatch:output_type -> hyapp.wallet.v1.CronBatchResponse + 164, // 150: hyapp.wallet.v1.WalletCronService.ProcessHostSalaryHalfMonthSettlementBatch:output_type -> hyapp.wallet.v1.CronBatchResponse + 164, // 151: hyapp.wallet.v1.WalletCronService.ProcessHostSalaryMonthEndBatch:output_type -> hyapp.wallet.v1.CronBatchResponse + 1, // 152: hyapp.wallet.v1.WalletService.DebitGift:output_type -> hyapp.wallet.v1.DebitGiftResponse + 5, // 153: hyapp.wallet.v1.WalletService.BatchDebitGift:output_type -> hyapp.wallet.v1.BatchDebitGiftResponse + 8, // 154: hyapp.wallet.v1.WalletService.GetBalances:output_type -> hyapp.wallet.v1.GetBalancesResponse + 12, // 155: hyapp.wallet.v1.WalletService.GetActiveHostSalaryPolicy:output_type -> hyapp.wallet.v1.GetActiveHostSalaryPolicyResponse + 15, // 156: hyapp.wallet.v1.WalletService.GetHostSalaryProgress:output_type -> hyapp.wallet.v1.GetHostSalaryProgressResponse + 17, // 157: hyapp.wallet.v1.WalletService.AdminCreditAsset:output_type -> hyapp.wallet.v1.AdminCreditAssetResponse + 19, // 158: hyapp.wallet.v1.WalletService.AdminCreditCoinSellerStock:output_type -> hyapp.wallet.v1.AdminCreditCoinSellerStockResponse + 21, // 159: hyapp.wallet.v1.WalletService.TransferCoinFromSeller:output_type -> hyapp.wallet.v1.TransferCoinFromSellerResponse + 24, // 160: hyapp.wallet.v1.WalletService.ListCoinSellerSalaryExchangeRateTiers:output_type -> hyapp.wallet.v1.ListCoinSellerSalaryExchangeRateTiersResponse + 26, // 161: hyapp.wallet.v1.WalletService.ExchangeSalaryToCoin:output_type -> hyapp.wallet.v1.ExchangeSalaryToCoinResponse + 28, // 162: hyapp.wallet.v1.WalletService.TransferSalaryToCoinSeller:output_type -> hyapp.wallet.v1.TransferSalaryToCoinSellerResponse + 40, // 163: hyapp.wallet.v1.WalletService.ListResources:output_type -> hyapp.wallet.v1.ListResourcesResponse + 42, // 164: hyapp.wallet.v1.WalletService.GetResource:output_type -> hyapp.wallet.v1.GetResourceResponse + 46, // 165: hyapp.wallet.v1.WalletService.CreateResource:output_type -> hyapp.wallet.v1.ResourceResponse + 46, // 166: hyapp.wallet.v1.WalletService.UpdateResource:output_type -> hyapp.wallet.v1.ResourceResponse + 46, // 167: hyapp.wallet.v1.WalletService.SetResourceStatus:output_type -> hyapp.wallet.v1.ResourceResponse + 48, // 168: hyapp.wallet.v1.WalletService.ListResourceGroups:output_type -> hyapp.wallet.v1.ListResourceGroupsResponse + 50, // 169: hyapp.wallet.v1.WalletService.GetResourceGroup:output_type -> hyapp.wallet.v1.GetResourceGroupResponse + 54, // 170: hyapp.wallet.v1.WalletService.CreateResourceGroup:output_type -> hyapp.wallet.v1.ResourceGroupResponse + 54, // 171: hyapp.wallet.v1.WalletService.UpdateResourceGroup:output_type -> hyapp.wallet.v1.ResourceGroupResponse + 54, // 172: hyapp.wallet.v1.WalletService.SetResourceGroupStatus:output_type -> hyapp.wallet.v1.ResourceGroupResponse + 56, // 173: hyapp.wallet.v1.WalletService.ListGiftConfigs:output_type -> hyapp.wallet.v1.ListGiftConfigsResponse + 58, // 174: hyapp.wallet.v1.WalletService.ListGiftTypeConfigs:output_type -> hyapp.wallet.v1.ListGiftTypeConfigsResponse + 64, // 175: hyapp.wallet.v1.WalletService.CreateGiftConfig:output_type -> hyapp.wallet.v1.GiftConfigResponse + 64, // 176: hyapp.wallet.v1.WalletService.UpdateGiftConfig:output_type -> hyapp.wallet.v1.GiftConfigResponse + 64, // 177: hyapp.wallet.v1.WalletService.SetGiftConfigStatus:output_type -> hyapp.wallet.v1.GiftConfigResponse + 60, // 178: hyapp.wallet.v1.WalletService.UpsertGiftTypeConfig:output_type -> hyapp.wallet.v1.GiftTypeConfigResponse + 67, // 179: hyapp.wallet.v1.WalletService.GrantResource:output_type -> hyapp.wallet.v1.ResourceGrantResponse + 67, // 180: hyapp.wallet.v1.WalletService.GrantResourceGroup:output_type -> hyapp.wallet.v1.ResourceGrantResponse + 69, // 181: hyapp.wallet.v1.WalletService.ListUserResources:output_type -> hyapp.wallet.v1.ListUserResourcesResponse + 71, // 182: hyapp.wallet.v1.WalletService.EquipUserResource:output_type -> hyapp.wallet.v1.EquipUserResourceResponse + 73, // 183: hyapp.wallet.v1.WalletService.UnequipUserResource:output_type -> hyapp.wallet.v1.UnequipUserResourceResponse + 76, // 184: hyapp.wallet.v1.WalletService.BatchGetUserEquippedResources:output_type -> hyapp.wallet.v1.BatchGetUserEquippedResourcesResponse + 78, // 185: hyapp.wallet.v1.WalletService.ListResourceGrants:output_type -> hyapp.wallet.v1.ListResourceGrantsResponse + 81, // 186: hyapp.wallet.v1.WalletService.ListResourceShopItems:output_type -> hyapp.wallet.v1.ListResourceShopItemsResponse + 83, // 187: hyapp.wallet.v1.WalletService.UpsertResourceShopItems:output_type -> hyapp.wallet.v1.UpsertResourceShopItemsResponse + 85, // 188: hyapp.wallet.v1.WalletService.SetResourceShopItemStatus:output_type -> hyapp.wallet.v1.ResourceShopItemResponse + 87, // 189: hyapp.wallet.v1.WalletService.PurchaseResourceShopItem:output_type -> hyapp.wallet.v1.PurchaseResourceShopItemResponse + 90, // 190: hyapp.wallet.v1.WalletService.ListRechargeBills:output_type -> hyapp.wallet.v1.ListRechargeBillsResponse + 93, // 191: hyapp.wallet.v1.WalletService.GetWalletOverview:output_type -> hyapp.wallet.v1.GetWalletOverviewResponse + 96, // 192: hyapp.wallet.v1.WalletService.GetWalletValueSummary:output_type -> hyapp.wallet.v1.GetWalletValueSummaryResponse + 99, // 193: hyapp.wallet.v1.WalletService.GetUserGiftWall:output_type -> hyapp.wallet.v1.GetUserGiftWallResponse + 102, // 194: hyapp.wallet.v1.WalletService.ListRechargeProducts:output_type -> hyapp.wallet.v1.ListRechargeProductsResponse + 104, // 195: hyapp.wallet.v1.WalletService.ConfirmGooglePayment:output_type -> hyapp.wallet.v1.ConfirmGooglePaymentResponse + 106, // 196: hyapp.wallet.v1.WalletService.ListAdminRechargeProducts:output_type -> hyapp.wallet.v1.ListAdminRechargeProductsResponse + 110, // 197: hyapp.wallet.v1.WalletService.CreateRechargeProduct:output_type -> hyapp.wallet.v1.RechargeProductResponse + 110, // 198: hyapp.wallet.v1.WalletService.UpdateRechargeProduct:output_type -> hyapp.wallet.v1.RechargeProductResponse + 111, // 199: hyapp.wallet.v1.WalletService.DeleteRechargeProduct:output_type -> hyapp.wallet.v1.DeleteRechargeProductResponse + 114, // 200: hyapp.wallet.v1.WalletService.GetDiamondExchangeConfig:output_type -> hyapp.wallet.v1.GetDiamondExchangeConfigResponse + 117, // 201: hyapp.wallet.v1.WalletService.ListWalletTransactions:output_type -> hyapp.wallet.v1.ListWalletTransactionsResponse + 122, // 202: hyapp.wallet.v1.WalletService.ListVipPackages:output_type -> hyapp.wallet.v1.ListVipPackagesResponse + 124, // 203: hyapp.wallet.v1.WalletService.GetMyVip:output_type -> hyapp.wallet.v1.GetMyVipResponse + 126, // 204: hyapp.wallet.v1.WalletService.PurchaseVip:output_type -> hyapp.wallet.v1.PurchaseVipResponse + 128, // 205: hyapp.wallet.v1.WalletService.DebitCPBreakupFee:output_type -> hyapp.wallet.v1.DebitCPBreakupFeeResponse + 130, // 206: hyapp.wallet.v1.WalletService.GrantVip:output_type -> hyapp.wallet.v1.GrantVipResponse + 133, // 207: hyapp.wallet.v1.WalletService.ListAdminVipLevels:output_type -> hyapp.wallet.v1.ListAdminVipLevelsResponse + 135, // 208: hyapp.wallet.v1.WalletService.UpdateAdminVipLevels:output_type -> hyapp.wallet.v1.UpdateAdminVipLevelsResponse + 137, // 209: hyapp.wallet.v1.WalletService.CreditTaskReward:output_type -> hyapp.wallet.v1.CreditTaskRewardResponse + 139, // 210: hyapp.wallet.v1.WalletService.CreditLuckyGiftReward:output_type -> hyapp.wallet.v1.CreditLuckyGiftRewardResponse + 141, // 211: hyapp.wallet.v1.WalletService.CreditRoomTurnoverReward:output_type -> hyapp.wallet.v1.CreditRoomTurnoverRewardResponse + 143, // 212: hyapp.wallet.v1.WalletService.ApplyGameCoinChange:output_type -> hyapp.wallet.v1.ApplyGameCoinChangeResponse + 148, // 213: hyapp.wallet.v1.WalletService.GetRedPacketConfig:output_type -> hyapp.wallet.v1.GetRedPacketConfigResponse + 150, // 214: hyapp.wallet.v1.WalletService.UpdateRedPacketConfig:output_type -> hyapp.wallet.v1.UpdateRedPacketConfigResponse + 152, // 215: hyapp.wallet.v1.WalletService.CreateRedPacket:output_type -> hyapp.wallet.v1.CreateRedPacketResponse + 154, // 216: hyapp.wallet.v1.WalletService.ClaimRedPacket:output_type -> hyapp.wallet.v1.ClaimRedPacketResponse + 156, // 217: hyapp.wallet.v1.WalletService.ListRedPackets:output_type -> hyapp.wallet.v1.ListRedPacketsResponse + 158, // 218: hyapp.wallet.v1.WalletService.GetRedPacket:output_type -> hyapp.wallet.v1.GetRedPacketResponse + 160, // 219: hyapp.wallet.v1.WalletService.ExpireRedPackets:output_type -> hyapp.wallet.v1.ExpireRedPacketsResponse + 162, // 220: hyapp.wallet.v1.WalletService.RetryRedPacketRefund:output_type -> hyapp.wallet.v1.RetryRedPacketRefundResponse + 149, // [149:221] is the sub-list for method output_type + 77, // [77:149] is the sub-list for method input_type + 77, // [77:77] is the sub-list for extension type_name + 77, // [77:77] is the sub-list for extension extendee + 0, // [0:77] is the sub-list for field type_name } func init() { file_proto_wallet_v1_wallet_proto_init() } @@ -16274,7 +16446,7 @@ func file_proto_wallet_v1_wallet_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_proto_wallet_v1_wallet_proto_rawDesc), len(file_proto_wallet_v1_wallet_proto_rawDesc)), NumEnums: 0, - NumMessages: 163, + NumMessages: 165, NumExtensions: 0, NumServices: 2, }, diff --git a/api/proto/wallet/v1/wallet.proto b/api/proto/wallet/v1/wallet.proto index 06909507..fee5779a 100644 --- a/api/proto/wallet/v1/wallet.proto +++ b/api/proto/wallet/v1/wallet.proto @@ -1264,6 +1264,22 @@ message PurchaseVipResponse { repeated VipRewardItem reward_items = 6; } +message DebitCPBreakupFeeRequest { + string command_id = 1; + string app_code = 2; + int64 user_id = 3; + string relationship_id = 4; + string relation_type = 5; + int64 amount = 6; +} + +message DebitCPBreakupFeeResponse { + string transaction_id = 1; + int64 coin_spent = 2; + int64 coin_balance_after = 3; + AssetBalance balance = 4; +} + message GrantVipRequest { string command_id = 1; string app_code = 2; @@ -1657,6 +1673,7 @@ service WalletService { rpc ListVipPackages(ListVipPackagesRequest) returns (ListVipPackagesResponse); rpc GetMyVip(GetMyVipRequest) returns (GetMyVipResponse); rpc PurchaseVip(PurchaseVipRequest) returns (PurchaseVipResponse); + rpc DebitCPBreakupFee(DebitCPBreakupFeeRequest) returns (DebitCPBreakupFeeResponse); rpc GrantVip(GrantVipRequest) returns (GrantVipResponse); rpc ListAdminVipLevels(ListAdminVipLevelsRequest) returns (ListAdminVipLevelsResponse); rpc UpdateAdminVipLevels(UpdateAdminVipLevelsRequest) returns (UpdateAdminVipLevelsResponse); diff --git a/api/proto/wallet/v1/wallet_grpc.pb.go b/api/proto/wallet/v1/wallet_grpc.pb.go index 91ff44d8..4c67275f 100644 --- a/api/proto/wallet/v1/wallet_grpc.pb.go +++ b/api/proto/wallet/v1/wallet_grpc.pb.go @@ -254,6 +254,7 @@ const ( WalletService_ListVipPackages_FullMethodName = "/hyapp.wallet.v1.WalletService/ListVipPackages" WalletService_GetMyVip_FullMethodName = "/hyapp.wallet.v1.WalletService/GetMyVip" WalletService_PurchaseVip_FullMethodName = "/hyapp.wallet.v1.WalletService/PurchaseVip" + WalletService_DebitCPBreakupFee_FullMethodName = "/hyapp.wallet.v1.WalletService/DebitCPBreakupFee" WalletService_GrantVip_FullMethodName = "/hyapp.wallet.v1.WalletService/GrantVip" WalletService_ListAdminVipLevels_FullMethodName = "/hyapp.wallet.v1.WalletService/ListAdminVipLevels" WalletService_UpdateAdminVipLevels_FullMethodName = "/hyapp.wallet.v1.WalletService/UpdateAdminVipLevels" @@ -330,6 +331,7 @@ type WalletServiceClient interface { ListVipPackages(ctx context.Context, in *ListVipPackagesRequest, opts ...grpc.CallOption) (*ListVipPackagesResponse, error) GetMyVip(ctx context.Context, in *GetMyVipRequest, opts ...grpc.CallOption) (*GetMyVipResponse, error) PurchaseVip(ctx context.Context, in *PurchaseVipRequest, opts ...grpc.CallOption) (*PurchaseVipResponse, error) + DebitCPBreakupFee(ctx context.Context, in *DebitCPBreakupFeeRequest, opts ...grpc.CallOption) (*DebitCPBreakupFeeResponse, error) GrantVip(ctx context.Context, in *GrantVipRequest, opts ...grpc.CallOption) (*GrantVipResponse, error) ListAdminVipLevels(ctx context.Context, in *ListAdminVipLevelsRequest, opts ...grpc.CallOption) (*ListAdminVipLevelsResponse, error) UpdateAdminVipLevels(ctx context.Context, in *UpdateAdminVipLevelsRequest, opts ...grpc.CallOption) (*UpdateAdminVipLevelsResponse, error) @@ -885,6 +887,16 @@ func (c *walletServiceClient) PurchaseVip(ctx context.Context, in *PurchaseVipRe return out, nil } +func (c *walletServiceClient) DebitCPBreakupFee(ctx context.Context, in *DebitCPBreakupFeeRequest, opts ...grpc.CallOption) (*DebitCPBreakupFeeResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(DebitCPBreakupFeeResponse) + err := c.cc.Invoke(ctx, WalletService_DebitCPBreakupFee_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *walletServiceClient) GrantVip(ctx context.Context, in *GrantVipRequest, opts ...grpc.CallOption) (*GrantVipResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GrantVipResponse) @@ -1094,6 +1106,7 @@ type WalletServiceServer interface { ListVipPackages(context.Context, *ListVipPackagesRequest) (*ListVipPackagesResponse, error) GetMyVip(context.Context, *GetMyVipRequest) (*GetMyVipResponse, error) PurchaseVip(context.Context, *PurchaseVipRequest) (*PurchaseVipResponse, error) + DebitCPBreakupFee(context.Context, *DebitCPBreakupFeeRequest) (*DebitCPBreakupFeeResponse, error) GrantVip(context.Context, *GrantVipRequest) (*GrantVipResponse, error) ListAdminVipLevels(context.Context, *ListAdminVipLevelsRequest) (*ListAdminVipLevelsResponse, error) UpdateAdminVipLevels(context.Context, *UpdateAdminVipLevelsRequest) (*UpdateAdminVipLevelsResponse, error) @@ -1278,6 +1291,9 @@ func (UnimplementedWalletServiceServer) GetMyVip(context.Context, *GetMyVipReque func (UnimplementedWalletServiceServer) PurchaseVip(context.Context, *PurchaseVipRequest) (*PurchaseVipResponse, error) { return nil, status.Error(codes.Unimplemented, "method PurchaseVip not implemented") } +func (UnimplementedWalletServiceServer) DebitCPBreakupFee(context.Context, *DebitCPBreakupFeeRequest) (*DebitCPBreakupFeeResponse, error) { + return nil, status.Error(codes.Unimplemented, "method DebitCPBreakupFee not implemented") +} func (UnimplementedWalletServiceServer) GrantVip(context.Context, *GrantVipRequest) (*GrantVipResponse, error) { return nil, status.Error(codes.Unimplemented, "method GrantVip not implemented") } @@ -2298,6 +2314,24 @@ func _WalletService_PurchaseVip_Handler(srv interface{}, ctx context.Context, de return interceptor(ctx, in, info, handler) } +func _WalletService_DebitCPBreakupFee_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DebitCPBreakupFeeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WalletServiceServer).DebitCPBreakupFee(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: WalletService_DebitCPBreakupFee_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WalletServiceServer).DebitCPBreakupFee(ctx, req.(*DebitCPBreakupFeeRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _WalletService_GrantVip_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GrantVipRequest) if err := dec(in); err != nil { @@ -2787,6 +2821,10 @@ var WalletService_ServiceDesc = grpc.ServiceDesc{ MethodName: "PurchaseVip", Handler: _WalletService_PurchaseVip_Handler, }, + { + MethodName: "DebitCPBreakupFee", + Handler: _WalletService_DebitCPBreakupFee_Handler, + }, { MethodName: "GrantVip", Handler: _WalletService_GrantVip_Handler, diff --git a/docs/CP关系服务端开发文档.md b/docs/CP关系服务端开发文档.md index 0cf7d690..2270d7b9 100644 --- a/docs/CP关系服务端开发文档.md +++ b/docs/CP关系服务端开发文档.md @@ -150,7 +150,19 @@ sequenceDiagram - App 关系查询返回当前等级阈值、下一等级阈值、距离下一级和进度百分比。 - 资料卡弹窗只能使用 `/api/v1/cp/relationships` 返回的阈值字段展示进度;客户端不能读取后台配置或硬编码等级表。 -## 8. App HTTP接口 +## 8. 解除关系 + +用户可以主动解除自己的 active 关系。解除费用由后台 CP 配置按关系类型维护,单位是金币。 + +规则: + +- App 先通过 `/api/v1/cp/relationships` 读取 `breakup_cost_coins` 展示费用。 +- 解除接口必须传 `command_id`,同一次解除重试复用同一个 `command_id`。 +- gateway 先在 user-service 创建解除占位,再调用 wallet-service 扣金币,最后确认关系为 `ended`。 +- 如果 wallet-service 扣费失败,user-service 会取消解除占位,关系仍保持 active。 +- 解除成功后不会发送 C2C、房间 IM 或区域 IM;客户端使用接口返回和关系列表刷新 UI。 + +## 9. App HTTP接口 所有接口走 `gateway-service`,响应使用 `{code,message,request_id,data}`。 @@ -160,6 +172,7 @@ sequenceDiagram | `POST` | `/api/v1/cp/applications/{application_id}/accept` | 同意申请 | | `POST` | `/api/v1/cp/applications/{application_id}/reject` | 拒绝申请 | | `GET` | `/api/v1/cp/relationships` | 查询我的 active 关系 | +| `POST` | `/api/v1/cp/relationships/{relationship_id}/break` | 解除关系并扣金币 | `/api/v1/cp/relationships` 的 relationship item 包含: @@ -177,7 +190,9 @@ sequenceDiagram | `needed_for_next_level` | 距离下一级还需要多少亲密值;满级时为 0 | | `level_progress_percent` | 当前等级内进度百分比,0 到 100 | | `max_level` | 是否已经没有下一等级 | +| `breakup_cost_coins` | 当前关系解除需要支付的金币数 | | `formed_at_ms` | 关系形成时间 | +| `ended_at_ms` | 解除时间;active 关系为 0 | | `updated_at_ms` | 最近更新时间 | 这些字段由 user-service 从 `user_cp_level_rules` 计算,gateway 只做透传。客户端资料卡不能根据本地表推算这些值。 @@ -205,17 +220,33 @@ sequenceDiagram | --- | --- | --- | --- | | `reason` | string | 否 | 拒绝原因,只进入 IM/outbox payload | -## 9. 数据表 +解除请求体: + +| 字段 | 类型 | 必填 | 说明 | +| --- | --- | --- | --- | +| `command_id` | string | 是 | 解除关系幂等键,同一次重试必须复用 | + +解除返回值: + +| 字段 | 说明 | +| --- | --- | +| `relationship` | 已解除的关系,`status=ended` | +| `breakup_cost_coins` | 本次实际扣除金币数 | +| `wallet_transaction_id` | 钱包扣费交易 ID;费用为 0 时为空 | +| `coin_balance_after` | 扣费后金币余额;费用为 0 时为 0 | + +## 10. 数据表 表放在 `user-service` 库,所有表带 `app_code`,时间使用 UTC epoch milliseconds。 | 表 | 说明 | | --- | --- | -| `user_cp_relation_configs` | CP/兄弟/姐妹数量与申请过期配置;CP 数量服务端固定为 1,兄弟/姐妹读取后台配置 | +| `user_cp_relation_configs` | CP/兄弟/姐妹数量、申请过期和解除费用配置;CP 数量服务端固定为 1,兄弟/姐妹读取后台配置 | | `user_cp_level_rules` | 等级阈值和奖励资源组 | | `user_cp_gift_event_consumption` | `RoomGiftSent` 消费幂等 | | `user_cp_applications` | CP 关系申请 | | `user_cp_relationships` | 双人关系事实 | +| `user_cp_relationship_breakups` | 解除关系 pending/confirmed/canceled 占位和幂等事实 | | `user_cp_level_reward_grants` | 等级奖励发放幂等 | | `user_outbox` | CP 事件事实 | @@ -225,8 +256,9 @@ sequenceDiagram - CP active 关系按单用户唯一:任一用户已有 CP 关系就不能再接受新的 CP 关系。 - 兄弟/姐妹 active 关系按后台配置做单用户数量上限校验。 - pending 申请按用户对和类型唯一:`(app_code, requester_user_id, target_user_id, relation_type, status='pending')`。 +- 解除关系按 `command_id` 幂等;同一关系同一时间只能有一条 pending 解除占位。 -## 10. 相关IM +## 11. 相关IM | IM | 通道 | 发送时机 | | --- | --- | --- | @@ -238,10 +270,11 @@ sequenceDiagram | `cp_application_rejected` | C2C | B 拒绝后,B 发给 A | | `cp_application_rejected` | 房间群 | B 拒绝后,发到来源房间,payload 带 `recipient_user_id=A` | | `cp_relationship_created` | 区域群 | 关系建立后发送区域播报 | +| 无 | 无 | 解除关系成功不发 IM,App 根据解除接口返回刷新 | C2C 使用腾讯云 IM `From_Account` 表达会话方向:申请为 A,拒绝为 B;同意会发 `B -> A` 和 `A -> B` 两条。区域 IM 群 ID 使用 `hy__bc_r_`,本地测试可通过 `group_id_prefix` 加前缀。 -## 11. 错误码 +## 12. 错误码 | 场景 | code | 说明 | | --- | --- | --- | @@ -249,9 +282,11 @@ C2C 使用腾讯云 IM `From_Account` 表达会话方向:申请为 A,拒绝 | 申请已过期 | `CONFLICT` | 不能再同意;内部 gRPC 语义是 FailedPrecondition | | 已有关系 | `CONFLICT` | A/B 任一方已经有 active 关系 | | 无权限处理 | `PERMISSION_DENIED` | 不是申请目标用户 | +| 余额不足 | `INSUFFICIENT_BALANCE` | 解除关系扣金币失败 | +| 关系不可解除 | `CONFLICT` | 关系不是 active,或已有 pending 解除 | | 幂等冲突 | `CONFLICT` | command_id 或事件消费 payload 不一致 | -## 12. 验证项 +## 13. 验证项 - CP 礼物发送成功后,`RoomGiftSent` 带 `gift_type_code=cp`、`cp_relation_type`、礼物 icon 快照。 - A 给 B 连发 `cp`、`brother`、`sister` 三种礼物,会生成三条 pending 申请。 @@ -259,4 +294,5 @@ C2C 使用腾讯云 IM `From_Account` 表达会话方向:申请为 A,拒绝 - A/B 建立关系后,A 或 B 都不能再和第三人建立 active 关系。 - pending 申请超过默认 24 小时后不能接受。 - active 关系双方互送任意礼物,亲密值按 `heat_value` 增加。 +- active 关系解除会扣除后台配置的金币费用,扣费失败不改变关系状态。 - 同意、拒绝、关系成立的 IM 都写入 `notice_delivery_events`,失败可重试。 diff --git a/docs/flutter对接/CP关系Flutter对接.md b/docs/flutter对接/CP关系Flutter对接.md index 5ae8e0d8..d44b81a1 100644 --- a/docs/flutter对接/CP关系Flutter对接.md +++ b/docs/flutter对接/CP关系Flutter对接.md @@ -279,7 +279,9 @@ X-App-Code: lalu "needed_for_next_level": 1112, "level_progress_percent": 44, "max_level": false, + "breakup_cost_coins": 88, "formed_at_ms": 1779259100000, + "ended_at_ms": 0, "updated_at_ms": 1779259200000 } ], @@ -295,12 +297,60 @@ X-App-Code: lalu - 资料卡弹窗只使用后端返回的 `intimacy_value`、`level`、`current_level_threshold`、`next_level_threshold`、`needed_for_next_level`、`level_progress_percent` 和 `max_level`。 - `max_level=true` 或 `next_level_threshold=0` 时表示没有下一等级,隐藏“距离下一级”和进度条。 - Flutter 不要用本地常量、礼物价格或后台配置接口自行推算进度条和“距离下一级”。 +- `breakup_cost_coins` 是解除当前关系需要支付的金币数,弹窗和二次确认直接使用该值。 -## 7. 相关IM +## 7. 解除关系 + +地址: + +```http +POST /api/v1/cp/relationships/{relationship_id}/break +Authorization: Bearer +X-App-Code: lalu +Content-Type: application/json + +{ + "command_id": "break_cp_rel_10001_10002_1779259300000" +} +``` + +参数: + +| 参数 | 类型 | 必填 | 说明 | +| --- | --- | --- | --- | +| `relationship_id` | string | 是 | URL path,关系 ID | +| `command_id` | string | 是 | 解除关系幂等键,同一次重试必须复用 | + +返回值: + +```json +{ + "relationship": { + "relationship_id": "cp_rel_10001_10002", + "relation_type": "cp", + "status": "ended", + "breakup_cost_coins": 88, + "formed_at_ms": 1779259100000, + "ended_at_ms": 1779259300000, + "updated_at_ms": 1779259300000 + }, + "breakup_cost_coins": 88, + "wallet_transaction_id": "wallet_tx_break_1", + "coin_balance_after": 912 +} +``` + +说明: + +- 解除前先展示 `/api/v1/cp/relationships` 返回的 `breakup_cost_coins`。 +- 金币不足时接口返回 `INSUFFICIENT_BALANCE`,关系仍保持 active。 +- 解除成功不发 C2C、房间 IM 或区域 IM;Flutter 使用接口返回刷新资料卡和关系列表。 + +## 8. 相关IM 所有 IM 都是 Tencent `TIMCustomElem`,`MsgContent.Desc` 等于下表事件名,`MsgContent.Data` 是 JSON 字符串。客户端按 `event_id` 去重。 -### 7.1 收到关系申请 +### 8.1 收到关系申请 房间 IM 和 C2C IM 都会收到: @@ -354,7 +404,7 @@ Data: - C2C IM 在私聊里显示同意/拒绝按钮。 - `expires_at_ms <= server_time_ms` 时按钮置灰并刷新申请列表。 -### 7.2 申请被同意 +### 8.2 申请被同意 C2C 会收到双方互发的两条消息,房间 IM 仍然只给申请发起人 A 展示: @@ -384,7 +434,7 @@ C2C 差异: - B 操作成功后也刷新关系列表。 - 同一对用户其他 pending 申请需要置灰。 -### 7.3 申请被拒绝 +### 8.3 申请被拒绝 C2C 和房间 IM 都会收到: @@ -402,7 +452,7 @@ Data 字段和申请消息一致,差异是: | `decided_at_ms` | 处理时间 | | `recipient_user_id` | 房间 IM 中为 A 的 user_id | -### 7.4 区域关系成立播报 +### 8.4 区域关系成立播报 用户组成任意关系后,会发送区域 IM: diff --git a/docs/flutter对接/语音房火箭Flutter对接.md b/docs/flutter对接/语音房火箭Flutter对接.md index a211f3e4..629c00d1 100644 --- a/docs/flutter对接/语音房火箭Flutter对接.md +++ b/docs/flutter对接/语音房火箭Flutter对接.md @@ -34,6 +34,18 @@ | `levels[].in_room_rewards` | 在房奖励候选 | | `levels[].top1_rewards` | 贡献第一奖励候选 | | `levels[].igniter_rewards` | 点火人奖励候选 | +| `levels[].*_rewards[].resource_group_id` | 奖励资源组 ID | +| `levels[].*_rewards[].resource_group` | 奖励资源组详情 | +| `levels[].*_rewards[].resource_group.items` | 资源组明细 | +| `levels[].*_rewards[].resource_group.items[].item_type` | `wallet_asset` 或 `resource` | +| `levels[].*_rewards[].resource_group.items[].wallet_asset_type` | 金币等奖励资产类型,例如 `COIN` | +| `levels[].*_rewards[].resource_group.items[].wallet_asset_amount` | 金币等奖励数量 | +| `levels[].*_rewards[].resource_group.items[].resource` | 聊天气泡、麦位特效等资源素材 | +| `levels[].*_rewards[].resource_group.items[].resource.resource_type` | 资源类型,例如 `chat_bubble`、`mic_effect` | +| `levels[].*_rewards[].resource_group.items[].resource.asset_url` | 资源主素材 | +| `levels[].*_rewards[].resource_group.items[].resource.preview_url` | 资源预览图 | +| `levels[].*_rewards[].resource_group.items[].resource.animation_url` | 资源动效 | +| `levels[].*_rewards[].resource_group.items[].duration_ms` | 资源有效期毫秒,`0` 表示永久 | | `state.current_level` | 当前正在累计的等级 | | `state.current_fuel` | 当前等级已累计燃料 | | `state.fuel_threshold` | 当前等级阈值 | @@ -48,8 +60,12 @@ | `state.pending_launches[].igniter_user_id` | 点火人 | | `state.pending_launches[].cover_url` | 小封面图 | | `state.last_rewards` | 最近一次发射奖励结果 | +| `state.last_rewards[].resource_group_id` | 本次中奖资源组 ID | +| `state.last_rewards[].resource_group` | 本次中奖资源组详情,字段同上 | | `server_time_ms` | 服务端 UTC 毫秒 | +`levels[].*_rewards` 表示 `in_room_rewards`、`top1_rewards`、`igniter_rewards` 三个奖励池。客户端展示金币数量、奖励天数、聊天气泡、麦位特效时,直接读 `resource_group.items`。 + ## 送礼 地址:`POST /api/v1/rooms/gift/send` @@ -258,6 +274,8 @@ | `rewards[].grant_id` | 发奖回执 | | `rewards[].status` | 发奖状态 | +奖励 IM 用于通知本次哪些人中奖。需要渲染金币数量、奖励天数、聊天气泡或麦位特效素材时,收到 IM 后调用 `GET /api/v1/rooms/{room_id}/rocket`,读取 `state.last_rewards[].resource_group`。 + ## 客户端处理 - 进房先调 `GET /api/v1/rooms/{room_id}/rocket`。 diff --git a/docs/语音房火箭功能架构.md b/docs/语音房火箭功能架构.md index 265f6b76..31d55d52 100644 --- a/docs/语音房火箭功能架构.md +++ b/docs/语音房火箭功能架构.md @@ -3,7 +3,7 @@ ## 服务边界 - `room-service` 是火箭进度、点火、待发射队列和奖励结算 owner。 -- `gateway-service` 只提供 App HTTP 入口和鉴权后的协议转换。 +- `gateway-service` 只提供 App HTTP 入口和鉴权后的协议转换;`GET /api/v1/rooms/{room_id}/rocket` 会按奖励 `resource_group_id` 查询 wallet-service 并嵌入 `resource_group.items`。 - `server/admin` 只读写 `room-service` 内部配置接口,不直连 room 数据库。 - `wallet-service` 负责资源组发放。 - `activity-service` 负责区域/全局飘屏和带用户资料的奖励房间 IM。 @@ -92,6 +92,7 @@ | `RoomRocketRewardGranted` | `room_rocket_reward_granted` 房间奖励 IM | activity-service | 奖励 IM 由 activity-service 查询用户公开资料后组装,包含头像、昵称、短 ID 和奖励信息。room-service 不反查 user-service。 +奖励资源组内容不写入 Room Cell;客户端需要金币数量、有效期、聊天气泡或麦位特效素材时,通过 rocket GET 接口读取展开后的 `resource_group`。 ## 高频处理 diff --git a/server/admin/internal/modules/cprelation/service.go b/server/admin/internal/modules/cprelation/service.go index c954188d..e1e3c79a 100644 --- a/server/admin/internal/modules/cprelation/service.go +++ b/server/admin/internal/modules/cprelation/service.go @@ -52,6 +52,7 @@ type relationDTO struct { DisplayName string `json:"displayName"` MaxCountPerUser int32 `json:"maxCountPerUser"` ApplicationExpireHours int32 `json:"applicationExpireHours"` + BreakupCostCoins int64 `json:"breakupCostCoins"` Status string `json:"status"` Levels []levelDTO `json:"levels"` UpdatedAtMS int64 `json:"updatedAtMs"` @@ -109,15 +110,16 @@ func (s *Service) UpdateConfig(ctx context.Context, appCode string, req updateRe for _, relation := range relations { if _, err := tx.ExecContext(ctx, ` INSERT INTO user_cp_relation_configs ( - app_code, relation_type, max_count_per_user, application_expire_hours, + app_code, relation_type, max_count_per_user, application_expire_hours, breakup_cost_coins, status, created_at_ms, updated_at_ms - ) VALUES (?, ?, ?, ?, ?, ?, ?) + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE max_count_per_user = VALUES(max_count_per_user), application_expire_hours = VALUES(application_expire_hours), + breakup_cost_coins = VALUES(breakup_cost_coins), status = VALUES(status), updated_at_ms = VALUES(updated_at_ms)`, - appCode, relation.RelationType, relation.MaxCountPerUser, relation.ApplicationExpireHours, + appCode, relation.RelationType, relation.MaxCountPerUser, relation.ApplicationExpireHours, relation.BreakupCostCoins, relation.Status, nowMs, nowMs, ); err != nil { return configDTO{}, err @@ -149,7 +151,7 @@ func (s *Service) UpdateConfig(ctx context.Context, appCode string, req updateRe func (s *Service) listRelations(ctx context.Context, appCode string) ([]relationDTO, error) { rows, err := s.db.QueryContext(ctx, ` - SELECT relation_type, max_count_per_user, application_expire_hours, status, updated_at_ms + SELECT relation_type, max_count_per_user, application_expire_hours, breakup_cost_coins, status, updated_at_ms FROM user_cp_relation_configs WHERE app_code = ?`, appCode) if err != nil { @@ -159,7 +161,7 @@ func (s *Service) listRelations(ctx context.Context, appCode string) ([]relation relationsByType := map[string]relationDTO{} for rows.Next() { var item relationDTO - if err := rows.Scan(&item.RelationType, &item.MaxCountPerUser, &item.ApplicationExpireHours, &item.Status, &item.UpdatedAtMS); err != nil { + if err := rows.Scan(&item.RelationType, &item.MaxCountPerUser, &item.ApplicationExpireHours, &item.BreakupCostCoins, &item.Status, &item.UpdatedAtMS); err != nil { return nil, err } item.DisplayName = relationLabels[item.RelationType] @@ -222,9 +224,9 @@ func (s *Service) ensureDefaultConfig(ctx context.Context, appCode string, nowMs } if _, err := s.db.ExecContext(ctx, ` INSERT INTO user_cp_relation_configs ( - app_code, relation_type, max_count_per_user, application_expire_hours, + app_code, relation_type, max_count_per_user, application_expire_hours, breakup_cost_coins, status, created_at_ms, updated_at_ms - ) VALUES (?, ?, ?, ?, 'active', ?, ?) + ) VALUES (?, ?, ?, ?, 0, 'active', ?, ?) ON DUPLICATE KEY UPDATE relation_type = VALUES(relation_type)`, appCode, relationType, maxCount, defaultExpireHours, nowMs, nowMs, ); err != nil { @@ -256,6 +258,7 @@ func (s *Service) ensureSchema(ctx context.Context) error { relation_type VARCHAR(32) NOT NULL, max_count_per_user INT NOT NULL, application_expire_hours INT NOT NULL, + breakup_cost_coins BIGINT NOT NULL DEFAULT 0, status VARCHAR(32) NOT NULL DEFAULT 'active', created_at_ms BIGINT NOT NULL, updated_at_ms BIGINT NOT NULL, @@ -263,6 +266,11 @@ func (s *Service) ensureSchema(ctx context.Context) error { ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`); err != nil { return err } + if err := s.ensureColumn(ctx, "user_cp_relation_configs", "breakup_cost_coins", ` + ALTER TABLE user_cp_relation_configs + ADD COLUMN breakup_cost_coins BIGINT NOT NULL DEFAULT 0 AFTER application_expire_hours`); err != nil { + return err + } _, err := s.db.ExecContext(ctx, ` CREATE TABLE IF NOT EXISTS user_cp_level_rules ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu', @@ -280,6 +288,23 @@ func (s *Service) ensureSchema(ctx context.Context) error { return err } +func (s *Service) ensureColumn(ctx context.Context, tableName string, columnName string, alterSQL string) error { + var found string + err := s.db.QueryRowContext(ctx, ` + SELECT COLUMN_NAME + FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ? AND COLUMN_NAME = ? + LIMIT 1`, tableName, columnName).Scan(&found) + if err == nil { + return nil + } + if !errors.Is(err, sql.ErrNoRows) { + return err + } + _, err = s.db.ExecContext(ctx, alterSQL) + return err +} + func normalizeRelations(input []relationDTO) ([]relationDTO, error) { if len(input) == 0 { return nil, fmt.Errorf("%w: 关系配置不能为空", ErrInvalidArgument) @@ -305,6 +330,9 @@ func normalizeRelations(input []relationDTO) ([]relationDTO, error) { if relation.ApplicationExpireHours <= 0 { relation.ApplicationExpireHours = defaultExpireHours } + if relation.BreakupCostCoins < 0 { + return nil, fmt.Errorf("%w: %s解除费用不能小于0", ErrInvalidArgument, relationLabels[relation.RelationType]) + } relation.Status = defaultString(strings.TrimSpace(relation.Status), statusActive) relation.Levels = normalizeLevelDefaults(relation.Levels) if err := validateLevels(relation.Levels); err != nil { diff --git a/services/gateway-service/internal/client/user_client.go b/services/gateway-service/internal/client/user_client.go index 6e14cee8..dd935f7e 100644 --- a/services/gateway-service/internal/client/user_client.go +++ b/services/gateway-service/internal/client/user_client.go @@ -63,6 +63,9 @@ type UserCPClient interface { AcceptCPApplication(ctx context.Context, req *userv1.AcceptCPApplicationRequest) (*userv1.AcceptCPApplicationResponse, error) RejectCPApplication(ctx context.Context, req *userv1.RejectCPApplicationRequest) (*userv1.RejectCPApplicationResponse, error) ListCPRelationships(ctx context.Context, req *userv1.ListCPRelationshipsRequest) (*userv1.ListCPRelationshipsResponse, error) + PrepareBreakCPRelationship(ctx context.Context, req *userv1.PrepareBreakCPRelationshipRequest) (*userv1.PrepareBreakCPRelationshipResponse, error) + ConfirmBreakCPRelationship(ctx context.Context, req *userv1.ConfirmBreakCPRelationshipRequest) (*userv1.ConfirmBreakCPRelationshipResponse, error) + CancelBreakCPRelationship(ctx context.Context, req *userv1.CancelBreakCPRelationshipRequest) (*userv1.CancelBreakCPRelationshipResponse, error) } // UserDeviceClient 抽象 gateway 对 user-service 设备 push token 的依赖。 @@ -367,6 +370,18 @@ func (c *grpcUserCPClient) ListCPRelationships(ctx context.Context, req *userv1. return c.client.ListCPRelationships(ctx, req) } +func (c *grpcUserCPClient) PrepareBreakCPRelationship(ctx context.Context, req *userv1.PrepareBreakCPRelationshipRequest) (*userv1.PrepareBreakCPRelationshipResponse, error) { + return c.client.PrepareBreakCPRelationship(ctx, req) +} + +func (c *grpcUserCPClient) ConfirmBreakCPRelationship(ctx context.Context, req *userv1.ConfirmBreakCPRelationshipRequest) (*userv1.ConfirmBreakCPRelationshipResponse, error) { + return c.client.ConfirmBreakCPRelationship(ctx, req) +} + +func (c *grpcUserCPClient) CancelBreakCPRelationship(ctx context.Context, req *userv1.CancelBreakCPRelationshipRequest) (*userv1.CancelBreakCPRelationshipResponse, error) { + return c.client.CancelBreakCPRelationship(ctx, req) +} + func (c *grpcUserDeviceClient) BindPushToken(ctx context.Context, req *userv1.BindPushTokenRequest) (*userv1.BindPushTokenResponse, error) { return c.client.BindPushToken(ctx, req) } diff --git a/services/gateway-service/internal/client/wallet_client.go b/services/gateway-service/internal/client/wallet_client.go index 0763cf3a..624480d5 100644 --- a/services/gateway-service/internal/client/wallet_client.go +++ b/services/gateway-service/internal/client/wallet_client.go @@ -23,6 +23,7 @@ type WalletClient interface { ListVipPackages(ctx context.Context, req *walletv1.ListVipPackagesRequest) (*walletv1.ListVipPackagesResponse, error) GetMyVip(ctx context.Context, req *walletv1.GetMyVipRequest) (*walletv1.GetMyVipResponse, error) PurchaseVip(ctx context.Context, req *walletv1.PurchaseVipRequest) (*walletv1.PurchaseVipResponse, error) + DebitCPBreakupFee(ctx context.Context, req *walletv1.DebitCPBreakupFeeRequest) (*walletv1.DebitCPBreakupFeeResponse, error) GrantVip(ctx context.Context, req *walletv1.GrantVipRequest) (*walletv1.GrantVipResponse, error) TransferCoinFromSeller(ctx context.Context, req *walletv1.TransferCoinFromSellerRequest) (*walletv1.TransferCoinFromSellerResponse, error) ListCoinSellerSalaryExchangeRateTiers(ctx context.Context, req *walletv1.ListCoinSellerSalaryExchangeRateTiersRequest) (*walletv1.ListCoinSellerSalaryExchangeRateTiersResponse, error) @@ -108,6 +109,10 @@ func (c *grpcWalletClient) PurchaseVip(ctx context.Context, req *walletv1.Purcha return c.client.PurchaseVip(ctx, req) } +func (c *grpcWalletClient) DebitCPBreakupFee(ctx context.Context, req *walletv1.DebitCPBreakupFeeRequest) (*walletv1.DebitCPBreakupFeeResponse, error) { + return c.client.DebitCPBreakupFee(ctx, req) +} + func (c *grpcWalletClient) GrantVip(ctx context.Context, req *walletv1.GrantVipRequest) (*walletv1.GrantVipResponse, error) { return c.client.GrantVip(ctx, req) } diff --git a/services/gateway-service/internal/transport/http/activityapi/weekly_star_handler.go b/services/gateway-service/internal/transport/http/activityapi/weekly_star_handler.go index febb39a2..681066ac 100644 --- a/services/gateway-service/internal/transport/http/activityapi/weekly_star_handler.go +++ b/services/gateway-service/internal/transport/http/activityapi/weekly_star_handler.go @@ -32,8 +32,9 @@ type weeklyStarGiftData struct { } type weeklyStarRewardData struct { - RankNo int32 `json:"rank_no"` - ResourceGroupID int64 `json:"resource_group_id"` + RankNo int32 `json:"rank_no"` + ResourceGroupID int64 `json:"resource_group_id"` + ResourceGroup *achievementResourceGroupData `json:"resource_group,omitempty"` } type weeklyStarEntryData struct { @@ -98,8 +99,12 @@ func (h *Handler) getWeeklyStarCurrent(writer http.ResponseWriter, request *http return } users := h.resolveWeeklyStarUsers(request, weeklyStarUserIDs(resp.GetTopEntries(), resp.GetMyEntry())) + resourceGroups, ok := h.resolveWeeklyStarResourceGroups(writer, request, resp.GetCycle()) + if !ok { + return + } data := weeklyStarCurrentData{ - Cycle: weeklyStarCycleFromProto(resp.GetCycle()), + Cycle: weeklyStarCycleFromProto(resp.GetCycle(), resourceGroups), TopEntries: weeklyStarEntriesFromProto(resp.GetTopEntries(), users), ServerTimeMS: resp.GetServerTimeMs(), } @@ -133,8 +138,12 @@ func (h *Handler) listWeeklyStarLeaderboard(writer http.ResponseWriter, request return } users := h.resolveWeeklyStarUsers(request, weeklyStarUserIDs(resp.GetEntries(), nil)) + resourceGroups, ok := h.resolveWeeklyStarResourceGroups(writer, request, resp.GetCycle()) + if !ok { + return + } httpkit.WriteOK(writer, request, weeklyStarLeaderboardData{ - Cycle: weeklyStarCycleFromProto(resp.GetCycle()), + Cycle: weeklyStarCycleFromProto(resp.GetCycle(), resourceGroups), Entries: weeklyStarEntriesFromProto(resp.GetEntries(), users), NextPageToken: resp.GetNextPageToken(), Total: resp.GetTotal(), @@ -162,14 +171,20 @@ func (h *Handler) listWeeklyStarHistory(writer http.ResponseWriter, request *htt return } ids := make([]int64, 0) + cycleItems := make([]*activityv1.WeeklyStarCycle, 0, len(resp.GetCycles())) for _, cycle := range resp.GetCycles() { ids = append(ids, weeklyStarUserIDs(cycle.GetTopEntries(), nil)...) + cycleItems = append(cycleItems, cycle.GetCycle()) } users := h.resolveWeeklyStarUsers(request, ids) + resourceGroups, ok := h.resolveWeeklyStarResourceGroups(writer, request, cycleItems...) + if !ok { + return + } cycles := make([]weeklyStarHistoryCycleData, 0, len(resp.GetCycles())) for _, item := range resp.GetCycles() { cycles = append(cycles, weeklyStarHistoryCycleData{ - Cycle: weeklyStarCycleFromProto(item.GetCycle()), + Cycle: weeklyStarCycleFromProto(item.GetCycle(), resourceGroups), TopEntries: weeklyStarEntriesFromProto(item.GetTopEntries(), users), }) } @@ -213,7 +228,13 @@ func (h *Handler) resolveWeeklyStarUsers(request *http.Request, ids []int64) map return users } -func weeklyStarCycleFromProto(item *activityv1.WeeklyStarCycle) *weeklyStarCycleData { +func (h *Handler) resolveWeeklyStarResourceGroups(writer http.ResponseWriter, request *http.Request, cycles ...*activityv1.WeeklyStarCycle) (map[int64]achievementResourceGroupData, bool) { + // 周星周期只存奖励资源组 ID,资源名称、类型、素材和数量仍由 wallet-service 资源库统一维护。 + // gateway 在 App 出口补齐这些展示字段,避免 activity-service 复制资源库快照,也让后台改资源组后 App 读取保持一致。 + return h.resolveAchievementResourceGroups(writer, request, weeklyStarResourceGroupIDs(cycles...)) +} + +func weeklyStarCycleFromProto(item *activityv1.WeeklyStarCycle, resourceGroups map[int64]achievementResourceGroupData) *weeklyStarCycleData { if item == nil { return nil } @@ -235,7 +256,11 @@ func weeklyStarCycleFromProto(item *activityv1.WeeklyStarCycle) *weeklyStarCycle cycle.Gifts = append(cycle.Gifts, weeklyStarGiftData{GiftID: gift.GetGiftId(), SortOrder: gift.GetSortOrder()}) } for _, reward := range item.GetRewards() { - cycle.Rewards = append(cycle.Rewards, weeklyStarRewardData{RankNo: reward.GetRankNo(), ResourceGroupID: reward.GetResourceGroupId()}) + rewardData := weeklyStarRewardData{RankNo: reward.GetRankNo(), ResourceGroupID: reward.GetResourceGroupId()} + if group, ok := resourceGroups[reward.GetResourceGroupId()]; ok { + rewardData.ResourceGroup = &group + } + cycle.Rewards = append(cycle.Rewards, rewardData) } return cycle } @@ -273,6 +298,16 @@ func weeklyStarUserIDs(items []*activityv1.WeeklyStarLeaderboardEntry, extra *ac return ids } +func weeklyStarResourceGroupIDs(cycles ...*activityv1.WeeklyStarCycle) []int64 { + ids := make([]int64, 0) + for _, cycle := range cycles { + for _, reward := range cycle.GetRewards() { + ids = append(ids, reward.GetResourceGroupId()) + } + } + return ids +} + func queryInt(request *http.Request, key string, fallback int) int { value, err := strconv.Atoi(strings.TrimSpace(request.URL.Query().Get(key))) if err != nil || value <= 0 { diff --git a/services/gateway-service/internal/transport/http/httproutes/router.go b/services/gateway-service/internal/transport/http/httproutes/router.go index 385f3ca9..1b3f9382 100644 --- a/services/gateway-service/internal/transport/http/httproutes/router.go +++ b/services/gateway-service/internal/transport/http/httproutes/router.go @@ -102,6 +102,7 @@ type UserHandlers struct { AcceptCPApplication http.HandlerFunc RejectCPApplication http.HandlerFunc ListCPRelationships http.HandlerFunc + BreakCPRelationship http.HandlerFunc GetMyProfile http.HandlerFunc GetMyAppearance http.HandlerFunc GetUserAppearance http.HandlerFunc @@ -366,6 +367,7 @@ func (r routes) registerUserRoutes() { r.profile("/cp/applications/{application_id}/accept", http.MethodPost, h.AcceptCPApplication) r.profile("/cp/applications/{application_id}/reject", http.MethodPost, h.RejectCPApplication) r.profile("/cp/relationships", http.MethodGet, h.ListCPRelationships) + r.profile("/cp/relationships/{relationship_id}/break", http.MethodPost, h.BreakCPRelationship) r.profile("/appearance", http.MethodGet, h.GetMyAppearance) r.profile("/users/me/appearance", http.MethodGet, h.GetMyAppearance) r.profile("/users/me", "", h.GetMyProfile) diff --git a/services/gateway-service/internal/transport/http/response_test.go b/services/gateway-service/internal/transport/http/response_test.go index 6c04321b..19b52a2b 100644 --- a/services/gateway-service/internal/transport/http/response_test.go +++ b/services/gateway-service/internal/transport/http/response_test.go @@ -567,6 +567,16 @@ type fakeAchievementClient struct { err error } +type fakeWeeklyStarClient struct { + lastCurrent *activityv1.GetWeeklyStarCurrentRequest + currentResp *activityv1.GetWeeklyStarCurrentResponse + lastLeaderboard *activityv1.ListWeeklyStarLeaderboardRequest + leaderboardResp *activityv1.ListWeeklyStarLeaderboardResponse + lastHistory *activityv1.ListWeeklyStarHistoryRequest + historyResp *activityv1.ListWeeklyStarHistoryResponse + err error +} + type fakeBroadcastClient struct { lastRemove *activityv1.RemoveRegionBroadcastMemberRequest err error @@ -1159,6 +1169,39 @@ func (f *fakeAchievementClient) SetBadgeDisplay(_ context.Context, req *activity return &activityv1.SetBadgeDisplayResponse{}, nil } +func (f *fakeWeeklyStarClient) GetWeeklyStarCurrent(_ context.Context, req *activityv1.GetWeeklyStarCurrentRequest) (*activityv1.GetWeeklyStarCurrentResponse, error) { + f.lastCurrent = req + if f.err != nil { + return nil, f.err + } + if f.currentResp != nil { + return f.currentResp, nil + } + return &activityv1.GetWeeklyStarCurrentResponse{}, nil +} + +func (f *fakeWeeklyStarClient) ListWeeklyStarLeaderboard(_ context.Context, req *activityv1.ListWeeklyStarLeaderboardRequest) (*activityv1.ListWeeklyStarLeaderboardResponse, error) { + f.lastLeaderboard = req + if f.err != nil { + return nil, f.err + } + if f.leaderboardResp != nil { + return f.leaderboardResp, nil + } + return &activityv1.ListWeeklyStarLeaderboardResponse{}, nil +} + +func (f *fakeWeeklyStarClient) ListWeeklyStarHistory(_ context.Context, req *activityv1.ListWeeklyStarHistoryRequest) (*activityv1.ListWeeklyStarHistoryResponse, error) { + f.lastHistory = req + if f.err != nil { + return nil, f.err + } + if f.historyResp != nil { + return f.historyResp, nil + } + return &activityv1.ListWeeklyStarHistoryResponse{}, nil +} + func (f *fakeBroadcastClient) RemoveRegionBroadcastMember(_ context.Context, req *activityv1.RemoveRegionBroadcastMemberRequest) (*activityv1.RemoveRegionBroadcastMemberResponse, error) { f.lastRemove = req if f.err != nil { @@ -1543,6 +1586,10 @@ func (f *fakeWalletClient) PurchaseVip(_ context.Context, req *walletv1.Purchase return &walletv1.PurchaseVipResponse{}, nil } +func (f *fakeWalletClient) DebitCPBreakupFee(context.Context, *walletv1.DebitCPBreakupFeeRequest) (*walletv1.DebitCPBreakupFeeResponse, error) { + return &walletv1.DebitCPBreakupFeeResponse{}, nil +} + func (f *fakeWalletClient) GrantVip(_ context.Context, req *walletv1.GrantVipRequest) (*walletv1.GrantVipResponse, error) { f.lastGrantVip = req if f.vipErr != nil { @@ -2429,6 +2476,116 @@ func TestListRoomsUsesUserRegionFromUserService(t *testing.T) { } } +func TestGetRoomRocketEmbedsRewardResourceGroups(t *testing.T) { + queryClient := &fakeRoomQueryClient{rocketResp: &roomv1.GetRoomRocketResponse{ + Rocket: &roomv1.RoomRocketInfo{ + Enabled: true, + LaunchDelayMs: 1200, + Levels: []*roomv1.RoomRocketLevel{{ + Level: 1, + FuelThreshold: 100, + InRoomRewards: []*roomv1.RoomRocketRewardItem{{ + RewardItemId: "in-room-coin", + ResourceGroupId: 23, + Weight: 100, + DisplayName: "1888 Coins", + }}, + }}, + State: &roomv1.RoomRocketState{ + CurrentLevel: 1, + CurrentFuel: 0, + FuelThreshold: 100, + Status: "charging", + LastRewards: []*roomv1.RoomRocketRewardGrant{{ + RewardRole: "igniter", + UserId: 42, + RewardItemId: "chat-bubble", + ResourceGroupId: 24, + DisplayName: "Blue Bubble", + Status: "succeeded", + }}, + }, + }, + ServerTimeMs: 1_780_000_000_000, + }} + walletClient := &fakeWalletClient{resourceGroupsByID: map[int64]*walletv1.ResourceGroup{ + 23: { + GroupId: 23, + GroupCode: "coin_1888", + Name: "Coin Reward", + Status: "active", + Items: []*walletv1.ResourceGroupItem{{ + GroupItemId: 2301, + ItemType: "wallet_asset", + WalletAssetType: "COIN", + WalletAssetAmount: 1888, + Quantity: 1, + }}, + }, + 24: { + GroupId: 24, + GroupCode: "bubble_7d", + Name: "Chat Bubble", + Status: "active", + Items: []*walletv1.ResourceGroupItem{{ + GroupItemId: 2401, + ItemType: "resource", + ResourceId: 8101, + Resource: &walletv1.Resource{ + ResourceId: 8101, + ResourceCode: "bubble_blue", + ResourceType: "chat_bubble", + Name: "Blue Bubble", + Status: "active", + AssetUrl: "https://cdn.example/bubble.png", + }, + Quantity: 1, + DurationMs: 604800000, + }}, + }, + }} + handler := NewHandlerWithClients(&fakeRoomClient{}, nil, nil, &fakeUserProfileClient{}) + handler.SetRoomQueryClient(queryClient) + handler.SetWalletClient(walletClient) + router := handler.Routes(auth.NewVerifier("secret")) + request := httptest.NewRequest(http.MethodGet, "/api/v1/rooms/room_1001/rocket", nil) + request.Header.Set("Authorization", "Bearer "+signGatewayToken(t, "secret", 42)) + request.Header.Set("X-Request-ID", "req-room-rocket") + recorder := httptest.NewRecorder() + + router.ServeHTTP(recorder, request) + + if recorder.Code != http.StatusOK { + t.Fatalf("status mismatch: got %d body=%s", recorder.Code, recorder.Body.String()) + } + if queryClient.lastRocket == nil || queryClient.lastRocket.GetViewerUserId() != 42 || queryClient.lastRocket.GetRoomId() != "room_1001" { + t.Fatalf("GetRoomRocket must forward authenticated viewer and room: %+v", queryClient.lastRocket) + } + var envelope httpkit.ResponseEnvelope + if err := json.NewDecoder(recorder.Body).Decode(&envelope); err != nil { + t.Fatalf("decode rocket response failed: %v", err) + } + data := envelope.Data.(map[string]any) + level := data["levels"].([]any)[0].(map[string]any) + inRoomReward := level["in_room_rewards"].([]any)[0].(map[string]any) + inRoomGroup := inRoomReward["resource_group"].(map[string]any) + if inRoomReward["resource_group_id"].(float64) != 23 || inRoomGroup["group_id"].(float64) != 23 { + t.Fatalf("rocket reward must embed resource group id 23: %+v", inRoomReward) + } + coinItem := inRoomGroup["items"].([]any)[0].(map[string]any) + if coinItem["item_type"] != "wallet_asset" || coinItem["wallet_asset_type"] != "COIN" || coinItem["wallet_asset_amount"].(float64) != 1888 { + t.Fatalf("rocket reward group must expose wallet asset amount: %+v", coinItem) + } + state := data["state"].(map[string]any) + lastReward := state["last_rewards"].([]any)[0].(map[string]any) + lastGroup := lastReward["resource_group"].(map[string]any) + resourceItem := lastGroup["items"].([]any)[0].(map[string]any) + resource := resourceItem["resource"].(map[string]any) + if lastReward["resource_group_id"].(float64) != 24 || resource["resource_type"] != "chat_bubble" || resource["asset_url"] != "https://cdn.example/bubble.png" || resourceItem["duration_ms"].(float64) != 604800000 { + t.Fatalf("rocket last reward must expose resource material and duration: reward=%+v item=%+v", lastReward, resourceItem) + } +} + func TestListRoomsRejectsCountryOutsideUserRegion(t *testing.T) { profileClient := &fakeUserProfileClient{regionID: 1001} regionClient := &fakeUserRegionClient{resp: &userv1.RegionResponse{Region: &userv1.Region{ @@ -4821,6 +4978,141 @@ func TestAchievementAndBadgeRoutesEmbedResourceMaterials(t *testing.T) { } } +func TestWeeklyStarCurrentEmbedsRewardResourceGroups(t *testing.T) { + rewardResource := &walletv1.Resource{ + ResourceId: 8101, + ResourceCode: "weekly_star_frame", + ResourceType: "avatar_frame", + Name: "Weekly Star Frame", + Status: "active", + Grantable: true, + WalletAssetType: "FRAME", + UsageScopes: []string{"profile"}, + AssetUrl: "https://cdn.example/weekly-frame.png", + PreviewUrl: "https://cdn.example/weekly-frame-preview.png", + SortOrder: 10, + } + weeklyStarClient := &fakeWeeklyStarClient{ + currentResp: &activityv1.GetWeeklyStarCurrentResponse{ + Cycle: &activityv1.WeeklyStarCycle{ + CycleId: "wstar-test", + ActivityCode: "weekly_star", + RegionId: 686, + Title: "Weekly Star", + Status: "active", + StartMs: 1780848000000, + EndMs: 1781452740000, + Gifts: []*activityv1.WeeklyStarGift{{ + GiftId: "308", + SortOrder: 1, + }}, + Rewards: []*activityv1.WeeklyStarReward{{ + RankNo: 1, + ResourceGroupId: 23, + }}, + }, + TopEntries: []*activityv1.WeeklyStarLeaderboardEntry{{ + RankNo: 1, + UserId: 88, + Score: 120000, + FirstScoredAtMs: 1780849000000, + LastScoredAtMs: 1780849900000, + }}, + ServerTimeMs: 1780916324006, + }, + } + walletClient := &fakeWalletClient{ + resourceGroupsByID: map[int64]*walletv1.ResourceGroup{23: { + GroupId: 23, + GroupCode: "weekly_star_top1", + Name: "Top 1 Resource Group", + Status: "active", + Description: "Top 1 reward materials", + Items: []*walletv1.ResourceGroupItem{{ + GroupItemId: 501, + ItemType: "resource", + ResourceId: 8101, + Resource: rewardResource, + Quantity: 1, + DurationMs: 7 * 24 * int64(time.Hour/time.Millisecond), + SortOrder: 1, + }}, + }}, + } + userClient := &fakeUserProfileClient{ + regionID: 686, + usersByID: map[int64]*userv1.User{ + 88: { + UserId: 88, + DisplayUserId: "163088", + Username: "weekly_ranker", + Avatar: "https://cdn.example/ranker.png", + RegionId: 686, + }, + }, + } + handler := NewHandlerWithClients(&fakeRoomClient{}, nil, nil, userClient) + handler.SetWeeklyStarClient(weeklyStarClient) + handler.SetWalletClient(walletClient) + router := handler.Routes(auth.NewVerifier("secret")) + + request := httptest.NewRequest(http.MethodGet, "/api/v1/activities/weekly-star/current", nil) + request.Header.Set("Authorization", "Bearer "+signGatewayToken(t, "secret", 42)) + recorder := httptest.NewRecorder() + router.ServeHTTP(recorder, request) + if recorder.Code != http.StatusOK { + t.Fatalf("weekly star current status mismatch: got %d body=%s", recorder.Code, recorder.Body.String()) + } + var envelope struct { + Code string `json:"code"` + Data struct { + Cycle struct { + Rewards []struct { + RankNo int32 `json:"rank_no"` + ResourceGroupID int64 `json:"resource_group_id"` + ResourceGroup struct { + GroupID int64 `json:"group_id"` + Name string `json:"name"` + Items []struct { + ResourceID int64 `json:"resource_id"` + Quantity int64 `json:"quantity"` + DurationMS int64 `json:"duration_ms"` + Resource struct { + ResourceID int64 `json:"resource_id"` + ResourceType string `json:"resource_type"` + Name string `json:"name"` + AssetURL string `json:"asset_url"` + } `json:"resource"` + } `json:"items"` + } `json:"resource_group"` + } `json:"rewards"` + } `json:"cycle"` + TopEntries []struct { + User struct { + Username string `json:"username"` + } `json:"user"` + } `json:"top_entries"` + } `json:"data"` + } + if err := json.NewDecoder(recorder.Body).Decode(&envelope); err != nil { + t.Fatalf("decode weekly star current response failed: %v", err) + } + if weeklyStarClient.lastCurrent == nil || weeklyStarClient.lastCurrent.GetRegionId() != 686 || weeklyStarClient.lastCurrent.GetUserId() != 42 { + t.Fatalf("weekly star current request mismatch: %+v", weeklyStarClient.lastCurrent) + } + firstReward := envelope.Data.Cycle.Rewards[0] + if envelope.Code != httpkit.CodeOK || firstReward.ResourceGroupID != 23 || firstReward.ResourceGroup.GroupID != 23 || firstReward.ResourceGroup.Name != "Top 1 Resource Group" { + t.Fatalf("weekly star reward group envelope mismatch: %+v", envelope) + } + firstItem := firstReward.ResourceGroup.Items[0] + if firstItem.ResourceID != 8101 || firstItem.Quantity != 1 || firstItem.DurationMS == 0 || firstItem.Resource.Name != "Weekly Star Frame" || firstItem.Resource.ResourceType != "avatar_frame" || firstItem.Resource.AssetURL == "" { + t.Fatalf("weekly star reward item must embed resource material details: %+v", firstItem) + } + if len(envelope.Data.TopEntries) != 1 || envelope.Data.TopEntries[0].User.Username != "weekly_ranker" { + t.Fatalf("weekly star leaderboard user enrichment mismatch: %+v", envelope.Data.TopEntries) + } +} + func TestAppearanceAggregatesEquippedResourcesAndBadges(t *testing.T) { frameResource := &walletv1.Resource{ ResourceId: 8101, diff --git a/services/gateway-service/internal/transport/http/roomapi/room_handler.go b/services/gateway-service/internal/transport/http/roomapi/room_handler.go index 5e7d4d80..61f3a28c 100644 --- a/services/gateway-service/internal/transport/http/roomapi/room_handler.go +++ b/services/gateway-service/internal/transport/http/roomapi/room_handler.go @@ -740,7 +740,41 @@ func (h *Handler) getRoomRocket(writer http.ResponseWriter, request *http.Reques httpkit.WriteRPCError(writer, request, err) return } - httpkit.WriteOK(writer, request, roomRocketDataFromProto(resp)) + resourceGroups, ok := h.resolveRoomRocketResourceGroups(writer, request, resp) + if !ok { + return + } + httpkit.WriteOK(writer, request, roomRocketDataFromProto(resp, resourceGroups)) +} + +// resolveRoomRocketResourceGroups 展开奖励池和最近中奖结果引用的资源组。 +// room-service 只保存房间状态和奖励资源组 ID;gateway 在 HTTP 出口补齐素材和钱包资产明细,避免 Room Cell 持有展示快照。 +func (h *Handler) resolveRoomRocketResourceGroups(writer http.ResponseWriter, request *http.Request, resp *roomv1.GetRoomRocketResponse) (map[int64]*roomRocketResourceGroupData, bool) { + ids := roomRocketResourceGroupIDs(resp) + groups := make(map[int64]*roomRocketResourceGroupData, len(ids)) + if len(ids) == 0 { + return groups, true + } + if h.walletClient == nil { + httpkit.WriteError(writer, request, http.StatusBadGateway, httpkit.CodeUpstreamError, "upstream service error") + return nil, false + } + for _, id := range ids { + groupResp, err := h.walletClient.GetResourceGroup(request.Context(), &walletv1.GetResourceGroupRequest{ + RequestId: httpkit.RequestIDFromContext(request.Context()), + AppCode: appcode.FromContext(request.Context()), + GroupId: id, + }) + if err != nil { + httpkit.WriteRPCError(writer, request, err) + return nil, false + } + group := roomRocketResourceGroupFromProto(groupResp.GetGroup()) + if group != nil && group.GroupID > 0 { + groups[group.GroupID] = group + } + } + return groups, true } // handleRoomFollow 建立或取消当前用户对房间的关注关系。 diff --git a/services/gateway-service/internal/transport/http/roomapi/room_view.go b/services/gateway-service/internal/transport/http/roomapi/room_view.go index 5595e850..c7b9423f 100644 --- a/services/gateway-service/internal/transport/http/roomapi/room_view.go +++ b/services/gateway-service/internal/transport/http/roomapi/room_view.go @@ -6,6 +6,7 @@ import ( "hyapp/pkg/tencentrtc" roomv1 "hyapp.local/api/proto/room/v1" + walletv1 "hyapp.local/api/proto/wallet/v1" ) const joinRoomContributionRankLimit = 10 @@ -203,11 +204,12 @@ type roomRocketLevelData struct { } type roomRocketRewardData struct { - RewardItemID string `json:"reward_item_id"` - ResourceGroupID int64 `json:"resource_group_id"` - Weight int64 `json:"weight,omitempty"` - DisplayName string `json:"display_name,omitempty"` - IconURL string `json:"icon_url,omitempty"` + RewardItemID string `json:"reward_item_id"` + ResourceGroupID int64 `json:"resource_group_id"` + ResourceGroup *roomRocketResourceGroupData `json:"resource_group,omitempty"` + Weight int64 `json:"weight,omitempty"` + DisplayName string `json:"display_name,omitempty"` + IconURL string `json:"icon_url,omitempty"` } type roomRocketStateData struct { @@ -241,14 +243,59 @@ type roomRocketPendingLaunchData struct { } type roomRocketRewardGrantData struct { - RewardRole string `json:"reward_role"` - UserID string `json:"user_id"` - RewardItemID string `json:"reward_item_id"` - ResourceGroupID int64 `json:"resource_group_id"` - DisplayName string `json:"display_name,omitempty"` - IconURL string `json:"icon_url,omitempty"` - GrantID string `json:"grant_id,omitempty"` - Status string `json:"status,omitempty"` + RewardRole string `json:"reward_role"` + UserID string `json:"user_id"` + RewardItemID string `json:"reward_item_id"` + ResourceGroupID int64 `json:"resource_group_id"` + ResourceGroup *roomRocketResourceGroupData `json:"resource_group,omitempty"` + DisplayName string `json:"display_name,omitempty"` + IconURL string `json:"icon_url,omitempty"` + GrantID string `json:"grant_id,omitempty"` + Status string `json:"status,omitempty"` +} + +type roomRocketResourceData struct { + ResourceID int64 `json:"resource_id"` + ResourceCode string `json:"resource_code"` + ResourceType string `json:"resource_type"` + Name string `json:"name"` + Status string `json:"status"` + Grantable bool `json:"grantable"` + GrantStrategy string `json:"grant_strategy"` + WalletAssetType string `json:"wallet_asset_type,omitempty"` + WalletAssetAmount int64 `json:"wallet_asset_amount,omitempty"` + UsageScopes []string `json:"usage_scopes"` + AssetURL string `json:"asset_url"` + PreviewURL string `json:"preview_url"` + AnimationURL string `json:"animation_url"` + MetadataJSON string `json:"metadata_json"` + SortOrder int32 `json:"sort_order"` + CreatedAtMS int64 `json:"created_at_ms"` + UpdatedAtMS int64 `json:"updated_at_ms"` +} + +type roomRocketResourceGroupItemData struct { + GroupItemID int64 `json:"group_item_id"` + ItemType string `json:"item_type"` + ResourceID int64 `json:"resource_id"` + Resource *roomRocketResourceData `json:"resource,omitempty"` + WalletAssetType string `json:"wallet_asset_type,omitempty"` + WalletAssetAmount int64 `json:"wallet_asset_amount,omitempty"` + Quantity int64 `json:"quantity"` + DurationMS int64 `json:"duration_ms"` + SortOrder int32 `json:"sort_order"` +} + +type roomRocketResourceGroupData struct { + GroupID int64 `json:"group_id"` + GroupCode string `json:"group_code"` + Name string `json:"name"` + Status string `json:"status"` + Description string `json:"description"` + SortOrder int32 `json:"sort_order"` + Items []roomRocketResourceGroupItemData `json:"items"` + CreatedAtMS int64 `json:"created_at_ms"` + UpdatedAtMS int64 `json:"updated_at_ms"` } type roomGiftRecipientData struct { @@ -418,15 +465,15 @@ func createRoomDataFromProto(resp *roomv1.CreateRoomResponse) createRoomData { } } -func roomRocketDataFromProto(resp *roomv1.GetRoomRocketResponse) roomRocketData { +func roomRocketDataFromProto(resp *roomv1.GetRoomRocketResponse, resourceGroups map[int64]*roomRocketResourceGroupData) roomRocketData { if resp == nil || resp.GetRocket() == nil { return roomRocketData{} } rocket := resp.GetRocket() return roomRocketData{ Enabled: rocket.GetEnabled(), - Levels: roomRocketLevelsFromProto(rocket.GetLevels()), - State: roomRocketStateFromProto(rocket.GetState()), + Levels: roomRocketLevelsFromProto(rocket.GetLevels(), resourceGroups), + State: roomRocketStateFromProto(rocket.GetState(), resourceGroups), BroadcastScope: rocket.GetBroadcastScope(), LaunchDelayMS: rocket.GetLaunchDelayMs(), BroadcastDelayMS: rocket.GetBroadcastDelayMs(), @@ -435,7 +482,7 @@ func roomRocketDataFromProto(resp *roomv1.GetRoomRocketResponse) roomRocketData } } -func roomRocketLevelsFromProto(levels []*roomv1.RoomRocketLevel) []roomRocketLevelData { +func roomRocketLevelsFromProto(levels []*roomv1.RoomRocketLevel, resourceGroups map[int64]*roomRocketResourceGroupData) []roomRocketLevelData { out := make([]roomRocketLevelData, 0, len(levels)) for _, level := range levels { out = append(out, roomRocketLevelData{ @@ -445,20 +492,21 @@ func roomRocketLevelsFromProto(levels []*roomv1.RoomRocketLevel) []roomRocketLev AnimationURL: level.GetAnimationUrl(), LaunchAnimationURL: level.GetLaunchAnimationUrl(), LaunchedImageURL: level.GetLaunchedImageUrl(), - InRoomRewards: roomRocketRewardsFromProto(level.GetInRoomRewards()), - Top1Rewards: roomRocketRewardsFromProto(level.GetTop1Rewards()), - IgniterRewards: roomRocketRewardsFromProto(level.GetIgniterRewards()), + InRoomRewards: roomRocketRewardsFromProto(level.GetInRoomRewards(), resourceGroups), + Top1Rewards: roomRocketRewardsFromProto(level.GetTop1Rewards(), resourceGroups), + IgniterRewards: roomRocketRewardsFromProto(level.GetIgniterRewards(), resourceGroups), }) } return out } -func roomRocketRewardsFromProto(rewards []*roomv1.RoomRocketRewardItem) []roomRocketRewardData { +func roomRocketRewardsFromProto(rewards []*roomv1.RoomRocketRewardItem, resourceGroups map[int64]*roomRocketResourceGroupData) []roomRocketRewardData { out := make([]roomRocketRewardData, 0, len(rewards)) for _, reward := range rewards { out = append(out, roomRocketRewardData{ RewardItemID: reward.GetRewardItemId(), ResourceGroupID: reward.GetResourceGroupId(), + ResourceGroup: resourceGroups[reward.GetResourceGroupId()], Weight: reward.GetWeight(), DisplayName: reward.GetDisplayName(), IconURL: reward.GetIconUrl(), @@ -467,7 +515,7 @@ func roomRocketRewardsFromProto(rewards []*roomv1.RoomRocketRewardItem) []roomRo return out } -func roomRocketStateFromProto(state *roomv1.RoomRocketState) roomRocketStateData { +func roomRocketStateFromProto(state *roomv1.RoomRocketState, resourceGroups map[int64]*roomRocketResourceGroupData) roomRocketStateData { if state == nil { return roomRocketStateData{} } @@ -484,7 +532,7 @@ func roomRocketStateFromProto(state *roomv1.RoomRocketState) roomRocketStateData IgniterUserID: formatOptionalUserID(state.GetIgniterUserId()), RocketID: state.GetRocketId(), ConfigVersion: state.GetConfigVersion(), - LastRewards: roomRocketRewardGrantsFromProto(state.GetLastRewards()), + LastRewards: roomRocketRewardGrantsFromProto(state.GetLastRewards(), resourceGroups), PendingLaunches: roomRocketPendingLaunchesFromProto(state.GetPendingLaunches()), } } @@ -508,7 +556,7 @@ func roomRocketPendingLaunchesFromProto(launches []*roomv1.RoomRocketPendingLaun return out } -func roomRocketRewardGrantsFromProto(rewards []*roomv1.RoomRocketRewardGrant) []roomRocketRewardGrantData { +func roomRocketRewardGrantsFromProto(rewards []*roomv1.RoomRocketRewardGrant, resourceGroups map[int64]*roomRocketResourceGroupData) []roomRocketRewardGrantData { out := make([]roomRocketRewardGrantData, 0, len(rewards)) for _, reward := range rewards { out = append(out, roomRocketRewardGrantData{ @@ -516,6 +564,7 @@ func roomRocketRewardGrantsFromProto(rewards []*roomv1.RoomRocketRewardGrant) [] UserID: formatOptionalUserID(reward.GetUserId()), RewardItemID: reward.GetRewardItemId(), ResourceGroupID: reward.GetResourceGroupId(), + ResourceGroup: resourceGroups[reward.GetResourceGroupId()], DisplayName: reward.GetDisplayName(), IconURL: reward.GetIconUrl(), GrantID: reward.GetGrantId(), @@ -525,6 +574,95 @@ func roomRocketRewardGrantsFromProto(rewards []*roomv1.RoomRocketRewardGrant) [] return out } +func roomRocketResourceGroupIDs(resp *roomv1.GetRoomRocketResponse) []int64 { + if resp == nil || resp.GetRocket() == nil { + return nil + } + seen := map[int64]struct{}{} + ids := make([]int64, 0) + add := func(id int64) { + if id <= 0 { + return + } + if _, exists := seen[id]; exists { + return + } + seen[id] = struct{}{} + ids = append(ids, id) + } + for _, level := range resp.GetRocket().GetLevels() { + for _, reward := range level.GetInRoomRewards() { + add(reward.GetResourceGroupId()) + } + for _, reward := range level.GetTop1Rewards() { + add(reward.GetResourceGroupId()) + } + for _, reward := range level.GetIgniterRewards() { + add(reward.GetResourceGroupId()) + } + } + for _, reward := range resp.GetRocket().GetState().GetLastRewards() { + add(reward.GetResourceGroupId()) + } + return ids +} + +func roomRocketResourceGroupFromProto(group *walletv1.ResourceGroup) *roomRocketResourceGroupData { + if group == nil { + return nil + } + items := make([]roomRocketResourceGroupItemData, 0, len(group.GetItems())) + for _, item := range group.GetItems() { + items = append(items, roomRocketResourceGroupItemData{ + GroupItemID: item.GetGroupItemId(), + ItemType: item.GetItemType(), + ResourceID: item.GetResourceId(), + Resource: roomRocketResourceFromProto(item.GetResource()), + WalletAssetType: item.GetWalletAssetType(), + WalletAssetAmount: item.GetWalletAssetAmount(), + Quantity: item.GetQuantity(), + DurationMS: item.GetDurationMs(), + SortOrder: item.GetSortOrder(), + }) + } + return &roomRocketResourceGroupData{ + GroupID: group.GetGroupId(), + GroupCode: group.GetGroupCode(), + Name: group.GetName(), + Status: group.GetStatus(), + Description: group.GetDescription(), + SortOrder: group.GetSortOrder(), + Items: items, + CreatedAtMS: group.GetCreatedAtMs(), + UpdatedAtMS: group.GetUpdatedAtMs(), + } +} + +func roomRocketResourceFromProto(item *walletv1.Resource) *roomRocketResourceData { + if item == nil { + return nil + } + return &roomRocketResourceData{ + ResourceID: item.GetResourceId(), + ResourceCode: item.GetResourceCode(), + ResourceType: item.GetResourceType(), + Name: item.GetName(), + Status: item.GetStatus(), + Grantable: item.GetGrantable(), + GrantStrategy: item.GetGrantStrategy(), + WalletAssetType: item.GetWalletAssetType(), + WalletAssetAmount: item.GetWalletAssetAmount(), + UsageScopes: item.GetUsageScopes(), + AssetURL: item.GetAssetUrl(), + PreviewURL: item.GetPreviewUrl(), + AnimationURL: item.GetAnimationUrl(), + MetadataJSON: item.GetMetadataJson(), + SortOrder: item.GetSortOrder(), + CreatedAtMS: item.GetCreatedAtMs(), + UpdatedAtMS: item.GetUpdatedAtMs(), + } +} + func roomListItemDataFromProto(room *roomv1.RoomListItem) roomListItemData { if room == nil { return roomListItemData{} diff --git a/services/gateway-service/internal/transport/http/userapi/cp_handler.go b/services/gateway-service/internal/transport/http/userapi/cp_handler.go index 71372058..e36ba75b 100644 --- a/services/gateway-service/internal/transport/http/userapi/cp_handler.go +++ b/services/gateway-service/internal/transport/http/userapi/cp_handler.go @@ -5,6 +5,7 @@ import ( "strings" userv1 "hyapp.local/api/proto/user/v1" + walletv1 "hyapp.local/api/proto/wallet/v1" "hyapp/services/gateway-service/internal/auth" "hyapp/services/gateway-service/internal/transport/http/httpkit" ) @@ -54,7 +55,9 @@ type cpRelationshipData struct { NeededForNextLevel int64 `json:"needed_for_next_level"` LevelProgressPercent int32 `json:"level_progress_percent"` MaxLevel bool `json:"max_level"` + BreakupCostCoins int64 `json:"breakup_cost_coins"` FormedAtMS int64 `json:"formed_at_ms"` + EndedAtMS int64 `json:"ended_at_ms"` UpdatedAtMS int64 `json:"updated_at_ms"` } @@ -62,6 +65,10 @@ type cpRejectRequest struct { Reason string `json:"reason"` } +type cpBreakRelationshipRequest struct { + CommandID string `json:"command_id"` +} + // listCPApplications 返回当前用户收到或发出的 CP/兄弟/姐妹申请。 func (h *Handler) listCPApplications(writer http.ResponseWriter, request *http.Request) { if h.userCPClient == nil { @@ -182,6 +189,96 @@ func (h *Handler) listCPRelationships(writer http.ResponseWriter, request *http. }) } +// breakCPRelationship 先在 user-service 创建解除占位,再扣钱包,最后确认关系 ended,避免并发请求重复扣费。 +func (h *Handler) breakCPRelationship(writer http.ResponseWriter, request *http.Request) { + if h.userCPClient == nil || h.walletClient == nil { + httpkit.WriteError(writer, request, http.StatusBadGateway, httpkit.CodeUpstreamError, "upstream service error") + return + } + relationshipID := strings.TrimSpace(request.PathValue("relationship_id")) + if relationshipID == "" { + httpkit.WriteError(writer, request, http.StatusNotFound, httpkit.CodeNotFound, "not found") + return + } + var body cpBreakRelationshipRequest + if !httpkit.Decode(writer, request, &body) { + return + } + commandID := strings.TrimSpace(body.CommandID) + if commandID == "" { + httpkit.WriteError(writer, request, http.StatusBadRequest, httpkit.CodeInvalidArgument, "command_id is required") + return + } + userID := auth.UserIDFromContext(request.Context()) + meta := httpkit.UserMeta(request, "") + prepare, err := h.userCPClient.PrepareBreakCPRelationship(request.Context(), &userv1.PrepareBreakCPRelationshipRequest{ + Meta: meta, + UserId: userID, + RelationshipId: relationshipID, + CommandId: commandID, + }) + if err != nil { + httpkit.WriteRPCError(writer, request, err) + return + } + if prepare.GetStatus() == "confirmed" { + httpkit.WriteOK(writer, request, map[string]any{ + "relationship": cpRelationshipFromProto(prepare.GetRelationship()), + "breakup_cost_coins": prepare.GetBreakupCostCoins(), + "wallet_transaction_id": prepare.GetWalletTransactionId(), + "coin_balance_after": prepare.GetCoinBalanceAfter(), + }) + return + } + + walletTransactionID := "" + coinBalanceAfter := int64(0) + cost := prepare.GetBreakupCostCoins() + if cost > 0 { + walletResp, walletErr := h.walletClient.DebitCPBreakupFee(request.Context(), &walletv1.DebitCPBreakupFeeRequest{ + CommandId: commandID, + AppCode: meta.GetAppCode(), + UserId: userID, + RelationshipId: relationshipID, + RelationType: prepare.GetRelationship().GetRelationType(), + Amount: cost, + }) + if walletErr != nil { + // 钱包失败表示关系不应解除;取消 pending 占位后把真实钱包错误返回给客户端。 + _, _ = h.userCPClient.CancelBreakCPRelationship(request.Context(), &userv1.CancelBreakCPRelationshipRequest{ + Meta: meta, + UserId: userID, + RelationshipId: relationshipID, + CommandId: commandID, + Reason: "wallet_debit_failed", + }) + httpkit.WriteRPCError(writer, request, walletErr) + return + } + walletTransactionID = walletResp.GetTransactionId() + coinBalanceAfter = walletResp.GetCoinBalanceAfter() + } + confirmed, err := h.userCPClient.ConfirmBreakCPRelationship(request.Context(), &userv1.ConfirmBreakCPRelationshipRequest{ + Meta: meta, + UserId: userID, + RelationshipId: relationshipID, + CommandId: commandID, + WalletTransactionId: walletTransactionID, + PaidCoinAmount: cost, + CoinBalanceAfter: coinBalanceAfter, + }) + if err != nil { + httpkit.WriteRPCError(writer, request, err) + return + } + httpkit.WriteOK(writer, request, map[string]any{ + "relationship": cpRelationshipFromProto(confirmed.GetRelationship()), + "breakup_cost_coins": confirmed.GetBreakupCostCoins(), + "wallet_transaction_id": confirmed.GetWalletTransactionId(), + "coin_balance_after": confirmed.GetCoinBalanceAfter(), + }) +} + func cpApplicationFromProto(item *userv1.CPApplication) cpApplicationData { if item == nil { return cpApplicationData{} @@ -219,7 +316,9 @@ func cpRelationshipFromProto(item *userv1.CPRelationship) cpRelationshipData { NeededForNextLevel: item.GetNeededForNextLevel(), LevelProgressPercent: item.GetLevelProgressPercent(), MaxLevel: item.GetMaxLevel(), + BreakupCostCoins: item.GetBreakupCostCoins(), FormedAtMS: item.GetFormedAtMs(), + EndedAtMS: item.GetEndedAtMs(), UpdatedAtMS: item.GetUpdatedAtMs(), } } diff --git a/services/gateway-service/internal/transport/http/userapi/cp_handler_test.go b/services/gateway-service/internal/transport/http/userapi/cp_handler_test.go index 01562305..0919414a 100644 --- a/services/gateway-service/internal/transport/http/userapi/cp_handler_test.go +++ b/services/gateway-service/internal/transport/http/userapi/cp_handler_test.go @@ -18,7 +18,9 @@ func TestCPRelationshipFromProtoIncludesLevelProgress(t *testing.T) { NeededForNextLevel: 120, LevelProgressPercent: 40, MaxLevel: false, + BreakupCostCoins: 88, FormedAtMs: 1700000000000, + EndedAtMs: 1700000002000, UpdatedAtMs: 1700000001000, } @@ -27,7 +29,9 @@ func TestCPRelationshipFromProtoIncludesLevelProgress(t *testing.T) { got.NextLevelThreshold != 300 || got.NeededForNextLevel != 120 || got.LevelProgressPercent != 40 || - got.MaxLevel { + got.MaxLevel || + got.BreakupCostCoins != 88 || + got.EndedAtMS != 1700000002000 { t.Fatalf("relationship progress fields not mapped: %+v", got) } } diff --git a/services/gateway-service/internal/transport/http/userapi/handler.go b/services/gateway-service/internal/transport/http/userapi/handler.go index 76ea1b8a..e5dbf787 100644 --- a/services/gateway-service/internal/transport/http/userapi/handler.go +++ b/services/gateway-service/internal/transport/http/userapi/handler.go @@ -88,6 +88,7 @@ func (h *Handler) UserHandlers() httproutes.UserHandlers { AcceptCPApplication: h.acceptCPApplication, RejectCPApplication: h.rejectCPApplication, ListCPRelationships: h.listCPRelationships, + BreakCPRelationship: h.breakCPRelationship, GetMyProfile: h.getMyProfile, GetMyAppearance: h.getMyAppearance, GetUserAppearance: h.getUserAppearance, diff --git a/services/user-service/deploy/mysql/initdb/001_user_service.sql b/services/user-service/deploy/mysql/initdb/001_user_service.sql index 5dc2de57..72c936c6 100644 --- a/services/user-service/deploy/mysql/initdb/001_user_service.sql +++ b/services/user-service/deploy/mysql/initdb/001_user_service.sql @@ -425,6 +425,7 @@ CREATE TABLE IF NOT EXISTS user_cp_relation_configs ( relation_type VARCHAR(32) NOT NULL COMMENT '关系类型:cp、brother、sister', max_count_per_user INT NOT NULL COMMENT '每个用户可拥有的该类型 active 关系数量上限', application_expire_hours INT NOT NULL COMMENT '申请过期小时数', + breakup_cost_coins BIGINT NOT NULL DEFAULT 0 COMMENT '用户主动解除该类型关系需要支付的金币数', status VARCHAR(32) NOT NULL DEFAULT 'active' COMMENT '业务状态', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', updated_at_ms BIGINT NOT NULL COMMENT '更新时间,UTC epoch ms', @@ -487,6 +488,11 @@ CREATE TABLE IF NOT EXISTS user_cp_relationships ( source_application_id VARCHAR(128) NOT NULL DEFAULT '' COMMENT '建立关系的申请 ID', formed_at_ms BIGINT NOT NULL COMMENT '建立时间,UTC epoch ms', ended_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '解除时间,UTC epoch ms', + ended_by_user_id BIGINT NOT NULL DEFAULT 0 COMMENT '主动解除关系的用户 ID', + breakup_cost_coins BIGINT NOT NULL DEFAULT 0 COMMENT '本次解除实际支付金币数', + breakup_command_id VARCHAR(128) NOT NULL DEFAULT '' COMMENT '解除关系命令 ID', + breakup_wallet_transaction_id VARCHAR(128) NOT NULL DEFAULT '' COMMENT '解除扣费钱包交易 ID', + breakup_coin_balance_after BIGINT NOT NULL DEFAULT 0 COMMENT '解除扣费后用户金币余额', created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', updated_at_ms BIGINT NOT NULL COMMENT '更新时间,UTC epoch ms', PRIMARY KEY (app_code, relationship_id), @@ -495,6 +501,26 @@ CREATE TABLE IF NOT EXISTS user_cp_relationships ( KEY idx_user_cp_rel_user_b (app_code, user_b_id, status, relation_type, updated_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户 CP 关系表'; +CREATE TABLE IF NOT EXISTS user_cp_relationship_breakups ( + app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离', + command_id VARCHAR(128) NOT NULL COMMENT '解除关系命令 ID', + relationship_id VARCHAR(128) NOT NULL COMMENT '关系 ID', + requester_user_id BIGINT NOT NULL COMMENT '发起解除的用户 ID', + relation_type VARCHAR(32) NOT NULL COMMENT '关系类型:cp、brother、sister', + breakup_cost_coins BIGINT NOT NULL DEFAULT 0 COMMENT '创建解除占位时读取到的金币费用', + status VARCHAR(32) NOT NULL COMMENT '解除状态:pending、confirmed、canceled', + wallet_transaction_id VARCHAR(128) NOT NULL DEFAULT '' COMMENT '解除扣费钱包交易 ID', + coin_balance_after BIGINT NOT NULL DEFAULT 0 COMMENT '扣费后金币余额', + reason VARCHAR(256) NOT NULL DEFAULT '' COMMENT '取消原因', + created_at_ms BIGINT NOT NULL COMMENT '创建时间,UTC epoch ms', + updated_at_ms BIGINT NOT NULL COMMENT '更新时间,UTC epoch ms', + confirmed_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '确认解除时间,UTC epoch ms', + canceled_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '取消解除时间,UTC epoch ms', + PRIMARY KEY (app_code, command_id), + KEY idx_user_cp_breakup_relationship_status (app_code, relationship_id, status, updated_at_ms), + KEY idx_user_cp_breakup_requester_status (app_code, requester_user_id, status, updated_at_ms) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户 CP 关系解除占位表'; + CREATE TABLE IF NOT EXISTS user_cp_gift_event_consumption ( app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码,用于多租户隔离', room_event_id VARCHAR(128) NOT NULL COMMENT 'room outbox 事件 ID', diff --git a/services/user-service/internal/domain/cp/cp.go b/services/user-service/internal/domain/cp/cp.go index 6966d26f..cc9aa975 100644 --- a/services/user-service/internal/domain/cp/cp.go +++ b/services/user-service/internal/domain/cp/cp.go @@ -15,6 +15,10 @@ const ( RelationshipStatusActive = "active" RelationshipStatusEnded = "ended" + BreakupStatusPending = "pending" + BreakupStatusConfirmed = "confirmed" + BreakupStatusCanceled = "canceled" + GiftTypeCodeCP = "cp" EventTypeApplicationCreated = "UserCPApplicationCreated" @@ -23,6 +27,7 @@ const ( EventTypeRelationshipCreated = "UserCPRelationshipCreated" EventTypeRelationshipIntimacyChanged = "UserCPRelationshipIntimacyChanged" EventTypeRelationshipLevelUp = "UserCPRelationshipLevelUp" + EventTypeRelationshipEnded = "UserCPRelationshipEnded" ) // UserProfile 是 CP 申请和关系展示用的用户快照。 @@ -80,9 +85,28 @@ type Relationship struct { MaxLevel bool SourceApplicationID string FormedAtMS int64 + EndedAtMS int64 + BreakupCostCoins int64 UpdatedAtMS int64 } +// RelationshipBreakup 是一次解除关系命令的占位事实;pending 阻止同一关系被并发重复扣费。 +type RelationshipBreakup struct { + CommandID string + RelationshipID string + RequesterUserID int64 + RelationType string + BreakupCostCoins int64 + Status string + WalletTransactionID string + CoinBalanceAfter int64 + Reason string + CreatedAtMS int64 + UpdatedAtMS int64 + ConfirmedAtMS int64 + CanceledAtMS int64 +} + // GiftEvent 是 room outbox 中 RoomGiftSent 转换后的 CP 关系消费输入。 type GiftEvent struct { AppCode string diff --git a/services/user-service/internal/service/cp/service.go b/services/user-service/internal/service/cp/service.go index ec289244..7b5c26db 100644 --- a/services/user-service/internal/service/cp/service.go +++ b/services/user-service/internal/service/cp/service.go @@ -16,6 +16,9 @@ type Repository interface { AcceptApplication(ctx context.Context, userID int64, applicationID string, nowMs int64) (cpdomain.Application, cpdomain.Relationship, error) RejectApplication(ctx context.Context, userID int64, applicationID string, reason string, nowMs int64) (cpdomain.Application, error) ListRelationships(ctx context.Context, userID int64, relationType string, page int32, pageSize int32) ([]cpdomain.Relationship, int64, error) + PrepareBreakRelationship(ctx context.Context, userID int64, relationshipID string, commandID string, nowMs int64) (cpdomain.RelationshipBreakup, cpdomain.Relationship, error) + ConfirmBreakRelationship(ctx context.Context, userID int64, relationshipID string, commandID string, walletTransactionID string, paidCoinAmount int64, coinBalanceAfter int64, nowMs int64) (cpdomain.RelationshipBreakup, cpdomain.Relationship, error) + CancelBreakRelationship(ctx context.Context, userID int64, relationshipID string, commandID string, reason string, nowMs int64) (cpdomain.RelationshipBreakup, error) ConsumeGiftEvent(ctx context.Context, event cpdomain.GiftEvent, nowMs int64) (cpdomain.ConsumeResult, error) } @@ -73,6 +76,36 @@ func (s *Service) ListRelationships(ctx context.Context, userID int64, relationT return s.repo.ListRelationships(ctx, userID, normalizeRelationType(relationType), page, pageSize) } +// PrepareBreakRelationship 创建解除关系占位;占位成功后 gateway 才能去 wallet-service 扣费。 +func (s *Service) PrepareBreakRelationship(ctx context.Context, userID int64, relationshipID string, commandID string) (cpdomain.RelationshipBreakup, cpdomain.Relationship, error) { + if err := requireBreakCommand(userID, relationshipID, commandID); err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + return s.repo.PrepareBreakRelationship(ctx, userID, strings.TrimSpace(relationshipID), strings.TrimSpace(commandID), s.nowMs()) +} + +// ConfirmBreakRelationship 在 wallet-service 扣费成功后确认解除;paidCoinAmount 必须等于 prepare 时冻结的配置费用。 +func (s *Service) ConfirmBreakRelationship(ctx context.Context, userID int64, relationshipID string, commandID string, walletTransactionID string, paidCoinAmount int64, coinBalanceAfter int64) (cpdomain.RelationshipBreakup, cpdomain.Relationship, error) { + if err := requireBreakCommand(userID, relationshipID, commandID); err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + if paidCoinAmount < 0 { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, xerr.New(xerr.InvalidArgument, "paid_coin_amount is invalid") + } + if paidCoinAmount > 0 && strings.TrimSpace(walletTransactionID) == "" { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, xerr.New(xerr.InvalidArgument, "wallet_transaction_id is required") + } + return s.repo.ConfirmBreakRelationship(ctx, userID, strings.TrimSpace(relationshipID), strings.TrimSpace(commandID), strings.TrimSpace(walletTransactionID), paidCoinAmount, coinBalanceAfter, s.nowMs()) +} + +// CancelBreakRelationship 只取消 pending 占位;已经 confirmed 的解除不能通过取消接口回滚。 +func (s *Service) CancelBreakRelationship(ctx context.Context, userID int64, relationshipID string, commandID string, reason string) (cpdomain.RelationshipBreakup, error) { + if err := requireBreakCommand(userID, relationshipID, commandID); err != nil { + return cpdomain.RelationshipBreakup{}, err + } + return s.repo.CancelBreakRelationship(ctx, userID, strings.TrimSpace(relationshipID), strings.TrimSpace(commandID), reason, s.nowMs()) +} + // ConsumeGiftEvent 消费 room-service 已扣费并落房间状态的送礼事实。 func (s *Service) ConsumeGiftEvent(ctx context.Context, event cpdomain.GiftEvent) (cpdomain.ConsumeResult, error) { event.CPRelationType = normalizeRelationType(event.CPRelationType) @@ -100,6 +133,22 @@ func requireUserID(userID int64) error { return nil } +func requireBreakCommand(userID int64, relationshipID string, commandID string) error { + if err := requireUserID(userID); err != nil { + return err + } + if strings.TrimSpace(relationshipID) == "" { + return xerr.New(xerr.InvalidArgument, "relationship_id is required") + } + if strings.TrimSpace(commandID) == "" { + return xerr.New(xerr.InvalidArgument, "command_id is required") + } + if len(strings.TrimSpace(commandID)) > 128 { + return xerr.New(xerr.InvalidArgument, "command_id is too long") + } + return nil +} + func normalizeDirection(value string) string { switch strings.ToLower(strings.TrimSpace(value)) { case "outgoing": diff --git a/services/user-service/internal/storage/mysql/cp/repository.go b/services/user-service/internal/storage/mysql/cp/repository.go index 61a58c15..81a4e87d 100644 --- a/services/user-service/internal/storage/mysql/cp/repository.go +++ b/services/user-service/internal/storage/mysql/cp/repository.go @@ -129,8 +129,24 @@ func (r *Repository) AcceptApplication(ctx context.Context, userID int64, applic INSERT INTO user_cp_relationships ( app_code, relationship_id, user_a_id, user_b_id, relation_type, status, intimacy_value, level_no, source_application_id, - formed_at_ms, ended_at_ms, created_at_ms, updated_at_ms - ) VALUES (?, ?, ?, ?, ?, ?, 0, 1, ?, ?, 0, ?, ?)`, + formed_at_ms, ended_at_ms, ended_by_user_id, breakup_cost_coins, + breakup_command_id, breakup_wallet_transaction_id, breakup_coin_balance_after, + created_at_ms, updated_at_ms + ) VALUES (?, ?, ?, ?, ?, ?, 0, 1, ?, ?, 0, 0, 0, '', '', 0, ?, ?) + ON DUPLICATE KEY UPDATE + relation_type = VALUES(relation_type), + status = VALUES(status), + intimacy_value = 0, + level_no = 1, + source_application_id = VALUES(source_application_id), + formed_at_ms = VALUES(formed_at_ms), + ended_at_ms = 0, + ended_by_user_id = 0, + breakup_cost_coins = 0, + breakup_command_id = '', + breakup_wallet_transaction_id = '', + breakup_coin_balance_after = 0, + updated_at_ms = VALUES(updated_at_ms)`, appCode, relationshipID, userAID, userBID, application.RelationType, cpdomain.RelationshipStatusActive, application.ApplicationID, nowMs, nowMs, nowMs, ); err != nil { @@ -260,6 +276,196 @@ func (r *Repository) ListRelationships(ctx context.Context, userID int64, relati return relationships, total, nil } +// PrepareBreakRelationship 为解除关系创建 pending 占位;占位持有 command 幂等事实,但不提前结束关系。 +func (r *Repository) PrepareBreakRelationship(ctx context.Context, userID int64, relationshipID string, commandID string, nowMs int64) (cpdomain.RelationshipBreakup, cpdomain.Relationship, error) { + if r == nil || r.db == nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, xerr.New(xerr.Unavailable, "mysql repository is not configured") + } + tx, err := r.db.BeginTx(ctx, nil) + if err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + defer func() { _ = tx.Rollback() }() + + appCode := appcode.FromContext(ctx) + if err := ensureDefaultConfigTx(ctx, tx, appCode, nowMs); err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + // 所有解除分支先锁关系行,再锁 breakup 行;prepare/confirm/cancel 共享这个顺序以降低死锁概率。 + relationship, err := lockRelationshipByIDTx(ctx, tx, appCode, userID, relationshipID) + if err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + if err := assertRelationshipParticipant(relationship, userID); err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + if existing, found, err := lockBreakupByCommandTx(ctx, tx, appCode, commandID); err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } else if found { + if err := assertBreakupMatches(existing, userID, relationshipID); err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + if existing.Status == cpdomain.BreakupStatusCanceled { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, xerr.New(xerr.Conflict, "cp relationship breakup command is canceled") + } + return existing, relationship, tx.Commit() + } + if relationship.Status != cpdomain.RelationshipStatusActive { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, xerr.New(xerr.Conflict, "cp relationship is not active") + } + if pending, found, err := lockPendingBreakupForRelationshipTx(ctx, tx, appCode, relationshipID); err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } else if found { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, xerr.New(xerr.Conflict, fmt.Sprintf("cp relationship breakup is pending: %s", pending.CommandID)) + } + cost := relationship.BreakupCostCoins + if cost < 0 { + cost = 0 + } + if _, err := tx.ExecContext(ctx, ` + INSERT INTO user_cp_relationship_breakups ( + app_code, command_id, relationship_id, requester_user_id, relation_type, + breakup_cost_coins, status, wallet_transaction_id, coin_balance_after, + reason, created_at_ms, updated_at_ms, confirmed_at_ms, canceled_at_ms + ) VALUES (?, ?, ?, ?, ?, ?, ?, '', 0, '', ?, ?, 0, 0)`, + appCode, commandID, relationship.RelationshipID, userID, relationship.RelationType, + cost, cpdomain.BreakupStatusPending, nowMs, nowMs, + ); err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + breakup, err := lockBreakupByCommandRequiredTx(ctx, tx, appCode, commandID) + if err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + return breakup, relationship, tx.Commit() +} + +// ConfirmBreakRelationship 在钱包扣费成功后真正结束关系;重复确认同一 command 只返回已确认结果。 +func (r *Repository) ConfirmBreakRelationship(ctx context.Context, userID int64, relationshipID string, commandID string, walletTransactionID string, paidCoinAmount int64, coinBalanceAfter int64, nowMs int64) (cpdomain.RelationshipBreakup, cpdomain.Relationship, error) { + if r == nil || r.db == nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, xerr.New(xerr.Unavailable, "mysql repository is not configured") + } + tx, err := r.db.BeginTx(ctx, nil) + if err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + defer func() { _ = tx.Rollback() }() + + appCode := appcode.FromContext(ctx) + relationship, err := lockRelationshipByIDTx(ctx, tx, appCode, userID, relationshipID) + if err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + if err := assertRelationshipParticipant(relationship, userID); err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + breakup, err := lockBreakupByCommandRequiredTx(ctx, tx, appCode, commandID) + if err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + if err := assertBreakupMatches(breakup, userID, relationshipID); err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + if breakup.Status == cpdomain.BreakupStatusConfirmed { + return breakup, relationship, tx.Commit() + } + if breakup.Status == cpdomain.BreakupStatusCanceled { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, xerr.New(xerr.Conflict, "cp relationship breakup command is canceled") + } + if relationship.Status != cpdomain.RelationshipStatusActive { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, xerr.New(xerr.Conflict, "cp relationship is not active") + } + if paidCoinAmount != breakup.BreakupCostCoins { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, xerr.New(xerr.Conflict, "cp breakup paid amount mismatch") + } + if breakup.BreakupCostCoins > 0 && walletTransactionID == "" { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, xerr.New(xerr.InvalidArgument, "wallet_transaction_id is required") + } + if _, err := tx.ExecContext(ctx, ` + UPDATE user_cp_relationships + SET status = ?, ended_at_ms = ?, ended_by_user_id = ?, + breakup_cost_coins = ?, breakup_command_id = ?, breakup_wallet_transaction_id = ?, + breakup_coin_balance_after = ?, updated_at_ms = ? + WHERE app_code = ? AND relationship_id = ? AND status = ?`, + cpdomain.RelationshipStatusEnded, nowMs, userID, + breakup.BreakupCostCoins, commandID, walletTransactionID, + coinBalanceAfter, nowMs, + appCode, relationshipID, cpdomain.RelationshipStatusActive, + ); err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + if _, err := tx.ExecContext(ctx, ` + UPDATE user_cp_relationship_breakups + SET status = ?, wallet_transaction_id = ?, coin_balance_after = ?, + updated_at_ms = ?, confirmed_at_ms = ? + WHERE app_code = ? AND command_id = ? AND status = ?`, + cpdomain.BreakupStatusConfirmed, walletTransactionID, coinBalanceAfter, + nowMs, nowMs, appCode, commandID, cpdomain.BreakupStatusPending, + ); err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + breakup, err = lockBreakupByCommandRequiredTx(ctx, tx, appCode, commandID) + if err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + relationship, err = queryRelationshipByIDTx(ctx, tx, appCode, userID, relationshipID) + if err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + payload := map[string]any{"relationship": relationship, "breakup": breakup} + if err := insertOutboxTx(ctx, tx, appCode, cpdomain.EventTypeRelationshipEnded, "cp_relationship", userID, payload, nowMs); err != nil { + return cpdomain.RelationshipBreakup{}, cpdomain.Relationship{}, err + } + return breakup, relationship, tx.Commit() +} + +// CancelBreakRelationship 释放 pending 占位;钱包扣费失败后 gateway 调用它,关系仍保持 active。 +func (r *Repository) CancelBreakRelationship(ctx context.Context, userID int64, relationshipID string, commandID string, reason string, nowMs int64) (cpdomain.RelationshipBreakup, error) { + if r == nil || r.db == nil { + return cpdomain.RelationshipBreakup{}, xerr.New(xerr.Unavailable, "mysql repository is not configured") + } + tx, err := r.db.BeginTx(ctx, nil) + if err != nil { + return cpdomain.RelationshipBreakup{}, err + } + defer func() { _ = tx.Rollback() }() + + appCode := appcode.FromContext(ctx) + relationship, err := lockRelationshipByIDTx(ctx, tx, appCode, userID, relationshipID) + if err != nil { + return cpdomain.RelationshipBreakup{}, err + } + if err := assertRelationshipParticipant(relationship, userID); err != nil { + return cpdomain.RelationshipBreakup{}, err + } + breakup, err := lockBreakupByCommandRequiredTx(ctx, tx, appCode, commandID) + if err != nil { + return cpdomain.RelationshipBreakup{}, err + } + if err := assertBreakupMatches(breakup, userID, relationshipID); err != nil { + return cpdomain.RelationshipBreakup{}, err + } + if breakup.Status == cpdomain.BreakupStatusConfirmed { + return cpdomain.RelationshipBreakup{}, xerr.New(xerr.Conflict, "cp relationship breakup is confirmed") + } + if breakup.Status == cpdomain.BreakupStatusPending { + if _, err := tx.ExecContext(ctx, ` + UPDATE user_cp_relationship_breakups + SET status = ?, reason = ?, updated_at_ms = ?, canceled_at_ms = ? + WHERE app_code = ? AND command_id = ? AND status = ?`, + cpdomain.BreakupStatusCanceled, strings.TrimSpace(reason), nowMs, nowMs, + appCode, commandID, cpdomain.BreakupStatusPending, + ); err != nil { + return cpdomain.RelationshipBreakup{}, err + } + breakup, err = lockBreakupByCommandRequiredTx(ctx, tx, appCode, commandID) + if err != nil { + return cpdomain.RelationshipBreakup{}, err + } + } + return breakup, tx.Commit() +} + // ConsumeGiftEvent 把房间送礼事实转换为 CP 申请或亲密值增长。 func (r *Repository) ConsumeGiftEvent(ctx context.Context, event cpdomain.GiftEvent, nowMs int64) (cpdomain.ConsumeResult, error) { if r == nil || r.db == nil { @@ -337,9 +543,9 @@ func ensureDefaultConfigTx(ctx context.Context, tx *sql.Tx, appCode string, nowM } if _, err := tx.ExecContext(ctx, ` INSERT INTO user_cp_relation_configs ( - app_code, relation_type, max_count_per_user, application_expire_hours, + app_code, relation_type, max_count_per_user, application_expire_hours, breakup_cost_coins, status, created_at_ms, updated_at_ms - ) VALUES (?, ?, ?, 24, 'active', ?, ?) + ) VALUES (?, ?, ?, 24, 0, 'active', ?, ?) ON DUPLICATE KEY UPDATE relation_type = VALUES(relation_type)`, appCode, relationType, maxCount, nowMs, nowMs, ); err != nil { @@ -450,6 +656,11 @@ func relationshipSelectSQL(suffix string) string { SELECT r.relationship_id, r.relation_type, r.status, r.user_a_id, r.user_b_id, r.intimacy_value, r.level_no, r.source_application_id, r.formed_at_ms, r.updated_at_ms, + r.ended_at_ms, + CASE WHEN r.status = '` + cpdomain.RelationshipStatusEnded + `' + THEN r.breakup_cost_coins + ELSE COALESCE(config.breakup_cost_coins, 0) + END AS breakup_cost_coins, COALESCE(( SELECT current_rule.intimacy_threshold FROM user_cp_level_rules current_rule @@ -475,6 +686,8 @@ func relationshipSelectSQL(suffix string) string { JOIN users me ON me.app_code = r.app_code AND me.user_id = ? JOIN users partner ON partner.app_code = r.app_code AND partner.user_id = CASE WHEN r.user_a_id = ? THEN r.user_b_id ELSE r.user_a_id END + LEFT JOIN user_cp_relation_configs config + ON config.app_code = r.app_code AND config.relation_type = r.relation_type ` + suffix } @@ -495,6 +708,7 @@ func scanRelationship(scanner interface{ Scan(dest ...any) error }) (cpdomain.Re err := scanner.Scan( &relationship.RelationshipID, &relationship.RelationType, &relationship.Status, &relationship.UserAID, &relationship.UserBID, &relationship.IntimacyValue, &relationship.Level, &relationship.SourceApplicationID, &relationship.FormedAtMS, &relationship.UpdatedAtMS, + &relationship.EndedAtMS, &relationship.BreakupCostCoins, &relationship.CurrentLevelThreshold, &relationship.NextLevelThreshold, &relationship.Me.UserID, &relationship.Me.DisplayUserID, &relationship.Me.Username, &relationship.Me.Avatar, &relationship.Partner.UserID, &relationship.Partner.DisplayUserID, &relationship.Partner.Username, &relationship.Partner.Avatar, @@ -553,11 +767,93 @@ func queryRelationshipByIDTx(ctx context.Context, tx *sql.Tx, appCode string, vi return relationship, err } +func lockRelationshipByIDTx(ctx context.Context, tx *sql.Tx, appCode string, viewerUserID int64, relationshipID string) (cpdomain.Relationship, error) { + row := tx.QueryRowContext(ctx, relationshipSelectSQL(` + WHERE r.app_code = ? AND r.relationship_id = ? + FOR UPDATE`), + viewerUserID, viewerUserID, appCode, strings.TrimSpace(relationshipID), + ) + relationship, err := scanRelationship(row) + if err == sql.ErrNoRows { + return cpdomain.Relationship{}, xerr.New(xerr.NotFound, "cp relationship not found") + } + return relationship, err +} + +func assertRelationshipParticipant(relationship cpdomain.Relationship, userID int64) error { + if relationship.UserAID == userID || relationship.UserBID == userID { + return nil + } + return xerr.New(xerr.PermissionDenied, "only relationship user can operate cp relationship") +} + +func lockBreakupByCommandRequiredTx(ctx context.Context, tx *sql.Tx, appCode string, commandID string) (cpdomain.RelationshipBreakup, error) { + breakup, found, err := lockBreakupByCommandTx(ctx, tx, appCode, commandID) + if err != nil { + return cpdomain.RelationshipBreakup{}, err + } + if !found { + return cpdomain.RelationshipBreakup{}, xerr.New(xerr.NotFound, "cp relationship breakup not found") + } + return breakup, nil +} + +func lockBreakupByCommandTx(ctx context.Context, tx *sql.Tx, appCode string, commandID string) (cpdomain.RelationshipBreakup, bool, error) { + row := tx.QueryRowContext(ctx, breakupSelectSQL(` + WHERE app_code = ? AND command_id = ? + FOR UPDATE`), appCode, strings.TrimSpace(commandID)) + breakup, err := scanBreakup(row) + if err == sql.ErrNoRows { + return cpdomain.RelationshipBreakup{}, false, nil + } + return breakup, err == nil, err +} + +func lockPendingBreakupForRelationshipTx(ctx context.Context, tx *sql.Tx, appCode string, relationshipID string) (cpdomain.RelationshipBreakup, bool, error) { + row := tx.QueryRowContext(ctx, breakupSelectSQL(` + WHERE app_code = ? AND relationship_id = ? AND status = ? + ORDER BY created_at_ms ASC + LIMIT 1 + FOR UPDATE`), appCode, strings.TrimSpace(relationshipID), cpdomain.BreakupStatusPending) + breakup, err := scanBreakup(row) + if err == sql.ErrNoRows { + return cpdomain.RelationshipBreakup{}, false, nil + } + return breakup, err == nil, err +} + +func breakupSelectSQL(suffix string) string { + return ` + SELECT command_id, relationship_id, requester_user_id, relation_type, + breakup_cost_coins, status, wallet_transaction_id, coin_balance_after, + reason, created_at_ms, updated_at_ms, confirmed_at_ms, canceled_at_ms + FROM user_cp_relationship_breakups + ` + suffix +} + +func scanBreakup(scanner interface{ Scan(dest ...any) error }) (cpdomain.RelationshipBreakup, error) { + var breakup cpdomain.RelationshipBreakup + err := scanner.Scan( + &breakup.CommandID, &breakup.RelationshipID, &breakup.RequesterUserID, &breakup.RelationType, + &breakup.BreakupCostCoins, &breakup.Status, &breakup.WalletTransactionID, &breakup.CoinBalanceAfter, + &breakup.Reason, &breakup.CreatedAtMS, &breakup.UpdatedAtMS, &breakup.ConfirmedAtMS, &breakup.CanceledAtMS, + ) + return breakup, err +} + +func assertBreakupMatches(breakup cpdomain.RelationshipBreakup, userID int64, relationshipID string) error { + if breakup.RequesterUserID != userID || strings.TrimSpace(breakup.RelationshipID) != strings.TrimSpace(relationshipID) { + // command_id 是解除动作幂等键,不能被另一个用户或另一个关系复用。 + return xerr.New(xerr.Conflict, "cp relationship breakup command conflict") + } + return nil +} + func lockActiveRelationshipTx(ctx context.Context, tx *sql.Tx, appCode string, userAID int64, userBID int64) (cpdomain.Relationship, bool, error) { // active 关系行用 FOR UPDATE 锁住 pair,关系创建和送礼加亲密值都走这把锁。 row := tx.QueryRowContext(ctx, ` SELECT relationship_id, relation_type, status, user_a_id, user_b_id, - intimacy_value, level_no, source_application_id, formed_at_ms, updated_at_ms + intimacy_value, level_no, source_application_id, formed_at_ms, ended_at_ms, updated_at_ms FROM user_cp_relationships WHERE app_code = ? AND user_a_id = ? AND user_b_id = ? AND status = ? FOR UPDATE`, @@ -566,7 +862,7 @@ func lockActiveRelationshipTx(ctx context.Context, tx *sql.Tx, appCode string, u var relationship cpdomain.Relationship err := row.Scan( &relationship.RelationshipID, &relationship.RelationType, &relationship.Status, &relationship.UserAID, &relationship.UserBID, - &relationship.IntimacyValue, &relationship.Level, &relationship.SourceApplicationID, &relationship.FormedAtMS, &relationship.UpdatedAtMS, + &relationship.IntimacyValue, &relationship.Level, &relationship.SourceApplicationID, &relationship.FormedAtMS, &relationship.EndedAtMS, &relationship.UpdatedAtMS, ) if err == sql.ErrNoRows { return cpdomain.Relationship{}, false, nil diff --git a/services/user-service/internal/storage/mysql/cp/repository_test.go b/services/user-service/internal/storage/mysql/cp/repository_test.go index 134d547b..2961ad5d 100644 --- a/services/user-service/internal/storage/mysql/cp/repository_test.go +++ b/services/user-service/internal/storage/mysql/cp/repository_test.go @@ -149,6 +149,94 @@ func TestListRelationshipsIncludesServerLevelProgress(t *testing.T) { } } +func TestBreakRelationshipPrepareConfirmIsIdempotent(t *testing.T) { + schema := mysqlschema.New(t) + repo := New(schema.DB) + ctx := appcode.WithContext(context.Background(), appcode.Default) + nowMS := int64(1700000000000) + + seedCPTestUser(t, schema.DB, 5001, "Break Alice", nowMS) + seedCPTestUser(t, schema.DB, 5002, "Break Bob", nowMS) + seedRelationConfigWithBreakupCost(t, schema.DB, cpdomain.RelationTypeCP, 1, 88, nowMS) + seedActiveCPRelationship(t, schema.DB, "break_confirm", cpdomain.RelationTypeCP, 5001, 5002, 20, 1, nowMS) + + breakup, relationship, err := repo.PrepareBreakRelationship(ctx, 5001, "break_confirm", "break_cmd_1", nowMS+1) + if err != nil { + t.Fatalf("prepare breakup failed: %v", err) + } + if breakup.Status != cpdomain.BreakupStatusPending || breakup.BreakupCostCoins != 88 { + t.Fatalf("prepare breakup mismatch: %+v", breakup) + } + if relationship.BreakupCostCoins != 88 || relationship.Status != cpdomain.RelationshipStatusActive { + t.Fatalf("relationship cost/status mismatch: %+v", relationship) + } + + replayed, _, err := repo.PrepareBreakRelationship(ctx, 5001, "break_confirm", "break_cmd_1", nowMS+2) + if err != nil { + t.Fatalf("prepare replay failed: %v", err) + } + if replayed.CommandID != breakup.CommandID || replayed.Status != cpdomain.BreakupStatusPending { + t.Fatalf("prepare replay mismatch: %+v", replayed) + } + if _, _, err := repo.PrepareBreakRelationship(ctx, 5002, "break_confirm", "break_cmd_2", nowMS+3); xerr.CodeOf(err) != xerr.Conflict { + t.Fatalf("concurrent breakup must be rejected, got %v", err) + } + if _, _, err := repo.ConfirmBreakRelationship(ctx, 5001, "break_confirm", "break_cmd_1", "wallet_tx_bad", 87, 913, nowMS+4); xerr.CodeOf(err) != xerr.Conflict { + t.Fatalf("paid amount mismatch must be rejected, got %v", err) + } + + confirmed, ended, err := repo.ConfirmBreakRelationship(ctx, 5001, "break_confirm", "break_cmd_1", "wallet_tx_1", 88, 912, nowMS+5) + if err != nil { + t.Fatalf("confirm breakup failed: %v", err) + } + if confirmed.Status != cpdomain.BreakupStatusConfirmed || confirmed.WalletTransactionID != "wallet_tx_1" { + t.Fatalf("confirmed breakup mismatch: %+v", confirmed) + } + if ended.Status != cpdomain.RelationshipStatusEnded || ended.EndedAtMS != nowMS+5 || ended.BreakupCostCoins != 88 { + t.Fatalf("ended relationship mismatch: %+v", ended) + } + replayedConfirm, replayedEnded, err := repo.ConfirmBreakRelationship(ctx, 5001, "break_confirm", "break_cmd_1", "wallet_tx_1", 88, 912, nowMS+6) + if err != nil { + t.Fatalf("confirm replay failed: %v", err) + } + if replayedConfirm.Status != cpdomain.BreakupStatusConfirmed || replayedEnded.Status != cpdomain.RelationshipStatusEnded { + t.Fatalf("confirm replay mismatch: breakup=%+v relationship=%+v", replayedConfirm, replayedEnded) + } +} + +func TestBreakRelationshipCancelKeepsRelationshipActive(t *testing.T) { + schema := mysqlschema.New(t) + repo := New(schema.DB) + ctx := appcode.WithContext(context.Background(), appcode.Default) + nowMS := int64(1700000000000) + + seedCPTestUser(t, schema.DB, 6001, "Cancel Alice", nowMS) + seedCPTestUser(t, schema.DB, 6002, "Cancel Bob", nowMS) + seedRelationConfigWithBreakupCost(t, schema.DB, cpdomain.RelationTypeSister, 5, 66, nowMS) + seedActiveCPRelationship(t, schema.DB, "break_cancel", cpdomain.RelationTypeSister, 6001, 6002, 20, 1, nowMS) + + if _, _, err := repo.PrepareBreakRelationship(ctx, 6002, "break_cancel", "break_cmd_cancel", nowMS+1); err != nil { + t.Fatalf("prepare cancel breakup failed: %v", err) + } + canceled, err := repo.CancelBreakRelationship(ctx, 6002, "break_cancel", "break_cmd_cancel", "wallet_debit_failed", nowMS+2) + if err != nil { + t.Fatalf("cancel breakup failed: %v", err) + } + if canceled.Status != cpdomain.BreakupStatusCanceled { + t.Fatalf("cancel status mismatch: %+v", canceled) + } + relationships, total, err := repo.ListRelationships(ctx, 6002, cpdomain.RelationTypeSister, 1, 20) + if err != nil { + t.Fatalf("list relationships after cancel failed: %v", err) + } + if total != 1 || len(relationships) != 1 || relationships[0].Status != cpdomain.RelationshipStatusActive { + t.Fatalf("relationship must stay active after cancel, total=%d relationships=%+v", total, relationships) + } + if _, _, err := repo.ConfirmBreakRelationship(ctx, 6002, "break_cancel", "break_cmd_cancel", "wallet_tx_after_cancel", 66, 934, nowMS+3); xerr.CodeOf(err) != xerr.Conflict { + t.Fatalf("canceled breakup must not be confirmed, got %v", err) + } +} + func seedCPTestUser(t testing.TB, db *sql.DB, userID int64, username string, nowMS int64) { t.Helper() @@ -167,18 +255,23 @@ func seedCPTestUser(t testing.TB, db *sql.DB, userID int64, username string, now } func seedRelationConfig(t testing.TB, db *sql.DB, relationType string, maxCount int32, nowMS int64) { + seedRelationConfigWithBreakupCost(t, db, relationType, maxCount, 0, nowMS) +} + +func seedRelationConfigWithBreakupCost(t testing.TB, db *sql.DB, relationType string, maxCount int32, breakupCost int64, nowMS int64) { t.Helper() // 容量测试直接写配置表,AcceptApplication 中的默认配置 upsert 不会覆盖已有业务配置。 if _, err := db.ExecContext(context.Background(), ` INSERT INTO user_cp_relation_configs ( - app_code, relation_type, max_count_per_user, application_expire_hours, + app_code, relation_type, max_count_per_user, application_expire_hours, breakup_cost_coins, status, created_at_ms, updated_at_ms - ) VALUES (?, ?, ?, 24, 'active', ?, ?) + ) VALUES (?, ?, ?, 24, ?, 'active', ?, ?) ON DUPLICATE KEY UPDATE max_count_per_user = VALUES(max_count_per_user), + breakup_cost_coins = VALUES(breakup_cost_coins), updated_at_ms = VALUES(updated_at_ms)`, - appcode.Default, relationType, maxCount, nowMS, nowMS, + appcode.Default, relationType, maxCount, breakupCost, nowMS, nowMS, ); err != nil { t.Fatalf("seed relation config %s failed: %v", relationType, err) } diff --git a/services/user-service/internal/transport/grpc/cp.go b/services/user-service/internal/transport/grpc/cp.go index 6c99023b..d138716a 100644 --- a/services/user-service/internal/transport/grpc/cp.go +++ b/services/user-service/internal/transport/grpc/cp.go @@ -79,6 +79,60 @@ func (s *Server) ListCPRelationships(ctx context.Context, req *userv1.ListCPRela return resp, nil } +// PrepareBreakCPRelationship 创建解除关系占位;gateway 随后按返回费用调用 wallet-service 扣金币。 +func (s *Server) PrepareBreakCPRelationship(ctx context.Context, req *userv1.PrepareBreakCPRelationshipRequest) (*userv1.PrepareBreakCPRelationshipResponse, error) { + ctx = contextWithApp(ctx, req.GetMeta()) + if s.cpSvc == nil { + return nil, xerr.ToGRPCError(xerr.New(xerr.Unavailable, "cp service is not configured")) + } + breakup, relationship, err := s.cpSvc.PrepareBreakRelationship(ctx, req.GetUserId(), req.GetRelationshipId(), req.GetCommandId()) + if err != nil { + return nil, xerr.ToGRPCError(err) + } + return &userv1.PrepareBreakCPRelationshipResponse{ + Relationship: toProtoCPRelationship(relationship), + CommandId: breakup.CommandID, + Status: breakup.Status, + BreakupCostCoins: breakup.BreakupCostCoins, + WalletTransactionId: breakup.WalletTransactionID, + CoinBalanceAfter: breakup.CoinBalanceAfter, + }, nil +} + +// ConfirmBreakCPRelationship 在钱包扣费成功后确认解除,关系状态和 outbox 在同一事务提交。 +func (s *Server) ConfirmBreakCPRelationship(ctx context.Context, req *userv1.ConfirmBreakCPRelationshipRequest) (*userv1.ConfirmBreakCPRelationshipResponse, error) { + ctx = contextWithApp(ctx, req.GetMeta()) + if s.cpSvc == nil { + return nil, xerr.ToGRPCError(xerr.New(xerr.Unavailable, "cp service is not configured")) + } + breakup, relationship, err := s.cpSvc.ConfirmBreakRelationship(ctx, req.GetUserId(), req.GetRelationshipId(), req.GetCommandId(), req.GetWalletTransactionId(), req.GetPaidCoinAmount(), req.GetCoinBalanceAfter()) + if err != nil { + return nil, xerr.ToGRPCError(err) + } + return &userv1.ConfirmBreakCPRelationshipResponse{ + Relationship: toProtoCPRelationship(relationship), + BreakupCostCoins: breakup.BreakupCostCoins, + WalletTransactionId: breakup.WalletTransactionID, + CoinBalanceAfter: breakup.CoinBalanceAfter, + }, nil +} + +// CancelBreakCPRelationship 取消还未扣费成功的解除占位,避免钱包失败后关系被其他请求长期阻塞。 +func (s *Server) CancelBreakCPRelationship(ctx context.Context, req *userv1.CancelBreakCPRelationshipRequest) (*userv1.CancelBreakCPRelationshipResponse, error) { + ctx = contextWithApp(ctx, req.GetMeta()) + if s.cpSvc == nil { + return nil, xerr.ToGRPCError(xerr.New(xerr.Unavailable, "cp service is not configured")) + } + breakup, err := s.cpSvc.CancelBreakRelationship(ctx, req.GetUserId(), req.GetRelationshipId(), req.GetCommandId(), req.GetReason()) + if err != nil { + return nil, xerr.ToGRPCError(err) + } + return &userv1.CancelBreakCPRelationshipResponse{ + CommandId: breakup.CommandID, + Status: breakup.Status, + }, nil +} + // ConsumeRoomGiftCPEvent 由 user-service 内部 MQ worker 调用,把 RoomGiftSent 转为 CP 申请或亲密值增长。 func (s *Server) ConsumeRoomGiftCPEvent(ctx context.Context, req *userv1.ConsumeRoomGiftCPEventRequest) (*userv1.ConsumeRoomGiftCPEventResponse, error) { ctx = contextWithApp(ctx, req.GetMeta()) @@ -154,6 +208,8 @@ func toProtoCPRelationship(relationship cpdomain.Relationship) *userv1.CPRelatio NeededForNextLevel: relationship.NeededForNextLevel, LevelProgressPercent: relationship.LevelProgressPercent, MaxLevel: relationship.MaxLevel, + BreakupCostCoins: relationship.BreakupCostCoins, + EndedAtMs: relationship.EndedAtMS, } } diff --git a/services/wallet-service/internal/domain/ledger/ledger.go b/services/wallet-service/internal/domain/ledger/ledger.go index 95f1c486..52755f69 100644 --- a/services/wallet-service/internal/domain/ledger/ledger.go +++ b/services/wallet-service/internal/domain/ledger/ledger.go @@ -668,6 +668,24 @@ type PurchaseVipReceipt struct { RewardItems []VipRewardItem } +// CPBreakupFeeCommand 是解除 CP/兄弟/姐妹关系时的专用金币扣费命令。 +type CPBreakupFeeCommand struct { + AppCode string + CommandID string + UserID int64 + RelationshipID string + RelationType string + Amount int64 +} + +// CPBreakupFeeReceipt 返回解除关系扣费流水和 COIN 账后余额。 +type CPBreakupFeeReceipt struct { + TransactionID string + CoinSpent int64 + CoinBalanceAfter int64 + Balance AssetBalance +} + // GrantVipCommand 是活动或后台发放 VIP 的统一入口命令。 type GrantVipCommand struct { AppCode string diff --git a/services/wallet-service/internal/service/wallet/service.go b/services/wallet-service/internal/service/wallet/service.go index 68efd4cd..8c611de7 100644 --- a/services/wallet-service/internal/service/wallet/service.go +++ b/services/wallet-service/internal/service/wallet/service.go @@ -58,6 +58,7 @@ type Repository interface { ListVipPackages(ctx context.Context, userID int64) (ledger.UserVip, []ledger.VipLevel, error) GetMyVip(ctx context.Context, userID int64) (ledger.UserVip, error) PurchaseVip(ctx context.Context, command ledger.PurchaseVipCommand) (ledger.PurchaseVipReceipt, error) + DebitCPBreakupFee(ctx context.Context, command ledger.CPBreakupFeeCommand) (ledger.CPBreakupFeeReceipt, error) GrantVip(ctx context.Context, command ledger.GrantVipCommand) (ledger.GrantVipReceipt, error) ListAdminVipLevels(ctx context.Context) ([]ledger.VipLevel, error) UpdateAdminVipLevels(ctx context.Context, levels []ledger.AdminVipLevelCommand, operatorUserID int64) ([]ledger.VipLevel, error) @@ -961,6 +962,27 @@ func (s *Service) PurchaseVip(ctx context.Context, command ledger.PurchaseVipCom return s.repository.PurchaseVip(ctx, command) } +// DebitCPBreakupFee 扣除解除关系费用;关系是否可解除仍由 user-service 的 pending/confirm 流程决定。 +func (s *Service) DebitCPBreakupFee(ctx context.Context, command ledger.CPBreakupFeeCommand) (ledger.CPBreakupFeeReceipt, error) { + if command.CommandID == "" || command.UserID <= 0 || strings.TrimSpace(command.RelationshipID) == "" || strings.TrimSpace(command.RelationType) == "" { + return ledger.CPBreakupFeeReceipt{}, xerr.New(xerr.InvalidArgument, "cp breakup fee command is incomplete") + } + if len(command.CommandID) > 128 { + return ledger.CPBreakupFeeReceipt{}, xerr.New(xerr.InvalidArgument, "command_id is too long") + } + if command.Amount <= 0 { + return ledger.CPBreakupFeeReceipt{}, xerr.New(xerr.InvalidArgument, "cp breakup fee amount must be positive") + } + if s.repository == nil { + return ledger.CPBreakupFeeReceipt{}, xerr.New(xerr.Unavailable, "wallet repository is not configured") + } + command.AppCode = appcode.Normalize(command.AppCode) + command.RelationshipID = strings.TrimSpace(command.RelationshipID) + command.RelationType = strings.ToLower(strings.TrimSpace(command.RelationType)) + ctx = appcode.WithContext(ctx, command.AppCode) + return s.repository.DebitCPBreakupFee(ctx, command) +} + // GrantVip 是活动和后台赠送 VIP 的统一入口;购买仍走 PurchaseVip 完成扣费。 func (s *Service) GrantVip(ctx context.Context, command ledger.GrantVipCommand) (ledger.GrantVipReceipt, error) { if command.CommandID == "" || command.TargetUserID <= 0 || command.Level <= 0 { diff --git a/services/wallet-service/internal/storage/mysql/cp_breakup_fee_test.go b/services/wallet-service/internal/storage/mysql/cp_breakup_fee_test.go new file mode 100644 index 00000000..1dadeabf --- /dev/null +++ b/services/wallet-service/internal/storage/mysql/cp_breakup_fee_test.go @@ -0,0 +1,76 @@ +package mysql_test + +import ( + "context" + "testing" + + "hyapp/pkg/appcode" + "hyapp/pkg/xerr" + "hyapp/services/wallet-service/internal/domain/ledger" + "hyapp/services/wallet-service/internal/testutil/mysqltest" +) + +func TestDebitCPBreakupFeeDebitsCoinAndReplaysIdempotently(t *testing.T) { + repo := mysqltest.NewRepository(t) + ctx := appcode.WithContext(context.Background(), appcode.Default) + repo.SetBalance(7001, 1000) + + command := ledger.CPBreakupFeeCommand{ + AppCode: appcode.Default, + CommandID: "cp_break_fee_1", + UserID: 7001, + RelationshipID: "cp_rel:7001:7002", + RelationType: "cp", + Amount: 88, + } + first, err := repo.DebitCPBreakupFee(ctx, command) + if err != nil { + t.Fatalf("debit cp breakup fee failed: %v", err) + } + if first.CoinSpent != 88 || first.CoinBalanceAfter != 912 || first.Balance.AvailableAmount != 912 { + t.Fatalf("receipt mismatch: %+v", first) + } + if repo.CountRows("wallet_transactions", "command_id = ?", command.CommandID) != 1 { + t.Fatalf("expected one wallet transaction") + } + if repo.CountRows("wallet_entries", "transaction_id = ?", first.TransactionID) != 1 { + t.Fatalf("expected one wallet entry") + } + + second, err := repo.DebitCPBreakupFee(ctx, command) + if err != nil { + t.Fatalf("debit cp breakup fee replay failed: %v", err) + } + if second.TransactionID != first.TransactionID || second.CoinBalanceAfter != first.CoinBalanceAfter { + t.Fatalf("idempotent replay mismatch: first=%+v second=%+v", first, second) + } + if repo.CountRows("wallet_entries", "transaction_id = ?", first.TransactionID) != 1 { + t.Fatalf("idempotent replay must not create another entry") + } + + command.Amount = 89 + if _, err := repo.DebitCPBreakupFee(ctx, command); xerr.CodeOf(err) != xerr.LedgerConflict { + t.Fatalf("same command with different amount must conflict, got %v", err) + } +} + +func TestDebitCPBreakupFeeRejectsInsufficientBalance(t *testing.T) { + repo := mysqltest.NewRepository(t) + ctx := appcode.WithContext(context.Background(), appcode.Default) + repo.SetBalance(7101, 10) + + _, err := repo.DebitCPBreakupFee(ctx, ledger.CPBreakupFeeCommand{ + AppCode: appcode.Default, + CommandID: "cp_break_fee_insufficient", + UserID: 7101, + RelationshipID: "cp_rel:7101:7102", + RelationType: "sister", + Amount: 20, + }) + if xerr.CodeOf(err) != xerr.InsufficientBalance { + t.Fatalf("insufficient balance must be rejected, got %v", err) + } + if repo.CountRows("wallet_transactions", "command_id = ?", "cp_break_fee_insufficient") != 0 { + t.Fatalf("insufficient balance must not create transaction") + } +} diff --git a/services/wallet-service/internal/storage/mysql/repository.go b/services/wallet-service/internal/storage/mysql/repository.go index 93e20471..3f3cefba 100644 --- a/services/wallet-service/internal/storage/mysql/repository.go +++ b/services/wallet-service/internal/storage/mysql/repository.go @@ -39,6 +39,7 @@ const ( bizTypeGameRefund = "game_refund" bizTypeGameReverse = "game_reverse" bizTypeHostSalarySettlement = "host_salary_settlement" + bizTypeCPBreakupFee = "cp_breakup_fee" outboxStatusPending = "pending" outboxStatusDelivering = "delivering" outboxStatusDelivered = "delivered" @@ -786,6 +787,98 @@ func (r *Repository) AdminCreditAsset(ctx context.Context, command ledger.AdminC return balance, transactionID, nil } +// DebitCPBreakupFee 在钱包账本中扣除解除关系费用;关系状态不在 wallet 中修改,避免 wallet 反向拥有用户关系事实。 +func (r *Repository) DebitCPBreakupFee(ctx context.Context, command ledger.CPBreakupFeeCommand) (ledger.CPBreakupFeeReceipt, error) { + if r == nil || r.db == nil { + return ledger.CPBreakupFeeReceipt{}, xerr.New(xerr.Unavailable, "mysql repository is not configured") + } + ctx = contextWithCommandApp(ctx, command.AppCode) + command.AppCode = appcode.FromContext(ctx) + + tx, err := r.db.BeginTx(ctx, nil) + if err != nil { + return ledger.CPBreakupFeeReceipt{}, err + } + defer func() { _ = tx.Rollback() }() + + requestHash := cpBreakupFeeRequestHash(command) + if txRow, exists, err := r.lookupTransaction(ctx, tx, command.CommandID, requestHash, bizTypeCPBreakupFee); err != nil || exists { + if err != nil || !exists { + return ledger.CPBreakupFeeReceipt{}, err + } + balance, balanceErr := r.balanceAfterTransaction(ctx, tx, txRow.TransactionID, command.UserID, ledger.AssetCoin) + if balanceErr != nil { + return ledger.CPBreakupFeeReceipt{}, balanceErr + } + return ledger.CPBreakupFeeReceipt{ + TransactionID: txRow.TransactionID, + CoinSpent: command.Amount, + CoinBalanceAfter: balance.AvailableAmount, + Balance: balance, + }, nil + } + + nowMs := time.Now().UnixMilli() + account, err := r.lockAccount(ctx, tx, command.UserID, ledger.AssetCoin, false, nowMs) + if err != nil { + return ledger.CPBreakupFeeReceipt{}, err + } + if account.AvailableAmount < command.Amount { + return ledger.CPBreakupFeeReceipt{}, xerr.New(xerr.InsufficientBalance, "insufficient balance") + } + transactionID := transactionID(command.AppCode, command.CommandID) + balanceAfter := account.AvailableAmount - command.Amount + metadata := cpBreakupFeeMetadata{ + AppCode: command.AppCode, + UserID: command.UserID, + RelationshipID: command.RelationshipID, + RelationType: command.RelationType, + Amount: command.Amount, + CoinBalanceAfter: balanceAfter, + } + if err := r.insertTransaction(ctx, tx, transactionID, command.CommandID, bizTypeCPBreakupFee, requestHash, command.RelationshipID, metadata, nowMs); err != nil { + return ledger.CPBreakupFeeReceipt{}, err + } + if err := r.applyAccountDelta(ctx, tx, account, -command.Amount, 0, nowMs); err != nil { + return ledger.CPBreakupFeeReceipt{}, err + } + balance := ledger.AssetBalance{ + AppCode: command.AppCode, + UserID: command.UserID, + AssetType: ledger.AssetCoin, + AvailableAmount: balanceAfter, + FrozenAmount: account.FrozenAmount, + Version: account.Version + 1, + UpdatedAtMs: nowMs, + } + if err := r.insertEntry(ctx, tx, walletEntry{ + TransactionID: transactionID, + UserID: command.UserID, + AssetType: ledger.AssetCoin, + AvailableDelta: -command.Amount, + FrozenDelta: 0, + AvailableAfter: balance.AvailableAmount, + FrozenAfter: balance.FrozenAmount, + CreatedAtMS: nowMs, + }); err != nil { + return ledger.CPBreakupFeeReceipt{}, err + } + if err := r.insertWalletOutbox(ctx, tx, []walletOutboxEvent{ + balanceChangedEvent(transactionID, command.CommandID, command.UserID, ledger.AssetCoin, -command.Amount, 0, balance.AvailableAmount, balance.FrozenAmount, balance.Version, metadata, nowMs), + }); err != nil { + return ledger.CPBreakupFeeReceipt{}, err + } + if err := tx.Commit(); err != nil { + return ledger.CPBreakupFeeReceipt{}, err + } + return ledger.CPBreakupFeeReceipt{ + TransactionID: transactionID, + CoinSpent: command.Amount, + CoinBalanceAfter: balance.AvailableAmount, + Balance: balance, + }, nil +} + // CreditTaskReward 在一个事务内完成任务奖励 COIN 入账、交易分录和 outbox 事件。 func (r *Repository) CreditTaskReward(ctx context.Context, command ledger.TaskRewardCommand) (ledger.TaskRewardReceipt, error) { if r == nil || r.db == nil { @@ -2624,6 +2717,15 @@ type adminCreditMetadata struct { EvidenceRef string `json:"evidence_ref"` } +type cpBreakupFeeMetadata struct { + AppCode string `json:"app_code"` + UserID int64 `json:"user_id"` + RelationshipID string `json:"relationship_id"` + RelationType string `json:"relation_type"` + Amount int64 `json:"amount"` + CoinBalanceAfter int64 `json:"coin_balance_after"` +} + type taskRewardMetadata struct { AppCode string `json:"app_code"` TargetUserID int64 `json:"target_user_id"` @@ -3476,6 +3578,17 @@ func adminCreditRequestHash(command ledger.AdminCreditAssetCommand) string { )) } +func cpBreakupFeeRequestHash(command ledger.CPBreakupFeeCommand) string { + // 解除扣费幂等覆盖关系、关系类型、用户和费用;同 command_id 换任何字段都必须拒绝。 + return stableHash(fmt.Sprintf("cp_breakup_fee|%s|%d|%s|%s|%d", + appcode.Normalize(command.AppCode), + command.UserID, + strings.TrimSpace(command.RelationshipID), + strings.ToLower(strings.TrimSpace(command.RelationType)), + command.Amount, + )) +} + func taskRewardRequestHash(command ledger.TaskRewardCommand) string { return stableHash(fmt.Sprintf("task_reward|%s|%d|%d|%s|%s|%s|%s", appcode.Normalize(command.AppCode), diff --git a/services/wallet-service/internal/transport/grpc/server.go b/services/wallet-service/internal/transport/grpc/server.go index d7f281a7..c5f00c8e 100644 --- a/services/wallet-service/internal/transport/grpc/server.go +++ b/services/wallet-service/internal/transport/grpc/server.go @@ -493,6 +493,28 @@ func (s *Server) PurchaseVip(ctx context.Context, req *walletv1.PurchaseVipReque }, nil } +// DebitCPBreakupFee 扣除解除 CP/兄弟/姐妹关系费用;关系状态确认由 user-service 负责。 +func (s *Server) DebitCPBreakupFee(ctx context.Context, req *walletv1.DebitCPBreakupFeeRequest) (*walletv1.DebitCPBreakupFeeResponse, error) { + ctx = appcode.WithContext(ctx, req.GetAppCode()) + receipt, err := s.svc.DebitCPBreakupFee(ctx, ledger.CPBreakupFeeCommand{ + AppCode: req.GetAppCode(), + CommandID: req.GetCommandId(), + UserID: req.GetUserId(), + RelationshipID: req.GetRelationshipId(), + RelationType: req.GetRelationType(), + Amount: req.GetAmount(), + }) + if err != nil { + return nil, xerr.ToGRPCError(err) + } + return &walletv1.DebitCPBreakupFeeResponse{ + TransactionId: receipt.TransactionID, + CoinSpent: receipt.CoinSpent, + CoinBalanceAfter: receipt.CoinBalanceAfter, + Balance: balanceToProto(receipt.Balance), + }, nil +} + // GrantVip 统一处理活动和后台赠送 VIP。 func (s *Server) GrantVip(ctx context.Context, req *walletv1.GrantVipRequest) (*walletv1.GrantVipResponse, error) { ctx = appcode.WithContext(ctx, req.GetAppCode())