diff --git a/api/proto/user/v1/user.pb.go b/api/proto/user/v1/user.pb.go index 33ab235a..02730658 100644 --- a/api/proto/user/v1/user.pb.go +++ b/api/proto/user/v1/user.pb.go @@ -517,8 +517,10 @@ type User struct { ProfileBgImg string `protobuf:"bytes,31,opt,name=profile_bg_img,json=profileBgImg,proto3" json:"profile_bg_img,omitempty"` ContactInfo string `protobuf:"bytes,32,opt,name=contact_info,json=contactInfo,proto3" json:"contact_info,omitempty"` WithdrawUsdtTrc20Address string `protobuf:"bytes,33,opt,name=withdraw_usdt_trc20_address,json=withdrawUsdtTrc20Address,proto3" json:"withdraw_usdt_trc20_address,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // content_blacklisted 只控制游戏列表和 Banner 等运营内容可见性,不改变登录、房间或账务状态。 + ContentBlacklisted bool `protobuf:"varint,34,opt,name=content_blacklisted,json=contentBlacklisted,proto3" json:"content_blacklisted,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *User) Reset() { @@ -782,6 +784,13 @@ func (x *User) GetWithdrawUsdtTrc20Address() string { return "" } +func (x *User) GetContentBlacklisted() bool { + if x != nil { + return x.ContentBlacklisted + } + return false +} + // InviteOverview 是我的页可直接展示的邀请码和邀请计数 read model。 type InviteOverview struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -6847,6 +6856,476 @@ func (x *AdminIssueUserAccessTokenResponse) GetSessionLastHeartbeatAtMs() int64 return 0 } +// UserContentBlacklistEntry 是后台“黑名单屏蔽用户”列表当前态。 +// 用户展示字段随列表查询读取当前资料;operator_admin_id/reason/time 是 user-service 持有的治理事实。 +type UserContentBlacklistEntry struct { + state protoimpl.MessageState `protogen:"open.v1"` + UserId int64 `protobuf:"varint,1,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` + DisplayUserId string `protobuf:"bytes,2,opt,name=display_user_id,json=displayUserId,proto3" json:"display_user_id,omitempty"` + DefaultDisplayUserId string `protobuf:"bytes,3,opt,name=default_display_user_id,json=defaultDisplayUserId,proto3" json:"default_display_user_id,omitempty"` + PrettyId string `protobuf:"bytes,4,opt,name=pretty_id,json=prettyId,proto3" json:"pretty_id,omitempty"` + PrettyDisplayUserId string `protobuf:"bytes,5,opt,name=pretty_display_user_id,json=prettyDisplayUserId,proto3" json:"pretty_display_user_id,omitempty"` + Username string `protobuf:"bytes,6,opt,name=username,proto3" json:"username,omitempty"` + Avatar string `protobuf:"bytes,7,opt,name=avatar,proto3" json:"avatar,omitempty"` + UserStatus UserStatus `protobuf:"varint,8,opt,name=user_status,json=userStatus,proto3,enum=hyapp.user.v1.UserStatus" json:"user_status,omitempty"` + OperatorAdminId int64 `protobuf:"varint,9,opt,name=operator_admin_id,json=operatorAdminId,proto3" json:"operator_admin_id,omitempty"` + Reason string `protobuf:"bytes,10,opt,name=reason,proto3" json:"reason,omitempty"` + CreatedAtMs int64 `protobuf:"varint,11,opt,name=created_at_ms,json=createdAtMs,proto3" json:"created_at_ms,omitempty"` + UpdatedAtMs int64 `protobuf:"varint,12,opt,name=updated_at_ms,json=updatedAtMs,proto3" json:"updated_at_ms,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UserContentBlacklistEntry) Reset() { + *x = UserContentBlacklistEntry{} + mi := &file_proto_user_v1_user_proto_msgTypes[88] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UserContentBlacklistEntry) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UserContentBlacklistEntry) ProtoMessage() {} + +func (x *UserContentBlacklistEntry) ProtoReflect() protoreflect.Message { + mi := &file_proto_user_v1_user_proto_msgTypes[88] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UserContentBlacklistEntry.ProtoReflect.Descriptor instead. +func (*UserContentBlacklistEntry) Descriptor() ([]byte, []int) { + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{88} +} + +func (x *UserContentBlacklistEntry) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *UserContentBlacklistEntry) GetDisplayUserId() string { + if x != nil { + return x.DisplayUserId + } + return "" +} + +func (x *UserContentBlacklistEntry) GetDefaultDisplayUserId() string { + if x != nil { + return x.DefaultDisplayUserId + } + return "" +} + +func (x *UserContentBlacklistEntry) GetPrettyId() string { + if x != nil { + return x.PrettyId + } + return "" +} + +func (x *UserContentBlacklistEntry) GetPrettyDisplayUserId() string { + if x != nil { + return x.PrettyDisplayUserId + } + return "" +} + +func (x *UserContentBlacklistEntry) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +func (x *UserContentBlacklistEntry) GetAvatar() string { + if x != nil { + return x.Avatar + } + return "" +} + +func (x *UserContentBlacklistEntry) GetUserStatus() UserStatus { + if x != nil { + return x.UserStatus + } + return UserStatus_USER_STATUS_UNSPECIFIED +} + +func (x *UserContentBlacklistEntry) GetOperatorAdminId() int64 { + if x != nil { + return x.OperatorAdminId + } + return 0 +} + +func (x *UserContentBlacklistEntry) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + +func (x *UserContentBlacklistEntry) GetCreatedAtMs() int64 { + if x != nil { + return x.CreatedAtMs + } + return 0 +} + +func (x *UserContentBlacklistEntry) GetUpdatedAtMs() int64 { + if x != nil { + return x.UpdatedAtMs + } + return 0 +} + +type ListUserContentBlacklistRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Meta *RequestMeta `protobuf:"bytes,1,opt,name=meta,proto3" json:"meta,omitempty"` + Page int32 `protobuf:"varint,2,opt,name=page,proto3" json:"page,omitempty"` + PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListUserContentBlacklistRequest) Reset() { + *x = ListUserContentBlacklistRequest{} + mi := &file_proto_user_v1_user_proto_msgTypes[89] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListUserContentBlacklistRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListUserContentBlacklistRequest) ProtoMessage() {} + +func (x *ListUserContentBlacklistRequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_user_v1_user_proto_msgTypes[89] + 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 ListUserContentBlacklistRequest.ProtoReflect.Descriptor instead. +func (*ListUserContentBlacklistRequest) Descriptor() ([]byte, []int) { + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{89} +} + +func (x *ListUserContentBlacklistRequest) GetMeta() *RequestMeta { + if x != nil { + return x.Meta + } + return nil +} + +func (x *ListUserContentBlacklistRequest) GetPage() int32 { + if x != nil { + return x.Page + } + return 0 +} + +func (x *ListUserContentBlacklistRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +type ListUserContentBlacklistResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Items []*UserContentBlacklistEntry `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + Total int64 `protobuf:"varint,2,opt,name=total,proto3" json:"total,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListUserContentBlacklistResponse) Reset() { + *x = ListUserContentBlacklistResponse{} + mi := &file_proto_user_v1_user_proto_msgTypes[90] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListUserContentBlacklistResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListUserContentBlacklistResponse) ProtoMessage() {} + +func (x *ListUserContentBlacklistResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_user_v1_user_proto_msgTypes[90] + 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 ListUserContentBlacklistResponse.ProtoReflect.Descriptor instead. +func (*ListUserContentBlacklistResponse) Descriptor() ([]byte, []int) { + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{90} +} + +func (x *ListUserContentBlacklistResponse) GetItems() []*UserContentBlacklistEntry { + if x != nil { + return x.Items + } + return nil +} + +func (x *ListUserContentBlacklistResponse) GetTotal() int64 { + if x != nil { + return x.Total + } + return 0 +} + +type AdminAddUserContentBlacklistRequest 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"` + OperatorAdminId int64 `protobuf:"varint,3,opt,name=operator_admin_id,json=operatorAdminId,proto3" json:"operator_admin_id,omitempty"` + Reason string `protobuf:"bytes,4,opt,name=reason,proto3" json:"reason,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AdminAddUserContentBlacklistRequest) Reset() { + *x = AdminAddUserContentBlacklistRequest{} + mi := &file_proto_user_v1_user_proto_msgTypes[91] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AdminAddUserContentBlacklistRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AdminAddUserContentBlacklistRequest) ProtoMessage() {} + +func (x *AdminAddUserContentBlacklistRequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_user_v1_user_proto_msgTypes[91] + 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 AdminAddUserContentBlacklistRequest.ProtoReflect.Descriptor instead. +func (*AdminAddUserContentBlacklistRequest) Descriptor() ([]byte, []int) { + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{91} +} + +func (x *AdminAddUserContentBlacklistRequest) GetMeta() *RequestMeta { + if x != nil { + return x.Meta + } + return nil +} + +func (x *AdminAddUserContentBlacklistRequest) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *AdminAddUserContentBlacklistRequest) GetOperatorAdminId() int64 { + if x != nil { + return x.OperatorAdminId + } + return 0 +} + +func (x *AdminAddUserContentBlacklistRequest) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + +type AdminAddUserContentBlacklistResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Item *UserContentBlacklistEntry `protobuf:"bytes,1,opt,name=item,proto3" json:"item,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AdminAddUserContentBlacklistResponse) Reset() { + *x = AdminAddUserContentBlacklistResponse{} + mi := &file_proto_user_v1_user_proto_msgTypes[92] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AdminAddUserContentBlacklistResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AdminAddUserContentBlacklistResponse) ProtoMessage() {} + +func (x *AdminAddUserContentBlacklistResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_user_v1_user_proto_msgTypes[92] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AdminAddUserContentBlacklistResponse.ProtoReflect.Descriptor instead. +func (*AdminAddUserContentBlacklistResponse) Descriptor() ([]byte, []int) { + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{92} +} + +func (x *AdminAddUserContentBlacklistResponse) GetItem() *UserContentBlacklistEntry { + if x != nil { + return x.Item + } + return nil +} + +type AdminRemoveUserContentBlacklistRequest 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"` + OperatorAdminId int64 `protobuf:"varint,3,opt,name=operator_admin_id,json=operatorAdminId,proto3" json:"operator_admin_id,omitempty"` + Reason string `protobuf:"bytes,4,opt,name=reason,proto3" json:"reason,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AdminRemoveUserContentBlacklistRequest) Reset() { + *x = AdminRemoveUserContentBlacklistRequest{} + mi := &file_proto_user_v1_user_proto_msgTypes[93] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AdminRemoveUserContentBlacklistRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AdminRemoveUserContentBlacklistRequest) ProtoMessage() {} + +func (x *AdminRemoveUserContentBlacklistRequest) ProtoReflect() protoreflect.Message { + mi := &file_proto_user_v1_user_proto_msgTypes[93] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AdminRemoveUserContentBlacklistRequest.ProtoReflect.Descriptor instead. +func (*AdminRemoveUserContentBlacklistRequest) Descriptor() ([]byte, []int) { + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{93} +} + +func (x *AdminRemoveUserContentBlacklistRequest) GetMeta() *RequestMeta { + if x != nil { + return x.Meta + } + return nil +} + +func (x *AdminRemoveUserContentBlacklistRequest) GetUserId() int64 { + if x != nil { + return x.UserId + } + return 0 +} + +func (x *AdminRemoveUserContentBlacklistRequest) GetOperatorAdminId() int64 { + if x != nil { + return x.OperatorAdminId + } + return 0 +} + +func (x *AdminRemoveUserContentBlacklistRequest) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + +type AdminRemoveUserContentBlacklistResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Removed bool `protobuf:"varint,1,opt,name=removed,proto3" json:"removed,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AdminRemoveUserContentBlacklistResponse) Reset() { + *x = AdminRemoveUserContentBlacklistResponse{} + mi := &file_proto_user_v1_user_proto_msgTypes[94] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AdminRemoveUserContentBlacklistResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AdminRemoveUserContentBlacklistResponse) ProtoMessage() {} + +func (x *AdminRemoveUserContentBlacklistResponse) ProtoReflect() protoreflect.Message { + mi := &file_proto_user_v1_user_proto_msgTypes[94] + 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 AdminRemoveUserContentBlacklistResponse.ProtoReflect.Descriptor instead. +func (*AdminRemoveUserContentBlacklistResponse) Descriptor() ([]byte, []int) { + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{94} +} + +func (x *AdminRemoveUserContentBlacklistResponse) GetRemoved() bool { + if x != nil { + return x.Removed + } + return false +} + // RoomBasicUser 是房间首屏只需要的用户展示基础资料。 type RoomBasicUser struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -6860,7 +7339,7 @@ type RoomBasicUser struct { func (x *RoomBasicUser) Reset() { *x = RoomBasicUser{} - mi := &file_proto_user_v1_user_proto_msgTypes[88] + mi := &file_proto_user_v1_user_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6872,7 +7351,7 @@ func (x *RoomBasicUser) String() string { func (*RoomBasicUser) ProtoMessage() {} func (x *RoomBasicUser) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[88] + mi := &file_proto_user_v1_user_proto_msgTypes[95] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6885,7 +7364,7 @@ func (x *RoomBasicUser) ProtoReflect() protoreflect.Message { // Deprecated: Use RoomBasicUser.ProtoReflect.Descriptor instead. func (*RoomBasicUser) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{88} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{95} } func (x *RoomBasicUser) GetUserId() int64 { @@ -6927,7 +7406,7 @@ type BatchGetRoomBasicUsersRequest struct { func (x *BatchGetRoomBasicUsersRequest) Reset() { *x = BatchGetRoomBasicUsersRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[89] + mi := &file_proto_user_v1_user_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6939,7 +7418,7 @@ func (x *BatchGetRoomBasicUsersRequest) String() string { func (*BatchGetRoomBasicUsersRequest) ProtoMessage() {} func (x *BatchGetRoomBasicUsersRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[89] + mi := &file_proto_user_v1_user_proto_msgTypes[96] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6952,7 +7431,7 @@ func (x *BatchGetRoomBasicUsersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchGetRoomBasicUsersRequest.ProtoReflect.Descriptor instead. func (*BatchGetRoomBasicUsersRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{89} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{96} } func (x *BatchGetRoomBasicUsersRequest) GetMeta() *RequestMeta { @@ -6979,7 +7458,7 @@ type BatchGetRoomBasicUsersResponse struct { func (x *BatchGetRoomBasicUsersResponse) Reset() { *x = BatchGetRoomBasicUsersResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[90] + mi := &file_proto_user_v1_user_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6991,7 +7470,7 @@ func (x *BatchGetRoomBasicUsersResponse) String() string { func (*BatchGetRoomBasicUsersResponse) ProtoMessage() {} func (x *BatchGetRoomBasicUsersResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[90] + mi := &file_proto_user_v1_user_proto_msgTypes[97] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7004,7 +7483,7 @@ func (x *BatchGetRoomBasicUsersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BatchGetRoomBasicUsersResponse.ProtoReflect.Descriptor instead. func (*BatchGetRoomBasicUsersResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{90} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{97} } func (x *BatchGetRoomBasicUsersResponse) GetUsers() map[int64]*RoomBasicUser { @@ -7029,7 +7508,7 @@ type ListUserIDsRequest struct { func (x *ListUserIDsRequest) Reset() { *x = ListUserIDsRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[91] + mi := &file_proto_user_v1_user_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7041,7 +7520,7 @@ func (x *ListUserIDsRequest) String() string { func (*ListUserIDsRequest) ProtoMessage() {} func (x *ListUserIDsRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[91] + mi := &file_proto_user_v1_user_proto_msgTypes[98] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7054,7 +7533,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{91} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{98} } func (x *ListUserIDsRequest) GetMeta() *RequestMeta { @@ -7111,7 +7590,7 @@ type ListUserIDsResponse struct { func (x *ListUserIDsResponse) Reset() { *x = ListUserIDsResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[92] + mi := &file_proto_user_v1_user_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7123,7 +7602,7 @@ func (x *ListUserIDsResponse) String() string { func (*ListUserIDsResponse) ProtoMessage() {} func (x *ListUserIDsResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[92] + mi := &file_proto_user_v1_user_proto_msgTypes[99] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7136,7 +7615,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{92} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{99} } func (x *ListUserIDsResponse) GetUserIds() []int64 { @@ -7177,7 +7656,7 @@ type UpdateUserProfileRequest struct { func (x *UpdateUserProfileRequest) Reset() { *x = UpdateUserProfileRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[93] + mi := &file_proto_user_v1_user_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7189,7 +7668,7 @@ func (x *UpdateUserProfileRequest) String() string { func (*UpdateUserProfileRequest) ProtoMessage() {} func (x *UpdateUserProfileRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[93] + mi := &file_proto_user_v1_user_proto_msgTypes[100] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7202,7 +7681,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{93} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{100} } func (x *UpdateUserProfileRequest) GetMeta() *RequestMeta { @@ -7264,7 +7743,7 @@ type UpdateUserProfileResponse struct { func (x *UpdateUserProfileResponse) Reset() { *x = UpdateUserProfileResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[94] + mi := &file_proto_user_v1_user_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7276,7 +7755,7 @@ func (x *UpdateUserProfileResponse) String() string { func (*UpdateUserProfileResponse) ProtoMessage() {} func (x *UpdateUserProfileResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[94] + mi := &file_proto_user_v1_user_proto_msgTypes[101] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7289,7 +7768,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{94} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{101} } func (x *UpdateUserProfileResponse) GetUser() *User { @@ -7321,7 +7800,7 @@ type UserAvatarMedia struct { func (x *UserAvatarMedia) Reset() { *x = UserAvatarMedia{} - mi := &file_proto_user_v1_user_proto_msgTypes[95] + mi := &file_proto_user_v1_user_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7333,7 +7812,7 @@ func (x *UserAvatarMedia) String() string { func (*UserAvatarMedia) ProtoMessage() {} func (x *UserAvatarMedia) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[95] + mi := &file_proto_user_v1_user_proto_msgTypes[102] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7346,7 +7825,7 @@ func (x *UserAvatarMedia) ProtoReflect() protoreflect.Message { // Deprecated: Use UserAvatarMedia.ProtoReflect.Descriptor instead. func (*UserAvatarMedia) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{95} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{102} } func (x *UserAvatarMedia) GetUrl() string { @@ -7446,7 +7925,7 @@ type AuthorizeUserAvatarUploadRequest struct { func (x *AuthorizeUserAvatarUploadRequest) Reset() { *x = AuthorizeUserAvatarUploadRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[96] + mi := &file_proto_user_v1_user_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7458,7 +7937,7 @@ func (x *AuthorizeUserAvatarUploadRequest) String() string { func (*AuthorizeUserAvatarUploadRequest) ProtoMessage() {} func (x *AuthorizeUserAvatarUploadRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[96] + mi := &file_proto_user_v1_user_proto_msgTypes[103] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7471,7 +7950,7 @@ func (x *AuthorizeUserAvatarUploadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AuthorizeUserAvatarUploadRequest.ProtoReflect.Descriptor instead. func (*AuthorizeUserAvatarUploadRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{96} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{103} } func (x *AuthorizeUserAvatarUploadRequest) GetMeta() *RequestMeta { @@ -7514,7 +7993,7 @@ type AuthorizeUserAvatarUploadResponse struct { func (x *AuthorizeUserAvatarUploadResponse) Reset() { *x = AuthorizeUserAvatarUploadResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[97] + mi := &file_proto_user_v1_user_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7526,7 +8005,7 @@ func (x *AuthorizeUserAvatarUploadResponse) String() string { func (*AuthorizeUserAvatarUploadResponse) ProtoMessage() {} func (x *AuthorizeUserAvatarUploadResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[97] + mi := &file_proto_user_v1_user_proto_msgTypes[104] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7539,7 +8018,7 @@ func (x *AuthorizeUserAvatarUploadResponse) ProtoReflect() protoreflect.Message // Deprecated: Use AuthorizeUserAvatarUploadResponse.ProtoReflect.Descriptor instead. func (*AuthorizeUserAvatarUploadResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{97} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{104} } func (x *AuthorizeUserAvatarUploadResponse) GetAllowed() bool { @@ -7583,7 +8062,7 @@ type CompleteUserAvatarUploadRequest struct { func (x *CompleteUserAvatarUploadRequest) Reset() { *x = CompleteUserAvatarUploadRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[98] + mi := &file_proto_user_v1_user_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7595,7 +8074,7 @@ func (x *CompleteUserAvatarUploadRequest) String() string { func (*CompleteUserAvatarUploadRequest) ProtoMessage() {} func (x *CompleteUserAvatarUploadRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[98] + mi := &file_proto_user_v1_user_proto_msgTypes[105] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7608,7 +8087,7 @@ func (x *CompleteUserAvatarUploadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CompleteUserAvatarUploadRequest.ProtoReflect.Descriptor instead. func (*CompleteUserAvatarUploadRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{98} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{105} } func (x *CompleteUserAvatarUploadRequest) GetMeta() *RequestMeta { @@ -7651,7 +8130,7 @@ type CompleteUserAvatarUploadResponse struct { func (x *CompleteUserAvatarUploadResponse) Reset() { *x = CompleteUserAvatarUploadResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[99] + mi := &file_proto_user_v1_user_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7663,7 +8142,7 @@ func (x *CompleteUserAvatarUploadResponse) String() string { func (*CompleteUserAvatarUploadResponse) ProtoMessage() {} func (x *CompleteUserAvatarUploadResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[99] + mi := &file_proto_user_v1_user_proto_msgTypes[106] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7676,7 +8155,7 @@ func (x *CompleteUserAvatarUploadResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CompleteUserAvatarUploadResponse.ProtoReflect.Descriptor instead. func (*CompleteUserAvatarUploadResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{99} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{106} } func (x *CompleteUserAvatarUploadResponse) GetActive() bool { @@ -7719,7 +8198,7 @@ type UpdateUserProfileBackgroundRequest struct { func (x *UpdateUserProfileBackgroundRequest) Reset() { *x = UpdateUserProfileBackgroundRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[100] + mi := &file_proto_user_v1_user_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7731,7 +8210,7 @@ func (x *UpdateUserProfileBackgroundRequest) String() string { func (*UpdateUserProfileBackgroundRequest) ProtoMessage() {} func (x *UpdateUserProfileBackgroundRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[100] + mi := &file_proto_user_v1_user_proto_msgTypes[107] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7744,7 +8223,7 @@ func (x *UpdateUserProfileBackgroundRequest) ProtoReflect() protoreflect.Message // Deprecated: Use UpdateUserProfileBackgroundRequest.ProtoReflect.Descriptor instead. func (*UpdateUserProfileBackgroundRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{100} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{107} } func (x *UpdateUserProfileBackgroundRequest) GetMeta() *RequestMeta { @@ -7778,7 +8257,7 @@ type UpdateUserProfileBackgroundResponse struct { func (x *UpdateUserProfileBackgroundResponse) Reset() { *x = UpdateUserProfileBackgroundResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[101] + mi := &file_proto_user_v1_user_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7790,7 +8269,7 @@ func (x *UpdateUserProfileBackgroundResponse) String() string { func (*UpdateUserProfileBackgroundResponse) ProtoMessage() {} func (x *UpdateUserProfileBackgroundResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[101] + mi := &file_proto_user_v1_user_proto_msgTypes[108] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7803,7 +8282,7 @@ func (x *UpdateUserProfileBackgroundResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use UpdateUserProfileBackgroundResponse.ProtoReflect.Descriptor instead. func (*UpdateUserProfileBackgroundResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{101} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{108} } func (x *UpdateUserProfileBackgroundResponse) GetUser() *User { @@ -7825,7 +8304,7 @@ type UpdateUserContactInfoRequest struct { func (x *UpdateUserContactInfoRequest) Reset() { *x = UpdateUserContactInfoRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[102] + mi := &file_proto_user_v1_user_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7837,7 +8316,7 @@ func (x *UpdateUserContactInfoRequest) String() string { func (*UpdateUserContactInfoRequest) ProtoMessage() {} func (x *UpdateUserContactInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[102] + mi := &file_proto_user_v1_user_proto_msgTypes[109] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7850,7 +8329,7 @@ func (x *UpdateUserContactInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateUserContactInfoRequest.ProtoReflect.Descriptor instead. func (*UpdateUserContactInfoRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{102} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{109} } func (x *UpdateUserContactInfoRequest) GetMeta() *RequestMeta { @@ -7884,7 +8363,7 @@ type UpdateUserContactInfoResponse struct { func (x *UpdateUserContactInfoResponse) Reset() { *x = UpdateUserContactInfoResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[103] + mi := &file_proto_user_v1_user_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7896,7 +8375,7 @@ func (x *UpdateUserContactInfoResponse) String() string { func (*UpdateUserContactInfoResponse) ProtoMessage() {} func (x *UpdateUserContactInfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[103] + mi := &file_proto_user_v1_user_proto_msgTypes[110] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7909,7 +8388,7 @@ func (x *UpdateUserContactInfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateUserContactInfoResponse.ProtoReflect.Descriptor instead. func (*UpdateUserContactInfoResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{103} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{110} } func (x *UpdateUserContactInfoResponse) GetUser() *User { @@ -7931,7 +8410,7 @@ type UpdateUserWithdrawAddressRequest struct { func (x *UpdateUserWithdrawAddressRequest) Reset() { *x = UpdateUserWithdrawAddressRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[104] + mi := &file_proto_user_v1_user_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7943,7 +8422,7 @@ func (x *UpdateUserWithdrawAddressRequest) String() string { func (*UpdateUserWithdrawAddressRequest) ProtoMessage() {} func (x *UpdateUserWithdrawAddressRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[104] + mi := &file_proto_user_v1_user_proto_msgTypes[111] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7956,7 +8435,7 @@ func (x *UpdateUserWithdrawAddressRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateUserWithdrawAddressRequest.ProtoReflect.Descriptor instead. func (*UpdateUserWithdrawAddressRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{104} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{111} } func (x *UpdateUserWithdrawAddressRequest) GetMeta() *RequestMeta { @@ -7990,7 +8469,7 @@ type UpdateUserWithdrawAddressResponse struct { func (x *UpdateUserWithdrawAddressResponse) Reset() { *x = UpdateUserWithdrawAddressResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[105] + mi := &file_proto_user_v1_user_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8002,7 +8481,7 @@ func (x *UpdateUserWithdrawAddressResponse) String() string { func (*UpdateUserWithdrawAddressResponse) ProtoMessage() {} func (x *UpdateUserWithdrawAddressResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[105] + mi := &file_proto_user_v1_user_proto_msgTypes[112] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8015,7 +8494,7 @@ func (x *UpdateUserWithdrawAddressResponse) ProtoReflect() protoreflect.Message // Deprecated: Use UpdateUserWithdrawAddressResponse.ProtoReflect.Descriptor instead. func (*UpdateUserWithdrawAddressResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{105} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{112} } func (x *UpdateUserWithdrawAddressResponse) GetUser() *User { @@ -8037,7 +8516,7 @@ type ChangeUserCountryRequest struct { func (x *ChangeUserCountryRequest) Reset() { *x = ChangeUserCountryRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[106] + mi := &file_proto_user_v1_user_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8049,7 +8528,7 @@ func (x *ChangeUserCountryRequest) String() string { func (*ChangeUserCountryRequest) ProtoMessage() {} func (x *ChangeUserCountryRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[106] + mi := &file_proto_user_v1_user_proto_msgTypes[113] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8062,7 +8541,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{106} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{113} } func (x *ChangeUserCountryRequest) GetMeta() *RequestMeta { @@ -8100,7 +8579,7 @@ type AdminChangeUserCountryRequest struct { func (x *AdminChangeUserCountryRequest) Reset() { *x = AdminChangeUserCountryRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[107] + mi := &file_proto_user_v1_user_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8112,7 +8591,7 @@ func (x *AdminChangeUserCountryRequest) String() string { func (*AdminChangeUserCountryRequest) ProtoMessage() {} func (x *AdminChangeUserCountryRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[107] + mi := &file_proto_user_v1_user_proto_msgTypes[114] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8125,7 +8604,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{107} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{114} } func (x *AdminChangeUserCountryRequest) GetMeta() *RequestMeta { @@ -8177,7 +8656,7 @@ type ChangeUserCountryResponse struct { func (x *ChangeUserCountryResponse) Reset() { *x = ChangeUserCountryResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[108] + mi := &file_proto_user_v1_user_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8189,7 +8668,7 @@ func (x *ChangeUserCountryResponse) String() string { func (*ChangeUserCountryResponse) ProtoMessage() {} func (x *ChangeUserCountryResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[108] + mi := &file_proto_user_v1_user_proto_msgTypes[115] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8202,7 +8681,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{108} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{115} } func (x *ChangeUserCountryResponse) GetUser() *User { @@ -8257,7 +8736,7 @@ type SetUserStatusRequest struct { func (x *SetUserStatusRequest) Reset() { *x = SetUserStatusRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[109] + mi := &file_proto_user_v1_user_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8269,7 +8748,7 @@ func (x *SetUserStatusRequest) String() string { func (*SetUserStatusRequest) ProtoMessage() {} func (x *SetUserStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[109] + mi := &file_proto_user_v1_user_proto_msgTypes[116] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8282,7 +8761,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{109} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{116} } func (x *SetUserStatusRequest) GetMeta() *RequestMeta { @@ -8348,7 +8827,7 @@ type SetUserStatusResponse struct { func (x *SetUserStatusResponse) Reset() { *x = SetUserStatusResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[110] + mi := &file_proto_user_v1_user_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8360,7 +8839,7 @@ func (x *SetUserStatusResponse) String() string { func (*SetUserStatusResponse) ProtoMessage() {} func (x *SetUserStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[110] + mi := &file_proto_user_v1_user_proto_msgTypes[117] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8373,7 +8852,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{110} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{117} } func (x *SetUserStatusResponse) GetUser() *User { @@ -8475,7 +8954,7 @@ type AdminUserBan struct { func (x *AdminUserBan) Reset() { *x = AdminUserBan{} - mi := &file_proto_user_v1_user_proto_msgTypes[111] + mi := &file_proto_user_v1_user_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8487,7 +8966,7 @@ func (x *AdminUserBan) String() string { func (*AdminUserBan) ProtoMessage() {} func (x *AdminUserBan) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[111] + mi := &file_proto_user_v1_user_proto_msgTypes[118] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8500,7 +8979,7 @@ func (x *AdminUserBan) ProtoReflect() protoreflect.Message { // Deprecated: Use AdminUserBan.ProtoReflect.Descriptor instead. func (*AdminUserBan) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{111} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{118} } func (x *AdminUserBan) GetBanId() string { @@ -8608,7 +9087,7 @@ type AdminBanUserRequest struct { func (x *AdminBanUserRequest) Reset() { *x = AdminBanUserRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[112] + mi := &file_proto_user_v1_user_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8620,7 +9099,7 @@ func (x *AdminBanUserRequest) String() string { func (*AdminBanUserRequest) ProtoMessage() {} func (x *AdminBanUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[112] + mi := &file_proto_user_v1_user_proto_msgTypes[119] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8633,7 +9112,7 @@ func (x *AdminBanUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AdminBanUserRequest.ProtoReflect.Descriptor instead. func (*AdminBanUserRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{112} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{119} } func (x *AdminBanUserRequest) GetMeta() *RequestMeta { @@ -8688,7 +9167,7 @@ type AdminBanUserResponse struct { func (x *AdminBanUserResponse) Reset() { *x = AdminBanUserResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[113] + mi := &file_proto_user_v1_user_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8700,7 +9179,7 @@ func (x *AdminBanUserResponse) String() string { func (*AdminBanUserResponse) ProtoMessage() {} func (x *AdminBanUserResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[113] + mi := &file_proto_user_v1_user_proto_msgTypes[120] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8713,7 +9192,7 @@ func (x *AdminBanUserResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AdminBanUserResponse.ProtoReflect.Descriptor instead. func (*AdminBanUserResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{113} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{120} } func (x *AdminBanUserResponse) GetBan() *AdminUserBan { @@ -8745,7 +9224,7 @@ type AdminUnbanUserRequest struct { func (x *AdminUnbanUserRequest) Reset() { *x = AdminUnbanUserRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[114] + mi := &file_proto_user_v1_user_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8757,7 +9236,7 @@ func (x *AdminUnbanUserRequest) String() string { func (*AdminUnbanUserRequest) ProtoMessage() {} func (x *AdminUnbanUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[114] + mi := &file_proto_user_v1_user_proto_msgTypes[121] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8770,7 +9249,7 @@ func (x *AdminUnbanUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AdminUnbanUserRequest.ProtoReflect.Descriptor instead. func (*AdminUnbanUserRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{114} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{121} } func (x *AdminUnbanUserRequest) GetMeta() *RequestMeta { @@ -8822,7 +9301,7 @@ type AdminUnbanUserResponse struct { func (x *AdminUnbanUserResponse) Reset() { *x = AdminUnbanUserResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[115] + mi := &file_proto_user_v1_user_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8834,7 +9313,7 @@ func (x *AdminUnbanUserResponse) String() string { func (*AdminUnbanUserResponse) ProtoMessage() {} func (x *AdminUnbanUserResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[115] + mi := &file_proto_user_v1_user_proto_msgTypes[122] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8847,7 +9326,7 @@ func (x *AdminUnbanUserResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AdminUnbanUserResponse.ProtoReflect.Descriptor instead. func (*AdminUnbanUserResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{115} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{122} } func (x *AdminUnbanUserResponse) GetBan() *AdminUserBan { @@ -8905,7 +9384,7 @@ type ManagerUserBlock struct { func (x *ManagerUserBlock) Reset() { *x = ManagerUserBlock{} - mi := &file_proto_user_v1_user_proto_msgTypes[116] + mi := &file_proto_user_v1_user_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8917,7 +9396,7 @@ func (x *ManagerUserBlock) String() string { func (*ManagerUserBlock) ProtoMessage() {} func (x *ManagerUserBlock) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[116] + mi := &file_proto_user_v1_user_proto_msgTypes[123] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8930,7 +9409,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{116} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{123} } func (x *ManagerUserBlock) GetBlockId() string { @@ -9031,7 +9510,7 @@ type CreateManagerUserBlockRequest struct { func (x *CreateManagerUserBlockRequest) Reset() { *x = CreateManagerUserBlockRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[117] + mi := &file_proto_user_v1_user_proto_msgTypes[124] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9043,7 +9522,7 @@ func (x *CreateManagerUserBlockRequest) String() string { func (*CreateManagerUserBlockRequest) ProtoMessage() {} func (x *CreateManagerUserBlockRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[117] + mi := &file_proto_user_v1_user_proto_msgTypes[124] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9056,7 +9535,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{117} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{124} } func (x *CreateManagerUserBlockRequest) GetMeta() *RequestMeta { @@ -9111,7 +9590,7 @@ type CreateManagerUserBlockResponse struct { func (x *CreateManagerUserBlockResponse) Reset() { *x = CreateManagerUserBlockResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[118] + mi := &file_proto_user_v1_user_proto_msgTypes[125] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9123,7 +9602,7 @@ func (x *CreateManagerUserBlockResponse) String() string { func (*CreateManagerUserBlockResponse) ProtoMessage() {} func (x *CreateManagerUserBlockResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[118] + mi := &file_proto_user_v1_user_proto_msgTypes[125] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9136,7 +9615,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{118} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{125} } func (x *CreateManagerUserBlockResponse) GetBlock() *ManagerUserBlock { @@ -9165,7 +9644,7 @@ type ListManagerUserBlocksRequest struct { func (x *ListManagerUserBlocksRequest) Reset() { *x = ListManagerUserBlocksRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[119] + mi := &file_proto_user_v1_user_proto_msgTypes[126] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9177,7 +9656,7 @@ func (x *ListManagerUserBlocksRequest) String() string { func (*ListManagerUserBlocksRequest) ProtoMessage() {} func (x *ListManagerUserBlocksRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[119] + mi := &file_proto_user_v1_user_proto_msgTypes[126] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9190,7 +9669,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{119} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{126} } func (x *ListManagerUserBlocksRequest) GetMeta() *RequestMeta { @@ -9230,7 +9709,7 @@ type ListManagerUserBlocksResponse struct { func (x *ListManagerUserBlocksResponse) Reset() { *x = ListManagerUserBlocksResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[120] + mi := &file_proto_user_v1_user_proto_msgTypes[127] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9242,7 +9721,7 @@ func (x *ListManagerUserBlocksResponse) String() string { func (*ListManagerUserBlocksResponse) ProtoMessage() {} func (x *ListManagerUserBlocksResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[120] + mi := &file_proto_user_v1_user_proto_msgTypes[127] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9255,7 +9734,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{120} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{127} } func (x *ListManagerUserBlocksResponse) GetBlocks() []*ManagerUserBlock { @@ -9277,7 +9756,7 @@ type UnblockManagerUserRequest struct { func (x *UnblockManagerUserRequest) Reset() { *x = UnblockManagerUserRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[121] + mi := &file_proto_user_v1_user_proto_msgTypes[128] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9289,7 +9768,7 @@ func (x *UnblockManagerUserRequest) String() string { func (*UnblockManagerUserRequest) ProtoMessage() {} func (x *UnblockManagerUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[121] + mi := &file_proto_user_v1_user_proto_msgTypes[128] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9302,7 +9781,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{121} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{128} } func (x *UnblockManagerUserRequest) GetMeta() *RequestMeta { @@ -9343,7 +9822,7 @@ type UnblockManagerUserResponse struct { func (x *UnblockManagerUserResponse) Reset() { *x = UnblockManagerUserResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[122] + mi := &file_proto_user_v1_user_proto_msgTypes[129] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9355,7 +9834,7 @@ func (x *UnblockManagerUserResponse) String() string { func (*UnblockManagerUserResponse) ProtoMessage() {} func (x *UnblockManagerUserResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[122] + mi := &file_proto_user_v1_user_proto_msgTypes[129] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9368,7 +9847,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{122} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{129} } func (x *UnblockManagerUserResponse) GetBlock() *ManagerUserBlock { @@ -9401,7 +9880,7 @@ type CompleteOnboardingRequest struct { func (x *CompleteOnboardingRequest) Reset() { *x = CompleteOnboardingRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[123] + mi := &file_proto_user_v1_user_proto_msgTypes[130] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9413,7 +9892,7 @@ func (x *CompleteOnboardingRequest) String() string { func (*CompleteOnboardingRequest) ProtoMessage() {} func (x *CompleteOnboardingRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[123] + mi := &file_proto_user_v1_user_proto_msgTypes[130] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9426,7 +9905,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{123} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{130} } func (x *CompleteOnboardingRequest) GetMeta() *RequestMeta { @@ -9493,7 +9972,7 @@ type CompleteOnboardingResponse struct { func (x *CompleteOnboardingResponse) Reset() { *x = CompleteOnboardingResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[124] + mi := &file_proto_user_v1_user_proto_msgTypes[131] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9505,7 +9984,7 @@ func (x *CompleteOnboardingResponse) String() string { func (*CompleteOnboardingResponse) ProtoMessage() {} func (x *CompleteOnboardingResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[124] + mi := &file_proto_user_v1_user_proto_msgTypes[131] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9518,7 +9997,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{124} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{131} } func (x *CompleteOnboardingResponse) GetUser() *User { @@ -9575,7 +10054,7 @@ type SearchInviteReferrerRequest struct { func (x *SearchInviteReferrerRequest) Reset() { *x = SearchInviteReferrerRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[125] + mi := &file_proto_user_v1_user_proto_msgTypes[132] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9587,7 +10066,7 @@ func (x *SearchInviteReferrerRequest) String() string { func (*SearchInviteReferrerRequest) ProtoMessage() {} func (x *SearchInviteReferrerRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[125] + mi := &file_proto_user_v1_user_proto_msgTypes[132] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9600,7 +10079,7 @@ func (x *SearchInviteReferrerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchInviteReferrerRequest.ProtoReflect.Descriptor instead. func (*SearchInviteReferrerRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{125} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{132} } func (x *SearchInviteReferrerRequest) GetMeta() *RequestMeta { @@ -9633,7 +10112,7 @@ type SearchInviteReferrerResponse struct { func (x *SearchInviteReferrerResponse) Reset() { *x = SearchInviteReferrerResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[126] + mi := &file_proto_user_v1_user_proto_msgTypes[133] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9645,7 +10124,7 @@ func (x *SearchInviteReferrerResponse) String() string { func (*SearchInviteReferrerResponse) ProtoMessage() {} func (x *SearchInviteReferrerResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[126] + mi := &file_proto_user_v1_user_proto_msgTypes[133] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9658,7 +10137,7 @@ func (x *SearchInviteReferrerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchInviteReferrerResponse.ProtoReflect.Descriptor instead. func (*SearchInviteReferrerResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{126} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{133} } func (x *SearchInviteReferrerResponse) GetInviter() *User { @@ -9680,7 +10159,7 @@ type BindInviteReferrerRequest struct { func (x *BindInviteReferrerRequest) Reset() { *x = BindInviteReferrerRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[127] + mi := &file_proto_user_v1_user_proto_msgTypes[134] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9692,7 +10171,7 @@ func (x *BindInviteReferrerRequest) String() string { func (*BindInviteReferrerRequest) ProtoMessage() {} func (x *BindInviteReferrerRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[127] + mi := &file_proto_user_v1_user_proto_msgTypes[134] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9705,7 +10184,7 @@ func (x *BindInviteReferrerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BindInviteReferrerRequest.ProtoReflect.Descriptor instead. func (*BindInviteReferrerRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{127} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{134} } func (x *BindInviteReferrerRequest) GetMeta() *RequestMeta { @@ -9739,7 +10218,7 @@ type BindInviteReferrerResponse struct { func (x *BindInviteReferrerResponse) Reset() { *x = BindInviteReferrerResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[128] + mi := &file_proto_user_v1_user_proto_msgTypes[135] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9751,7 +10230,7 @@ func (x *BindInviteReferrerResponse) String() string { func (*BindInviteReferrerResponse) ProtoMessage() {} func (x *BindInviteReferrerResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[128] + mi := &file_proto_user_v1_user_proto_msgTypes[135] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9764,7 +10243,7 @@ func (x *BindInviteReferrerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BindInviteReferrerResponse.ProtoReflect.Descriptor instead. func (*BindInviteReferrerResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{128} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{135} } func (x *BindInviteReferrerResponse) GetInvite() *InviteBinding { @@ -9800,7 +10279,7 @@ type BindPushTokenRequest struct { func (x *BindPushTokenRequest) Reset() { *x = BindPushTokenRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[129] + mi := &file_proto_user_v1_user_proto_msgTypes[136] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9812,7 +10291,7 @@ func (x *BindPushTokenRequest) String() string { func (*BindPushTokenRequest) ProtoMessage() {} func (x *BindPushTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[129] + mi := &file_proto_user_v1_user_proto_msgTypes[136] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9825,7 +10304,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{129} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{136} } func (x *BindPushTokenRequest) GetMeta() *RequestMeta { @@ -9901,7 +10380,7 @@ type BindPushTokenResponse struct { func (x *BindPushTokenResponse) Reset() { *x = BindPushTokenResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[130] + mi := &file_proto_user_v1_user_proto_msgTypes[137] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9913,7 +10392,7 @@ func (x *BindPushTokenResponse) String() string { func (*BindPushTokenResponse) ProtoMessage() {} func (x *BindPushTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[130] + mi := &file_proto_user_v1_user_proto_msgTypes[137] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9926,7 +10405,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{130} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{137} } func (x *BindPushTokenResponse) GetBound() bool { @@ -9957,7 +10436,7 @@ type DeletePushTokenRequest struct { func (x *DeletePushTokenRequest) Reset() { *x = DeletePushTokenRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[131] + mi := &file_proto_user_v1_user_proto_msgTypes[138] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9969,7 +10448,7 @@ func (x *DeletePushTokenRequest) String() string { func (*DeletePushTokenRequest) ProtoMessage() {} func (x *DeletePushTokenRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[131] + mi := &file_proto_user_v1_user_proto_msgTypes[138] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9982,7 +10461,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{131} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{138} } func (x *DeletePushTokenRequest) GetMeta() *RequestMeta { @@ -10023,7 +10502,7 @@ type DeletePushTokenResponse struct { func (x *DeletePushTokenResponse) Reset() { *x = DeletePushTokenResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[132] + mi := &file_proto_user_v1_user_proto_msgTypes[139] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10035,7 +10514,7 @@ func (x *DeletePushTokenResponse) String() string { func (*DeletePushTokenResponse) ProtoMessage() {} func (x *DeletePushTokenResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[132] + mi := &file_proto_user_v1_user_proto_msgTypes[139] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10048,7 +10527,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{132} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{139} } func (x *DeletePushTokenResponse) GetDeleted() bool { @@ -10087,7 +10566,7 @@ type Country struct { func (x *Country) Reset() { *x = Country{} - mi := &file_proto_user_v1_user_proto_msgTypes[133] + mi := &file_proto_user_v1_user_proto_msgTypes[140] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10099,7 +10578,7 @@ func (x *Country) String() string { func (*Country) ProtoMessage() {} func (x *Country) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[133] + mi := &file_proto_user_v1_user_proto_msgTypes[140] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10112,7 +10591,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{133} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{140} } func (x *Country) GetCountryId() int64 { @@ -10224,7 +10703,7 @@ type Region struct { func (x *Region) Reset() { *x = Region{} - mi := &file_proto_user_v1_user_proto_msgTypes[134] + mi := &file_proto_user_v1_user_proto_msgTypes[141] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10236,7 +10715,7 @@ func (x *Region) String() string { func (*Region) ProtoMessage() {} func (x *Region) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[134] + mi := &file_proto_user_v1_user_proto_msgTypes[141] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10249,7 +10728,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{134} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{141} } func (x *Region) GetRegionId() int64 { @@ -10325,7 +10804,7 @@ type ListCountriesRequest struct { func (x *ListCountriesRequest) Reset() { *x = ListCountriesRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[135] + mi := &file_proto_user_v1_user_proto_msgTypes[142] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10337,7 +10816,7 @@ func (x *ListCountriesRequest) String() string { func (*ListCountriesRequest) ProtoMessage() {} func (x *ListCountriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[135] + mi := &file_proto_user_v1_user_proto_msgTypes[142] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10350,7 +10829,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{135} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{142} } func (x *ListCountriesRequest) GetMeta() *RequestMeta { @@ -10376,7 +10855,7 @@ type ListCountriesResponse struct { func (x *ListCountriesResponse) Reset() { *x = ListCountriesResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[136] + mi := &file_proto_user_v1_user_proto_msgTypes[143] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10388,7 +10867,7 @@ func (x *ListCountriesResponse) String() string { func (*ListCountriesResponse) ProtoMessage() {} func (x *ListCountriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[136] + mi := &file_proto_user_v1_user_proto_msgTypes[143] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10401,7 +10880,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{136} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{143} } func (x *ListCountriesResponse) GetCountries() []*Country { @@ -10430,7 +10909,7 @@ type UpdateCountryRequest struct { func (x *UpdateCountryRequest) Reset() { *x = UpdateCountryRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[137] + mi := &file_proto_user_v1_user_proto_msgTypes[144] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10442,7 +10921,7 @@ func (x *UpdateCountryRequest) String() string { func (*UpdateCountryRequest) ProtoMessage() {} func (x *UpdateCountryRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[137] + mi := &file_proto_user_v1_user_proto_msgTypes[144] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10455,7 +10934,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{137} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{144} } func (x *UpdateCountryRequest) GetMeta() *RequestMeta { @@ -10537,7 +11016,7 @@ type CountryResponse struct { func (x *CountryResponse) Reset() { *x = CountryResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[138] + mi := &file_proto_user_v1_user_proto_msgTypes[145] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10549,7 +11028,7 @@ func (x *CountryResponse) String() string { func (*CountryResponse) ProtoMessage() {} func (x *CountryResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[138] + mi := &file_proto_user_v1_user_proto_msgTypes[145] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10562,7 +11041,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{138} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{145} } func (x *CountryResponse) GetCountry() *Country { @@ -10581,7 +11060,7 @@ type ListRegistrationCountriesRequest struct { func (x *ListRegistrationCountriesRequest) Reset() { *x = ListRegistrationCountriesRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[139] + mi := &file_proto_user_v1_user_proto_msgTypes[146] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10593,7 +11072,7 @@ func (x *ListRegistrationCountriesRequest) String() string { func (*ListRegistrationCountriesRequest) ProtoMessage() {} func (x *ListRegistrationCountriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[139] + mi := &file_proto_user_v1_user_proto_msgTypes[146] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10606,7 +11085,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{139} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{146} } func (x *ListRegistrationCountriesRequest) GetMeta() *RequestMeta { @@ -10625,7 +11104,7 @@ type ListRegistrationCountriesResponse struct { func (x *ListRegistrationCountriesResponse) Reset() { *x = ListRegistrationCountriesResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[140] + mi := &file_proto_user_v1_user_proto_msgTypes[147] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10637,7 +11116,7 @@ func (x *ListRegistrationCountriesResponse) String() string { func (*ListRegistrationCountriesResponse) ProtoMessage() {} func (x *ListRegistrationCountriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[140] + mi := &file_proto_user_v1_user_proto_msgTypes[147] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10650,7 +11129,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{140} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{147} } func (x *ListRegistrationCountriesResponse) GetCountries() []*Country { @@ -10671,7 +11150,7 @@ type LoginRiskBlockedCountry struct { func (x *LoginRiskBlockedCountry) Reset() { *x = LoginRiskBlockedCountry{} - mi := &file_proto_user_v1_user_proto_msgTypes[141] + mi := &file_proto_user_v1_user_proto_msgTypes[148] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10683,7 +11162,7 @@ func (x *LoginRiskBlockedCountry) String() string { func (*LoginRiskBlockedCountry) ProtoMessage() {} func (x *LoginRiskBlockedCountry) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[141] + mi := &file_proto_user_v1_user_proto_msgTypes[148] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10696,7 +11175,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{141} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{148} } func (x *LoginRiskBlockedCountry) GetCountryCode() string { @@ -10729,7 +11208,7 @@ type ListLoginRiskBlockedCountriesRequest struct { func (x *ListLoginRiskBlockedCountriesRequest) Reset() { *x = ListLoginRiskBlockedCountriesRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[142] + mi := &file_proto_user_v1_user_proto_msgTypes[149] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10741,7 +11220,7 @@ func (x *ListLoginRiskBlockedCountriesRequest) String() string { func (*ListLoginRiskBlockedCountriesRequest) ProtoMessage() {} func (x *ListLoginRiskBlockedCountriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[142] + mi := &file_proto_user_v1_user_proto_msgTypes[149] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10754,7 +11233,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{142} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{149} } func (x *ListLoginRiskBlockedCountriesRequest) GetMeta() *RequestMeta { @@ -10774,7 +11253,7 @@ type ListLoginRiskBlockedCountriesResponse struct { func (x *ListLoginRiskBlockedCountriesResponse) Reset() { *x = ListLoginRiskBlockedCountriesResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[143] + mi := &file_proto_user_v1_user_proto_msgTypes[150] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10786,7 +11265,7 @@ func (x *ListLoginRiskBlockedCountriesResponse) String() string { func (*ListLoginRiskBlockedCountriesResponse) ProtoMessage() {} func (x *ListLoginRiskBlockedCountriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[143] + mi := &file_proto_user_v1_user_proto_msgTypes[150] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10799,7 +11278,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{143} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{150} } func (x *ListLoginRiskBlockedCountriesResponse) GetCountries() []*LoginRiskBlockedCountry { @@ -10826,7 +11305,7 @@ type ListRegionsRequest struct { func (x *ListRegionsRequest) Reset() { *x = ListRegionsRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[144] + mi := &file_proto_user_v1_user_proto_msgTypes[151] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10838,7 +11317,7 @@ func (x *ListRegionsRequest) String() string { func (*ListRegionsRequest) ProtoMessage() {} func (x *ListRegionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[144] + mi := &file_proto_user_v1_user_proto_msgTypes[151] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10851,7 +11330,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{144} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{151} } func (x *ListRegionsRequest) GetMeta() *RequestMeta { @@ -10877,7 +11356,7 @@ type ListRegionsResponse struct { func (x *ListRegionsResponse) Reset() { *x = ListRegionsResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[145] + mi := &file_proto_user_v1_user_proto_msgTypes[152] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10889,7 +11368,7 @@ func (x *ListRegionsResponse) String() string { func (*ListRegionsResponse) ProtoMessage() {} func (x *ListRegionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[145] + mi := &file_proto_user_v1_user_proto_msgTypes[152] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10902,7 +11381,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{145} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{152} } func (x *ListRegionsResponse) GetRegions() []*Region { @@ -10922,7 +11401,7 @@ type GetRegionRequest struct { func (x *GetRegionRequest) Reset() { *x = GetRegionRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[146] + mi := &file_proto_user_v1_user_proto_msgTypes[153] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10934,7 +11413,7 @@ func (x *GetRegionRequest) String() string { func (*GetRegionRequest) ProtoMessage() {} func (x *GetRegionRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[146] + mi := &file_proto_user_v1_user_proto_msgTypes[153] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10947,7 +11426,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{146} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{153} } func (x *GetRegionRequest) GetMeta() *RequestMeta { @@ -10979,7 +11458,7 @@ type UpdateRegionRequest struct { func (x *UpdateRegionRequest) Reset() { *x = UpdateRegionRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[147] + mi := &file_proto_user_v1_user_proto_msgTypes[154] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10991,7 +11470,7 @@ func (x *UpdateRegionRequest) String() string { func (*UpdateRegionRequest) ProtoMessage() {} func (x *UpdateRegionRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[147] + mi := &file_proto_user_v1_user_proto_msgTypes[154] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11004,7 +11483,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{147} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{154} } func (x *UpdateRegionRequest) GetMeta() *RequestMeta { @@ -11061,7 +11540,7 @@ type ReplaceRegionCountriesRequest struct { func (x *ReplaceRegionCountriesRequest) Reset() { *x = ReplaceRegionCountriesRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[148] + mi := &file_proto_user_v1_user_proto_msgTypes[155] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11073,7 +11552,7 @@ func (x *ReplaceRegionCountriesRequest) String() string { func (*ReplaceRegionCountriesRequest) ProtoMessage() {} func (x *ReplaceRegionCountriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[148] + mi := &file_proto_user_v1_user_proto_msgTypes[155] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11086,7 +11565,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{148} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{155} } func (x *ReplaceRegionCountriesRequest) GetMeta() *RequestMeta { @@ -11126,7 +11605,7 @@ type RegionResponse struct { func (x *RegionResponse) Reset() { *x = RegionResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[149] + mi := &file_proto_user_v1_user_proto_msgTypes[156] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11138,7 +11617,7 @@ func (x *RegionResponse) String() string { func (*RegionResponse) ProtoMessage() {} func (x *RegionResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[149] + mi := &file_proto_user_v1_user_proto_msgTypes[156] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11151,7 +11630,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{149} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{156} } func (x *RegionResponse) GetRegion() *Region { @@ -11179,7 +11658,7 @@ type UserIdentity struct { func (x *UserIdentity) Reset() { *x = UserIdentity{} - mi := &file_proto_user_v1_user_proto_msgTypes[150] + mi := &file_proto_user_v1_user_proto_msgTypes[157] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11191,7 +11670,7 @@ func (x *UserIdentity) String() string { func (*UserIdentity) ProtoMessage() {} func (x *UserIdentity) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[150] + mi := &file_proto_user_v1_user_proto_msgTypes[157] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11204,7 +11683,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{150} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{157} } func (x *UserIdentity) GetUserId() int64 { @@ -11281,7 +11760,7 @@ type GetUserIdentityRequest struct { func (x *GetUserIdentityRequest) Reset() { *x = GetUserIdentityRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[151] + mi := &file_proto_user_v1_user_proto_msgTypes[158] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11293,7 +11772,7 @@ func (x *GetUserIdentityRequest) String() string { func (*GetUserIdentityRequest) ProtoMessage() {} func (x *GetUserIdentityRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[151] + mi := &file_proto_user_v1_user_proto_msgTypes[158] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11306,7 +11785,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{151} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{158} } func (x *GetUserIdentityRequest) GetMeta() *RequestMeta { @@ -11333,7 +11812,7 @@ type GetUserIdentityResponse struct { func (x *GetUserIdentityResponse) Reset() { *x = GetUserIdentityResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[152] + mi := &file_proto_user_v1_user_proto_msgTypes[159] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11345,7 +11824,7 @@ func (x *GetUserIdentityResponse) String() string { func (*GetUserIdentityResponse) ProtoMessage() {} func (x *GetUserIdentityResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[152] + mi := &file_proto_user_v1_user_proto_msgTypes[159] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11358,7 +11837,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{152} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{159} } func (x *GetUserIdentityResponse) GetIdentity() *UserIdentity { @@ -11379,7 +11858,7 @@ type ResolveDisplayUserIDRequest struct { func (x *ResolveDisplayUserIDRequest) Reset() { *x = ResolveDisplayUserIDRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[153] + mi := &file_proto_user_v1_user_proto_msgTypes[160] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11391,7 +11870,7 @@ func (x *ResolveDisplayUserIDRequest) String() string { func (*ResolveDisplayUserIDRequest) ProtoMessage() {} func (x *ResolveDisplayUserIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[153] + mi := &file_proto_user_v1_user_proto_msgTypes[160] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11404,7 +11883,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{153} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{160} } func (x *ResolveDisplayUserIDRequest) GetMeta() *RequestMeta { @@ -11431,7 +11910,7 @@ type ResolveDisplayUserIDResponse struct { func (x *ResolveDisplayUserIDResponse) Reset() { *x = ResolveDisplayUserIDResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[154] + mi := &file_proto_user_v1_user_proto_msgTypes[161] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11443,7 +11922,7 @@ func (x *ResolveDisplayUserIDResponse) String() string { func (*ResolveDisplayUserIDResponse) ProtoMessage() {} func (x *ResolveDisplayUserIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[154] + mi := &file_proto_user_v1_user_proto_msgTypes[161] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11456,7 +11935,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{154} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{161} } func (x *ResolveDisplayUserIDResponse) GetIdentity() *UserIdentity { @@ -11480,7 +11959,7 @@ type ChangeDisplayUserIDRequest struct { func (x *ChangeDisplayUserIDRequest) Reset() { *x = ChangeDisplayUserIDRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[155] + mi := &file_proto_user_v1_user_proto_msgTypes[162] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11492,7 +11971,7 @@ func (x *ChangeDisplayUserIDRequest) String() string { func (*ChangeDisplayUserIDRequest) ProtoMessage() {} func (x *ChangeDisplayUserIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[155] + mi := &file_proto_user_v1_user_proto_msgTypes[162] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11505,7 +11984,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{155} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{162} } func (x *ChangeDisplayUserIDRequest) GetMeta() *RequestMeta { @@ -11553,7 +12032,7 @@ type ChangeDisplayUserIDResponse struct { func (x *ChangeDisplayUserIDResponse) Reset() { *x = ChangeDisplayUserIDResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[156] + mi := &file_proto_user_v1_user_proto_msgTypes[163] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11565,7 +12044,7 @@ func (x *ChangeDisplayUserIDResponse) String() string { func (*ChangeDisplayUserIDResponse) ProtoMessage() {} func (x *ChangeDisplayUserIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[156] + mi := &file_proto_user_v1_user_proto_msgTypes[163] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11578,7 +12057,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{156} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{163} } func (x *ChangeDisplayUserIDResponse) GetIdentity() *UserIdentity { @@ -11602,7 +12081,7 @@ type ApplyPrettyDisplayUserIDRequest struct { func (x *ApplyPrettyDisplayUserIDRequest) Reset() { *x = ApplyPrettyDisplayUserIDRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[157] + mi := &file_proto_user_v1_user_proto_msgTypes[164] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11614,7 +12093,7 @@ func (x *ApplyPrettyDisplayUserIDRequest) String() string { func (*ApplyPrettyDisplayUserIDRequest) ProtoMessage() {} func (x *ApplyPrettyDisplayUserIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[157] + mi := &file_proto_user_v1_user_proto_msgTypes[164] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11627,7 +12106,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{157} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{164} } func (x *ApplyPrettyDisplayUserIDRequest) GetMeta() *RequestMeta { @@ -11676,7 +12155,7 @@ type ApplyPrettyDisplayUserIDResponse struct { func (x *ApplyPrettyDisplayUserIDResponse) Reset() { *x = ApplyPrettyDisplayUserIDResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[158] + mi := &file_proto_user_v1_user_proto_msgTypes[165] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11688,7 +12167,7 @@ func (x *ApplyPrettyDisplayUserIDResponse) String() string { func (*ApplyPrettyDisplayUserIDResponse) ProtoMessage() {} func (x *ApplyPrettyDisplayUserIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[158] + mi := &file_proto_user_v1_user_proto_msgTypes[165] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11701,7 +12180,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{158} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{165} } func (x *ApplyPrettyDisplayUserIDResponse) GetIdentity() *UserIdentity { @@ -11730,7 +12209,7 @@ type ExpirePrettyDisplayUserIDRequest struct { func (x *ExpirePrettyDisplayUserIDRequest) Reset() { *x = ExpirePrettyDisplayUserIDRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[159] + mi := &file_proto_user_v1_user_proto_msgTypes[166] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11742,7 +12221,7 @@ func (x *ExpirePrettyDisplayUserIDRequest) String() string { func (*ExpirePrettyDisplayUserIDRequest) ProtoMessage() {} func (x *ExpirePrettyDisplayUserIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[159] + mi := &file_proto_user_v1_user_proto_msgTypes[166] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11755,7 +12234,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{159} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{166} } func (x *ExpirePrettyDisplayUserIDRequest) GetMeta() *RequestMeta { @@ -11789,7 +12268,7 @@ type ExpirePrettyDisplayUserIDResponse struct { func (x *ExpirePrettyDisplayUserIDResponse) Reset() { *x = ExpirePrettyDisplayUserIDResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[160] + mi := &file_proto_user_v1_user_proto_msgTypes[167] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11801,7 +12280,7 @@ func (x *ExpirePrettyDisplayUserIDResponse) String() string { func (*ExpirePrettyDisplayUserIDResponse) ProtoMessage() {} func (x *ExpirePrettyDisplayUserIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[160] + mi := &file_proto_user_v1_user_proto_msgTypes[167] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11814,7 +12293,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{160} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{167} } func (x *ExpirePrettyDisplayUserIDResponse) GetIdentity() *UserIdentity { @@ -11847,7 +12326,7 @@ type PrettyDisplayIDPool struct { func (x *PrettyDisplayIDPool) Reset() { *x = PrettyDisplayIDPool{} - mi := &file_proto_user_v1_user_proto_msgTypes[161] + mi := &file_proto_user_v1_user_proto_msgTypes[168] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -11859,7 +12338,7 @@ func (x *PrettyDisplayIDPool) String() string { func (*PrettyDisplayIDPool) ProtoMessage() {} func (x *PrettyDisplayIDPool) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[161] + mi := &file_proto_user_v1_user_proto_msgTypes[168] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -11872,7 +12351,7 @@ func (x *PrettyDisplayIDPool) ProtoReflect() protoreflect.Message { // Deprecated: Use PrettyDisplayIDPool.ProtoReflect.Descriptor instead. func (*PrettyDisplayIDPool) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{161} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{168} } func (x *PrettyDisplayIDPool) GetAppCode() string { @@ -11998,7 +12477,7 @@ type PrettyDisplayID struct { func (x *PrettyDisplayID) Reset() { *x = PrettyDisplayID{} - mi := &file_proto_user_v1_user_proto_msgTypes[162] + mi := &file_proto_user_v1_user_proto_msgTypes[169] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12010,7 +12489,7 @@ func (x *PrettyDisplayID) String() string { func (*PrettyDisplayID) ProtoMessage() {} func (x *PrettyDisplayID) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[162] + mi := &file_proto_user_v1_user_proto_msgTypes[169] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12023,7 +12502,7 @@ func (x *PrettyDisplayID) ProtoReflect() protoreflect.Message { // Deprecated: Use PrettyDisplayID.ProtoReflect.Descriptor instead. func (*PrettyDisplayID) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{162} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{169} } func (x *PrettyDisplayID) GetAppCode() string { @@ -12159,7 +12638,7 @@ type PrettyDisplayIDGenerationBatch struct { func (x *PrettyDisplayIDGenerationBatch) Reset() { *x = PrettyDisplayIDGenerationBatch{} - mi := &file_proto_user_v1_user_proto_msgTypes[163] + mi := &file_proto_user_v1_user_proto_msgTypes[170] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12171,7 +12650,7 @@ func (x *PrettyDisplayIDGenerationBatch) String() string { func (*PrettyDisplayIDGenerationBatch) ProtoMessage() {} func (x *PrettyDisplayIDGenerationBatch) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[163] + mi := &file_proto_user_v1_user_proto_msgTypes[170] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12184,7 +12663,7 @@ func (x *PrettyDisplayIDGenerationBatch) ProtoReflect() protoreflect.Message { // Deprecated: Use PrettyDisplayIDGenerationBatch.ProtoReflect.Descriptor instead. func (*PrettyDisplayIDGenerationBatch) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{163} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{170} } func (x *PrettyDisplayIDGenerationBatch) GetAppCode() string { @@ -12290,7 +12769,7 @@ type ListAvailablePrettyDisplayIDsRequest struct { func (x *ListAvailablePrettyDisplayIDsRequest) Reset() { *x = ListAvailablePrettyDisplayIDsRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[164] + mi := &file_proto_user_v1_user_proto_msgTypes[171] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12302,7 +12781,7 @@ func (x *ListAvailablePrettyDisplayIDsRequest) String() string { func (*ListAvailablePrettyDisplayIDsRequest) ProtoMessage() {} func (x *ListAvailablePrettyDisplayIDsRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[164] + mi := &file_proto_user_v1_user_proto_msgTypes[171] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12315,7 +12794,7 @@ func (x *ListAvailablePrettyDisplayIDsRequest) ProtoReflect() protoreflect.Messa // Deprecated: Use ListAvailablePrettyDisplayIDsRequest.ProtoReflect.Descriptor instead. func (*ListAvailablePrettyDisplayIDsRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{164} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{171} } func (x *ListAvailablePrettyDisplayIDsRequest) GetMeta() *RequestMeta { @@ -12356,7 +12835,7 @@ type ListAvailablePrettyDisplayIDsResponse struct { func (x *ListAvailablePrettyDisplayIDsResponse) Reset() { *x = ListAvailablePrettyDisplayIDsResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[165] + mi := &file_proto_user_v1_user_proto_msgTypes[172] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12368,7 +12847,7 @@ func (x *ListAvailablePrettyDisplayIDsResponse) String() string { func (*ListAvailablePrettyDisplayIDsResponse) ProtoMessage() {} func (x *ListAvailablePrettyDisplayIDsResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[165] + mi := &file_proto_user_v1_user_proto_msgTypes[172] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12381,7 +12860,7 @@ func (x *ListAvailablePrettyDisplayIDsResponse) ProtoReflect() protoreflect.Mess // Deprecated: Use ListAvailablePrettyDisplayIDsResponse.ProtoReflect.Descriptor instead. func (*ListAvailablePrettyDisplayIDsResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{165} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{172} } func (x *ListAvailablePrettyDisplayIDsResponse) GetItems() []*PrettyDisplayID { @@ -12409,7 +12888,7 @@ type ApplyPrettyDisplayIDFromPoolRequest struct { func (x *ApplyPrettyDisplayIDFromPoolRequest) Reset() { *x = ApplyPrettyDisplayIDFromPoolRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[166] + mi := &file_proto_user_v1_user_proto_msgTypes[173] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12421,7 +12900,7 @@ func (x *ApplyPrettyDisplayIDFromPoolRequest) String() string { func (*ApplyPrettyDisplayIDFromPoolRequest) ProtoMessage() {} func (x *ApplyPrettyDisplayIDFromPoolRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[166] + mi := &file_proto_user_v1_user_proto_msgTypes[173] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12434,7 +12913,7 @@ func (x *ApplyPrettyDisplayIDFromPoolRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ApplyPrettyDisplayIDFromPoolRequest.ProtoReflect.Descriptor instead. func (*ApplyPrettyDisplayIDFromPoolRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{166} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{173} } func (x *ApplyPrettyDisplayIDFromPoolRequest) GetMeta() *RequestMeta { @@ -12469,7 +12948,7 @@ type ApplyPrettyDisplayIDFromPoolResponse struct { func (x *ApplyPrettyDisplayIDFromPoolResponse) Reset() { *x = ApplyPrettyDisplayIDFromPoolResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[167] + mi := &file_proto_user_v1_user_proto_msgTypes[174] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12481,7 +12960,7 @@ func (x *ApplyPrettyDisplayIDFromPoolResponse) String() string { func (*ApplyPrettyDisplayIDFromPoolResponse) ProtoMessage() {} func (x *ApplyPrettyDisplayIDFromPoolResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[167] + mi := &file_proto_user_v1_user_proto_msgTypes[174] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12494,7 +12973,7 @@ func (x *ApplyPrettyDisplayIDFromPoolResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ApplyPrettyDisplayIDFromPoolResponse.ProtoReflect.Descriptor instead. func (*ApplyPrettyDisplayIDFromPoolResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{167} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{174} } func (x *ApplyPrettyDisplayIDFromPoolResponse) GetIdentity() *UserIdentity { @@ -12531,7 +13010,7 @@ type ListPrettyDisplayIDPoolsRequest struct { func (x *ListPrettyDisplayIDPoolsRequest) Reset() { *x = ListPrettyDisplayIDPoolsRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[168] + mi := &file_proto_user_v1_user_proto_msgTypes[175] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12543,7 +13022,7 @@ func (x *ListPrettyDisplayIDPoolsRequest) String() string { func (*ListPrettyDisplayIDPoolsRequest) ProtoMessage() {} func (x *ListPrettyDisplayIDPoolsRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[168] + mi := &file_proto_user_v1_user_proto_msgTypes[175] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12556,7 +13035,7 @@ func (x *ListPrettyDisplayIDPoolsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPrettyDisplayIDPoolsRequest.ProtoReflect.Descriptor instead. func (*ListPrettyDisplayIDPoolsRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{168} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{175} } func (x *ListPrettyDisplayIDPoolsRequest) GetMeta() *RequestMeta { @@ -12604,7 +13083,7 @@ type ListPrettyDisplayIDPoolsResponse struct { func (x *ListPrettyDisplayIDPoolsResponse) Reset() { *x = ListPrettyDisplayIDPoolsResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[169] + mi := &file_proto_user_v1_user_proto_msgTypes[176] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12616,7 +13095,7 @@ func (x *ListPrettyDisplayIDPoolsResponse) String() string { func (*ListPrettyDisplayIDPoolsResponse) ProtoMessage() {} func (x *ListPrettyDisplayIDPoolsResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[169] + mi := &file_proto_user_v1_user_proto_msgTypes[176] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12629,7 +13108,7 @@ func (x *ListPrettyDisplayIDPoolsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPrettyDisplayIDPoolsResponse.ProtoReflect.Descriptor instead. func (*ListPrettyDisplayIDPoolsResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{169} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{176} } func (x *ListPrettyDisplayIDPoolsResponse) GetItems() []*PrettyDisplayIDPool { @@ -12664,7 +13143,7 @@ type CreatePrettyDisplayIDPoolRequest struct { func (x *CreatePrettyDisplayIDPoolRequest) Reset() { *x = CreatePrettyDisplayIDPoolRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[170] + mi := &file_proto_user_v1_user_proto_msgTypes[177] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12676,7 +13155,7 @@ func (x *CreatePrettyDisplayIDPoolRequest) String() string { func (*CreatePrettyDisplayIDPoolRequest) ProtoMessage() {} func (x *CreatePrettyDisplayIDPoolRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[170] + mi := &file_proto_user_v1_user_proto_msgTypes[177] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12689,7 +13168,7 @@ func (x *CreatePrettyDisplayIDPoolRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreatePrettyDisplayIDPoolRequest.ProtoReflect.Descriptor instead. func (*CreatePrettyDisplayIDPoolRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{170} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{177} } func (x *CreatePrettyDisplayIDPoolRequest) GetMeta() *RequestMeta { @@ -12781,7 +13260,7 @@ type UpdatePrettyDisplayIDPoolRequest struct { func (x *UpdatePrettyDisplayIDPoolRequest) Reset() { *x = UpdatePrettyDisplayIDPoolRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[171] + mi := &file_proto_user_v1_user_proto_msgTypes[178] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12793,7 +13272,7 @@ func (x *UpdatePrettyDisplayIDPoolRequest) String() string { func (*UpdatePrettyDisplayIDPoolRequest) ProtoMessage() {} func (x *UpdatePrettyDisplayIDPoolRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[171] + mi := &file_proto_user_v1_user_proto_msgTypes[178] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12806,7 +13285,7 @@ func (x *UpdatePrettyDisplayIDPoolRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdatePrettyDisplayIDPoolRequest.ProtoReflect.Descriptor instead. func (*UpdatePrettyDisplayIDPoolRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{171} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{178} } func (x *UpdatePrettyDisplayIDPoolRequest) GetMeta() *RequestMeta { @@ -12895,7 +13374,7 @@ type PrettyDisplayIDPoolResponse struct { func (x *PrettyDisplayIDPoolResponse) Reset() { *x = PrettyDisplayIDPoolResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[172] + mi := &file_proto_user_v1_user_proto_msgTypes[179] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12907,7 +13386,7 @@ func (x *PrettyDisplayIDPoolResponse) String() string { func (*PrettyDisplayIDPoolResponse) ProtoMessage() {} func (x *PrettyDisplayIDPoolResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[172] + mi := &file_proto_user_v1_user_proto_msgTypes[179] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12920,7 +13399,7 @@ func (x *PrettyDisplayIDPoolResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PrettyDisplayIDPoolResponse.ProtoReflect.Descriptor instead. func (*PrettyDisplayIDPoolResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{172} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{179} } func (x *PrettyDisplayIDPoolResponse) GetPool() *PrettyDisplayIDPool { @@ -12944,7 +13423,7 @@ type GeneratePrettyDisplayIDsRequest struct { func (x *GeneratePrettyDisplayIDsRequest) Reset() { *x = GeneratePrettyDisplayIDsRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[173] + mi := &file_proto_user_v1_user_proto_msgTypes[180] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -12956,7 +13435,7 @@ func (x *GeneratePrettyDisplayIDsRequest) String() string { func (*GeneratePrettyDisplayIDsRequest) ProtoMessage() {} func (x *GeneratePrettyDisplayIDsRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[173] + mi := &file_proto_user_v1_user_proto_msgTypes[180] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -12969,7 +13448,7 @@ func (x *GeneratePrettyDisplayIDsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GeneratePrettyDisplayIDsRequest.ProtoReflect.Descriptor instead. func (*GeneratePrettyDisplayIDsRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{173} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{180} } func (x *GeneratePrettyDisplayIDsRequest) GetMeta() *RequestMeta { @@ -13023,7 +13502,7 @@ type GeneratePrettyDisplayIDsResponse struct { func (x *GeneratePrettyDisplayIDsResponse) Reset() { *x = GeneratePrettyDisplayIDsResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[174] + mi := &file_proto_user_v1_user_proto_msgTypes[181] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13035,7 +13514,7 @@ func (x *GeneratePrettyDisplayIDsResponse) String() string { func (*GeneratePrettyDisplayIDsResponse) ProtoMessage() {} func (x *GeneratePrettyDisplayIDsResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[174] + mi := &file_proto_user_v1_user_proto_msgTypes[181] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13048,7 +13527,7 @@ func (x *GeneratePrettyDisplayIDsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GeneratePrettyDisplayIDsResponse.ProtoReflect.Descriptor instead. func (*GeneratePrettyDisplayIDsResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{174} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{181} } func (x *GeneratePrettyDisplayIDsResponse) GetBatch() *PrettyDisplayIDGenerationBatch { @@ -13074,7 +13553,7 @@ type ListPrettyDisplayIDsRequest struct { func (x *ListPrettyDisplayIDsRequest) Reset() { *x = ListPrettyDisplayIDsRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[175] + mi := &file_proto_user_v1_user_proto_msgTypes[182] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13086,7 +13565,7 @@ func (x *ListPrettyDisplayIDsRequest) String() string { func (*ListPrettyDisplayIDsRequest) ProtoMessage() {} func (x *ListPrettyDisplayIDsRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[175] + mi := &file_proto_user_v1_user_proto_msgTypes[182] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13099,7 +13578,7 @@ func (x *ListPrettyDisplayIDsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPrettyDisplayIDsRequest.ProtoReflect.Descriptor instead. func (*ListPrettyDisplayIDsRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{175} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{182} } func (x *ListPrettyDisplayIDsRequest) GetMeta() *RequestMeta { @@ -13168,7 +13647,7 @@ type ListPrettyDisplayIDsResponse struct { func (x *ListPrettyDisplayIDsResponse) Reset() { *x = ListPrettyDisplayIDsResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[176] + mi := &file_proto_user_v1_user_proto_msgTypes[183] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13180,7 +13659,7 @@ func (x *ListPrettyDisplayIDsResponse) String() string { func (*ListPrettyDisplayIDsResponse) ProtoMessage() {} func (x *ListPrettyDisplayIDsResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[176] + mi := &file_proto_user_v1_user_proto_msgTypes[183] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13193,7 +13672,7 @@ func (x *ListPrettyDisplayIDsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPrettyDisplayIDsResponse.ProtoReflect.Descriptor instead. func (*ListPrettyDisplayIDsResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{176} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{183} } func (x *ListPrettyDisplayIDsResponse) GetItems() []*PrettyDisplayID { @@ -13223,7 +13702,7 @@ type SetPrettyDisplayIDStatusRequest struct { func (x *SetPrettyDisplayIDStatusRequest) Reset() { *x = SetPrettyDisplayIDStatusRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[177] + mi := &file_proto_user_v1_user_proto_msgTypes[184] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13235,7 +13714,7 @@ func (x *SetPrettyDisplayIDStatusRequest) String() string { func (*SetPrettyDisplayIDStatusRequest) ProtoMessage() {} func (x *SetPrettyDisplayIDStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[177] + mi := &file_proto_user_v1_user_proto_msgTypes[184] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13248,7 +13727,7 @@ func (x *SetPrettyDisplayIDStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetPrettyDisplayIDStatusRequest.ProtoReflect.Descriptor instead. func (*SetPrettyDisplayIDStatusRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{177} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{184} } func (x *SetPrettyDisplayIDStatusRequest) GetMeta() *RequestMeta { @@ -13298,7 +13777,7 @@ type RecyclePrettyDisplayIDRequest struct { func (x *RecyclePrettyDisplayIDRequest) Reset() { *x = RecyclePrettyDisplayIDRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[178] + mi := &file_proto_user_v1_user_proto_msgTypes[185] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13310,7 +13789,7 @@ func (x *RecyclePrettyDisplayIDRequest) String() string { func (*RecyclePrettyDisplayIDRequest) ProtoMessage() {} func (x *RecyclePrettyDisplayIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[178] + mi := &file_proto_user_v1_user_proto_msgTypes[185] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13323,7 +13802,7 @@ func (x *RecyclePrettyDisplayIDRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RecyclePrettyDisplayIDRequest.ProtoReflect.Descriptor instead. func (*RecyclePrettyDisplayIDRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{178} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{185} } func (x *RecyclePrettyDisplayIDRequest) GetMeta() *RequestMeta { @@ -13363,7 +13842,7 @@ type PrettyDisplayIDResponse struct { func (x *PrettyDisplayIDResponse) Reset() { *x = PrettyDisplayIDResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[179] + mi := &file_proto_user_v1_user_proto_msgTypes[186] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13375,7 +13854,7 @@ func (x *PrettyDisplayIDResponse) String() string { func (*PrettyDisplayIDResponse) ProtoMessage() {} func (x *PrettyDisplayIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[179] + mi := &file_proto_user_v1_user_proto_msgTypes[186] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13388,7 +13867,7 @@ func (x *PrettyDisplayIDResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PrettyDisplayIDResponse.ProtoReflect.Descriptor instead. func (*PrettyDisplayIDResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{179} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{186} } func (x *PrettyDisplayIDResponse) GetItem() *PrettyDisplayID { @@ -13412,7 +13891,7 @@ type AdminGrantPrettyDisplayIDRequest struct { func (x *AdminGrantPrettyDisplayIDRequest) Reset() { *x = AdminGrantPrettyDisplayIDRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[180] + mi := &file_proto_user_v1_user_proto_msgTypes[187] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13424,7 +13903,7 @@ func (x *AdminGrantPrettyDisplayIDRequest) String() string { func (*AdminGrantPrettyDisplayIDRequest) ProtoMessage() {} func (x *AdminGrantPrettyDisplayIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[180] + mi := &file_proto_user_v1_user_proto_msgTypes[187] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13437,7 +13916,7 @@ func (x *AdminGrantPrettyDisplayIDRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AdminGrantPrettyDisplayIDRequest.ProtoReflect.Descriptor instead. func (*AdminGrantPrettyDisplayIDRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{180} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{187} } func (x *AdminGrantPrettyDisplayIDRequest) GetMeta() *RequestMeta { @@ -13493,7 +13972,7 @@ type AdminGrantPrettyDisplayIDResponse struct { func (x *AdminGrantPrettyDisplayIDResponse) Reset() { *x = AdminGrantPrettyDisplayIDResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[181] + mi := &file_proto_user_v1_user_proto_msgTypes[188] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13505,7 +13984,7 @@ func (x *AdminGrantPrettyDisplayIDResponse) String() string { func (*AdminGrantPrettyDisplayIDResponse) ProtoMessage() {} func (x *AdminGrantPrettyDisplayIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[181] + mi := &file_proto_user_v1_user_proto_msgTypes[188] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13518,7 +13997,7 @@ func (x *AdminGrantPrettyDisplayIDResponse) ProtoReflect() protoreflect.Message // Deprecated: Use AdminGrantPrettyDisplayIDResponse.ProtoReflect.Descriptor instead. func (*AdminGrantPrettyDisplayIDResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{181} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{188} } func (x *AdminGrantPrettyDisplayIDResponse) GetIdentity() *UserIdentity { @@ -13556,7 +14035,7 @@ type CPFormationGiftFeedItem struct { func (x *CPFormationGiftFeedItem) Reset() { *x = CPFormationGiftFeedItem{} - mi := &file_proto_user_v1_user_proto_msgTypes[182] + mi := &file_proto_user_v1_user_proto_msgTypes[189] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13568,7 +14047,7 @@ func (x *CPFormationGiftFeedItem) String() string { func (*CPFormationGiftFeedItem) ProtoMessage() {} func (x *CPFormationGiftFeedItem) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[182] + mi := &file_proto_user_v1_user_proto_msgTypes[189] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13581,7 +14060,7 @@ func (x *CPFormationGiftFeedItem) ProtoReflect() protoreflect.Message { // Deprecated: Use CPFormationGiftFeedItem.ProtoReflect.Descriptor instead. func (*CPFormationGiftFeedItem) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{182} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{189} } func (x *CPFormationGiftFeedItem) GetFormationId() string { @@ -13629,7 +14108,7 @@ type ListCPFormationGiftFeedRequest struct { func (x *ListCPFormationGiftFeedRequest) Reset() { *x = ListCPFormationGiftFeedRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[183] + mi := &file_proto_user_v1_user_proto_msgTypes[190] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13641,7 +14120,7 @@ func (x *ListCPFormationGiftFeedRequest) String() string { func (*ListCPFormationGiftFeedRequest) ProtoMessage() {} func (x *ListCPFormationGiftFeedRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[183] + mi := &file_proto_user_v1_user_proto_msgTypes[190] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13654,7 +14133,7 @@ func (x *ListCPFormationGiftFeedRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListCPFormationGiftFeedRequest.ProtoReflect.Descriptor instead. func (*ListCPFormationGiftFeedRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{183} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{190} } func (x *ListCPFormationGiftFeedRequest) GetMeta() *RequestMeta { @@ -13680,7 +14159,7 @@ type ListCPFormationGiftFeedResponse struct { func (x *ListCPFormationGiftFeedResponse) Reset() { *x = ListCPFormationGiftFeedResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[184] + mi := &file_proto_user_v1_user_proto_msgTypes[191] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13692,7 +14171,7 @@ func (x *ListCPFormationGiftFeedResponse) String() string { func (*ListCPFormationGiftFeedResponse) ProtoMessage() {} func (x *ListCPFormationGiftFeedResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[184] + mi := &file_proto_user_v1_user_proto_msgTypes[191] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13705,7 +14184,7 @@ func (x *ListCPFormationGiftFeedResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListCPFormationGiftFeedResponse.ProtoReflect.Descriptor instead. func (*ListCPFormationGiftFeedResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{184} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{191} } func (x *ListCPFormationGiftFeedResponse) GetItems() []*CPFormationGiftFeedItem { @@ -13725,7 +14204,7 @@ type ListAppsRequest struct { func (x *ListAppsRequest) Reset() { *x = ListAppsRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[185] + mi := &file_proto_user_v1_user_proto_msgTypes[192] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13737,7 +14216,7 @@ func (x *ListAppsRequest) String() string { func (*ListAppsRequest) ProtoMessage() {} func (x *ListAppsRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[185] + mi := &file_proto_user_v1_user_proto_msgTypes[192] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13750,7 +14229,7 @@ func (x *ListAppsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAppsRequest.ProtoReflect.Descriptor instead. func (*ListAppsRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{185} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{192} } func (x *ListAppsRequest) GetMeta() *RequestMeta { @@ -13769,7 +14248,7 @@ type ListAppsResponse struct { func (x *ListAppsResponse) Reset() { *x = ListAppsResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[186] + mi := &file_proto_user_v1_user_proto_msgTypes[193] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13781,7 +14260,7 @@ func (x *ListAppsResponse) String() string { func (*ListAppsResponse) ProtoMessage() {} func (x *ListAppsResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[186] + mi := &file_proto_user_v1_user_proto_msgTypes[193] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13794,7 +14273,7 @@ func (x *ListAppsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListAppsResponse.ProtoReflect.Descriptor instead. func (*ListAppsResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{186} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{193} } func (x *ListAppsResponse) GetApps() []*App { @@ -13816,7 +14295,7 @@ type ResolveAdminUserIdentifierRequest struct { func (x *ResolveAdminUserIdentifierRequest) Reset() { *x = ResolveAdminUserIdentifierRequest{} - mi := &file_proto_user_v1_user_proto_msgTypes[187] + mi := &file_proto_user_v1_user_proto_msgTypes[194] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13828,7 +14307,7 @@ func (x *ResolveAdminUserIdentifierRequest) String() string { func (*ResolveAdminUserIdentifierRequest) ProtoMessage() {} func (x *ResolveAdminUserIdentifierRequest) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[187] + mi := &file_proto_user_v1_user_proto_msgTypes[194] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13841,7 +14320,7 @@ func (x *ResolveAdminUserIdentifierRequest) ProtoReflect() protoreflect.Message // Deprecated: Use ResolveAdminUserIdentifierRequest.ProtoReflect.Descriptor instead. func (*ResolveAdminUserIdentifierRequest) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{187} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{194} } func (x *ResolveAdminUserIdentifierRequest) GetMeta() *RequestMeta { @@ -13868,7 +14347,7 @@ type ResolveAdminUserIdentifierResponse struct { func (x *ResolveAdminUserIdentifierResponse) Reset() { *x = ResolveAdminUserIdentifierResponse{} - mi := &file_proto_user_v1_user_proto_msgTypes[188] + mi := &file_proto_user_v1_user_proto_msgTypes[195] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -13880,7 +14359,7 @@ func (x *ResolveAdminUserIdentifierResponse) String() string { func (*ResolveAdminUserIdentifierResponse) ProtoMessage() {} func (x *ResolveAdminUserIdentifierResponse) ProtoReflect() protoreflect.Message { - mi := &file_proto_user_v1_user_proto_msgTypes[188] + mi := &file_proto_user_v1_user_proto_msgTypes[195] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -13893,7 +14372,7 @@ func (x *ResolveAdminUserIdentifierResponse) ProtoReflect() protoreflect.Message // Deprecated: Use ResolveAdminUserIdentifierResponse.ProtoReflect.Descriptor instead. func (*ResolveAdminUserIdentifierResponse) Descriptor() ([]byte, []int) { - return file_proto_user_v1_user_proto_rawDescGZIP(), []int{188} + return file_proto_user_v1_user_proto_rawDescGZIP(), []int{195} } func (x *ResolveAdminUserIdentifierResponse) GetIdentity() *UserIdentity { @@ -13950,7 +14429,7 @@ const file_proto_user_v1_user_proto_rawDesc = "" + "\bplatform\x18\x03 \x01(\tR\bplatform\x12\x19\n" + "\bapp_code\x18\x04 \x01(\tR\aappCode\":\n" + "\x12ResolveAppResponse\x12$\n" + - "\x03app\x18\x01 \x01(\v2\x12.hyapp.user.v1.AppR\x03app\"\x8b\n" + + "\x03app\x18\x01 \x01(\v2\x12.hyapp.user.v1.AppR\x03app\"\xbc\n" + "\n" + "\x04User\x12\x17\n" + "\auser_id\x18\x01 \x01(\x03R\x06userId\x121\n" + @@ -13990,7 +14469,8 @@ const file_proto_user_v1_user_proto_rawDesc = "" + "\x16pretty_display_user_id\x18\x1e \x01(\tR\x13prettyDisplayUserId\x12$\n" + "\x0eprofile_bg_img\x18\x1f \x01(\tR\fprofileBgImg\x12!\n" + "\fcontact_info\x18 \x01(\tR\vcontactInfo\x12=\n" + - "\x1bwithdraw_usdt_trc20_address\x18! \x01(\tR\x18withdrawUsdtTrc20Address\"\xed\x01\n" + + "\x1bwithdraw_usdt_trc20_address\x18! \x01(\tR\x18withdrawUsdtTrc20Address\x12/\n" + + "\x13content_blacklisted\x18\" \x01(\bR\x12contentBlacklisted\"\xed\x01\n" + "\x0eInviteOverview\x12$\n" + "\x0emy_invite_code\x18\x01 \x01(\tR\fmyInviteCode\x12%\n" + "\x0einvite_enabled\x18\x02 \x01(\bR\rinviteEnabled\x12!\n" + @@ -14502,7 +14982,43 @@ const file_proto_user_v1_user_proto_rawDesc = "" + "\n" + "session_id\x18\x04 \x01(\tR\tsessionId\x12\x1b\n" + "\tdevice_id\x18\x05 \x01(\tR\bdeviceId\x12>\n" + - "\x1csession_last_heartbeat_at_ms\x18\x06 \x01(\x03R\x18sessionLastHeartbeatAtMs\"\x84\x01\n" + + "\x1csession_last_heartbeat_at_ms\x18\x06 \x01(\x03R\x18sessionLastHeartbeatAtMs\"\xe1\x03\n" + + "\x19UserContentBlacklistEntry\x12\x17\n" + + "\auser_id\x18\x01 \x01(\x03R\x06userId\x12&\n" + + "\x0fdisplay_user_id\x18\x02 \x01(\tR\rdisplayUserId\x125\n" + + "\x17default_display_user_id\x18\x03 \x01(\tR\x14defaultDisplayUserId\x12\x1b\n" + + "\tpretty_id\x18\x04 \x01(\tR\bprettyId\x123\n" + + "\x16pretty_display_user_id\x18\x05 \x01(\tR\x13prettyDisplayUserId\x12\x1a\n" + + "\busername\x18\x06 \x01(\tR\busername\x12\x16\n" + + "\x06avatar\x18\a \x01(\tR\x06avatar\x12:\n" + + "\vuser_status\x18\b \x01(\x0e2\x19.hyapp.user.v1.UserStatusR\n" + + "userStatus\x12*\n" + + "\x11operator_admin_id\x18\t \x01(\x03R\x0foperatorAdminId\x12\x16\n" + + "\x06reason\x18\n" + + " \x01(\tR\x06reason\x12\"\n" + + "\rcreated_at_ms\x18\v \x01(\x03R\vcreatedAtMs\x12\"\n" + + "\rupdated_at_ms\x18\f \x01(\x03R\vupdatedAtMs\"\x82\x01\n" + + "\x1fListUserContentBlacklistRequest\x12.\n" + + "\x04meta\x18\x01 \x01(\v2\x1a.hyapp.user.v1.RequestMetaR\x04meta\x12\x12\n" + + "\x04page\x18\x02 \x01(\x05R\x04page\x12\x1b\n" + + "\tpage_size\x18\x03 \x01(\x05R\bpageSize\"x\n" + + " ListUserContentBlacklistResponse\x12>\n" + + "\x05items\x18\x01 \x03(\v2(.hyapp.user.v1.UserContentBlacklistEntryR\x05items\x12\x14\n" + + "\x05total\x18\x02 \x01(\x03R\x05total\"\xb2\x01\n" + + "#AdminAddUserContentBlacklistRequest\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" + + "\x11operator_admin_id\x18\x03 \x01(\x03R\x0foperatorAdminId\x12\x16\n" + + "\x06reason\x18\x04 \x01(\tR\x06reason\"d\n" + + "$AdminAddUserContentBlacklistResponse\x12<\n" + + "\x04item\x18\x01 \x01(\v2(.hyapp.user.v1.UserContentBlacklistEntryR\x04item\"\xb5\x01\n" + + "&AdminRemoveUserContentBlacklistRequest\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" + + "\x11operator_admin_id\x18\x03 \x01(\x03R\x0foperatorAdminId\x12\x16\n" + + "\x06reason\x18\x04 \x01(\tR\x06reason\"C\n" + + "'AdminRemoveUserContentBlacklistResponse\x12\x18\n" + + "\aremoved\x18\x01 \x01(\bR\aremoved\"\x84\x01\n" + "\rRoomBasicUser\x12\x17\n" + "\auser_id\x18\x01 \x01(\x03R\x06userId\x12\x1a\n" + "\busername\x18\x02 \x01(\tR\busername\x12\x16\n" + @@ -15089,7 +15605,7 @@ const file_proto_user_v1_user_proto_rawDesc = "" + "\x17USER_STATUS_UNSPECIFIED\x10\x00\x12\x16\n" + "\x12USER_STATUS_ACTIVE\x10\x01\x12\x18\n" + "\x14USER_STATUS_DISABLED\x10\x02\x12\x16\n" + - "\x12USER_STATUS_BANNED\x10\x032\xa9\x17\n" + + "\x12USER_STATUS_BANNED\x10\x032\xc3\x1a\n" + "\vUserService\x12H\n" + "\aGetUser\x12\x1d.hyapp.user.v1.GetUserRequest\x1a\x1e.hyapp.user.v1.GetUserResponse\x12o\n" + "\x14GetInviteAttribution\x12*.hyapp.user.v1.GetInviteAttributionRequest\x1a+.hyapp.user.v1.GetInviteAttributionResponse\x12i\n" + @@ -15097,7 +15613,10 @@ const file_proto_user_v1_user_proto_rawDesc = "" + "\x11GetMyProfileStats\x12'.hyapp.user.v1.GetMyProfileStatsRequest\x1a(.hyapp.user.v1.GetMyProfileStatsResponse\x12Z\n" + "\rBatchGetUsers\x12#.hyapp.user.v1.BatchGetUsersRequest\x1a$.hyapp.user.v1.BatchGetUsersResponse\x12~\n" + "\x19BatchGetUserAdminProfiles\x12/.hyapp.user.v1.BatchGetUserAdminProfilesRequest\x1a0.hyapp.user.v1.BatchGetUserAdminProfilesResponse\x12~\n" + - "\x19AdminIssueUserAccessToken\x12/.hyapp.user.v1.AdminIssueUserAccessTokenRequest\x1a0.hyapp.user.v1.AdminIssueUserAccessTokenResponse\x12u\n" + + "\x19AdminIssueUserAccessToken\x12/.hyapp.user.v1.AdminIssueUserAccessTokenRequest\x1a0.hyapp.user.v1.AdminIssueUserAccessTokenResponse\x12{\n" + + "\x18ListUserContentBlacklist\x12..hyapp.user.v1.ListUserContentBlacklistRequest\x1a/.hyapp.user.v1.ListUserContentBlacklistResponse\x12\x87\x01\n" + + "\x1cAdminAddUserContentBlacklist\x122.hyapp.user.v1.AdminAddUserContentBlacklistRequest\x1a3.hyapp.user.v1.AdminAddUserContentBlacklistResponse\x12\x90\x01\n" + + "\x1fAdminRemoveUserContentBlacklist\x125.hyapp.user.v1.AdminRemoveUserContentBlacklistRequest\x1a6.hyapp.user.v1.AdminRemoveUserContentBlacklistResponse\x12u\n" + "\x16BatchGetRoomBasicUsers\x12,.hyapp.user.v1.BatchGetRoomBasicUsersRequest\x1a-.hyapp.user.v1.BatchGetRoomBasicUsersResponse\x12T\n" + "\vListUserIDs\x12!.hyapp.user.v1.ListUserIDsRequest\x1a\".hyapp.user.v1.ListUserIDsResponse\x12x\n" + "\x17GetUserMicLifetimeStats\x12-.hyapp.user.v1.GetUserMicLifetimeStatsRequest\x1a..hyapp.user.v1.GetUserMicLifetimeStatsResponse\x12~\n" + @@ -15203,201 +15722,208 @@ 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, 192) +var file_proto_user_v1_user_proto_msgTypes = make([]protoimpl.MessageInfo, 199) var file_proto_user_v1_user_proto_goTypes = []any{ - (UserStatus)(0), // 0: hyapp.user.v1.UserStatus - (*RequestMeta)(nil), // 1: hyapp.user.v1.RequestMeta - (*App)(nil), // 2: hyapp.user.v1.App - (*ResolveAppRequest)(nil), // 3: hyapp.user.v1.ResolveAppRequest - (*ResolveAppResponse)(nil), // 4: hyapp.user.v1.ResolveAppResponse - (*User)(nil), // 5: hyapp.user.v1.User - (*InviteOverview)(nil), // 6: hyapp.user.v1.InviteOverview - (*InviteBinding)(nil), // 7: hyapp.user.v1.InviteBinding - (*InviteAttribution)(nil), // 8: hyapp.user.v1.InviteAttribution - (*GetInviteAttributionRequest)(nil), // 9: hyapp.user.v1.GetInviteAttributionRequest - (*GetInviteAttributionResponse)(nil), // 10: hyapp.user.v1.GetInviteAttributionResponse - (*UserMicLifetimeStats)(nil), // 11: hyapp.user.v1.UserMicLifetimeStats - (*GetUserMicLifetimeStatsRequest)(nil), // 12: hyapp.user.v1.GetUserMicLifetimeStatsRequest - (*GetUserMicLifetimeStatsResponse)(nil), // 13: hyapp.user.v1.GetUserMicLifetimeStatsResponse - (*CronBatchRequest)(nil), // 14: hyapp.user.v1.CronBatchRequest - (*CronBatchResponse)(nil), // 15: hyapp.user.v1.CronBatchResponse - (*AuthToken)(nil), // 16: hyapp.user.v1.AuthToken - (*GetUserRequest)(nil), // 17: hyapp.user.v1.GetUserRequest - (*GetUserResponse)(nil), // 18: hyapp.user.v1.GetUserResponse - (*BusinessUserLookupRequest)(nil), // 19: hyapp.user.v1.BusinessUserLookupRequest - (*BusinessUserLookupItem)(nil), // 20: hyapp.user.v1.BusinessUserLookupItem - (*BusinessUserLookupResponse)(nil), // 21: hyapp.user.v1.BusinessUserLookupResponse - (*UserProfileStats)(nil), // 22: hyapp.user.v1.UserProfileStats - (*GetMyProfileStatsRequest)(nil), // 23: hyapp.user.v1.GetMyProfileStatsRequest - (*GetMyProfileStatsResponse)(nil), // 24: hyapp.user.v1.GetMyProfileStatsResponse - (*RecordProfileVisitRequest)(nil), // 25: hyapp.user.v1.RecordProfileVisitRequest - (*RecordProfileVisitResponse)(nil), // 26: hyapp.user.v1.RecordProfileVisitResponse - (*ProfileVisitRecord)(nil), // 27: hyapp.user.v1.ProfileVisitRecord - (*ListProfileVisitorsRequest)(nil), // 28: hyapp.user.v1.ListProfileVisitorsRequest - (*ListProfileVisitorsResponse)(nil), // 29: hyapp.user.v1.ListProfileVisitorsResponse - (*FollowUserRequest)(nil), // 30: hyapp.user.v1.FollowUserRequest - (*FollowUserResponse)(nil), // 31: hyapp.user.v1.FollowUserResponse - (*UnfollowUserRequest)(nil), // 32: hyapp.user.v1.UnfollowUserRequest - (*UnfollowUserResponse)(nil), // 33: hyapp.user.v1.UnfollowUserResponse - (*FollowRecord)(nil), // 34: hyapp.user.v1.FollowRecord - (*ListFollowingRequest)(nil), // 35: hyapp.user.v1.ListFollowingRequest - (*ListFollowingResponse)(nil), // 36: hyapp.user.v1.ListFollowingResponse - (*ApplyFriendRequest)(nil), // 37: hyapp.user.v1.ApplyFriendRequest - (*ApplyFriendResponse)(nil), // 38: hyapp.user.v1.ApplyFriendResponse - (*AcceptFriendApplicationRequest)(nil), // 39: hyapp.user.v1.AcceptFriendApplicationRequest - (*AcceptFriendApplicationResponse)(nil), // 40: hyapp.user.v1.AcceptFriendApplicationResponse - (*DeleteFriendRequest)(nil), // 41: hyapp.user.v1.DeleteFriendRequest - (*DeleteFriendResponse)(nil), // 42: hyapp.user.v1.DeleteFriendResponse - (*FriendRecord)(nil), // 43: hyapp.user.v1.FriendRecord - (*ListFriendsRequest)(nil), // 44: hyapp.user.v1.ListFriendsRequest - (*ListFriendsResponse)(nil), // 45: hyapp.user.v1.ListFriendsResponse - (*FriendApplication)(nil), // 46: hyapp.user.v1.FriendApplication - (*ListFriendApplicationsRequest)(nil), // 47: hyapp.user.v1.ListFriendApplicationsRequest - (*ListFriendApplicationsResponse)(nil), // 48: hyapp.user.v1.ListFriendApplicationsResponse - (*CPUserProfile)(nil), // 49: hyapp.user.v1.CPUserProfile - (*CPGiftSnapshot)(nil), // 50: hyapp.user.v1.CPGiftSnapshot - (*CPApplication)(nil), // 51: hyapp.user.v1.CPApplication - (*CPRelationship)(nil), // 52: hyapp.user.v1.CPRelationship - (*CPAvatarFrameSnapshot)(nil), // 53: hyapp.user.v1.CPAvatarFrameSnapshot - (*CPIntimacyLeaderboardUser)(nil), // 54: hyapp.user.v1.CPIntimacyLeaderboardUser - (*CPIntimacyLeaderboardItem)(nil), // 55: hyapp.user.v1.CPIntimacyLeaderboardItem - (*CPWeeklyRankEntry)(nil), // 56: hyapp.user.v1.CPWeeklyRankEntry - (*ListCPWeeklyRankEntriesRequest)(nil), // 57: hyapp.user.v1.ListCPWeeklyRankEntriesRequest - (*ListCPWeeklyRankEntriesResponse)(nil), // 58: hyapp.user.v1.ListCPWeeklyRankEntriesResponse - (*ListCPApplicationsRequest)(nil), // 59: hyapp.user.v1.ListCPApplicationsRequest - (*ListCPApplicationsResponse)(nil), // 60: hyapp.user.v1.ListCPApplicationsResponse - (*AcceptCPApplicationRequest)(nil), // 61: hyapp.user.v1.AcceptCPApplicationRequest - (*AcceptCPApplicationResponse)(nil), // 62: hyapp.user.v1.AcceptCPApplicationResponse - (*RejectCPApplicationRequest)(nil), // 63: hyapp.user.v1.RejectCPApplicationRequest - (*RejectCPApplicationResponse)(nil), // 64: hyapp.user.v1.RejectCPApplicationResponse - (*ListCPRelationshipsRequest)(nil), // 65: hyapp.user.v1.ListCPRelationshipsRequest - (*ListCPRelationshipsResponse)(nil), // 66: hyapp.user.v1.ListCPRelationshipsResponse - (*ListCPIntimacyLeaderboardRequest)(nil), // 67: hyapp.user.v1.ListCPIntimacyLeaderboardRequest - (*ListCPIntimacyLeaderboardResponse)(nil), // 68: hyapp.user.v1.ListCPIntimacyLeaderboardResponse - (*PrepareBreakCPRelationshipRequest)(nil), // 69: hyapp.user.v1.PrepareBreakCPRelationshipRequest - (*PrepareBreakCPRelationshipResponse)(nil), // 70: hyapp.user.v1.PrepareBreakCPRelationshipResponse - (*ConfirmBreakCPRelationshipRequest)(nil), // 71: hyapp.user.v1.ConfirmBreakCPRelationshipRequest - (*ConfirmBreakCPRelationshipResponse)(nil), // 72: hyapp.user.v1.ConfirmBreakCPRelationshipResponse - (*CancelBreakCPRelationshipRequest)(nil), // 73: hyapp.user.v1.CancelBreakCPRelationshipRequest - (*CancelBreakCPRelationshipResponse)(nil), // 74: hyapp.user.v1.CancelBreakCPRelationshipResponse - (*RoomGiftCPEvent)(nil), // 75: hyapp.user.v1.RoomGiftCPEvent - (*ConsumeRoomGiftCPEventRequest)(nil), // 76: hyapp.user.v1.ConsumeRoomGiftCPEventRequest - (*ConsumeRoomGiftCPEventResponse)(nil), // 77: hyapp.user.v1.ConsumeRoomGiftCPEventResponse - (*UserReport)(nil), // 78: hyapp.user.v1.UserReport - (*SubmitReportRequest)(nil), // 79: hyapp.user.v1.SubmitReportRequest - (*SubmitReportResponse)(nil), // 80: hyapp.user.v1.SubmitReportResponse - (*BatchGetUsersRequest)(nil), // 81: hyapp.user.v1.BatchGetUsersRequest - (*BatchGetUsersResponse)(nil), // 82: hyapp.user.v1.BatchGetUsersResponse - (*ActiveUserBanSummary)(nil), // 83: hyapp.user.v1.ActiveUserBanSummary - (*UserAdminProfile)(nil), // 84: hyapp.user.v1.UserAdminProfile - (*BatchGetUserAdminProfilesRequest)(nil), // 85: hyapp.user.v1.BatchGetUserAdminProfilesRequest - (*BatchGetUserAdminProfilesResponse)(nil), // 86: hyapp.user.v1.BatchGetUserAdminProfilesResponse - (*AdminIssueUserAccessTokenRequest)(nil), // 87: hyapp.user.v1.AdminIssueUserAccessTokenRequest - (*AdminIssueUserAccessTokenResponse)(nil), // 88: hyapp.user.v1.AdminIssueUserAccessTokenResponse - (*RoomBasicUser)(nil), // 89: hyapp.user.v1.RoomBasicUser - (*BatchGetRoomBasicUsersRequest)(nil), // 90: hyapp.user.v1.BatchGetRoomBasicUsersRequest - (*BatchGetRoomBasicUsersResponse)(nil), // 91: hyapp.user.v1.BatchGetRoomBasicUsersResponse - (*ListUserIDsRequest)(nil), // 92: hyapp.user.v1.ListUserIDsRequest - (*ListUserIDsResponse)(nil), // 93: hyapp.user.v1.ListUserIDsResponse - (*UpdateUserProfileRequest)(nil), // 94: hyapp.user.v1.UpdateUserProfileRequest - (*UpdateUserProfileResponse)(nil), // 95: hyapp.user.v1.UpdateUserProfileResponse - (*UserAvatarMedia)(nil), // 96: hyapp.user.v1.UserAvatarMedia - (*AuthorizeUserAvatarUploadRequest)(nil), // 97: hyapp.user.v1.AuthorizeUserAvatarUploadRequest - (*AuthorizeUserAvatarUploadResponse)(nil), // 98: hyapp.user.v1.AuthorizeUserAvatarUploadResponse - (*CompleteUserAvatarUploadRequest)(nil), // 99: hyapp.user.v1.CompleteUserAvatarUploadRequest - (*CompleteUserAvatarUploadResponse)(nil), // 100: hyapp.user.v1.CompleteUserAvatarUploadResponse - (*UpdateUserProfileBackgroundRequest)(nil), // 101: hyapp.user.v1.UpdateUserProfileBackgroundRequest - (*UpdateUserProfileBackgroundResponse)(nil), // 102: hyapp.user.v1.UpdateUserProfileBackgroundResponse - (*UpdateUserContactInfoRequest)(nil), // 103: hyapp.user.v1.UpdateUserContactInfoRequest - (*UpdateUserContactInfoResponse)(nil), // 104: hyapp.user.v1.UpdateUserContactInfoResponse - (*UpdateUserWithdrawAddressRequest)(nil), // 105: hyapp.user.v1.UpdateUserWithdrawAddressRequest - (*UpdateUserWithdrawAddressResponse)(nil), // 106: hyapp.user.v1.UpdateUserWithdrawAddressResponse - (*ChangeUserCountryRequest)(nil), // 107: hyapp.user.v1.ChangeUserCountryRequest - (*AdminChangeUserCountryRequest)(nil), // 108: hyapp.user.v1.AdminChangeUserCountryRequest - (*ChangeUserCountryResponse)(nil), // 109: hyapp.user.v1.ChangeUserCountryResponse - (*SetUserStatusRequest)(nil), // 110: hyapp.user.v1.SetUserStatusRequest - (*SetUserStatusResponse)(nil), // 111: hyapp.user.v1.SetUserStatusResponse - (*AdminUserBan)(nil), // 112: hyapp.user.v1.AdminUserBan - (*AdminBanUserRequest)(nil), // 113: hyapp.user.v1.AdminBanUserRequest - (*AdminBanUserResponse)(nil), // 114: hyapp.user.v1.AdminBanUserResponse - (*AdminUnbanUserRequest)(nil), // 115: hyapp.user.v1.AdminUnbanUserRequest - (*AdminUnbanUserResponse)(nil), // 116: hyapp.user.v1.AdminUnbanUserResponse - (*ManagerUserBlock)(nil), // 117: hyapp.user.v1.ManagerUserBlock - (*CreateManagerUserBlockRequest)(nil), // 118: hyapp.user.v1.CreateManagerUserBlockRequest - (*CreateManagerUserBlockResponse)(nil), // 119: hyapp.user.v1.CreateManagerUserBlockResponse - (*ListManagerUserBlocksRequest)(nil), // 120: hyapp.user.v1.ListManagerUserBlocksRequest - (*ListManagerUserBlocksResponse)(nil), // 121: hyapp.user.v1.ListManagerUserBlocksResponse - (*UnblockManagerUserRequest)(nil), // 122: hyapp.user.v1.UnblockManagerUserRequest - (*UnblockManagerUserResponse)(nil), // 123: hyapp.user.v1.UnblockManagerUserResponse - (*CompleteOnboardingRequest)(nil), // 124: hyapp.user.v1.CompleteOnboardingRequest - (*CompleteOnboardingResponse)(nil), // 125: hyapp.user.v1.CompleteOnboardingResponse - (*SearchInviteReferrerRequest)(nil), // 126: hyapp.user.v1.SearchInviteReferrerRequest - (*SearchInviteReferrerResponse)(nil), // 127: hyapp.user.v1.SearchInviteReferrerResponse - (*BindInviteReferrerRequest)(nil), // 128: hyapp.user.v1.BindInviteReferrerRequest - (*BindInviteReferrerResponse)(nil), // 129: hyapp.user.v1.BindInviteReferrerResponse - (*BindPushTokenRequest)(nil), // 130: hyapp.user.v1.BindPushTokenRequest - (*BindPushTokenResponse)(nil), // 131: hyapp.user.v1.BindPushTokenResponse - (*DeletePushTokenRequest)(nil), // 132: hyapp.user.v1.DeletePushTokenRequest - (*DeletePushTokenResponse)(nil), // 133: hyapp.user.v1.DeletePushTokenResponse - (*Country)(nil), // 134: hyapp.user.v1.Country - (*Region)(nil), // 135: hyapp.user.v1.Region - (*ListCountriesRequest)(nil), // 136: hyapp.user.v1.ListCountriesRequest - (*ListCountriesResponse)(nil), // 137: hyapp.user.v1.ListCountriesResponse - (*UpdateCountryRequest)(nil), // 138: hyapp.user.v1.UpdateCountryRequest - (*CountryResponse)(nil), // 139: hyapp.user.v1.CountryResponse - (*ListRegistrationCountriesRequest)(nil), // 140: hyapp.user.v1.ListRegistrationCountriesRequest - (*ListRegistrationCountriesResponse)(nil), // 141: hyapp.user.v1.ListRegistrationCountriesResponse - (*LoginRiskBlockedCountry)(nil), // 142: hyapp.user.v1.LoginRiskBlockedCountry - (*ListLoginRiskBlockedCountriesRequest)(nil), // 143: hyapp.user.v1.ListLoginRiskBlockedCountriesRequest - (*ListLoginRiskBlockedCountriesResponse)(nil), // 144: hyapp.user.v1.ListLoginRiskBlockedCountriesResponse - (*ListRegionsRequest)(nil), // 145: hyapp.user.v1.ListRegionsRequest - (*ListRegionsResponse)(nil), // 146: hyapp.user.v1.ListRegionsResponse - (*GetRegionRequest)(nil), // 147: hyapp.user.v1.GetRegionRequest - (*UpdateRegionRequest)(nil), // 148: hyapp.user.v1.UpdateRegionRequest - (*ReplaceRegionCountriesRequest)(nil), // 149: hyapp.user.v1.ReplaceRegionCountriesRequest - (*RegionResponse)(nil), // 150: hyapp.user.v1.RegionResponse - (*UserIdentity)(nil), // 151: hyapp.user.v1.UserIdentity - (*GetUserIdentityRequest)(nil), // 152: hyapp.user.v1.GetUserIdentityRequest - (*GetUserIdentityResponse)(nil), // 153: hyapp.user.v1.GetUserIdentityResponse - (*ResolveDisplayUserIDRequest)(nil), // 154: hyapp.user.v1.ResolveDisplayUserIDRequest - (*ResolveDisplayUserIDResponse)(nil), // 155: hyapp.user.v1.ResolveDisplayUserIDResponse - (*ChangeDisplayUserIDRequest)(nil), // 156: hyapp.user.v1.ChangeDisplayUserIDRequest - (*ChangeDisplayUserIDResponse)(nil), // 157: hyapp.user.v1.ChangeDisplayUserIDResponse - (*ApplyPrettyDisplayUserIDRequest)(nil), // 158: hyapp.user.v1.ApplyPrettyDisplayUserIDRequest - (*ApplyPrettyDisplayUserIDResponse)(nil), // 159: hyapp.user.v1.ApplyPrettyDisplayUserIDResponse - (*ExpirePrettyDisplayUserIDRequest)(nil), // 160: hyapp.user.v1.ExpirePrettyDisplayUserIDRequest - (*ExpirePrettyDisplayUserIDResponse)(nil), // 161: hyapp.user.v1.ExpirePrettyDisplayUserIDResponse - (*PrettyDisplayIDPool)(nil), // 162: hyapp.user.v1.PrettyDisplayIDPool - (*PrettyDisplayID)(nil), // 163: hyapp.user.v1.PrettyDisplayID - (*PrettyDisplayIDGenerationBatch)(nil), // 164: hyapp.user.v1.PrettyDisplayIDGenerationBatch - (*ListAvailablePrettyDisplayIDsRequest)(nil), // 165: hyapp.user.v1.ListAvailablePrettyDisplayIDsRequest - (*ListAvailablePrettyDisplayIDsResponse)(nil), // 166: hyapp.user.v1.ListAvailablePrettyDisplayIDsResponse - (*ApplyPrettyDisplayIDFromPoolRequest)(nil), // 167: hyapp.user.v1.ApplyPrettyDisplayIDFromPoolRequest - (*ApplyPrettyDisplayIDFromPoolResponse)(nil), // 168: hyapp.user.v1.ApplyPrettyDisplayIDFromPoolResponse - (*ListPrettyDisplayIDPoolsRequest)(nil), // 169: hyapp.user.v1.ListPrettyDisplayIDPoolsRequest - (*ListPrettyDisplayIDPoolsResponse)(nil), // 170: hyapp.user.v1.ListPrettyDisplayIDPoolsResponse - (*CreatePrettyDisplayIDPoolRequest)(nil), // 171: hyapp.user.v1.CreatePrettyDisplayIDPoolRequest - (*UpdatePrettyDisplayIDPoolRequest)(nil), // 172: hyapp.user.v1.UpdatePrettyDisplayIDPoolRequest - (*PrettyDisplayIDPoolResponse)(nil), // 173: hyapp.user.v1.PrettyDisplayIDPoolResponse - (*GeneratePrettyDisplayIDsRequest)(nil), // 174: hyapp.user.v1.GeneratePrettyDisplayIDsRequest - (*GeneratePrettyDisplayIDsResponse)(nil), // 175: hyapp.user.v1.GeneratePrettyDisplayIDsResponse - (*ListPrettyDisplayIDsRequest)(nil), // 176: hyapp.user.v1.ListPrettyDisplayIDsRequest - (*ListPrettyDisplayIDsResponse)(nil), // 177: hyapp.user.v1.ListPrettyDisplayIDsResponse - (*SetPrettyDisplayIDStatusRequest)(nil), // 178: hyapp.user.v1.SetPrettyDisplayIDStatusRequest - (*RecyclePrettyDisplayIDRequest)(nil), // 179: hyapp.user.v1.RecyclePrettyDisplayIDRequest - (*PrettyDisplayIDResponse)(nil), // 180: hyapp.user.v1.PrettyDisplayIDResponse - (*AdminGrantPrettyDisplayIDRequest)(nil), // 181: hyapp.user.v1.AdminGrantPrettyDisplayIDRequest - (*AdminGrantPrettyDisplayIDResponse)(nil), // 182: hyapp.user.v1.AdminGrantPrettyDisplayIDResponse - (*CPFormationGiftFeedItem)(nil), // 183: hyapp.user.v1.CPFormationGiftFeedItem - (*ListCPFormationGiftFeedRequest)(nil), // 184: hyapp.user.v1.ListCPFormationGiftFeedRequest - (*ListCPFormationGiftFeedResponse)(nil), // 185: hyapp.user.v1.ListCPFormationGiftFeedResponse - (*ListAppsRequest)(nil), // 186: hyapp.user.v1.ListAppsRequest - (*ListAppsResponse)(nil), // 187: hyapp.user.v1.ListAppsResponse - (*ResolveAdminUserIdentifierRequest)(nil), // 188: hyapp.user.v1.ResolveAdminUserIdentifierRequest - (*ResolveAdminUserIdentifierResponse)(nil), // 189: hyapp.user.v1.ResolveAdminUserIdentifierResponse - nil, // 190: hyapp.user.v1.BatchGetUsersResponse.UsersEntry - nil, // 191: hyapp.user.v1.BatchGetUserAdminProfilesResponse.ProfilesEntry - nil, // 192: hyapp.user.v1.BatchGetRoomBasicUsersResponse.UsersEntry + (UserStatus)(0), // 0: hyapp.user.v1.UserStatus + (*RequestMeta)(nil), // 1: hyapp.user.v1.RequestMeta + (*App)(nil), // 2: hyapp.user.v1.App + (*ResolveAppRequest)(nil), // 3: hyapp.user.v1.ResolveAppRequest + (*ResolveAppResponse)(nil), // 4: hyapp.user.v1.ResolveAppResponse + (*User)(nil), // 5: hyapp.user.v1.User + (*InviteOverview)(nil), // 6: hyapp.user.v1.InviteOverview + (*InviteBinding)(nil), // 7: hyapp.user.v1.InviteBinding + (*InviteAttribution)(nil), // 8: hyapp.user.v1.InviteAttribution + (*GetInviteAttributionRequest)(nil), // 9: hyapp.user.v1.GetInviteAttributionRequest + (*GetInviteAttributionResponse)(nil), // 10: hyapp.user.v1.GetInviteAttributionResponse + (*UserMicLifetimeStats)(nil), // 11: hyapp.user.v1.UserMicLifetimeStats + (*GetUserMicLifetimeStatsRequest)(nil), // 12: hyapp.user.v1.GetUserMicLifetimeStatsRequest + (*GetUserMicLifetimeStatsResponse)(nil), // 13: hyapp.user.v1.GetUserMicLifetimeStatsResponse + (*CronBatchRequest)(nil), // 14: hyapp.user.v1.CronBatchRequest + (*CronBatchResponse)(nil), // 15: hyapp.user.v1.CronBatchResponse + (*AuthToken)(nil), // 16: hyapp.user.v1.AuthToken + (*GetUserRequest)(nil), // 17: hyapp.user.v1.GetUserRequest + (*GetUserResponse)(nil), // 18: hyapp.user.v1.GetUserResponse + (*BusinessUserLookupRequest)(nil), // 19: hyapp.user.v1.BusinessUserLookupRequest + (*BusinessUserLookupItem)(nil), // 20: hyapp.user.v1.BusinessUserLookupItem + (*BusinessUserLookupResponse)(nil), // 21: hyapp.user.v1.BusinessUserLookupResponse + (*UserProfileStats)(nil), // 22: hyapp.user.v1.UserProfileStats + (*GetMyProfileStatsRequest)(nil), // 23: hyapp.user.v1.GetMyProfileStatsRequest + (*GetMyProfileStatsResponse)(nil), // 24: hyapp.user.v1.GetMyProfileStatsResponse + (*RecordProfileVisitRequest)(nil), // 25: hyapp.user.v1.RecordProfileVisitRequest + (*RecordProfileVisitResponse)(nil), // 26: hyapp.user.v1.RecordProfileVisitResponse + (*ProfileVisitRecord)(nil), // 27: hyapp.user.v1.ProfileVisitRecord + (*ListProfileVisitorsRequest)(nil), // 28: hyapp.user.v1.ListProfileVisitorsRequest + (*ListProfileVisitorsResponse)(nil), // 29: hyapp.user.v1.ListProfileVisitorsResponse + (*FollowUserRequest)(nil), // 30: hyapp.user.v1.FollowUserRequest + (*FollowUserResponse)(nil), // 31: hyapp.user.v1.FollowUserResponse + (*UnfollowUserRequest)(nil), // 32: hyapp.user.v1.UnfollowUserRequest + (*UnfollowUserResponse)(nil), // 33: hyapp.user.v1.UnfollowUserResponse + (*FollowRecord)(nil), // 34: hyapp.user.v1.FollowRecord + (*ListFollowingRequest)(nil), // 35: hyapp.user.v1.ListFollowingRequest + (*ListFollowingResponse)(nil), // 36: hyapp.user.v1.ListFollowingResponse + (*ApplyFriendRequest)(nil), // 37: hyapp.user.v1.ApplyFriendRequest + (*ApplyFriendResponse)(nil), // 38: hyapp.user.v1.ApplyFriendResponse + (*AcceptFriendApplicationRequest)(nil), // 39: hyapp.user.v1.AcceptFriendApplicationRequest + (*AcceptFriendApplicationResponse)(nil), // 40: hyapp.user.v1.AcceptFriendApplicationResponse + (*DeleteFriendRequest)(nil), // 41: hyapp.user.v1.DeleteFriendRequest + (*DeleteFriendResponse)(nil), // 42: hyapp.user.v1.DeleteFriendResponse + (*FriendRecord)(nil), // 43: hyapp.user.v1.FriendRecord + (*ListFriendsRequest)(nil), // 44: hyapp.user.v1.ListFriendsRequest + (*ListFriendsResponse)(nil), // 45: hyapp.user.v1.ListFriendsResponse + (*FriendApplication)(nil), // 46: hyapp.user.v1.FriendApplication + (*ListFriendApplicationsRequest)(nil), // 47: hyapp.user.v1.ListFriendApplicationsRequest + (*ListFriendApplicationsResponse)(nil), // 48: hyapp.user.v1.ListFriendApplicationsResponse + (*CPUserProfile)(nil), // 49: hyapp.user.v1.CPUserProfile + (*CPGiftSnapshot)(nil), // 50: hyapp.user.v1.CPGiftSnapshot + (*CPApplication)(nil), // 51: hyapp.user.v1.CPApplication + (*CPRelationship)(nil), // 52: hyapp.user.v1.CPRelationship + (*CPAvatarFrameSnapshot)(nil), // 53: hyapp.user.v1.CPAvatarFrameSnapshot + (*CPIntimacyLeaderboardUser)(nil), // 54: hyapp.user.v1.CPIntimacyLeaderboardUser + (*CPIntimacyLeaderboardItem)(nil), // 55: hyapp.user.v1.CPIntimacyLeaderboardItem + (*CPWeeklyRankEntry)(nil), // 56: hyapp.user.v1.CPWeeklyRankEntry + (*ListCPWeeklyRankEntriesRequest)(nil), // 57: hyapp.user.v1.ListCPWeeklyRankEntriesRequest + (*ListCPWeeklyRankEntriesResponse)(nil), // 58: hyapp.user.v1.ListCPWeeklyRankEntriesResponse + (*ListCPApplicationsRequest)(nil), // 59: hyapp.user.v1.ListCPApplicationsRequest + (*ListCPApplicationsResponse)(nil), // 60: hyapp.user.v1.ListCPApplicationsResponse + (*AcceptCPApplicationRequest)(nil), // 61: hyapp.user.v1.AcceptCPApplicationRequest + (*AcceptCPApplicationResponse)(nil), // 62: hyapp.user.v1.AcceptCPApplicationResponse + (*RejectCPApplicationRequest)(nil), // 63: hyapp.user.v1.RejectCPApplicationRequest + (*RejectCPApplicationResponse)(nil), // 64: hyapp.user.v1.RejectCPApplicationResponse + (*ListCPRelationshipsRequest)(nil), // 65: hyapp.user.v1.ListCPRelationshipsRequest + (*ListCPRelationshipsResponse)(nil), // 66: hyapp.user.v1.ListCPRelationshipsResponse + (*ListCPIntimacyLeaderboardRequest)(nil), // 67: hyapp.user.v1.ListCPIntimacyLeaderboardRequest + (*ListCPIntimacyLeaderboardResponse)(nil), // 68: hyapp.user.v1.ListCPIntimacyLeaderboardResponse + (*PrepareBreakCPRelationshipRequest)(nil), // 69: hyapp.user.v1.PrepareBreakCPRelationshipRequest + (*PrepareBreakCPRelationshipResponse)(nil), // 70: hyapp.user.v1.PrepareBreakCPRelationshipResponse + (*ConfirmBreakCPRelationshipRequest)(nil), // 71: hyapp.user.v1.ConfirmBreakCPRelationshipRequest + (*ConfirmBreakCPRelationshipResponse)(nil), // 72: hyapp.user.v1.ConfirmBreakCPRelationshipResponse + (*CancelBreakCPRelationshipRequest)(nil), // 73: hyapp.user.v1.CancelBreakCPRelationshipRequest + (*CancelBreakCPRelationshipResponse)(nil), // 74: hyapp.user.v1.CancelBreakCPRelationshipResponse + (*RoomGiftCPEvent)(nil), // 75: hyapp.user.v1.RoomGiftCPEvent + (*ConsumeRoomGiftCPEventRequest)(nil), // 76: hyapp.user.v1.ConsumeRoomGiftCPEventRequest + (*ConsumeRoomGiftCPEventResponse)(nil), // 77: hyapp.user.v1.ConsumeRoomGiftCPEventResponse + (*UserReport)(nil), // 78: hyapp.user.v1.UserReport + (*SubmitReportRequest)(nil), // 79: hyapp.user.v1.SubmitReportRequest + (*SubmitReportResponse)(nil), // 80: hyapp.user.v1.SubmitReportResponse + (*BatchGetUsersRequest)(nil), // 81: hyapp.user.v1.BatchGetUsersRequest + (*BatchGetUsersResponse)(nil), // 82: hyapp.user.v1.BatchGetUsersResponse + (*ActiveUserBanSummary)(nil), // 83: hyapp.user.v1.ActiveUserBanSummary + (*UserAdminProfile)(nil), // 84: hyapp.user.v1.UserAdminProfile + (*BatchGetUserAdminProfilesRequest)(nil), // 85: hyapp.user.v1.BatchGetUserAdminProfilesRequest + (*BatchGetUserAdminProfilesResponse)(nil), // 86: hyapp.user.v1.BatchGetUserAdminProfilesResponse + (*AdminIssueUserAccessTokenRequest)(nil), // 87: hyapp.user.v1.AdminIssueUserAccessTokenRequest + (*AdminIssueUserAccessTokenResponse)(nil), // 88: hyapp.user.v1.AdminIssueUserAccessTokenResponse + (*UserContentBlacklistEntry)(nil), // 89: hyapp.user.v1.UserContentBlacklistEntry + (*ListUserContentBlacklistRequest)(nil), // 90: hyapp.user.v1.ListUserContentBlacklistRequest + (*ListUserContentBlacklistResponse)(nil), // 91: hyapp.user.v1.ListUserContentBlacklistResponse + (*AdminAddUserContentBlacklistRequest)(nil), // 92: hyapp.user.v1.AdminAddUserContentBlacklistRequest + (*AdminAddUserContentBlacklistResponse)(nil), // 93: hyapp.user.v1.AdminAddUserContentBlacklistResponse + (*AdminRemoveUserContentBlacklistRequest)(nil), // 94: hyapp.user.v1.AdminRemoveUserContentBlacklistRequest + (*AdminRemoveUserContentBlacklistResponse)(nil), // 95: hyapp.user.v1.AdminRemoveUserContentBlacklistResponse + (*RoomBasicUser)(nil), // 96: hyapp.user.v1.RoomBasicUser + (*BatchGetRoomBasicUsersRequest)(nil), // 97: hyapp.user.v1.BatchGetRoomBasicUsersRequest + (*BatchGetRoomBasicUsersResponse)(nil), // 98: hyapp.user.v1.BatchGetRoomBasicUsersResponse + (*ListUserIDsRequest)(nil), // 99: hyapp.user.v1.ListUserIDsRequest + (*ListUserIDsResponse)(nil), // 100: hyapp.user.v1.ListUserIDsResponse + (*UpdateUserProfileRequest)(nil), // 101: hyapp.user.v1.UpdateUserProfileRequest + (*UpdateUserProfileResponse)(nil), // 102: hyapp.user.v1.UpdateUserProfileResponse + (*UserAvatarMedia)(nil), // 103: hyapp.user.v1.UserAvatarMedia + (*AuthorizeUserAvatarUploadRequest)(nil), // 104: hyapp.user.v1.AuthorizeUserAvatarUploadRequest + (*AuthorizeUserAvatarUploadResponse)(nil), // 105: hyapp.user.v1.AuthorizeUserAvatarUploadResponse + (*CompleteUserAvatarUploadRequest)(nil), // 106: hyapp.user.v1.CompleteUserAvatarUploadRequest + (*CompleteUserAvatarUploadResponse)(nil), // 107: hyapp.user.v1.CompleteUserAvatarUploadResponse + (*UpdateUserProfileBackgroundRequest)(nil), // 108: hyapp.user.v1.UpdateUserProfileBackgroundRequest + (*UpdateUserProfileBackgroundResponse)(nil), // 109: hyapp.user.v1.UpdateUserProfileBackgroundResponse + (*UpdateUserContactInfoRequest)(nil), // 110: hyapp.user.v1.UpdateUserContactInfoRequest + (*UpdateUserContactInfoResponse)(nil), // 111: hyapp.user.v1.UpdateUserContactInfoResponse + (*UpdateUserWithdrawAddressRequest)(nil), // 112: hyapp.user.v1.UpdateUserWithdrawAddressRequest + (*UpdateUserWithdrawAddressResponse)(nil), // 113: hyapp.user.v1.UpdateUserWithdrawAddressResponse + (*ChangeUserCountryRequest)(nil), // 114: hyapp.user.v1.ChangeUserCountryRequest + (*AdminChangeUserCountryRequest)(nil), // 115: hyapp.user.v1.AdminChangeUserCountryRequest + (*ChangeUserCountryResponse)(nil), // 116: hyapp.user.v1.ChangeUserCountryResponse + (*SetUserStatusRequest)(nil), // 117: hyapp.user.v1.SetUserStatusRequest + (*SetUserStatusResponse)(nil), // 118: hyapp.user.v1.SetUserStatusResponse + (*AdminUserBan)(nil), // 119: hyapp.user.v1.AdminUserBan + (*AdminBanUserRequest)(nil), // 120: hyapp.user.v1.AdminBanUserRequest + (*AdminBanUserResponse)(nil), // 121: hyapp.user.v1.AdminBanUserResponse + (*AdminUnbanUserRequest)(nil), // 122: hyapp.user.v1.AdminUnbanUserRequest + (*AdminUnbanUserResponse)(nil), // 123: hyapp.user.v1.AdminUnbanUserResponse + (*ManagerUserBlock)(nil), // 124: hyapp.user.v1.ManagerUserBlock + (*CreateManagerUserBlockRequest)(nil), // 125: hyapp.user.v1.CreateManagerUserBlockRequest + (*CreateManagerUserBlockResponse)(nil), // 126: hyapp.user.v1.CreateManagerUserBlockResponse + (*ListManagerUserBlocksRequest)(nil), // 127: hyapp.user.v1.ListManagerUserBlocksRequest + (*ListManagerUserBlocksResponse)(nil), // 128: hyapp.user.v1.ListManagerUserBlocksResponse + (*UnblockManagerUserRequest)(nil), // 129: hyapp.user.v1.UnblockManagerUserRequest + (*UnblockManagerUserResponse)(nil), // 130: hyapp.user.v1.UnblockManagerUserResponse + (*CompleteOnboardingRequest)(nil), // 131: hyapp.user.v1.CompleteOnboardingRequest + (*CompleteOnboardingResponse)(nil), // 132: hyapp.user.v1.CompleteOnboardingResponse + (*SearchInviteReferrerRequest)(nil), // 133: hyapp.user.v1.SearchInviteReferrerRequest + (*SearchInviteReferrerResponse)(nil), // 134: hyapp.user.v1.SearchInviteReferrerResponse + (*BindInviteReferrerRequest)(nil), // 135: hyapp.user.v1.BindInviteReferrerRequest + (*BindInviteReferrerResponse)(nil), // 136: hyapp.user.v1.BindInviteReferrerResponse + (*BindPushTokenRequest)(nil), // 137: hyapp.user.v1.BindPushTokenRequest + (*BindPushTokenResponse)(nil), // 138: hyapp.user.v1.BindPushTokenResponse + (*DeletePushTokenRequest)(nil), // 139: hyapp.user.v1.DeletePushTokenRequest + (*DeletePushTokenResponse)(nil), // 140: hyapp.user.v1.DeletePushTokenResponse + (*Country)(nil), // 141: hyapp.user.v1.Country + (*Region)(nil), // 142: hyapp.user.v1.Region + (*ListCountriesRequest)(nil), // 143: hyapp.user.v1.ListCountriesRequest + (*ListCountriesResponse)(nil), // 144: hyapp.user.v1.ListCountriesResponse + (*UpdateCountryRequest)(nil), // 145: hyapp.user.v1.UpdateCountryRequest + (*CountryResponse)(nil), // 146: hyapp.user.v1.CountryResponse + (*ListRegistrationCountriesRequest)(nil), // 147: hyapp.user.v1.ListRegistrationCountriesRequest + (*ListRegistrationCountriesResponse)(nil), // 148: hyapp.user.v1.ListRegistrationCountriesResponse + (*LoginRiskBlockedCountry)(nil), // 149: hyapp.user.v1.LoginRiskBlockedCountry + (*ListLoginRiskBlockedCountriesRequest)(nil), // 150: hyapp.user.v1.ListLoginRiskBlockedCountriesRequest + (*ListLoginRiskBlockedCountriesResponse)(nil), // 151: hyapp.user.v1.ListLoginRiskBlockedCountriesResponse + (*ListRegionsRequest)(nil), // 152: hyapp.user.v1.ListRegionsRequest + (*ListRegionsResponse)(nil), // 153: hyapp.user.v1.ListRegionsResponse + (*GetRegionRequest)(nil), // 154: hyapp.user.v1.GetRegionRequest + (*UpdateRegionRequest)(nil), // 155: hyapp.user.v1.UpdateRegionRequest + (*ReplaceRegionCountriesRequest)(nil), // 156: hyapp.user.v1.ReplaceRegionCountriesRequest + (*RegionResponse)(nil), // 157: hyapp.user.v1.RegionResponse + (*UserIdentity)(nil), // 158: hyapp.user.v1.UserIdentity + (*GetUserIdentityRequest)(nil), // 159: hyapp.user.v1.GetUserIdentityRequest + (*GetUserIdentityResponse)(nil), // 160: hyapp.user.v1.GetUserIdentityResponse + (*ResolveDisplayUserIDRequest)(nil), // 161: hyapp.user.v1.ResolveDisplayUserIDRequest + (*ResolveDisplayUserIDResponse)(nil), // 162: hyapp.user.v1.ResolveDisplayUserIDResponse + (*ChangeDisplayUserIDRequest)(nil), // 163: hyapp.user.v1.ChangeDisplayUserIDRequest + (*ChangeDisplayUserIDResponse)(nil), // 164: hyapp.user.v1.ChangeDisplayUserIDResponse + (*ApplyPrettyDisplayUserIDRequest)(nil), // 165: hyapp.user.v1.ApplyPrettyDisplayUserIDRequest + (*ApplyPrettyDisplayUserIDResponse)(nil), // 166: hyapp.user.v1.ApplyPrettyDisplayUserIDResponse + (*ExpirePrettyDisplayUserIDRequest)(nil), // 167: hyapp.user.v1.ExpirePrettyDisplayUserIDRequest + (*ExpirePrettyDisplayUserIDResponse)(nil), // 168: hyapp.user.v1.ExpirePrettyDisplayUserIDResponse + (*PrettyDisplayIDPool)(nil), // 169: hyapp.user.v1.PrettyDisplayIDPool + (*PrettyDisplayID)(nil), // 170: hyapp.user.v1.PrettyDisplayID + (*PrettyDisplayIDGenerationBatch)(nil), // 171: hyapp.user.v1.PrettyDisplayIDGenerationBatch + (*ListAvailablePrettyDisplayIDsRequest)(nil), // 172: hyapp.user.v1.ListAvailablePrettyDisplayIDsRequest + (*ListAvailablePrettyDisplayIDsResponse)(nil), // 173: hyapp.user.v1.ListAvailablePrettyDisplayIDsResponse + (*ApplyPrettyDisplayIDFromPoolRequest)(nil), // 174: hyapp.user.v1.ApplyPrettyDisplayIDFromPoolRequest + (*ApplyPrettyDisplayIDFromPoolResponse)(nil), // 175: hyapp.user.v1.ApplyPrettyDisplayIDFromPoolResponse + (*ListPrettyDisplayIDPoolsRequest)(nil), // 176: hyapp.user.v1.ListPrettyDisplayIDPoolsRequest + (*ListPrettyDisplayIDPoolsResponse)(nil), // 177: hyapp.user.v1.ListPrettyDisplayIDPoolsResponse + (*CreatePrettyDisplayIDPoolRequest)(nil), // 178: hyapp.user.v1.CreatePrettyDisplayIDPoolRequest + (*UpdatePrettyDisplayIDPoolRequest)(nil), // 179: hyapp.user.v1.UpdatePrettyDisplayIDPoolRequest + (*PrettyDisplayIDPoolResponse)(nil), // 180: hyapp.user.v1.PrettyDisplayIDPoolResponse + (*GeneratePrettyDisplayIDsRequest)(nil), // 181: hyapp.user.v1.GeneratePrettyDisplayIDsRequest + (*GeneratePrettyDisplayIDsResponse)(nil), // 182: hyapp.user.v1.GeneratePrettyDisplayIDsResponse + (*ListPrettyDisplayIDsRequest)(nil), // 183: hyapp.user.v1.ListPrettyDisplayIDsRequest + (*ListPrettyDisplayIDsResponse)(nil), // 184: hyapp.user.v1.ListPrettyDisplayIDsResponse + (*SetPrettyDisplayIDStatusRequest)(nil), // 185: hyapp.user.v1.SetPrettyDisplayIDStatusRequest + (*RecyclePrettyDisplayIDRequest)(nil), // 186: hyapp.user.v1.RecyclePrettyDisplayIDRequest + (*PrettyDisplayIDResponse)(nil), // 187: hyapp.user.v1.PrettyDisplayIDResponse + (*AdminGrantPrettyDisplayIDRequest)(nil), // 188: hyapp.user.v1.AdminGrantPrettyDisplayIDRequest + (*AdminGrantPrettyDisplayIDResponse)(nil), // 189: hyapp.user.v1.AdminGrantPrettyDisplayIDResponse + (*CPFormationGiftFeedItem)(nil), // 190: hyapp.user.v1.CPFormationGiftFeedItem + (*ListCPFormationGiftFeedRequest)(nil), // 191: hyapp.user.v1.ListCPFormationGiftFeedRequest + (*ListCPFormationGiftFeedResponse)(nil), // 192: hyapp.user.v1.ListCPFormationGiftFeedResponse + (*ListAppsRequest)(nil), // 193: hyapp.user.v1.ListAppsRequest + (*ListAppsResponse)(nil), // 194: hyapp.user.v1.ListAppsResponse + (*ResolveAdminUserIdentifierRequest)(nil), // 195: hyapp.user.v1.ResolveAdminUserIdentifierRequest + (*ResolveAdminUserIdentifierResponse)(nil), // 196: hyapp.user.v1.ResolveAdminUserIdentifierResponse + nil, // 197: hyapp.user.v1.BatchGetUsersResponse.UsersEntry + nil, // 198: hyapp.user.v1.BatchGetUserAdminProfilesResponse.ProfilesEntry + nil, // 199: hyapp.user.v1.BatchGetRoomBasicUsersResponse.UsersEntry } var file_proto_user_v1_user_proto_depIdxs = []int32{ 1, // 0: hyapp.user.v1.ResolveAppRequest.meta:type_name -> hyapp.user.v1.RequestMeta @@ -15471,289 +15997,301 @@ var file_proto_user_v1_user_proto_depIdxs = []int32{ 1, // 68: hyapp.user.v1.SubmitReportRequest.meta:type_name -> hyapp.user.v1.RequestMeta 78, // 69: hyapp.user.v1.SubmitReportResponse.report:type_name -> hyapp.user.v1.UserReport 1, // 70: hyapp.user.v1.BatchGetUsersRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 190, // 71: hyapp.user.v1.BatchGetUsersResponse.users:type_name -> hyapp.user.v1.BatchGetUsersResponse.UsersEntry + 197, // 71: hyapp.user.v1.BatchGetUsersResponse.users:type_name -> hyapp.user.v1.BatchGetUsersResponse.UsersEntry 0, // 72: hyapp.user.v1.ActiveUserBanSummary.user_status:type_name -> hyapp.user.v1.UserStatus 5, // 73: hyapp.user.v1.UserAdminProfile.user:type_name -> hyapp.user.v1.User 83, // 74: hyapp.user.v1.UserAdminProfile.ban:type_name -> hyapp.user.v1.ActiveUserBanSummary 1, // 75: hyapp.user.v1.BatchGetUserAdminProfilesRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 191, // 76: hyapp.user.v1.BatchGetUserAdminProfilesResponse.profiles:type_name -> hyapp.user.v1.BatchGetUserAdminProfilesResponse.ProfilesEntry + 198, // 76: hyapp.user.v1.BatchGetUserAdminProfilesResponse.profiles:type_name -> hyapp.user.v1.BatchGetUserAdminProfilesResponse.ProfilesEntry 1, // 77: hyapp.user.v1.AdminIssueUserAccessTokenRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 1, // 78: hyapp.user.v1.BatchGetRoomBasicUsersRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 192, // 79: hyapp.user.v1.BatchGetRoomBasicUsersResponse.users:type_name -> hyapp.user.v1.BatchGetRoomBasicUsersResponse.UsersEntry - 1, // 80: hyapp.user.v1.ListUserIDsRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 1, // 81: hyapp.user.v1.UpdateUserProfileRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 5, // 82: hyapp.user.v1.UpdateUserProfileResponse.user:type_name -> hyapp.user.v1.User - 1, // 83: hyapp.user.v1.AuthorizeUserAvatarUploadRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 96, // 84: hyapp.user.v1.AuthorizeUserAvatarUploadRequest.media:type_name -> hyapp.user.v1.UserAvatarMedia - 1, // 85: hyapp.user.v1.CompleteUserAvatarUploadRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 96, // 86: hyapp.user.v1.CompleteUserAvatarUploadRequest.media:type_name -> hyapp.user.v1.UserAvatarMedia - 96, // 87: hyapp.user.v1.CompleteUserAvatarUploadResponse.media:type_name -> hyapp.user.v1.UserAvatarMedia - 1, // 88: hyapp.user.v1.UpdateUserProfileBackgroundRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 5, // 89: hyapp.user.v1.UpdateUserProfileBackgroundResponse.user:type_name -> hyapp.user.v1.User - 1, // 90: hyapp.user.v1.UpdateUserContactInfoRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 5, // 91: hyapp.user.v1.UpdateUserContactInfoResponse.user:type_name -> hyapp.user.v1.User - 1, // 92: hyapp.user.v1.UpdateUserWithdrawAddressRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 5, // 93: hyapp.user.v1.UpdateUserWithdrawAddressResponse.user:type_name -> hyapp.user.v1.User - 1, // 94: hyapp.user.v1.ChangeUserCountryRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 1, // 95: hyapp.user.v1.AdminChangeUserCountryRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 5, // 96: hyapp.user.v1.ChangeUserCountryResponse.user:type_name -> hyapp.user.v1.User - 1, // 97: hyapp.user.v1.SetUserStatusRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 0, // 98: hyapp.user.v1.SetUserStatusRequest.status:type_name -> hyapp.user.v1.UserStatus - 5, // 99: hyapp.user.v1.SetUserStatusResponse.user:type_name -> hyapp.user.v1.User - 1, // 100: hyapp.user.v1.AdminBanUserRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 112, // 101: hyapp.user.v1.AdminBanUserResponse.ban:type_name -> hyapp.user.v1.AdminUserBan - 111, // 102: hyapp.user.v1.AdminBanUserResponse.status:type_name -> hyapp.user.v1.SetUserStatusResponse - 1, // 103: hyapp.user.v1.AdminUnbanUserRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 112, // 104: hyapp.user.v1.AdminUnbanUserResponse.ban:type_name -> hyapp.user.v1.AdminUserBan - 111, // 105: hyapp.user.v1.AdminUnbanUserResponse.status:type_name -> hyapp.user.v1.SetUserStatusResponse - 1, // 106: hyapp.user.v1.CreateManagerUserBlockRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 117, // 107: hyapp.user.v1.CreateManagerUserBlockResponse.block:type_name -> hyapp.user.v1.ManagerUserBlock - 111, // 108: hyapp.user.v1.CreateManagerUserBlockResponse.status:type_name -> hyapp.user.v1.SetUserStatusResponse - 1, // 109: hyapp.user.v1.ListManagerUserBlocksRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 117, // 110: hyapp.user.v1.ListManagerUserBlocksResponse.blocks:type_name -> hyapp.user.v1.ManagerUserBlock - 1, // 111: hyapp.user.v1.UnblockManagerUserRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 117, // 112: hyapp.user.v1.UnblockManagerUserResponse.block:type_name -> hyapp.user.v1.ManagerUserBlock - 111, // 113: hyapp.user.v1.UnblockManagerUserResponse.status:type_name -> hyapp.user.v1.SetUserStatusResponse - 1, // 114: hyapp.user.v1.CompleteOnboardingRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 5, // 115: hyapp.user.v1.CompleteOnboardingResponse.user:type_name -> hyapp.user.v1.User - 16, // 116: hyapp.user.v1.CompleteOnboardingResponse.token:type_name -> hyapp.user.v1.AuthToken - 7, // 117: hyapp.user.v1.CompleteOnboardingResponse.invite:type_name -> hyapp.user.v1.InviteBinding - 1, // 118: hyapp.user.v1.SearchInviteReferrerRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 5, // 119: hyapp.user.v1.SearchInviteReferrerResponse.inviter:type_name -> hyapp.user.v1.User - 1, // 120: hyapp.user.v1.BindInviteReferrerRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 7, // 121: hyapp.user.v1.BindInviteReferrerResponse.invite:type_name -> hyapp.user.v1.InviteBinding - 5, // 122: hyapp.user.v1.BindInviteReferrerResponse.inviter:type_name -> hyapp.user.v1.User - 1, // 123: hyapp.user.v1.BindPushTokenRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 1, // 124: hyapp.user.v1.DeletePushTokenRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 1, // 125: hyapp.user.v1.ListCountriesRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 134, // 126: hyapp.user.v1.ListCountriesResponse.countries:type_name -> hyapp.user.v1.Country - 1, // 127: hyapp.user.v1.UpdateCountryRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 134, // 128: hyapp.user.v1.CountryResponse.country:type_name -> hyapp.user.v1.Country - 1, // 129: hyapp.user.v1.ListRegistrationCountriesRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 134, // 130: hyapp.user.v1.ListRegistrationCountriesResponse.countries:type_name -> hyapp.user.v1.Country - 1, // 131: hyapp.user.v1.ListLoginRiskBlockedCountriesRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 142, // 132: hyapp.user.v1.ListLoginRiskBlockedCountriesResponse.countries:type_name -> hyapp.user.v1.LoginRiskBlockedCountry - 1, // 133: hyapp.user.v1.ListRegionsRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 135, // 134: hyapp.user.v1.ListRegionsResponse.regions:type_name -> hyapp.user.v1.Region - 1, // 135: hyapp.user.v1.GetRegionRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 1, // 136: hyapp.user.v1.UpdateRegionRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 1, // 137: hyapp.user.v1.ReplaceRegionCountriesRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 135, // 138: hyapp.user.v1.RegionResponse.region:type_name -> hyapp.user.v1.Region - 1, // 139: hyapp.user.v1.GetUserIdentityRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 151, // 140: hyapp.user.v1.GetUserIdentityResponse.identity:type_name -> hyapp.user.v1.UserIdentity - 1, // 141: hyapp.user.v1.ResolveDisplayUserIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 151, // 142: hyapp.user.v1.ResolveDisplayUserIDResponse.identity:type_name -> hyapp.user.v1.UserIdentity - 1, // 143: hyapp.user.v1.ChangeDisplayUserIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 151, // 144: hyapp.user.v1.ChangeDisplayUserIDResponse.identity:type_name -> hyapp.user.v1.UserIdentity - 1, // 145: hyapp.user.v1.ApplyPrettyDisplayUserIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 151, // 146: hyapp.user.v1.ApplyPrettyDisplayUserIDResponse.identity:type_name -> hyapp.user.v1.UserIdentity - 1, // 147: hyapp.user.v1.ExpirePrettyDisplayUserIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 151, // 148: hyapp.user.v1.ExpirePrettyDisplayUserIDResponse.identity:type_name -> hyapp.user.v1.UserIdentity - 162, // 149: hyapp.user.v1.PrettyDisplayID.pool:type_name -> hyapp.user.v1.PrettyDisplayIDPool - 1, // 150: hyapp.user.v1.ListAvailablePrettyDisplayIDsRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 163, // 151: hyapp.user.v1.ListAvailablePrettyDisplayIDsResponse.items:type_name -> hyapp.user.v1.PrettyDisplayID - 1, // 152: hyapp.user.v1.ApplyPrettyDisplayIDFromPoolRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 151, // 153: hyapp.user.v1.ApplyPrettyDisplayIDFromPoolResponse.identity:type_name -> hyapp.user.v1.UserIdentity - 1, // 154: hyapp.user.v1.ListPrettyDisplayIDPoolsRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 162, // 155: hyapp.user.v1.ListPrettyDisplayIDPoolsResponse.items:type_name -> hyapp.user.v1.PrettyDisplayIDPool - 1, // 156: hyapp.user.v1.CreatePrettyDisplayIDPoolRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 1, // 157: hyapp.user.v1.UpdatePrettyDisplayIDPoolRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 162, // 158: hyapp.user.v1.PrettyDisplayIDPoolResponse.pool:type_name -> hyapp.user.v1.PrettyDisplayIDPool - 1, // 159: hyapp.user.v1.GeneratePrettyDisplayIDsRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 164, // 160: hyapp.user.v1.GeneratePrettyDisplayIDsResponse.batch:type_name -> hyapp.user.v1.PrettyDisplayIDGenerationBatch - 1, // 161: hyapp.user.v1.ListPrettyDisplayIDsRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 163, // 162: hyapp.user.v1.ListPrettyDisplayIDsResponse.items:type_name -> hyapp.user.v1.PrettyDisplayID - 1, // 163: hyapp.user.v1.SetPrettyDisplayIDStatusRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 1, // 164: hyapp.user.v1.RecyclePrettyDisplayIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 163, // 165: hyapp.user.v1.PrettyDisplayIDResponse.item:type_name -> hyapp.user.v1.PrettyDisplayID - 1, // 166: hyapp.user.v1.AdminGrantPrettyDisplayIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 151, // 167: hyapp.user.v1.AdminGrantPrettyDisplayIDResponse.identity:type_name -> hyapp.user.v1.UserIdentity - 49, // 168: hyapp.user.v1.CPFormationGiftFeedItem.requester:type_name -> hyapp.user.v1.CPUserProfile - 49, // 169: hyapp.user.v1.CPFormationGiftFeedItem.target:type_name -> hyapp.user.v1.CPUserProfile - 1, // 170: hyapp.user.v1.ListCPFormationGiftFeedRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 183, // 171: hyapp.user.v1.ListCPFormationGiftFeedResponse.items:type_name -> hyapp.user.v1.CPFormationGiftFeedItem - 1, // 172: hyapp.user.v1.ListAppsRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 2, // 173: hyapp.user.v1.ListAppsResponse.apps:type_name -> hyapp.user.v1.App - 1, // 174: hyapp.user.v1.ResolveAdminUserIdentifierRequest.meta:type_name -> hyapp.user.v1.RequestMeta - 151, // 175: hyapp.user.v1.ResolveAdminUserIdentifierResponse.identity:type_name -> hyapp.user.v1.UserIdentity - 5, // 176: hyapp.user.v1.BatchGetUsersResponse.UsersEntry.value:type_name -> hyapp.user.v1.User - 84, // 177: hyapp.user.v1.BatchGetUserAdminProfilesResponse.ProfilesEntry.value:type_name -> hyapp.user.v1.UserAdminProfile - 89, // 178: hyapp.user.v1.BatchGetRoomBasicUsersResponse.UsersEntry.value:type_name -> hyapp.user.v1.RoomBasicUser - 17, // 179: hyapp.user.v1.UserService.GetUser:input_type -> hyapp.user.v1.GetUserRequest - 9, // 180: hyapp.user.v1.UserService.GetInviteAttribution:input_type -> hyapp.user.v1.GetInviteAttributionRequest - 19, // 181: hyapp.user.v1.UserService.BusinessUserLookup:input_type -> hyapp.user.v1.BusinessUserLookupRequest - 23, // 182: hyapp.user.v1.UserService.GetMyProfileStats:input_type -> hyapp.user.v1.GetMyProfileStatsRequest - 81, // 183: hyapp.user.v1.UserService.BatchGetUsers:input_type -> hyapp.user.v1.BatchGetUsersRequest - 85, // 184: hyapp.user.v1.UserService.BatchGetUserAdminProfiles:input_type -> hyapp.user.v1.BatchGetUserAdminProfilesRequest - 87, // 185: hyapp.user.v1.UserService.AdminIssueUserAccessToken:input_type -> hyapp.user.v1.AdminIssueUserAccessTokenRequest - 90, // 186: hyapp.user.v1.UserService.BatchGetRoomBasicUsers:input_type -> hyapp.user.v1.BatchGetRoomBasicUsersRequest - 92, // 187: hyapp.user.v1.UserService.ListUserIDs:input_type -> hyapp.user.v1.ListUserIDsRequest - 12, // 188: hyapp.user.v1.UserService.GetUserMicLifetimeStats:input_type -> hyapp.user.v1.GetUserMicLifetimeStatsRequest - 97, // 189: hyapp.user.v1.UserService.AuthorizeUserAvatarUpload:input_type -> hyapp.user.v1.AuthorizeUserAvatarUploadRequest - 99, // 190: hyapp.user.v1.UserService.CompleteUserAvatarUpload:input_type -> hyapp.user.v1.CompleteUserAvatarUploadRequest - 94, // 191: hyapp.user.v1.UserService.UpdateUserProfile:input_type -> hyapp.user.v1.UpdateUserProfileRequest - 101, // 192: hyapp.user.v1.UserService.UpdateUserProfileBackground:input_type -> hyapp.user.v1.UpdateUserProfileBackgroundRequest - 103, // 193: hyapp.user.v1.UserService.UpdateUserContactInfo:input_type -> hyapp.user.v1.UpdateUserContactInfoRequest - 105, // 194: hyapp.user.v1.UserService.UpdateUserWithdrawAddress:input_type -> hyapp.user.v1.UpdateUserWithdrawAddressRequest - 107, // 195: hyapp.user.v1.UserService.ChangeUserCountry:input_type -> hyapp.user.v1.ChangeUserCountryRequest - 108, // 196: hyapp.user.v1.UserService.AdminChangeUserCountry:input_type -> hyapp.user.v1.AdminChangeUserCountryRequest - 110, // 197: hyapp.user.v1.UserService.SetUserStatus:input_type -> hyapp.user.v1.SetUserStatusRequest - 113, // 198: hyapp.user.v1.UserService.AdminBanUser:input_type -> hyapp.user.v1.AdminBanUserRequest - 115, // 199: hyapp.user.v1.UserService.AdminUnbanUser:input_type -> hyapp.user.v1.AdminUnbanUserRequest - 118, // 200: hyapp.user.v1.UserService.CreateManagerUserBlock:input_type -> hyapp.user.v1.CreateManagerUserBlockRequest - 120, // 201: hyapp.user.v1.UserService.ListManagerUserBlocks:input_type -> hyapp.user.v1.ListManagerUserBlocksRequest - 122, // 202: hyapp.user.v1.UserService.UnblockManagerUser:input_type -> hyapp.user.v1.UnblockManagerUserRequest - 124, // 203: hyapp.user.v1.UserService.CompleteOnboarding:input_type -> hyapp.user.v1.CompleteOnboardingRequest - 126, // 204: hyapp.user.v1.UserService.SearchInviteReferrer:input_type -> hyapp.user.v1.SearchInviteReferrerRequest - 128, // 205: hyapp.user.v1.UserService.BindInviteReferrer:input_type -> hyapp.user.v1.BindInviteReferrerRequest - 25, // 206: hyapp.user.v1.UserSocialService.RecordProfileVisit:input_type -> hyapp.user.v1.RecordProfileVisitRequest - 28, // 207: hyapp.user.v1.UserSocialService.ListProfileVisitors:input_type -> hyapp.user.v1.ListProfileVisitorsRequest - 30, // 208: hyapp.user.v1.UserSocialService.FollowUser:input_type -> hyapp.user.v1.FollowUserRequest - 32, // 209: hyapp.user.v1.UserSocialService.UnfollowUser:input_type -> hyapp.user.v1.UnfollowUserRequest - 35, // 210: hyapp.user.v1.UserSocialService.ListFollowing:input_type -> hyapp.user.v1.ListFollowingRequest - 37, // 211: hyapp.user.v1.UserSocialService.ApplyFriend:input_type -> hyapp.user.v1.ApplyFriendRequest - 39, // 212: hyapp.user.v1.UserSocialService.AcceptFriendApplication:input_type -> hyapp.user.v1.AcceptFriendApplicationRequest - 41, // 213: hyapp.user.v1.UserSocialService.DeleteFriend:input_type -> hyapp.user.v1.DeleteFriendRequest - 44, // 214: hyapp.user.v1.UserSocialService.ListFriends:input_type -> hyapp.user.v1.ListFriendsRequest - 47, // 215: hyapp.user.v1.UserSocialService.ListFriendApplications:input_type -> hyapp.user.v1.ListFriendApplicationsRequest - 79, // 216: hyapp.user.v1.UserSocialService.SubmitReport:input_type -> hyapp.user.v1.SubmitReportRequest - 59, // 217: hyapp.user.v1.UserCPService.ListCPApplications:input_type -> hyapp.user.v1.ListCPApplicationsRequest - 61, // 218: hyapp.user.v1.UserCPService.AcceptCPApplication:input_type -> hyapp.user.v1.AcceptCPApplicationRequest - 63, // 219: hyapp.user.v1.UserCPService.RejectCPApplication:input_type -> hyapp.user.v1.RejectCPApplicationRequest - 65, // 220: hyapp.user.v1.UserCPService.ListCPRelationships:input_type -> hyapp.user.v1.ListCPRelationshipsRequest - 67, // 221: hyapp.user.v1.UserCPService.ListCPIntimacyLeaderboard:input_type -> hyapp.user.v1.ListCPIntimacyLeaderboardRequest - 69, // 222: hyapp.user.v1.UserCPService.PrepareBreakCPRelationship:input_type -> hyapp.user.v1.PrepareBreakCPRelationshipRequest - 71, // 223: hyapp.user.v1.UserCPService.ConfirmBreakCPRelationship:input_type -> hyapp.user.v1.ConfirmBreakCPRelationshipRequest - 73, // 224: hyapp.user.v1.UserCPService.CancelBreakCPRelationship:input_type -> hyapp.user.v1.CancelBreakCPRelationshipRequest - 184, // 225: hyapp.user.v1.UserCPService.ListCPFormationGiftFeed:input_type -> hyapp.user.v1.ListCPFormationGiftFeedRequest - 76, // 226: hyapp.user.v1.UserCPInternalService.ConsumeRoomGiftCPEvent:input_type -> hyapp.user.v1.ConsumeRoomGiftCPEventRequest - 57, // 227: hyapp.user.v1.UserCPInternalService.ListCPWeeklyRankEntries:input_type -> hyapp.user.v1.ListCPWeeklyRankEntriesRequest - 14, // 228: hyapp.user.v1.UserCronService.ProcessLoginIPRiskBatch:input_type -> hyapp.user.v1.CronBatchRequest - 14, // 229: hyapp.user.v1.UserCronService.ProcessRegionRebuildBatch:input_type -> hyapp.user.v1.CronBatchRequest - 14, // 230: hyapp.user.v1.UserCronService.CompensateMicOpenSessions:input_type -> hyapp.user.v1.CronBatchRequest - 14, // 231: hyapp.user.v1.UserCronService.CompensateRoomOpenSessions:input_type -> hyapp.user.v1.CronBatchRequest - 14, // 232: hyapp.user.v1.UserCronService.ExpireManagerUserBlocks:input_type -> hyapp.user.v1.CronBatchRequest - 14, // 233: hyapp.user.v1.UserCronService.ExpireAdminUserBans:input_type -> hyapp.user.v1.CronBatchRequest - 14, // 234: hyapp.user.v1.UserCronService.RefreshCPIntimacyLeaderboard:input_type -> hyapp.user.v1.CronBatchRequest - 14, // 235: hyapp.user.v1.UserCronService.ProcessPrivateMessageHistoryBatch:input_type -> hyapp.user.v1.CronBatchRequest - 130, // 236: hyapp.user.v1.UserDeviceService.BindPushToken:input_type -> hyapp.user.v1.BindPushTokenRequest - 132, // 237: hyapp.user.v1.UserDeviceService.DeletePushToken:input_type -> hyapp.user.v1.DeletePushTokenRequest - 3, // 238: hyapp.user.v1.AppRegistryService.ResolveApp:input_type -> hyapp.user.v1.ResolveAppRequest - 186, // 239: hyapp.user.v1.AppRegistryService.ListApps:input_type -> hyapp.user.v1.ListAppsRequest - 136, // 240: hyapp.user.v1.CountryAdminService.ListCountries:input_type -> hyapp.user.v1.ListCountriesRequest - 138, // 241: hyapp.user.v1.CountryAdminService.UpdateCountry:input_type -> hyapp.user.v1.UpdateCountryRequest - 140, // 242: hyapp.user.v1.CountryQueryService.ListRegistrationCountries:input_type -> hyapp.user.v1.ListRegistrationCountriesRequest - 143, // 243: hyapp.user.v1.CountryQueryService.ListLoginRiskBlockedCountries:input_type -> hyapp.user.v1.ListLoginRiskBlockedCountriesRequest - 145, // 244: hyapp.user.v1.RegionAdminService.ListRegions:input_type -> hyapp.user.v1.ListRegionsRequest - 147, // 245: hyapp.user.v1.RegionAdminService.GetRegion:input_type -> hyapp.user.v1.GetRegionRequest - 148, // 246: hyapp.user.v1.RegionAdminService.UpdateRegion:input_type -> hyapp.user.v1.UpdateRegionRequest - 149, // 247: hyapp.user.v1.RegionAdminService.ReplaceRegionCountries:input_type -> hyapp.user.v1.ReplaceRegionCountriesRequest - 152, // 248: hyapp.user.v1.UserIdentityService.GetUserIdentity:input_type -> hyapp.user.v1.GetUserIdentityRequest - 154, // 249: hyapp.user.v1.UserIdentityService.ResolveDisplayUserID:input_type -> hyapp.user.v1.ResolveDisplayUserIDRequest - 188, // 250: hyapp.user.v1.UserIdentityService.ResolveAdminUserIdentifier:input_type -> hyapp.user.v1.ResolveAdminUserIdentifierRequest - 156, // 251: hyapp.user.v1.UserIdentityService.ChangeDisplayUserID:input_type -> hyapp.user.v1.ChangeDisplayUserIDRequest - 158, // 252: hyapp.user.v1.UserIdentityService.ApplyPrettyDisplayUserID:input_type -> hyapp.user.v1.ApplyPrettyDisplayUserIDRequest - 165, // 253: hyapp.user.v1.UserIdentityService.ListAvailablePrettyDisplayIDs:input_type -> hyapp.user.v1.ListAvailablePrettyDisplayIDsRequest - 167, // 254: hyapp.user.v1.UserIdentityService.ApplyPrettyDisplayIDFromPool:input_type -> hyapp.user.v1.ApplyPrettyDisplayIDFromPoolRequest - 160, // 255: hyapp.user.v1.UserIdentityService.ExpirePrettyDisplayUserID:input_type -> hyapp.user.v1.ExpirePrettyDisplayUserIDRequest - 169, // 256: hyapp.user.v1.UserPrettyDisplayIDAdminService.ListPrettyDisplayIDPools:input_type -> hyapp.user.v1.ListPrettyDisplayIDPoolsRequest - 171, // 257: hyapp.user.v1.UserPrettyDisplayIDAdminService.CreatePrettyDisplayIDPool:input_type -> hyapp.user.v1.CreatePrettyDisplayIDPoolRequest - 172, // 258: hyapp.user.v1.UserPrettyDisplayIDAdminService.UpdatePrettyDisplayIDPool:input_type -> hyapp.user.v1.UpdatePrettyDisplayIDPoolRequest - 174, // 259: hyapp.user.v1.UserPrettyDisplayIDAdminService.GeneratePrettyDisplayIDs:input_type -> hyapp.user.v1.GeneratePrettyDisplayIDsRequest - 176, // 260: hyapp.user.v1.UserPrettyDisplayIDAdminService.ListPrettyDisplayIDs:input_type -> hyapp.user.v1.ListPrettyDisplayIDsRequest - 178, // 261: hyapp.user.v1.UserPrettyDisplayIDAdminService.SetPrettyDisplayIDStatus:input_type -> hyapp.user.v1.SetPrettyDisplayIDStatusRequest - 179, // 262: hyapp.user.v1.UserPrettyDisplayIDAdminService.RecyclePrettyDisplayID:input_type -> hyapp.user.v1.RecyclePrettyDisplayIDRequest - 181, // 263: hyapp.user.v1.UserPrettyDisplayIDAdminService.AdminGrantPrettyDisplayID:input_type -> hyapp.user.v1.AdminGrantPrettyDisplayIDRequest - 18, // 264: hyapp.user.v1.UserService.GetUser:output_type -> hyapp.user.v1.GetUserResponse - 10, // 265: hyapp.user.v1.UserService.GetInviteAttribution:output_type -> hyapp.user.v1.GetInviteAttributionResponse - 21, // 266: hyapp.user.v1.UserService.BusinessUserLookup:output_type -> hyapp.user.v1.BusinessUserLookupResponse - 24, // 267: hyapp.user.v1.UserService.GetMyProfileStats:output_type -> hyapp.user.v1.GetMyProfileStatsResponse - 82, // 268: hyapp.user.v1.UserService.BatchGetUsers:output_type -> hyapp.user.v1.BatchGetUsersResponse - 86, // 269: hyapp.user.v1.UserService.BatchGetUserAdminProfiles:output_type -> hyapp.user.v1.BatchGetUserAdminProfilesResponse - 88, // 270: hyapp.user.v1.UserService.AdminIssueUserAccessToken:output_type -> hyapp.user.v1.AdminIssueUserAccessTokenResponse - 91, // 271: hyapp.user.v1.UserService.BatchGetRoomBasicUsers:output_type -> hyapp.user.v1.BatchGetRoomBasicUsersResponse - 93, // 272: hyapp.user.v1.UserService.ListUserIDs:output_type -> hyapp.user.v1.ListUserIDsResponse - 13, // 273: hyapp.user.v1.UserService.GetUserMicLifetimeStats:output_type -> hyapp.user.v1.GetUserMicLifetimeStatsResponse - 98, // 274: hyapp.user.v1.UserService.AuthorizeUserAvatarUpload:output_type -> hyapp.user.v1.AuthorizeUserAvatarUploadResponse - 100, // 275: hyapp.user.v1.UserService.CompleteUserAvatarUpload:output_type -> hyapp.user.v1.CompleteUserAvatarUploadResponse - 95, // 276: hyapp.user.v1.UserService.UpdateUserProfile:output_type -> hyapp.user.v1.UpdateUserProfileResponse - 102, // 277: hyapp.user.v1.UserService.UpdateUserProfileBackground:output_type -> hyapp.user.v1.UpdateUserProfileBackgroundResponse - 104, // 278: hyapp.user.v1.UserService.UpdateUserContactInfo:output_type -> hyapp.user.v1.UpdateUserContactInfoResponse - 106, // 279: hyapp.user.v1.UserService.UpdateUserWithdrawAddress:output_type -> hyapp.user.v1.UpdateUserWithdrawAddressResponse - 109, // 280: hyapp.user.v1.UserService.ChangeUserCountry:output_type -> hyapp.user.v1.ChangeUserCountryResponse - 109, // 281: hyapp.user.v1.UserService.AdminChangeUserCountry:output_type -> hyapp.user.v1.ChangeUserCountryResponse - 111, // 282: hyapp.user.v1.UserService.SetUserStatus:output_type -> hyapp.user.v1.SetUserStatusResponse - 114, // 283: hyapp.user.v1.UserService.AdminBanUser:output_type -> hyapp.user.v1.AdminBanUserResponse - 116, // 284: hyapp.user.v1.UserService.AdminUnbanUser:output_type -> hyapp.user.v1.AdminUnbanUserResponse - 119, // 285: hyapp.user.v1.UserService.CreateManagerUserBlock:output_type -> hyapp.user.v1.CreateManagerUserBlockResponse - 121, // 286: hyapp.user.v1.UserService.ListManagerUserBlocks:output_type -> hyapp.user.v1.ListManagerUserBlocksResponse - 123, // 287: hyapp.user.v1.UserService.UnblockManagerUser:output_type -> hyapp.user.v1.UnblockManagerUserResponse - 125, // 288: hyapp.user.v1.UserService.CompleteOnboarding:output_type -> hyapp.user.v1.CompleteOnboardingResponse - 127, // 289: hyapp.user.v1.UserService.SearchInviteReferrer:output_type -> hyapp.user.v1.SearchInviteReferrerResponse - 129, // 290: hyapp.user.v1.UserService.BindInviteReferrer:output_type -> hyapp.user.v1.BindInviteReferrerResponse - 26, // 291: hyapp.user.v1.UserSocialService.RecordProfileVisit:output_type -> hyapp.user.v1.RecordProfileVisitResponse - 29, // 292: hyapp.user.v1.UserSocialService.ListProfileVisitors:output_type -> hyapp.user.v1.ListProfileVisitorsResponse - 31, // 293: hyapp.user.v1.UserSocialService.FollowUser:output_type -> hyapp.user.v1.FollowUserResponse - 33, // 294: hyapp.user.v1.UserSocialService.UnfollowUser:output_type -> hyapp.user.v1.UnfollowUserResponse - 36, // 295: hyapp.user.v1.UserSocialService.ListFollowing:output_type -> hyapp.user.v1.ListFollowingResponse - 38, // 296: hyapp.user.v1.UserSocialService.ApplyFriend:output_type -> hyapp.user.v1.ApplyFriendResponse - 40, // 297: hyapp.user.v1.UserSocialService.AcceptFriendApplication:output_type -> hyapp.user.v1.AcceptFriendApplicationResponse - 42, // 298: hyapp.user.v1.UserSocialService.DeleteFriend:output_type -> hyapp.user.v1.DeleteFriendResponse - 45, // 299: hyapp.user.v1.UserSocialService.ListFriends:output_type -> hyapp.user.v1.ListFriendsResponse - 48, // 300: hyapp.user.v1.UserSocialService.ListFriendApplications:output_type -> hyapp.user.v1.ListFriendApplicationsResponse - 80, // 301: hyapp.user.v1.UserSocialService.SubmitReport:output_type -> hyapp.user.v1.SubmitReportResponse - 60, // 302: hyapp.user.v1.UserCPService.ListCPApplications:output_type -> hyapp.user.v1.ListCPApplicationsResponse - 62, // 303: hyapp.user.v1.UserCPService.AcceptCPApplication:output_type -> hyapp.user.v1.AcceptCPApplicationResponse - 64, // 304: hyapp.user.v1.UserCPService.RejectCPApplication:output_type -> hyapp.user.v1.RejectCPApplicationResponse - 66, // 305: hyapp.user.v1.UserCPService.ListCPRelationships:output_type -> hyapp.user.v1.ListCPRelationshipsResponse - 68, // 306: hyapp.user.v1.UserCPService.ListCPIntimacyLeaderboard:output_type -> hyapp.user.v1.ListCPIntimacyLeaderboardResponse - 70, // 307: hyapp.user.v1.UserCPService.PrepareBreakCPRelationship:output_type -> hyapp.user.v1.PrepareBreakCPRelationshipResponse - 72, // 308: hyapp.user.v1.UserCPService.ConfirmBreakCPRelationship:output_type -> hyapp.user.v1.ConfirmBreakCPRelationshipResponse - 74, // 309: hyapp.user.v1.UserCPService.CancelBreakCPRelationship:output_type -> hyapp.user.v1.CancelBreakCPRelationshipResponse - 185, // 310: hyapp.user.v1.UserCPService.ListCPFormationGiftFeed:output_type -> hyapp.user.v1.ListCPFormationGiftFeedResponse - 77, // 311: hyapp.user.v1.UserCPInternalService.ConsumeRoomGiftCPEvent:output_type -> hyapp.user.v1.ConsumeRoomGiftCPEventResponse - 58, // 312: hyapp.user.v1.UserCPInternalService.ListCPWeeklyRankEntries:output_type -> hyapp.user.v1.ListCPWeeklyRankEntriesResponse - 15, // 313: hyapp.user.v1.UserCronService.ProcessLoginIPRiskBatch:output_type -> hyapp.user.v1.CronBatchResponse - 15, // 314: hyapp.user.v1.UserCronService.ProcessRegionRebuildBatch:output_type -> hyapp.user.v1.CronBatchResponse - 15, // 315: hyapp.user.v1.UserCronService.CompensateMicOpenSessions:output_type -> hyapp.user.v1.CronBatchResponse - 15, // 316: hyapp.user.v1.UserCronService.CompensateRoomOpenSessions:output_type -> hyapp.user.v1.CronBatchResponse - 15, // 317: hyapp.user.v1.UserCronService.ExpireManagerUserBlocks:output_type -> hyapp.user.v1.CronBatchResponse - 15, // 318: hyapp.user.v1.UserCronService.ExpireAdminUserBans:output_type -> hyapp.user.v1.CronBatchResponse - 15, // 319: hyapp.user.v1.UserCronService.RefreshCPIntimacyLeaderboard:output_type -> hyapp.user.v1.CronBatchResponse - 15, // 320: hyapp.user.v1.UserCronService.ProcessPrivateMessageHistoryBatch:output_type -> hyapp.user.v1.CronBatchResponse - 131, // 321: hyapp.user.v1.UserDeviceService.BindPushToken:output_type -> hyapp.user.v1.BindPushTokenResponse - 133, // 322: hyapp.user.v1.UserDeviceService.DeletePushToken:output_type -> hyapp.user.v1.DeletePushTokenResponse - 4, // 323: hyapp.user.v1.AppRegistryService.ResolveApp:output_type -> hyapp.user.v1.ResolveAppResponse - 187, // 324: hyapp.user.v1.AppRegistryService.ListApps:output_type -> hyapp.user.v1.ListAppsResponse - 137, // 325: hyapp.user.v1.CountryAdminService.ListCountries:output_type -> hyapp.user.v1.ListCountriesResponse - 139, // 326: hyapp.user.v1.CountryAdminService.UpdateCountry:output_type -> hyapp.user.v1.CountryResponse - 141, // 327: hyapp.user.v1.CountryQueryService.ListRegistrationCountries:output_type -> hyapp.user.v1.ListRegistrationCountriesResponse - 144, // 328: hyapp.user.v1.CountryQueryService.ListLoginRiskBlockedCountries:output_type -> hyapp.user.v1.ListLoginRiskBlockedCountriesResponse - 146, // 329: hyapp.user.v1.RegionAdminService.ListRegions:output_type -> hyapp.user.v1.ListRegionsResponse - 150, // 330: hyapp.user.v1.RegionAdminService.GetRegion:output_type -> hyapp.user.v1.RegionResponse - 150, // 331: hyapp.user.v1.RegionAdminService.UpdateRegion:output_type -> hyapp.user.v1.RegionResponse - 150, // 332: hyapp.user.v1.RegionAdminService.ReplaceRegionCountries:output_type -> hyapp.user.v1.RegionResponse - 153, // 333: hyapp.user.v1.UserIdentityService.GetUserIdentity:output_type -> hyapp.user.v1.GetUserIdentityResponse - 155, // 334: hyapp.user.v1.UserIdentityService.ResolveDisplayUserID:output_type -> hyapp.user.v1.ResolveDisplayUserIDResponse - 189, // 335: hyapp.user.v1.UserIdentityService.ResolveAdminUserIdentifier:output_type -> hyapp.user.v1.ResolveAdminUserIdentifierResponse - 157, // 336: hyapp.user.v1.UserIdentityService.ChangeDisplayUserID:output_type -> hyapp.user.v1.ChangeDisplayUserIDResponse - 159, // 337: hyapp.user.v1.UserIdentityService.ApplyPrettyDisplayUserID:output_type -> hyapp.user.v1.ApplyPrettyDisplayUserIDResponse - 166, // 338: hyapp.user.v1.UserIdentityService.ListAvailablePrettyDisplayIDs:output_type -> hyapp.user.v1.ListAvailablePrettyDisplayIDsResponse - 168, // 339: hyapp.user.v1.UserIdentityService.ApplyPrettyDisplayIDFromPool:output_type -> hyapp.user.v1.ApplyPrettyDisplayIDFromPoolResponse - 161, // 340: hyapp.user.v1.UserIdentityService.ExpirePrettyDisplayUserID:output_type -> hyapp.user.v1.ExpirePrettyDisplayUserIDResponse - 170, // 341: hyapp.user.v1.UserPrettyDisplayIDAdminService.ListPrettyDisplayIDPools:output_type -> hyapp.user.v1.ListPrettyDisplayIDPoolsResponse - 173, // 342: hyapp.user.v1.UserPrettyDisplayIDAdminService.CreatePrettyDisplayIDPool:output_type -> hyapp.user.v1.PrettyDisplayIDPoolResponse - 173, // 343: hyapp.user.v1.UserPrettyDisplayIDAdminService.UpdatePrettyDisplayIDPool:output_type -> hyapp.user.v1.PrettyDisplayIDPoolResponse - 175, // 344: hyapp.user.v1.UserPrettyDisplayIDAdminService.GeneratePrettyDisplayIDs:output_type -> hyapp.user.v1.GeneratePrettyDisplayIDsResponse - 177, // 345: hyapp.user.v1.UserPrettyDisplayIDAdminService.ListPrettyDisplayIDs:output_type -> hyapp.user.v1.ListPrettyDisplayIDsResponse - 180, // 346: hyapp.user.v1.UserPrettyDisplayIDAdminService.SetPrettyDisplayIDStatus:output_type -> hyapp.user.v1.PrettyDisplayIDResponse - 180, // 347: hyapp.user.v1.UserPrettyDisplayIDAdminService.RecyclePrettyDisplayID:output_type -> hyapp.user.v1.PrettyDisplayIDResponse - 182, // 348: hyapp.user.v1.UserPrettyDisplayIDAdminService.AdminGrantPrettyDisplayID:output_type -> hyapp.user.v1.AdminGrantPrettyDisplayIDResponse - 264, // [264:349] is the sub-list for method output_type - 179, // [179:264] is the sub-list for method input_type - 179, // [179:179] is the sub-list for extension type_name - 179, // [179:179] is the sub-list for extension extendee - 0, // [0:179] is the sub-list for field type_name + 0, // 78: hyapp.user.v1.UserContentBlacklistEntry.user_status:type_name -> hyapp.user.v1.UserStatus + 1, // 79: hyapp.user.v1.ListUserContentBlacklistRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 89, // 80: hyapp.user.v1.ListUserContentBlacklistResponse.items:type_name -> hyapp.user.v1.UserContentBlacklistEntry + 1, // 81: hyapp.user.v1.AdminAddUserContentBlacklistRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 89, // 82: hyapp.user.v1.AdminAddUserContentBlacklistResponse.item:type_name -> hyapp.user.v1.UserContentBlacklistEntry + 1, // 83: hyapp.user.v1.AdminRemoveUserContentBlacklistRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 1, // 84: hyapp.user.v1.BatchGetRoomBasicUsersRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 199, // 85: hyapp.user.v1.BatchGetRoomBasicUsersResponse.users:type_name -> hyapp.user.v1.BatchGetRoomBasicUsersResponse.UsersEntry + 1, // 86: hyapp.user.v1.ListUserIDsRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 1, // 87: hyapp.user.v1.UpdateUserProfileRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 5, // 88: hyapp.user.v1.UpdateUserProfileResponse.user:type_name -> hyapp.user.v1.User + 1, // 89: hyapp.user.v1.AuthorizeUserAvatarUploadRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 103, // 90: hyapp.user.v1.AuthorizeUserAvatarUploadRequest.media:type_name -> hyapp.user.v1.UserAvatarMedia + 1, // 91: hyapp.user.v1.CompleteUserAvatarUploadRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 103, // 92: hyapp.user.v1.CompleteUserAvatarUploadRequest.media:type_name -> hyapp.user.v1.UserAvatarMedia + 103, // 93: hyapp.user.v1.CompleteUserAvatarUploadResponse.media:type_name -> hyapp.user.v1.UserAvatarMedia + 1, // 94: hyapp.user.v1.UpdateUserProfileBackgroundRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 5, // 95: hyapp.user.v1.UpdateUserProfileBackgroundResponse.user:type_name -> hyapp.user.v1.User + 1, // 96: hyapp.user.v1.UpdateUserContactInfoRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 5, // 97: hyapp.user.v1.UpdateUserContactInfoResponse.user:type_name -> hyapp.user.v1.User + 1, // 98: hyapp.user.v1.UpdateUserWithdrawAddressRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 5, // 99: hyapp.user.v1.UpdateUserWithdrawAddressResponse.user:type_name -> hyapp.user.v1.User + 1, // 100: hyapp.user.v1.ChangeUserCountryRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 1, // 101: hyapp.user.v1.AdminChangeUserCountryRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 5, // 102: hyapp.user.v1.ChangeUserCountryResponse.user:type_name -> hyapp.user.v1.User + 1, // 103: hyapp.user.v1.SetUserStatusRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 0, // 104: hyapp.user.v1.SetUserStatusRequest.status:type_name -> hyapp.user.v1.UserStatus + 5, // 105: hyapp.user.v1.SetUserStatusResponse.user:type_name -> hyapp.user.v1.User + 1, // 106: hyapp.user.v1.AdminBanUserRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 119, // 107: hyapp.user.v1.AdminBanUserResponse.ban:type_name -> hyapp.user.v1.AdminUserBan + 118, // 108: hyapp.user.v1.AdminBanUserResponse.status:type_name -> hyapp.user.v1.SetUserStatusResponse + 1, // 109: hyapp.user.v1.AdminUnbanUserRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 119, // 110: hyapp.user.v1.AdminUnbanUserResponse.ban:type_name -> hyapp.user.v1.AdminUserBan + 118, // 111: hyapp.user.v1.AdminUnbanUserResponse.status:type_name -> hyapp.user.v1.SetUserStatusResponse + 1, // 112: hyapp.user.v1.CreateManagerUserBlockRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 124, // 113: hyapp.user.v1.CreateManagerUserBlockResponse.block:type_name -> hyapp.user.v1.ManagerUserBlock + 118, // 114: hyapp.user.v1.CreateManagerUserBlockResponse.status:type_name -> hyapp.user.v1.SetUserStatusResponse + 1, // 115: hyapp.user.v1.ListManagerUserBlocksRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 124, // 116: hyapp.user.v1.ListManagerUserBlocksResponse.blocks:type_name -> hyapp.user.v1.ManagerUserBlock + 1, // 117: hyapp.user.v1.UnblockManagerUserRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 124, // 118: hyapp.user.v1.UnblockManagerUserResponse.block:type_name -> hyapp.user.v1.ManagerUserBlock + 118, // 119: hyapp.user.v1.UnblockManagerUserResponse.status:type_name -> hyapp.user.v1.SetUserStatusResponse + 1, // 120: hyapp.user.v1.CompleteOnboardingRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 5, // 121: hyapp.user.v1.CompleteOnboardingResponse.user:type_name -> hyapp.user.v1.User + 16, // 122: hyapp.user.v1.CompleteOnboardingResponse.token:type_name -> hyapp.user.v1.AuthToken + 7, // 123: hyapp.user.v1.CompleteOnboardingResponse.invite:type_name -> hyapp.user.v1.InviteBinding + 1, // 124: hyapp.user.v1.SearchInviteReferrerRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 5, // 125: hyapp.user.v1.SearchInviteReferrerResponse.inviter:type_name -> hyapp.user.v1.User + 1, // 126: hyapp.user.v1.BindInviteReferrerRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 7, // 127: hyapp.user.v1.BindInviteReferrerResponse.invite:type_name -> hyapp.user.v1.InviteBinding + 5, // 128: hyapp.user.v1.BindInviteReferrerResponse.inviter:type_name -> hyapp.user.v1.User + 1, // 129: hyapp.user.v1.BindPushTokenRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 1, // 130: hyapp.user.v1.DeletePushTokenRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 1, // 131: hyapp.user.v1.ListCountriesRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 141, // 132: hyapp.user.v1.ListCountriesResponse.countries:type_name -> hyapp.user.v1.Country + 1, // 133: hyapp.user.v1.UpdateCountryRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 141, // 134: hyapp.user.v1.CountryResponse.country:type_name -> hyapp.user.v1.Country + 1, // 135: hyapp.user.v1.ListRegistrationCountriesRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 141, // 136: hyapp.user.v1.ListRegistrationCountriesResponse.countries:type_name -> hyapp.user.v1.Country + 1, // 137: hyapp.user.v1.ListLoginRiskBlockedCountriesRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 149, // 138: hyapp.user.v1.ListLoginRiskBlockedCountriesResponse.countries:type_name -> hyapp.user.v1.LoginRiskBlockedCountry + 1, // 139: hyapp.user.v1.ListRegionsRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 142, // 140: hyapp.user.v1.ListRegionsResponse.regions:type_name -> hyapp.user.v1.Region + 1, // 141: hyapp.user.v1.GetRegionRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 1, // 142: hyapp.user.v1.UpdateRegionRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 1, // 143: hyapp.user.v1.ReplaceRegionCountriesRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 142, // 144: hyapp.user.v1.RegionResponse.region:type_name -> hyapp.user.v1.Region + 1, // 145: hyapp.user.v1.GetUserIdentityRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 158, // 146: hyapp.user.v1.GetUserIdentityResponse.identity:type_name -> hyapp.user.v1.UserIdentity + 1, // 147: hyapp.user.v1.ResolveDisplayUserIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 158, // 148: hyapp.user.v1.ResolveDisplayUserIDResponse.identity:type_name -> hyapp.user.v1.UserIdentity + 1, // 149: hyapp.user.v1.ChangeDisplayUserIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 158, // 150: hyapp.user.v1.ChangeDisplayUserIDResponse.identity:type_name -> hyapp.user.v1.UserIdentity + 1, // 151: hyapp.user.v1.ApplyPrettyDisplayUserIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 158, // 152: hyapp.user.v1.ApplyPrettyDisplayUserIDResponse.identity:type_name -> hyapp.user.v1.UserIdentity + 1, // 153: hyapp.user.v1.ExpirePrettyDisplayUserIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 158, // 154: hyapp.user.v1.ExpirePrettyDisplayUserIDResponse.identity:type_name -> hyapp.user.v1.UserIdentity + 169, // 155: hyapp.user.v1.PrettyDisplayID.pool:type_name -> hyapp.user.v1.PrettyDisplayIDPool + 1, // 156: hyapp.user.v1.ListAvailablePrettyDisplayIDsRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 170, // 157: hyapp.user.v1.ListAvailablePrettyDisplayIDsResponse.items:type_name -> hyapp.user.v1.PrettyDisplayID + 1, // 158: hyapp.user.v1.ApplyPrettyDisplayIDFromPoolRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 158, // 159: hyapp.user.v1.ApplyPrettyDisplayIDFromPoolResponse.identity:type_name -> hyapp.user.v1.UserIdentity + 1, // 160: hyapp.user.v1.ListPrettyDisplayIDPoolsRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 169, // 161: hyapp.user.v1.ListPrettyDisplayIDPoolsResponse.items:type_name -> hyapp.user.v1.PrettyDisplayIDPool + 1, // 162: hyapp.user.v1.CreatePrettyDisplayIDPoolRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 1, // 163: hyapp.user.v1.UpdatePrettyDisplayIDPoolRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 169, // 164: hyapp.user.v1.PrettyDisplayIDPoolResponse.pool:type_name -> hyapp.user.v1.PrettyDisplayIDPool + 1, // 165: hyapp.user.v1.GeneratePrettyDisplayIDsRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 171, // 166: hyapp.user.v1.GeneratePrettyDisplayIDsResponse.batch:type_name -> hyapp.user.v1.PrettyDisplayIDGenerationBatch + 1, // 167: hyapp.user.v1.ListPrettyDisplayIDsRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 170, // 168: hyapp.user.v1.ListPrettyDisplayIDsResponse.items:type_name -> hyapp.user.v1.PrettyDisplayID + 1, // 169: hyapp.user.v1.SetPrettyDisplayIDStatusRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 1, // 170: hyapp.user.v1.RecyclePrettyDisplayIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 170, // 171: hyapp.user.v1.PrettyDisplayIDResponse.item:type_name -> hyapp.user.v1.PrettyDisplayID + 1, // 172: hyapp.user.v1.AdminGrantPrettyDisplayIDRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 158, // 173: hyapp.user.v1.AdminGrantPrettyDisplayIDResponse.identity:type_name -> hyapp.user.v1.UserIdentity + 49, // 174: hyapp.user.v1.CPFormationGiftFeedItem.requester:type_name -> hyapp.user.v1.CPUserProfile + 49, // 175: hyapp.user.v1.CPFormationGiftFeedItem.target:type_name -> hyapp.user.v1.CPUserProfile + 1, // 176: hyapp.user.v1.ListCPFormationGiftFeedRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 190, // 177: hyapp.user.v1.ListCPFormationGiftFeedResponse.items:type_name -> hyapp.user.v1.CPFormationGiftFeedItem + 1, // 178: hyapp.user.v1.ListAppsRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 2, // 179: hyapp.user.v1.ListAppsResponse.apps:type_name -> hyapp.user.v1.App + 1, // 180: hyapp.user.v1.ResolveAdminUserIdentifierRequest.meta:type_name -> hyapp.user.v1.RequestMeta + 158, // 181: hyapp.user.v1.ResolveAdminUserIdentifierResponse.identity:type_name -> hyapp.user.v1.UserIdentity + 5, // 182: hyapp.user.v1.BatchGetUsersResponse.UsersEntry.value:type_name -> hyapp.user.v1.User + 84, // 183: hyapp.user.v1.BatchGetUserAdminProfilesResponse.ProfilesEntry.value:type_name -> hyapp.user.v1.UserAdminProfile + 96, // 184: hyapp.user.v1.BatchGetRoomBasicUsersResponse.UsersEntry.value:type_name -> hyapp.user.v1.RoomBasicUser + 17, // 185: hyapp.user.v1.UserService.GetUser:input_type -> hyapp.user.v1.GetUserRequest + 9, // 186: hyapp.user.v1.UserService.GetInviteAttribution:input_type -> hyapp.user.v1.GetInviteAttributionRequest + 19, // 187: hyapp.user.v1.UserService.BusinessUserLookup:input_type -> hyapp.user.v1.BusinessUserLookupRequest + 23, // 188: hyapp.user.v1.UserService.GetMyProfileStats:input_type -> hyapp.user.v1.GetMyProfileStatsRequest + 81, // 189: hyapp.user.v1.UserService.BatchGetUsers:input_type -> hyapp.user.v1.BatchGetUsersRequest + 85, // 190: hyapp.user.v1.UserService.BatchGetUserAdminProfiles:input_type -> hyapp.user.v1.BatchGetUserAdminProfilesRequest + 87, // 191: hyapp.user.v1.UserService.AdminIssueUserAccessToken:input_type -> hyapp.user.v1.AdminIssueUserAccessTokenRequest + 90, // 192: hyapp.user.v1.UserService.ListUserContentBlacklist:input_type -> hyapp.user.v1.ListUserContentBlacklistRequest + 92, // 193: hyapp.user.v1.UserService.AdminAddUserContentBlacklist:input_type -> hyapp.user.v1.AdminAddUserContentBlacklistRequest + 94, // 194: hyapp.user.v1.UserService.AdminRemoveUserContentBlacklist:input_type -> hyapp.user.v1.AdminRemoveUserContentBlacklistRequest + 97, // 195: hyapp.user.v1.UserService.BatchGetRoomBasicUsers:input_type -> hyapp.user.v1.BatchGetRoomBasicUsersRequest + 99, // 196: hyapp.user.v1.UserService.ListUserIDs:input_type -> hyapp.user.v1.ListUserIDsRequest + 12, // 197: hyapp.user.v1.UserService.GetUserMicLifetimeStats:input_type -> hyapp.user.v1.GetUserMicLifetimeStatsRequest + 104, // 198: hyapp.user.v1.UserService.AuthorizeUserAvatarUpload:input_type -> hyapp.user.v1.AuthorizeUserAvatarUploadRequest + 106, // 199: hyapp.user.v1.UserService.CompleteUserAvatarUpload:input_type -> hyapp.user.v1.CompleteUserAvatarUploadRequest + 101, // 200: hyapp.user.v1.UserService.UpdateUserProfile:input_type -> hyapp.user.v1.UpdateUserProfileRequest + 108, // 201: hyapp.user.v1.UserService.UpdateUserProfileBackground:input_type -> hyapp.user.v1.UpdateUserProfileBackgroundRequest + 110, // 202: hyapp.user.v1.UserService.UpdateUserContactInfo:input_type -> hyapp.user.v1.UpdateUserContactInfoRequest + 112, // 203: hyapp.user.v1.UserService.UpdateUserWithdrawAddress:input_type -> hyapp.user.v1.UpdateUserWithdrawAddressRequest + 114, // 204: hyapp.user.v1.UserService.ChangeUserCountry:input_type -> hyapp.user.v1.ChangeUserCountryRequest + 115, // 205: hyapp.user.v1.UserService.AdminChangeUserCountry:input_type -> hyapp.user.v1.AdminChangeUserCountryRequest + 117, // 206: hyapp.user.v1.UserService.SetUserStatus:input_type -> hyapp.user.v1.SetUserStatusRequest + 120, // 207: hyapp.user.v1.UserService.AdminBanUser:input_type -> hyapp.user.v1.AdminBanUserRequest + 122, // 208: hyapp.user.v1.UserService.AdminUnbanUser:input_type -> hyapp.user.v1.AdminUnbanUserRequest + 125, // 209: hyapp.user.v1.UserService.CreateManagerUserBlock:input_type -> hyapp.user.v1.CreateManagerUserBlockRequest + 127, // 210: hyapp.user.v1.UserService.ListManagerUserBlocks:input_type -> hyapp.user.v1.ListManagerUserBlocksRequest + 129, // 211: hyapp.user.v1.UserService.UnblockManagerUser:input_type -> hyapp.user.v1.UnblockManagerUserRequest + 131, // 212: hyapp.user.v1.UserService.CompleteOnboarding:input_type -> hyapp.user.v1.CompleteOnboardingRequest + 133, // 213: hyapp.user.v1.UserService.SearchInviteReferrer:input_type -> hyapp.user.v1.SearchInviteReferrerRequest + 135, // 214: hyapp.user.v1.UserService.BindInviteReferrer:input_type -> hyapp.user.v1.BindInviteReferrerRequest + 25, // 215: hyapp.user.v1.UserSocialService.RecordProfileVisit:input_type -> hyapp.user.v1.RecordProfileVisitRequest + 28, // 216: hyapp.user.v1.UserSocialService.ListProfileVisitors:input_type -> hyapp.user.v1.ListProfileVisitorsRequest + 30, // 217: hyapp.user.v1.UserSocialService.FollowUser:input_type -> hyapp.user.v1.FollowUserRequest + 32, // 218: hyapp.user.v1.UserSocialService.UnfollowUser:input_type -> hyapp.user.v1.UnfollowUserRequest + 35, // 219: hyapp.user.v1.UserSocialService.ListFollowing:input_type -> hyapp.user.v1.ListFollowingRequest + 37, // 220: hyapp.user.v1.UserSocialService.ApplyFriend:input_type -> hyapp.user.v1.ApplyFriendRequest + 39, // 221: hyapp.user.v1.UserSocialService.AcceptFriendApplication:input_type -> hyapp.user.v1.AcceptFriendApplicationRequest + 41, // 222: hyapp.user.v1.UserSocialService.DeleteFriend:input_type -> hyapp.user.v1.DeleteFriendRequest + 44, // 223: hyapp.user.v1.UserSocialService.ListFriends:input_type -> hyapp.user.v1.ListFriendsRequest + 47, // 224: hyapp.user.v1.UserSocialService.ListFriendApplications:input_type -> hyapp.user.v1.ListFriendApplicationsRequest + 79, // 225: hyapp.user.v1.UserSocialService.SubmitReport:input_type -> hyapp.user.v1.SubmitReportRequest + 59, // 226: hyapp.user.v1.UserCPService.ListCPApplications:input_type -> hyapp.user.v1.ListCPApplicationsRequest + 61, // 227: hyapp.user.v1.UserCPService.AcceptCPApplication:input_type -> hyapp.user.v1.AcceptCPApplicationRequest + 63, // 228: hyapp.user.v1.UserCPService.RejectCPApplication:input_type -> hyapp.user.v1.RejectCPApplicationRequest + 65, // 229: hyapp.user.v1.UserCPService.ListCPRelationships:input_type -> hyapp.user.v1.ListCPRelationshipsRequest + 67, // 230: hyapp.user.v1.UserCPService.ListCPIntimacyLeaderboard:input_type -> hyapp.user.v1.ListCPIntimacyLeaderboardRequest + 69, // 231: hyapp.user.v1.UserCPService.PrepareBreakCPRelationship:input_type -> hyapp.user.v1.PrepareBreakCPRelationshipRequest + 71, // 232: hyapp.user.v1.UserCPService.ConfirmBreakCPRelationship:input_type -> hyapp.user.v1.ConfirmBreakCPRelationshipRequest + 73, // 233: hyapp.user.v1.UserCPService.CancelBreakCPRelationship:input_type -> hyapp.user.v1.CancelBreakCPRelationshipRequest + 191, // 234: hyapp.user.v1.UserCPService.ListCPFormationGiftFeed:input_type -> hyapp.user.v1.ListCPFormationGiftFeedRequest + 76, // 235: hyapp.user.v1.UserCPInternalService.ConsumeRoomGiftCPEvent:input_type -> hyapp.user.v1.ConsumeRoomGiftCPEventRequest + 57, // 236: hyapp.user.v1.UserCPInternalService.ListCPWeeklyRankEntries:input_type -> hyapp.user.v1.ListCPWeeklyRankEntriesRequest + 14, // 237: hyapp.user.v1.UserCronService.ProcessLoginIPRiskBatch:input_type -> hyapp.user.v1.CronBatchRequest + 14, // 238: hyapp.user.v1.UserCronService.ProcessRegionRebuildBatch:input_type -> hyapp.user.v1.CronBatchRequest + 14, // 239: hyapp.user.v1.UserCronService.CompensateMicOpenSessions:input_type -> hyapp.user.v1.CronBatchRequest + 14, // 240: hyapp.user.v1.UserCronService.CompensateRoomOpenSessions:input_type -> hyapp.user.v1.CronBatchRequest + 14, // 241: hyapp.user.v1.UserCronService.ExpireManagerUserBlocks:input_type -> hyapp.user.v1.CronBatchRequest + 14, // 242: hyapp.user.v1.UserCronService.ExpireAdminUserBans:input_type -> hyapp.user.v1.CronBatchRequest + 14, // 243: hyapp.user.v1.UserCronService.RefreshCPIntimacyLeaderboard:input_type -> hyapp.user.v1.CronBatchRequest + 14, // 244: hyapp.user.v1.UserCronService.ProcessPrivateMessageHistoryBatch:input_type -> hyapp.user.v1.CronBatchRequest + 137, // 245: hyapp.user.v1.UserDeviceService.BindPushToken:input_type -> hyapp.user.v1.BindPushTokenRequest + 139, // 246: hyapp.user.v1.UserDeviceService.DeletePushToken:input_type -> hyapp.user.v1.DeletePushTokenRequest + 3, // 247: hyapp.user.v1.AppRegistryService.ResolveApp:input_type -> hyapp.user.v1.ResolveAppRequest + 193, // 248: hyapp.user.v1.AppRegistryService.ListApps:input_type -> hyapp.user.v1.ListAppsRequest + 143, // 249: hyapp.user.v1.CountryAdminService.ListCountries:input_type -> hyapp.user.v1.ListCountriesRequest + 145, // 250: hyapp.user.v1.CountryAdminService.UpdateCountry:input_type -> hyapp.user.v1.UpdateCountryRequest + 147, // 251: hyapp.user.v1.CountryQueryService.ListRegistrationCountries:input_type -> hyapp.user.v1.ListRegistrationCountriesRequest + 150, // 252: hyapp.user.v1.CountryQueryService.ListLoginRiskBlockedCountries:input_type -> hyapp.user.v1.ListLoginRiskBlockedCountriesRequest + 152, // 253: hyapp.user.v1.RegionAdminService.ListRegions:input_type -> hyapp.user.v1.ListRegionsRequest + 154, // 254: hyapp.user.v1.RegionAdminService.GetRegion:input_type -> hyapp.user.v1.GetRegionRequest + 155, // 255: hyapp.user.v1.RegionAdminService.UpdateRegion:input_type -> hyapp.user.v1.UpdateRegionRequest + 156, // 256: hyapp.user.v1.RegionAdminService.ReplaceRegionCountries:input_type -> hyapp.user.v1.ReplaceRegionCountriesRequest + 159, // 257: hyapp.user.v1.UserIdentityService.GetUserIdentity:input_type -> hyapp.user.v1.GetUserIdentityRequest + 161, // 258: hyapp.user.v1.UserIdentityService.ResolveDisplayUserID:input_type -> hyapp.user.v1.ResolveDisplayUserIDRequest + 195, // 259: hyapp.user.v1.UserIdentityService.ResolveAdminUserIdentifier:input_type -> hyapp.user.v1.ResolveAdminUserIdentifierRequest + 163, // 260: hyapp.user.v1.UserIdentityService.ChangeDisplayUserID:input_type -> hyapp.user.v1.ChangeDisplayUserIDRequest + 165, // 261: hyapp.user.v1.UserIdentityService.ApplyPrettyDisplayUserID:input_type -> hyapp.user.v1.ApplyPrettyDisplayUserIDRequest + 172, // 262: hyapp.user.v1.UserIdentityService.ListAvailablePrettyDisplayIDs:input_type -> hyapp.user.v1.ListAvailablePrettyDisplayIDsRequest + 174, // 263: hyapp.user.v1.UserIdentityService.ApplyPrettyDisplayIDFromPool:input_type -> hyapp.user.v1.ApplyPrettyDisplayIDFromPoolRequest + 167, // 264: hyapp.user.v1.UserIdentityService.ExpirePrettyDisplayUserID:input_type -> hyapp.user.v1.ExpirePrettyDisplayUserIDRequest + 176, // 265: hyapp.user.v1.UserPrettyDisplayIDAdminService.ListPrettyDisplayIDPools:input_type -> hyapp.user.v1.ListPrettyDisplayIDPoolsRequest + 178, // 266: hyapp.user.v1.UserPrettyDisplayIDAdminService.CreatePrettyDisplayIDPool:input_type -> hyapp.user.v1.CreatePrettyDisplayIDPoolRequest + 179, // 267: hyapp.user.v1.UserPrettyDisplayIDAdminService.UpdatePrettyDisplayIDPool:input_type -> hyapp.user.v1.UpdatePrettyDisplayIDPoolRequest + 181, // 268: hyapp.user.v1.UserPrettyDisplayIDAdminService.GeneratePrettyDisplayIDs:input_type -> hyapp.user.v1.GeneratePrettyDisplayIDsRequest + 183, // 269: hyapp.user.v1.UserPrettyDisplayIDAdminService.ListPrettyDisplayIDs:input_type -> hyapp.user.v1.ListPrettyDisplayIDsRequest + 185, // 270: hyapp.user.v1.UserPrettyDisplayIDAdminService.SetPrettyDisplayIDStatus:input_type -> hyapp.user.v1.SetPrettyDisplayIDStatusRequest + 186, // 271: hyapp.user.v1.UserPrettyDisplayIDAdminService.RecyclePrettyDisplayID:input_type -> hyapp.user.v1.RecyclePrettyDisplayIDRequest + 188, // 272: hyapp.user.v1.UserPrettyDisplayIDAdminService.AdminGrantPrettyDisplayID:input_type -> hyapp.user.v1.AdminGrantPrettyDisplayIDRequest + 18, // 273: hyapp.user.v1.UserService.GetUser:output_type -> hyapp.user.v1.GetUserResponse + 10, // 274: hyapp.user.v1.UserService.GetInviteAttribution:output_type -> hyapp.user.v1.GetInviteAttributionResponse + 21, // 275: hyapp.user.v1.UserService.BusinessUserLookup:output_type -> hyapp.user.v1.BusinessUserLookupResponse + 24, // 276: hyapp.user.v1.UserService.GetMyProfileStats:output_type -> hyapp.user.v1.GetMyProfileStatsResponse + 82, // 277: hyapp.user.v1.UserService.BatchGetUsers:output_type -> hyapp.user.v1.BatchGetUsersResponse + 86, // 278: hyapp.user.v1.UserService.BatchGetUserAdminProfiles:output_type -> hyapp.user.v1.BatchGetUserAdminProfilesResponse + 88, // 279: hyapp.user.v1.UserService.AdminIssueUserAccessToken:output_type -> hyapp.user.v1.AdminIssueUserAccessTokenResponse + 91, // 280: hyapp.user.v1.UserService.ListUserContentBlacklist:output_type -> hyapp.user.v1.ListUserContentBlacklistResponse + 93, // 281: hyapp.user.v1.UserService.AdminAddUserContentBlacklist:output_type -> hyapp.user.v1.AdminAddUserContentBlacklistResponse + 95, // 282: hyapp.user.v1.UserService.AdminRemoveUserContentBlacklist:output_type -> hyapp.user.v1.AdminRemoveUserContentBlacklistResponse + 98, // 283: hyapp.user.v1.UserService.BatchGetRoomBasicUsers:output_type -> hyapp.user.v1.BatchGetRoomBasicUsersResponse + 100, // 284: hyapp.user.v1.UserService.ListUserIDs:output_type -> hyapp.user.v1.ListUserIDsResponse + 13, // 285: hyapp.user.v1.UserService.GetUserMicLifetimeStats:output_type -> hyapp.user.v1.GetUserMicLifetimeStatsResponse + 105, // 286: hyapp.user.v1.UserService.AuthorizeUserAvatarUpload:output_type -> hyapp.user.v1.AuthorizeUserAvatarUploadResponse + 107, // 287: hyapp.user.v1.UserService.CompleteUserAvatarUpload:output_type -> hyapp.user.v1.CompleteUserAvatarUploadResponse + 102, // 288: hyapp.user.v1.UserService.UpdateUserProfile:output_type -> hyapp.user.v1.UpdateUserProfileResponse + 109, // 289: hyapp.user.v1.UserService.UpdateUserProfileBackground:output_type -> hyapp.user.v1.UpdateUserProfileBackgroundResponse + 111, // 290: hyapp.user.v1.UserService.UpdateUserContactInfo:output_type -> hyapp.user.v1.UpdateUserContactInfoResponse + 113, // 291: hyapp.user.v1.UserService.UpdateUserWithdrawAddress:output_type -> hyapp.user.v1.UpdateUserWithdrawAddressResponse + 116, // 292: hyapp.user.v1.UserService.ChangeUserCountry:output_type -> hyapp.user.v1.ChangeUserCountryResponse + 116, // 293: hyapp.user.v1.UserService.AdminChangeUserCountry:output_type -> hyapp.user.v1.ChangeUserCountryResponse + 118, // 294: hyapp.user.v1.UserService.SetUserStatus:output_type -> hyapp.user.v1.SetUserStatusResponse + 121, // 295: hyapp.user.v1.UserService.AdminBanUser:output_type -> hyapp.user.v1.AdminBanUserResponse + 123, // 296: hyapp.user.v1.UserService.AdminUnbanUser:output_type -> hyapp.user.v1.AdminUnbanUserResponse + 126, // 297: hyapp.user.v1.UserService.CreateManagerUserBlock:output_type -> hyapp.user.v1.CreateManagerUserBlockResponse + 128, // 298: hyapp.user.v1.UserService.ListManagerUserBlocks:output_type -> hyapp.user.v1.ListManagerUserBlocksResponse + 130, // 299: hyapp.user.v1.UserService.UnblockManagerUser:output_type -> hyapp.user.v1.UnblockManagerUserResponse + 132, // 300: hyapp.user.v1.UserService.CompleteOnboarding:output_type -> hyapp.user.v1.CompleteOnboardingResponse + 134, // 301: hyapp.user.v1.UserService.SearchInviteReferrer:output_type -> hyapp.user.v1.SearchInviteReferrerResponse + 136, // 302: hyapp.user.v1.UserService.BindInviteReferrer:output_type -> hyapp.user.v1.BindInviteReferrerResponse + 26, // 303: hyapp.user.v1.UserSocialService.RecordProfileVisit:output_type -> hyapp.user.v1.RecordProfileVisitResponse + 29, // 304: hyapp.user.v1.UserSocialService.ListProfileVisitors:output_type -> hyapp.user.v1.ListProfileVisitorsResponse + 31, // 305: hyapp.user.v1.UserSocialService.FollowUser:output_type -> hyapp.user.v1.FollowUserResponse + 33, // 306: hyapp.user.v1.UserSocialService.UnfollowUser:output_type -> hyapp.user.v1.UnfollowUserResponse + 36, // 307: hyapp.user.v1.UserSocialService.ListFollowing:output_type -> hyapp.user.v1.ListFollowingResponse + 38, // 308: hyapp.user.v1.UserSocialService.ApplyFriend:output_type -> hyapp.user.v1.ApplyFriendResponse + 40, // 309: hyapp.user.v1.UserSocialService.AcceptFriendApplication:output_type -> hyapp.user.v1.AcceptFriendApplicationResponse + 42, // 310: hyapp.user.v1.UserSocialService.DeleteFriend:output_type -> hyapp.user.v1.DeleteFriendResponse + 45, // 311: hyapp.user.v1.UserSocialService.ListFriends:output_type -> hyapp.user.v1.ListFriendsResponse + 48, // 312: hyapp.user.v1.UserSocialService.ListFriendApplications:output_type -> hyapp.user.v1.ListFriendApplicationsResponse + 80, // 313: hyapp.user.v1.UserSocialService.SubmitReport:output_type -> hyapp.user.v1.SubmitReportResponse + 60, // 314: hyapp.user.v1.UserCPService.ListCPApplications:output_type -> hyapp.user.v1.ListCPApplicationsResponse + 62, // 315: hyapp.user.v1.UserCPService.AcceptCPApplication:output_type -> hyapp.user.v1.AcceptCPApplicationResponse + 64, // 316: hyapp.user.v1.UserCPService.RejectCPApplication:output_type -> hyapp.user.v1.RejectCPApplicationResponse + 66, // 317: hyapp.user.v1.UserCPService.ListCPRelationships:output_type -> hyapp.user.v1.ListCPRelationshipsResponse + 68, // 318: hyapp.user.v1.UserCPService.ListCPIntimacyLeaderboard:output_type -> hyapp.user.v1.ListCPIntimacyLeaderboardResponse + 70, // 319: hyapp.user.v1.UserCPService.PrepareBreakCPRelationship:output_type -> hyapp.user.v1.PrepareBreakCPRelationshipResponse + 72, // 320: hyapp.user.v1.UserCPService.ConfirmBreakCPRelationship:output_type -> hyapp.user.v1.ConfirmBreakCPRelationshipResponse + 74, // 321: hyapp.user.v1.UserCPService.CancelBreakCPRelationship:output_type -> hyapp.user.v1.CancelBreakCPRelationshipResponse + 192, // 322: hyapp.user.v1.UserCPService.ListCPFormationGiftFeed:output_type -> hyapp.user.v1.ListCPFormationGiftFeedResponse + 77, // 323: hyapp.user.v1.UserCPInternalService.ConsumeRoomGiftCPEvent:output_type -> hyapp.user.v1.ConsumeRoomGiftCPEventResponse + 58, // 324: hyapp.user.v1.UserCPInternalService.ListCPWeeklyRankEntries:output_type -> hyapp.user.v1.ListCPWeeklyRankEntriesResponse + 15, // 325: hyapp.user.v1.UserCronService.ProcessLoginIPRiskBatch:output_type -> hyapp.user.v1.CronBatchResponse + 15, // 326: hyapp.user.v1.UserCronService.ProcessRegionRebuildBatch:output_type -> hyapp.user.v1.CronBatchResponse + 15, // 327: hyapp.user.v1.UserCronService.CompensateMicOpenSessions:output_type -> hyapp.user.v1.CronBatchResponse + 15, // 328: hyapp.user.v1.UserCronService.CompensateRoomOpenSessions:output_type -> hyapp.user.v1.CronBatchResponse + 15, // 329: hyapp.user.v1.UserCronService.ExpireManagerUserBlocks:output_type -> hyapp.user.v1.CronBatchResponse + 15, // 330: hyapp.user.v1.UserCronService.ExpireAdminUserBans:output_type -> hyapp.user.v1.CronBatchResponse + 15, // 331: hyapp.user.v1.UserCronService.RefreshCPIntimacyLeaderboard:output_type -> hyapp.user.v1.CronBatchResponse + 15, // 332: hyapp.user.v1.UserCronService.ProcessPrivateMessageHistoryBatch:output_type -> hyapp.user.v1.CronBatchResponse + 138, // 333: hyapp.user.v1.UserDeviceService.BindPushToken:output_type -> hyapp.user.v1.BindPushTokenResponse + 140, // 334: hyapp.user.v1.UserDeviceService.DeletePushToken:output_type -> hyapp.user.v1.DeletePushTokenResponse + 4, // 335: hyapp.user.v1.AppRegistryService.ResolveApp:output_type -> hyapp.user.v1.ResolveAppResponse + 194, // 336: hyapp.user.v1.AppRegistryService.ListApps:output_type -> hyapp.user.v1.ListAppsResponse + 144, // 337: hyapp.user.v1.CountryAdminService.ListCountries:output_type -> hyapp.user.v1.ListCountriesResponse + 146, // 338: hyapp.user.v1.CountryAdminService.UpdateCountry:output_type -> hyapp.user.v1.CountryResponse + 148, // 339: hyapp.user.v1.CountryQueryService.ListRegistrationCountries:output_type -> hyapp.user.v1.ListRegistrationCountriesResponse + 151, // 340: hyapp.user.v1.CountryQueryService.ListLoginRiskBlockedCountries:output_type -> hyapp.user.v1.ListLoginRiskBlockedCountriesResponse + 153, // 341: hyapp.user.v1.RegionAdminService.ListRegions:output_type -> hyapp.user.v1.ListRegionsResponse + 157, // 342: hyapp.user.v1.RegionAdminService.GetRegion:output_type -> hyapp.user.v1.RegionResponse + 157, // 343: hyapp.user.v1.RegionAdminService.UpdateRegion:output_type -> hyapp.user.v1.RegionResponse + 157, // 344: hyapp.user.v1.RegionAdminService.ReplaceRegionCountries:output_type -> hyapp.user.v1.RegionResponse + 160, // 345: hyapp.user.v1.UserIdentityService.GetUserIdentity:output_type -> hyapp.user.v1.GetUserIdentityResponse + 162, // 346: hyapp.user.v1.UserIdentityService.ResolveDisplayUserID:output_type -> hyapp.user.v1.ResolveDisplayUserIDResponse + 196, // 347: hyapp.user.v1.UserIdentityService.ResolveAdminUserIdentifier:output_type -> hyapp.user.v1.ResolveAdminUserIdentifierResponse + 164, // 348: hyapp.user.v1.UserIdentityService.ChangeDisplayUserID:output_type -> hyapp.user.v1.ChangeDisplayUserIDResponse + 166, // 349: hyapp.user.v1.UserIdentityService.ApplyPrettyDisplayUserID:output_type -> hyapp.user.v1.ApplyPrettyDisplayUserIDResponse + 173, // 350: hyapp.user.v1.UserIdentityService.ListAvailablePrettyDisplayIDs:output_type -> hyapp.user.v1.ListAvailablePrettyDisplayIDsResponse + 175, // 351: hyapp.user.v1.UserIdentityService.ApplyPrettyDisplayIDFromPool:output_type -> hyapp.user.v1.ApplyPrettyDisplayIDFromPoolResponse + 168, // 352: hyapp.user.v1.UserIdentityService.ExpirePrettyDisplayUserID:output_type -> hyapp.user.v1.ExpirePrettyDisplayUserIDResponse + 177, // 353: hyapp.user.v1.UserPrettyDisplayIDAdminService.ListPrettyDisplayIDPools:output_type -> hyapp.user.v1.ListPrettyDisplayIDPoolsResponse + 180, // 354: hyapp.user.v1.UserPrettyDisplayIDAdminService.CreatePrettyDisplayIDPool:output_type -> hyapp.user.v1.PrettyDisplayIDPoolResponse + 180, // 355: hyapp.user.v1.UserPrettyDisplayIDAdminService.UpdatePrettyDisplayIDPool:output_type -> hyapp.user.v1.PrettyDisplayIDPoolResponse + 182, // 356: hyapp.user.v1.UserPrettyDisplayIDAdminService.GeneratePrettyDisplayIDs:output_type -> hyapp.user.v1.GeneratePrettyDisplayIDsResponse + 184, // 357: hyapp.user.v1.UserPrettyDisplayIDAdminService.ListPrettyDisplayIDs:output_type -> hyapp.user.v1.ListPrettyDisplayIDsResponse + 187, // 358: hyapp.user.v1.UserPrettyDisplayIDAdminService.SetPrettyDisplayIDStatus:output_type -> hyapp.user.v1.PrettyDisplayIDResponse + 187, // 359: hyapp.user.v1.UserPrettyDisplayIDAdminService.RecyclePrettyDisplayID:output_type -> hyapp.user.v1.PrettyDisplayIDResponse + 189, // 360: hyapp.user.v1.UserPrettyDisplayIDAdminService.AdminGrantPrettyDisplayID:output_type -> hyapp.user.v1.AdminGrantPrettyDisplayIDResponse + 273, // [273:361] is the sub-list for method output_type + 185, // [185:273] is the sub-list for method input_type + 185, // [185:185] is the sub-list for extension type_name + 185, // [185:185] is the sub-list for extension extendee + 0, // [0:185] is the sub-list for field type_name } func init() { file_proto_user_v1_user_proto_init() } @@ -15761,15 +16299,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[93].OneofWrappers = []any{} - file_proto_user_v1_user_proto_msgTypes[135].OneofWrappers = []any{} + file_proto_user_v1_user_proto_msgTypes[100].OneofWrappers = []any{} + file_proto_user_v1_user_proto_msgTypes[142].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: 192, + NumMessages: 199, NumExtensions: 0, NumServices: 12, }, diff --git a/api/proto/user/v1/user.proto b/api/proto/user/v1/user.proto index fcfe4d53..2a40feaa 100644 --- a/api/proto/user/v1/user.proto +++ b/api/proto/user/v1/user.proto @@ -98,6 +98,8 @@ message User { string profile_bg_img = 31; string contact_info = 32; string withdraw_usdt_trc20_address = 33; + // content_blacklisted 只控制游戏列表和 Banner 等运营内容可见性,不改变登录、房间或账务状态。 + bool content_blacklisted = 34; } // InviteOverview 是我的页可直接展示的邀请码和邀请计数 read model。 @@ -777,6 +779,56 @@ message AdminIssueUserAccessTokenResponse { int64 session_last_heartbeat_at_ms = 6; } +// UserContentBlacklistEntry 是后台“黑名单屏蔽用户”列表当前态。 +// 用户展示字段随列表查询读取当前资料;operator_admin_id/reason/time 是 user-service 持有的治理事实。 +message UserContentBlacklistEntry { + int64 user_id = 1; + string display_user_id = 2; + string default_display_user_id = 3; + string pretty_id = 4; + string pretty_display_user_id = 5; + string username = 6; + string avatar = 7; + UserStatus user_status = 8; + int64 operator_admin_id = 9; + string reason = 10; + int64 created_at_ms = 11; + int64 updated_at_ms = 12; +} + +message ListUserContentBlacklistRequest { + RequestMeta meta = 1; + int32 page = 2; + int32 page_size = 3; +} + +message ListUserContentBlacklistResponse { + repeated UserContentBlacklistEntry items = 1; + int64 total = 2; +} + +message AdminAddUserContentBlacklistRequest { + RequestMeta meta = 1; + int64 user_id = 2; + int64 operator_admin_id = 3; + string reason = 4; +} + +message AdminAddUserContentBlacklistResponse { + UserContentBlacklistEntry item = 1; +} + +message AdminRemoveUserContentBlacklistRequest { + RequestMeta meta = 1; + int64 user_id = 2; + int64 operator_admin_id = 3; + string reason = 4; +} + +message AdminRemoveUserContentBlacklistResponse { + bool removed = 1; +} + // RoomBasicUser 是房间首屏只需要的用户展示基础资料。 message RoomBasicUser { int64 user_id = 1; @@ -1548,6 +1600,9 @@ service UserService { rpc BatchGetUsers(BatchGetUsersRequest) returns (BatchGetUsersResponse); rpc BatchGetUserAdminProfiles(BatchGetUserAdminProfilesRequest) returns (BatchGetUserAdminProfilesResponse); rpc AdminIssueUserAccessToken(AdminIssueUserAccessTokenRequest) returns (AdminIssueUserAccessTokenResponse); + rpc ListUserContentBlacklist(ListUserContentBlacklistRequest) returns (ListUserContentBlacklistResponse); + rpc AdminAddUserContentBlacklist(AdminAddUserContentBlacklistRequest) returns (AdminAddUserContentBlacklistResponse); + rpc AdminRemoveUserContentBlacklist(AdminRemoveUserContentBlacklistRequest) returns (AdminRemoveUserContentBlacklistResponse); rpc BatchGetRoomBasicUsers(BatchGetRoomBasicUsersRequest) returns (BatchGetRoomBasicUsersResponse); rpc ListUserIDs(ListUserIDsRequest) returns (ListUserIDsResponse); rpc GetUserMicLifetimeStats(GetUserMicLifetimeStatsRequest) returns (GetUserMicLifetimeStatsResponse); diff --git a/api/proto/user/v1/user_grpc.pb.go b/api/proto/user/v1/user_grpc.pb.go index 6e686605..2ff67db3 100644 --- a/api/proto/user/v1/user_grpc.pb.go +++ b/api/proto/user/v1/user_grpc.pb.go @@ -19,33 +19,36 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - UserService_GetUser_FullMethodName = "/hyapp.user.v1.UserService/GetUser" - UserService_GetInviteAttribution_FullMethodName = "/hyapp.user.v1.UserService/GetInviteAttribution" - UserService_BusinessUserLookup_FullMethodName = "/hyapp.user.v1.UserService/BusinessUserLookup" - UserService_GetMyProfileStats_FullMethodName = "/hyapp.user.v1.UserService/GetMyProfileStats" - UserService_BatchGetUsers_FullMethodName = "/hyapp.user.v1.UserService/BatchGetUsers" - UserService_BatchGetUserAdminProfiles_FullMethodName = "/hyapp.user.v1.UserService/BatchGetUserAdminProfiles" - UserService_AdminIssueUserAccessToken_FullMethodName = "/hyapp.user.v1.UserService/AdminIssueUserAccessToken" - UserService_BatchGetRoomBasicUsers_FullMethodName = "/hyapp.user.v1.UserService/BatchGetRoomBasicUsers" - UserService_ListUserIDs_FullMethodName = "/hyapp.user.v1.UserService/ListUserIDs" - UserService_GetUserMicLifetimeStats_FullMethodName = "/hyapp.user.v1.UserService/GetUserMicLifetimeStats" - UserService_AuthorizeUserAvatarUpload_FullMethodName = "/hyapp.user.v1.UserService/AuthorizeUserAvatarUpload" - UserService_CompleteUserAvatarUpload_FullMethodName = "/hyapp.user.v1.UserService/CompleteUserAvatarUpload" - UserService_UpdateUserProfile_FullMethodName = "/hyapp.user.v1.UserService/UpdateUserProfile" - UserService_UpdateUserProfileBackground_FullMethodName = "/hyapp.user.v1.UserService/UpdateUserProfileBackground" - UserService_UpdateUserContactInfo_FullMethodName = "/hyapp.user.v1.UserService/UpdateUserContactInfo" - UserService_UpdateUserWithdrawAddress_FullMethodName = "/hyapp.user.v1.UserService/UpdateUserWithdrawAddress" - UserService_ChangeUserCountry_FullMethodName = "/hyapp.user.v1.UserService/ChangeUserCountry" - UserService_AdminChangeUserCountry_FullMethodName = "/hyapp.user.v1.UserService/AdminChangeUserCountry" - UserService_SetUserStatus_FullMethodName = "/hyapp.user.v1.UserService/SetUserStatus" - UserService_AdminBanUser_FullMethodName = "/hyapp.user.v1.UserService/AdminBanUser" - UserService_AdminUnbanUser_FullMethodName = "/hyapp.user.v1.UserService/AdminUnbanUser" - UserService_CreateManagerUserBlock_FullMethodName = "/hyapp.user.v1.UserService/CreateManagerUserBlock" - UserService_ListManagerUserBlocks_FullMethodName = "/hyapp.user.v1.UserService/ListManagerUserBlocks" - UserService_UnblockManagerUser_FullMethodName = "/hyapp.user.v1.UserService/UnblockManagerUser" - UserService_CompleteOnboarding_FullMethodName = "/hyapp.user.v1.UserService/CompleteOnboarding" - UserService_SearchInviteReferrer_FullMethodName = "/hyapp.user.v1.UserService/SearchInviteReferrer" - UserService_BindInviteReferrer_FullMethodName = "/hyapp.user.v1.UserService/BindInviteReferrer" + UserService_GetUser_FullMethodName = "/hyapp.user.v1.UserService/GetUser" + UserService_GetInviteAttribution_FullMethodName = "/hyapp.user.v1.UserService/GetInviteAttribution" + UserService_BusinessUserLookup_FullMethodName = "/hyapp.user.v1.UserService/BusinessUserLookup" + UserService_GetMyProfileStats_FullMethodName = "/hyapp.user.v1.UserService/GetMyProfileStats" + UserService_BatchGetUsers_FullMethodName = "/hyapp.user.v1.UserService/BatchGetUsers" + UserService_BatchGetUserAdminProfiles_FullMethodName = "/hyapp.user.v1.UserService/BatchGetUserAdminProfiles" + UserService_AdminIssueUserAccessToken_FullMethodName = "/hyapp.user.v1.UserService/AdminIssueUserAccessToken" + UserService_ListUserContentBlacklist_FullMethodName = "/hyapp.user.v1.UserService/ListUserContentBlacklist" + UserService_AdminAddUserContentBlacklist_FullMethodName = "/hyapp.user.v1.UserService/AdminAddUserContentBlacklist" + UserService_AdminRemoveUserContentBlacklist_FullMethodName = "/hyapp.user.v1.UserService/AdminRemoveUserContentBlacklist" + UserService_BatchGetRoomBasicUsers_FullMethodName = "/hyapp.user.v1.UserService/BatchGetRoomBasicUsers" + UserService_ListUserIDs_FullMethodName = "/hyapp.user.v1.UserService/ListUserIDs" + UserService_GetUserMicLifetimeStats_FullMethodName = "/hyapp.user.v1.UserService/GetUserMicLifetimeStats" + UserService_AuthorizeUserAvatarUpload_FullMethodName = "/hyapp.user.v1.UserService/AuthorizeUserAvatarUpload" + UserService_CompleteUserAvatarUpload_FullMethodName = "/hyapp.user.v1.UserService/CompleteUserAvatarUpload" + UserService_UpdateUserProfile_FullMethodName = "/hyapp.user.v1.UserService/UpdateUserProfile" + UserService_UpdateUserProfileBackground_FullMethodName = "/hyapp.user.v1.UserService/UpdateUserProfileBackground" + UserService_UpdateUserContactInfo_FullMethodName = "/hyapp.user.v1.UserService/UpdateUserContactInfo" + UserService_UpdateUserWithdrawAddress_FullMethodName = "/hyapp.user.v1.UserService/UpdateUserWithdrawAddress" + UserService_ChangeUserCountry_FullMethodName = "/hyapp.user.v1.UserService/ChangeUserCountry" + UserService_AdminChangeUserCountry_FullMethodName = "/hyapp.user.v1.UserService/AdminChangeUserCountry" + UserService_SetUserStatus_FullMethodName = "/hyapp.user.v1.UserService/SetUserStatus" + UserService_AdminBanUser_FullMethodName = "/hyapp.user.v1.UserService/AdminBanUser" + UserService_AdminUnbanUser_FullMethodName = "/hyapp.user.v1.UserService/AdminUnbanUser" + UserService_CreateManagerUserBlock_FullMethodName = "/hyapp.user.v1.UserService/CreateManagerUserBlock" + UserService_ListManagerUserBlocks_FullMethodName = "/hyapp.user.v1.UserService/ListManagerUserBlocks" + UserService_UnblockManagerUser_FullMethodName = "/hyapp.user.v1.UserService/UnblockManagerUser" + UserService_CompleteOnboarding_FullMethodName = "/hyapp.user.v1.UserService/CompleteOnboarding" + UserService_SearchInviteReferrer_FullMethodName = "/hyapp.user.v1.UserService/SearchInviteReferrer" + UserService_BindInviteReferrer_FullMethodName = "/hyapp.user.v1.UserService/BindInviteReferrer" ) // UserServiceClient is the client API for UserService service. @@ -61,6 +64,9 @@ type UserServiceClient interface { BatchGetUsers(ctx context.Context, in *BatchGetUsersRequest, opts ...grpc.CallOption) (*BatchGetUsersResponse, error) BatchGetUserAdminProfiles(ctx context.Context, in *BatchGetUserAdminProfilesRequest, opts ...grpc.CallOption) (*BatchGetUserAdminProfilesResponse, error) AdminIssueUserAccessToken(ctx context.Context, in *AdminIssueUserAccessTokenRequest, opts ...grpc.CallOption) (*AdminIssueUserAccessTokenResponse, error) + ListUserContentBlacklist(ctx context.Context, in *ListUserContentBlacklistRequest, opts ...grpc.CallOption) (*ListUserContentBlacklistResponse, error) + AdminAddUserContentBlacklist(ctx context.Context, in *AdminAddUserContentBlacklistRequest, opts ...grpc.CallOption) (*AdminAddUserContentBlacklistResponse, error) + AdminRemoveUserContentBlacklist(ctx context.Context, in *AdminRemoveUserContentBlacklistRequest, opts ...grpc.CallOption) (*AdminRemoveUserContentBlacklistResponse, error) BatchGetRoomBasicUsers(ctx context.Context, in *BatchGetRoomBasicUsersRequest, opts ...grpc.CallOption) (*BatchGetRoomBasicUsersResponse, error) ListUserIDs(ctx context.Context, in *ListUserIDsRequest, opts ...grpc.CallOption) (*ListUserIDsResponse, error) GetUserMicLifetimeStats(ctx context.Context, in *GetUserMicLifetimeStatsRequest, opts ...grpc.CallOption) (*GetUserMicLifetimeStatsResponse, error) @@ -161,6 +167,36 @@ func (c *userServiceClient) AdminIssueUserAccessToken(ctx context.Context, in *A return out, nil } +func (c *userServiceClient) ListUserContentBlacklist(ctx context.Context, in *ListUserContentBlacklistRequest, opts ...grpc.CallOption) (*ListUserContentBlacklistResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListUserContentBlacklistResponse) + err := c.cc.Invoke(ctx, UserService_ListUserContentBlacklist_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) AdminAddUserContentBlacklist(ctx context.Context, in *AdminAddUserContentBlacklistRequest, opts ...grpc.CallOption) (*AdminAddUserContentBlacklistResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AdminAddUserContentBlacklistResponse) + err := c.cc.Invoke(ctx, UserService_AdminAddUserContentBlacklist_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *userServiceClient) AdminRemoveUserContentBlacklist(ctx context.Context, in *AdminRemoveUserContentBlacklistRequest, opts ...grpc.CallOption) (*AdminRemoveUserContentBlacklistResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AdminRemoveUserContentBlacklistResponse) + err := c.cc.Invoke(ctx, UserService_AdminRemoveUserContentBlacklist_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *userServiceClient) BatchGetRoomBasicUsers(ctx context.Context, in *BatchGetRoomBasicUsersRequest, opts ...grpc.CallOption) (*BatchGetRoomBasicUsersResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(BatchGetRoomBasicUsersResponse) @@ -374,6 +410,9 @@ type UserServiceServer interface { BatchGetUsers(context.Context, *BatchGetUsersRequest) (*BatchGetUsersResponse, error) BatchGetUserAdminProfiles(context.Context, *BatchGetUserAdminProfilesRequest) (*BatchGetUserAdminProfilesResponse, error) AdminIssueUserAccessToken(context.Context, *AdminIssueUserAccessTokenRequest) (*AdminIssueUserAccessTokenResponse, error) + ListUserContentBlacklist(context.Context, *ListUserContentBlacklistRequest) (*ListUserContentBlacklistResponse, error) + AdminAddUserContentBlacklist(context.Context, *AdminAddUserContentBlacklistRequest) (*AdminAddUserContentBlacklistResponse, error) + AdminRemoveUserContentBlacklist(context.Context, *AdminRemoveUserContentBlacklistRequest) (*AdminRemoveUserContentBlacklistResponse, error) BatchGetRoomBasicUsers(context.Context, *BatchGetRoomBasicUsersRequest) (*BatchGetRoomBasicUsersResponse, error) ListUserIDs(context.Context, *ListUserIDsRequest) (*ListUserIDsResponse, error) GetUserMicLifetimeStats(context.Context, *GetUserMicLifetimeStatsRequest) (*GetUserMicLifetimeStatsResponse, error) @@ -425,6 +464,15 @@ func (UnimplementedUserServiceServer) BatchGetUserAdminProfiles(context.Context, func (UnimplementedUserServiceServer) AdminIssueUserAccessToken(context.Context, *AdminIssueUserAccessTokenRequest) (*AdminIssueUserAccessTokenResponse, error) { return nil, status.Error(codes.Unimplemented, "method AdminIssueUserAccessToken not implemented") } +func (UnimplementedUserServiceServer) ListUserContentBlacklist(context.Context, *ListUserContentBlacklistRequest) (*ListUserContentBlacklistResponse, error) { + return nil, status.Error(codes.Unimplemented, "method ListUserContentBlacklist not implemented") +} +func (UnimplementedUserServiceServer) AdminAddUserContentBlacklist(context.Context, *AdminAddUserContentBlacklistRequest) (*AdminAddUserContentBlacklistResponse, error) { + return nil, status.Error(codes.Unimplemented, "method AdminAddUserContentBlacklist not implemented") +} +func (UnimplementedUserServiceServer) AdminRemoveUserContentBlacklist(context.Context, *AdminRemoveUserContentBlacklistRequest) (*AdminRemoveUserContentBlacklistResponse, error) { + return nil, status.Error(codes.Unimplemented, "method AdminRemoveUserContentBlacklist not implemented") +} func (UnimplementedUserServiceServer) BatchGetRoomBasicUsers(context.Context, *BatchGetRoomBasicUsersRequest) (*BatchGetRoomBasicUsersResponse, error) { return nil, status.Error(codes.Unimplemented, "method BatchGetRoomBasicUsers not implemented") } @@ -632,6 +680,60 @@ func _UserService_AdminIssueUserAccessToken_Handler(srv interface{}, ctx context return interceptor(ctx, in, info, handler) } +func _UserService_ListUserContentBlacklist_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListUserContentBlacklistRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).ListUserContentBlacklist(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserService_ListUserContentBlacklist_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).ListUserContentBlacklist(ctx, req.(*ListUserContentBlacklistRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_AdminAddUserContentBlacklist_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AdminAddUserContentBlacklistRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).AdminAddUserContentBlacklist(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserService_AdminAddUserContentBlacklist_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).AdminAddUserContentBlacklist(ctx, req.(*AdminAddUserContentBlacklistRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _UserService_AdminRemoveUserContentBlacklist_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AdminRemoveUserContentBlacklistRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(UserServiceServer).AdminRemoveUserContentBlacklist(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: UserService_AdminRemoveUserContentBlacklist_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(UserServiceServer).AdminRemoveUserContentBlacklist(ctx, req.(*AdminRemoveUserContentBlacklistRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _UserService_BatchGetRoomBasicUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(BatchGetRoomBasicUsersRequest) if err := dec(in); err != nil { @@ -1027,6 +1129,18 @@ var UserService_ServiceDesc = grpc.ServiceDesc{ MethodName: "AdminIssueUserAccessToken", Handler: _UserService_AdminIssueUserAccessToken_Handler, }, + { + MethodName: "ListUserContentBlacklist", + Handler: _UserService_ListUserContentBlacklist_Handler, + }, + { + MethodName: "AdminAddUserContentBlacklist", + Handler: _UserService_AdminAddUserContentBlacklist_Handler, + }, + { + MethodName: "AdminRemoveUserContentBlacklist", + Handler: _UserService_AdminRemoveUserContentBlacklist_Handler, + }, { MethodName: "BatchGetRoomBasicUsers", Handler: _UserService_BatchGetRoomBasicUsers_Handler, diff --git a/api/proto/wallet/v1/wallet.pb.go b/api/proto/wallet/v1/wallet.pb.go index 32f949ab..7157c7f3 100644 --- a/api/proto/wallet/v1/wallet.pb.go +++ b/api/proto/wallet/v1/wallet.pb.go @@ -1502,8 +1502,13 @@ type HostSalaryPolicy struct { MinimumWithdrawUsdMinor int64 `protobuf:"varint,17,opt,name=minimum_withdraw_usd_minor,json=minimumWithdrawUsdMinor,proto3" json:"minimum_withdraw_usd_minor,omitempty"` WithdrawFeeBps int32 `protobuf:"varint,18,opt,name=withdraw_fee_bps,json=withdrawFeeBps,proto3" json:"withdraw_fee_bps,omitempty"` AgencyPointShareBps int32 `protobuf:"varint,19,opt,name=agency_point_share_bps,json=agencyPointShareBps,proto3" json:"agency_point_share_bps,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // 两个渠道的最低金额分别进入各自资金事务;旧 minimum_withdraw_usd_minor 仅保留为平台金额兼容别名。 + CoinSellerMinimumWithdrawUsdMinor int64 `protobuf:"varint,20,opt,name=coin_seller_minimum_withdraw_usd_minor,json=coinSellerMinimumWithdrawUsdMinor,proto3" json:"coin_seller_minimum_withdraw_usd_minor,omitempty"` + PlatformMinimumWithdrawUsdMinor int64 `protobuf:"varint,21,opt,name=platform_minimum_withdraw_usd_minor,json=platformMinimumWithdrawUsdMinor,proto3" json:"platform_minimum_withdraw_usd_minor,omitempty"` + // 只控制 POINT_DIAMOND -> COIN;关闭后永久积分余额和两种提现能力仍可独立使用。 + DiamondExchangeEnabled bool `protobuf:"varint,22,opt,name=diamond_exchange_enabled,json=diamondExchangeEnabled,proto3" json:"diamond_exchange_enabled,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *HostSalaryPolicy) Reset() { @@ -1669,6 +1674,27 @@ func (x *HostSalaryPolicy) GetAgencyPointShareBps() int32 { return 0 } +func (x *HostSalaryPolicy) GetCoinSellerMinimumWithdrawUsdMinor() int64 { + if x != nil { + return x.CoinSellerMinimumWithdrawUsdMinor + } + return 0 +} + +func (x *HostSalaryPolicy) GetPlatformMinimumWithdrawUsdMinor() int64 { + if x != nil { + return x.PlatformMinimumWithdrawUsdMinor + } + return 0 +} + +func (x *HostSalaryPolicy) GetDiamondExchangeEnabled() bool { + if x != nil { + return x.DiamondExchangeEnabled + } + return false +} + type GetActiveHostSalaryPolicyRequest struct { state protoimpl.MessageState `protogen:"open.v1"` RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` @@ -26927,17 +26953,21 @@ type GetPointWithdrawalConfigResponse struct { MinimumPoints int64 `protobuf:"varint,4,opt,name=minimum_points,json=minimumPoints,proto3" json:"minimum_points,omitempty"` PolicyInstanceCode string `protobuf:"bytes,5,opt,name=policy_instance_code,json=policyInstanceCode,proto3" json:"policy_instance_code,omitempty"` // coins_per_usd 复用工资兑换普通金币的统一比例,与 points_per_usd 组合得到 POINT->COIN 展示比例。 - CoinsPerUsd int64 `protobuf:"varint,6,opt,name=coins_per_usd,json=coinsPerUsd,proto3" json:"coins_per_usd,omitempty"` - PolicyType string `protobuf:"bytes,7,opt,name=policy_type,json=policyType,proto3" json:"policy_type,omitempty"` - MinimumWithdrawUsdMinor int64 `protobuf:"varint,8,opt,name=minimum_withdraw_usd_minor,json=minimumWithdrawUsdMinor,proto3" json:"minimum_withdraw_usd_minor,omitempty"` - AgencyPointShareBps int32 `protobuf:"varint,9,opt,name=agency_point_share_bps,json=agencyPointShareBps,proto3" json:"agency_point_share_bps,omitempty"` - PolicyId uint64 `protobuf:"varint,10,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` - PolicyVersion uint64 `protobuf:"varint,11,opt,name=policy_version,json=policyVersion,proto3" json:"policy_version,omitempty"` - AvailabilityEvaluated bool `protobuf:"varint,12,opt,name=availability_evaluated,json=availabilityEvaluated,proto3" json:"availability_evaluated,omitempty"` - CoinSellerAvailability *PointWithdrawalActionAvailability `protobuf:"bytes,13,opt,name=coin_seller_availability,json=coinSellerAvailability,proto3" json:"coin_seller_availability,omitempty"` - PlatformAvailability *PointWithdrawalActionAvailability `protobuf:"bytes,14,opt,name=platform_availability,json=platformAvailability,proto3" json:"platform_availability,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + CoinsPerUsd int64 `protobuf:"varint,6,opt,name=coins_per_usd,json=coinsPerUsd,proto3" json:"coins_per_usd,omitempty"` + PolicyType string `protobuf:"bytes,7,opt,name=policy_type,json=policyType,proto3" json:"policy_type,omitempty"` + MinimumWithdrawUsdMinor int64 `protobuf:"varint,8,opt,name=minimum_withdraw_usd_minor,json=minimumWithdrawUsdMinor,proto3" json:"minimum_withdraw_usd_minor,omitempty"` + AgencyPointShareBps int32 `protobuf:"varint,9,opt,name=agency_point_share_bps,json=agencyPointShareBps,proto3" json:"agency_point_share_bps,omitempty"` + PolicyId uint64 `protobuf:"varint,10,opt,name=policy_id,json=policyId,proto3" json:"policy_id,omitempty"` + PolicyVersion uint64 `protobuf:"varint,11,opt,name=policy_version,json=policyVersion,proto3" json:"policy_version,omitempty"` + AvailabilityEvaluated bool `protobuf:"varint,12,opt,name=availability_evaluated,json=availabilityEvaluated,proto3" json:"availability_evaluated,omitempty"` + CoinSellerAvailability *PointWithdrawalActionAvailability `protobuf:"bytes,13,opt,name=coin_seller_availability,json=coinSellerAvailability,proto3" json:"coin_seller_availability,omitempty"` + PlatformAvailability *PointWithdrawalActionAvailability `protobuf:"bytes,14,opt,name=platform_availability,json=platformAvailability,proto3" json:"platform_availability,omitempty"` + CoinSellerMinimumWithdrawUsdMinor int64 `protobuf:"varint,15,opt,name=coin_seller_minimum_withdraw_usd_minor,json=coinSellerMinimumWithdrawUsdMinor,proto3" json:"coin_seller_minimum_withdraw_usd_minor,omitempty"` + PlatformMinimumWithdrawUsdMinor int64 `protobuf:"varint,16,opt,name=platform_minimum_withdraw_usd_minor,json=platformMinimumWithdrawUsdMinor,proto3" json:"platform_minimum_withdraw_usd_minor,omitempty"` + // optional 区分旧 wallet-service 未返回字段与运营明确关闭,支持滚动升级时保持原开启行为。 + DiamondExchangeEnabled *bool `protobuf:"varint,17,opt,name=diamond_exchange_enabled,json=diamondExchangeEnabled,proto3,oneof" json:"diamond_exchange_enabled,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetPointWithdrawalConfigResponse) Reset() { @@ -27068,6 +27098,27 @@ func (x *GetPointWithdrawalConfigResponse) GetPlatformAvailability() *PointWithd return nil } +func (x *GetPointWithdrawalConfigResponse) GetCoinSellerMinimumWithdrawUsdMinor() int64 { + if x != nil { + return x.CoinSellerMinimumWithdrawUsdMinor + } + return 0 +} + +func (x *GetPointWithdrawalConfigResponse) GetPlatformMinimumWithdrawUsdMinor() int64 { + if x != nil { + return x.PlatformMinimumWithdrawUsdMinor + } + return 0 +} + +func (x *GetPointWithdrawalConfigResponse) GetDiamondExchangeEnabled() bool { + if x != nil && x.DiamondExchangeEnabled != nil { + return *x.DiamondExchangeEnabled + } + return false +} + // VipBenefitPreviewItem 是同一权益下的一项预览内容;独立稳定键允许 Flutter 在多图、动态资源间切换, // 且不会把数组下标误当成资源身份。 type VipBenefitPreviewItem struct { @@ -27652,7 +27703,7 @@ const file_proto_wallet_v1_wallet_proto_rawDesc = "" + "\x17agency_salary_usd_minor\x18\x05 \x01(\x03R\x14agencySalaryUsdMinor\x12\x16\n" + "\x06status\x18\x06 \x01(\tR\x06status\x12\x1d\n" + "\n" + - "sort_order\x18\a \x01(\x05R\tsortOrder\"\xc3\x06\n" + + "sort_order\x18\a \x01(\x05R\tsortOrder\"\x9e\b\n" + "\x10HostSalaryPolicy\x12\x1b\n" + "\tpolicy_id\x18\x01 \x01(\x04R\bpolicyId\x12\x12\n" + "\x04name\x18\x02 \x01(\tR\x04name\x12\x1b\n" + @@ -27674,7 +27725,10 @@ const file_proto_wallet_v1_wallet_proto_rawDesc = "" + "\rcoins_per_usd\x18\x10 \x01(\x03R\vcoinsPerUsd\x12;\n" + "\x1aminimum_withdraw_usd_minor\x18\x11 \x01(\x03R\x17minimumWithdrawUsdMinor\x12(\n" + "\x10withdraw_fee_bps\x18\x12 \x01(\x05R\x0ewithdrawFeeBps\x123\n" + - "\x16agency_point_share_bps\x18\x13 \x01(\x05R\x13agencyPointShareBps\"\x8e\x02\n" + + "\x16agency_point_share_bps\x18\x13 \x01(\x05R\x13agencyPointShareBps\x12Q\n" + + "&coin_seller_minimum_withdraw_usd_minor\x18\x14 \x01(\x03R!coinSellerMinimumWithdrawUsdMinor\x12L\n" + + "#platform_minimum_withdraw_usd_minor\x18\x15 \x01(\x03R\x1fplatformMinimumWithdrawUsdMinor\x128\n" + + "\x18diamond_exchange_enabled\x18\x16 \x01(\bR\x16diamondExchangeEnabled\"\x8e\x02\n" + " GetActiveHostSalaryPolicyRequest\x12\x1d\n" + "\n" + "request_id\x18\x01 \x01(\tR\trequestId\x12\x19\n" + @@ -30226,7 +30280,7 @@ const file_proto_wallet_v1_wallet_proto_rawDesc = "" + "used_count\x18\x04 \x01(\x03R\tusedCount\x12'\n" + "\x0fremaining_count\x18\x05 \x01(\x03R\x0eremainingCount\x12!\n" + "\fallowed_days\x18\x06 \x01(\tR\vallowedDays\x12!\n" + - "\fblock_reason\x18\a \x01(\tR\vblockReason\"\xd9\x05\n" + + "\fblock_reason\x18\a \x01(\tR\vblockReason\"\xd6\a\n" + " GetPointWithdrawalConfigResponse\x12\x14\n" + "\x05found\x18\x01 \x01(\bR\x05found\x12$\n" + "\x0epoints_per_usd\x18\x02 \x01(\x03R\fpointsPerUsd\x12\x17\n" + @@ -30243,7 +30297,11 @@ const file_proto_wallet_v1_wallet_proto_rawDesc = "" + "\x0epolicy_version\x18\v \x01(\x04R\rpolicyVersion\x125\n" + "\x16availability_evaluated\x18\f \x01(\bR\x15availabilityEvaluated\x12l\n" + "\x18coin_seller_availability\x18\r \x01(\v22.hyapp.wallet.v1.PointWithdrawalActionAvailabilityR\x16coinSellerAvailability\x12g\n" + - "\x15platform_availability\x18\x0e \x01(\v22.hyapp.wallet.v1.PointWithdrawalActionAvailabilityR\x14platformAvailability\"\x98\x02\n" + + "\x15platform_availability\x18\x0e \x01(\v22.hyapp.wallet.v1.PointWithdrawalActionAvailabilityR\x14platformAvailability\x12Q\n" + + "&coin_seller_minimum_withdraw_usd_minor\x18\x0f \x01(\x03R!coinSellerMinimumWithdrawUsdMinor\x12L\n" + + "#platform_minimum_withdraw_usd_minor\x18\x10 \x01(\x03R\x1fplatformMinimumWithdrawUsdMinor\x12=\n" + + "\x18diamond_exchange_enabled\x18\x11 \x01(\bH\x00R\x16diamondExchangeEnabled\x88\x01\x01B\x1b\n" + + "\x19_diamond_exchange_enabled\"\x98\x02\n" + "\x15VipBenefitPreviewItem\x12\x1d\n" + "\n" + "preview_id\x18\x01 \x01(\tR\tpreviewId\x12\x14\n" + @@ -31187,6 +31245,7 @@ func file_proto_wallet_v1_wallet_proto_init() { file_proto_wallet_v1_wallet_proto_msgTypes[153].OneofWrappers = []any{} file_proto_wallet_v1_wallet_proto_msgTypes[219].OneofWrappers = []any{} file_proto_wallet_v1_wallet_proto_msgTypes[231].OneofWrappers = []any{} + file_proto_wallet_v1_wallet_proto_msgTypes[298].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/api/proto/wallet/v1/wallet.proto b/api/proto/wallet/v1/wallet.proto index 2e27b12b..46642c8d 100644 --- a/api/proto/wallet/v1/wallet.proto +++ b/api/proto/wallet/v1/wallet.proto @@ -223,6 +223,11 @@ message HostSalaryPolicy { int64 minimum_withdraw_usd_minor = 17; int32 withdraw_fee_bps = 18; int32 agency_point_share_bps = 19; + // 两个渠道的最低金额分别进入各自资金事务;旧 minimum_withdraw_usd_minor 仅保留为平台金额兼容别名。 + int64 coin_seller_minimum_withdraw_usd_minor = 20; + int64 platform_minimum_withdraw_usd_minor = 21; + // 只控制 POINT_DIAMOND -> COIN;关闭后永久积分余额和两种提现能力仍可独立使用。 + bool diamond_exchange_enabled = 22; } message GetActiveHostSalaryPolicyRequest { @@ -3143,6 +3148,10 @@ message GetPointWithdrawalConfigResponse { bool availability_evaluated = 12; PointWithdrawalActionAvailability coin_seller_availability = 13; PointWithdrawalActionAvailability platform_availability = 14; + int64 coin_seller_minimum_withdraw_usd_minor = 15; + int64 platform_minimum_withdraw_usd_minor = 16; + // optional 区分旧 wallet-service 未返回字段与运营明确关闭,支持滚动升级时保持原开启行为。 + optional bool diamond_exchange_enabled = 17; } // VipBenefitPreviewItem 是同一权益下的一项预览内容;独立稳定键允许 Flutter 在多图、动态资源间切换, diff --git a/pkg/xerr/catalog.go b/pkg/xerr/catalog.go index c802a867..1fd4e782 100644 --- a/pkg/xerr/catalog.go +++ b/pkg/xerr/catalog.go @@ -92,9 +92,16 @@ var catalog = map[Code]Spec{ CPAlreadyExistsSelf: spec(codes.FailedPrecondition, httpStatusConflict, CPAlreadyExistsSelf, "You already have a CP"), CPAlreadyExistsOther: spec(codes.FailedPrecondition, httpStatusConflict, CPAlreadyExistsOther, "The other party already has a CP"), - InsufficientBalance: spec(codes.FailedPrecondition, httpStatusConflict, InsufficientBalance, "insufficient balance"), - DuplicateBillingCommand: spec(codes.AlreadyExists, httpStatusConflict, DuplicateBillingCommand, "billing command already processed"), - LedgerConflict: spec(codes.Aborted, httpStatusConflict, LedgerConflict, "wallet state changed, please retry"), + InsufficientBalance: spec(codes.FailedPrecondition, httpStatusConflict, InsufficientBalance, "insufficient balance"), + DuplicateBillingCommand: spec(codes.AlreadyExists, httpStatusConflict, DuplicateBillingCommand, "billing command already processed"), + LedgerConflict: spec(codes.Aborted, httpStatusConflict, LedgerConflict, "wallet state changed, please retry"), + WalletResourceReadTransient: { + GRPCCode: codes.Unavailable, + HTTPStatus: httpStatusBadGateway, + PublicCode: string(WalletResourceReadTransient), + PublicMessage: "wallet resource data is temporarily unavailable", + Retryable: true, + }, CoinSellerNotActive: spec(codes.FailedPrecondition, httpStatusConflict, CoinSellerNotActive, "coin seller is not active"), CoinSellerStockTypeInvalid: spec(codes.InvalidArgument, httpStatusBadRequest, CoinSellerStockTypeInvalid, "invalid argument"), CoinSellerStockAmountInvalid: spec(codes.InvalidArgument, httpStatusBadRequest, CoinSellerStockAmountInvalid, "invalid argument"), diff --git a/pkg/xerr/errors.go b/pkg/xerr/errors.go index ce8706b6..e17a2ba7 100644 --- a/pkg/xerr/errors.go +++ b/pkg/xerr/errors.go @@ -95,6 +95,8 @@ const ( DuplicateBillingCommand Code = "DUPLICATE_BILLING_COMMAND" // LedgerConflict 表示账本并发写入或余额版本冲突。 LedgerConflict Code = "LEDGER_CONFLICT" + // WalletResourceReadTransient 表示钱包资源读模型遇到可安全重试的瞬时数据库冲突。 + WalletResourceReadTransient Code = "WALLET_RESOURCE_READ_TRANSIENT" // CoinSellerNotActive 表示目标用户不存在 active 币商身份。 CoinSellerNotActive Code = "COIN_SELLER_NOT_ACTIVE" // CoinSellerStockTypeInvalid 表示币商库存入账类型不属于支持范围。 diff --git a/server/admin/internal/integration/userclient/client.go b/server/admin/internal/integration/userclient/client.go index 376d255b..699118e0 100644 --- a/server/admin/internal/integration/userclient/client.go +++ b/server/admin/internal/integration/userclient/client.go @@ -217,6 +217,7 @@ type UserIdentity struct { type User struct { UserID int64 `json:"userId,string"` Status string `json:"status"` + ContentBlacklisted bool `json:"contentBlacklisted"` CreatedAtMs int64 `json:"createdAtMs"` UpdatedAtMs int64 `json:"updatedAtMs"` DisplayUserID string `json:"displayUserId"` @@ -438,6 +439,20 @@ func (c *GRPCClient) AdminUnbanUser(ctx context.Context, req *userv1.AdminUnbanU return c.client.AdminUnbanUser(ctx, req) } +// 内容黑名单仍由 user-service 持有事实;admin-server 只透传治理命令和读模型, +// 避免后台直接读取用户库后形成第二套状态判断。 +func (c *GRPCClient) ListUserContentBlacklist(ctx context.Context, req *userv1.ListUserContentBlacklistRequest) (*userv1.ListUserContentBlacklistResponse, error) { + return c.client.ListUserContentBlacklist(ctx, req) +} + +func (c *GRPCClient) AdminAddUserContentBlacklist(ctx context.Context, req *userv1.AdminAddUserContentBlacklistRequest) (*userv1.AdminAddUserContentBlacklistResponse, error) { + return c.client.AdminAddUserContentBlacklist(ctx, req) +} + +func (c *GRPCClient) AdminRemoveUserContentBlacklist(ctx context.Context, req *userv1.AdminRemoveUserContentBlacklistRequest) (*userv1.AdminRemoveUserContentBlacklistResponse, error) { + return c.client.AdminRemoveUserContentBlacklist(ctx, req) +} + func userStatusToProto(status string) userv1.UserStatus { switch status { case "active": @@ -494,6 +509,7 @@ func fromProtoUser(user *userv1.User) *User { return &User{ UserID: user.GetUserId(), Status: fromProtoStatus(user.GetStatus()), + ContentBlacklisted: user.GetContentBlacklisted(), CreatedAtMs: user.GetCreatedAtMs(), UpdatedAtMs: user.GetUpdatedAtMs(), DisplayUserID: user.GetDisplayUserId(), diff --git a/server/admin/internal/model/models.go b/server/admin/internal/model/models.go index 03eea75f..7fb5f5e1 100644 --- a/server/admin/internal/model/models.go +++ b/server/admin/internal/model/models.go @@ -454,13 +454,17 @@ type HostAgencySalaryPolicy struct { // SettlementTriggerMode 区分自动任务与后台人工结算;手动政策发布后仍可被查询,但不会被 cron 自动发薪。 SettlementTriggerMode string `gorm:"column:settlement_trigger_mode;size:24;not null;default:automatic" json:"settlementTriggerMode"` // 比例字段使用 decimal 字符串承载,避免金币、钻石、美元换算出现 float 精度误差。 - GiftCoinToDiamondRatio string `gorm:"column:gift_coin_to_diamond_ratio;type:decimal(18,6);not null;default:1.000000" json:"giftCoinToDiamondRatio"` - PointDiamondsPerUSD int64 `gorm:"column:point_diamonds_per_usd;not null;default:0" json:"pointDiamondsPerUsd"` - CoinsPerUSD int64 `gorm:"column:coins_per_usd;not null;default:0" json:"coinsPerUsd"` - MinimumWithdrawUSDMinor int64 `gorm:"column:minimum_withdraw_usd_minor;not null;default:0" json:"minimumWithdrawUsdMinor"` - WithdrawFeeBPS int32 `gorm:"column:withdraw_fee_bps;not null;default:0" json:"withdrawFeeBps"` - AgencyPointShareBPS int32 `gorm:"column:agency_point_share_bps;not null;default:0" json:"agencyPointShareBps"` - ResidualDiamondToUSDRate string `gorm:"column:residual_diamond_to_usd_rate;type:decimal(24,12);not null;default:0.000000000000" json:"residualDiamondToUsdRate"` + GiftCoinToDiamondRatio string `gorm:"column:gift_coin_to_diamond_ratio;type:decimal(18,6);not null;default:1.000000" json:"giftCoinToDiamondRatio"` + PointDiamondsPerUSD int64 `gorm:"column:point_diamonds_per_usd;not null;default:0" json:"pointDiamondsPerUsd"` + CoinsPerUSD int64 `gorm:"column:coins_per_usd;not null;default:0" json:"coinsPerUsd"` + // MinimumWithdrawUSDMinor 保留为旧客户端平台门槛别名;新配置和运行校验必须使用下面两个渠道字段。 + MinimumWithdrawUSDMinor int64 `gorm:"column:minimum_withdraw_usd_minor;not null;default:0" json:"minimumWithdrawUsdMinor"` + CoinSellerMinimumWithdrawUSDMinor int64 `gorm:"column:coin_seller_minimum_withdraw_usd_minor;not null;default:0" json:"coinSellerMinimumWithdrawUsdMinor"` + PlatformMinimumWithdrawUSDMinor int64 `gorm:"column:platform_minimum_withdraw_usd_minor;not null;default:0" json:"platformMinimumWithdrawUsdMinor"` + DiamondExchangeEnabled bool `gorm:"column:diamond_exchange_enabled;not null;default:true" json:"diamondExchangeEnabled"` + WithdrawFeeBPS int32 `gorm:"column:withdraw_fee_bps;not null;default:0" json:"withdrawFeeBps"` + AgencyPointShareBPS int32 `gorm:"column:agency_point_share_bps;not null;default:0" json:"agencyPointShareBps"` + ResidualDiamondToUSDRate string `gorm:"column:residual_diamond_to_usd_rate;type:decimal(24,12);not null;default:0.000000000000" json:"residualDiamondToUsdRate"` // 提现次数限制随月度政策形成不可变快照;count=0 表示不限,period 只允许 day/week/month。 CoinSellerWithdrawalLimitPeriod string `gorm:"column:coin_seller_withdrawal_limit_period;size:16;not null;default:month" json:"coinSellerWithdrawalLimitPeriod"` CoinSellerWithdrawalLimitCount int64 `gorm:"column:coin_seller_withdrawal_limit_count;not null;default:0" json:"coinSellerWithdrawalLimitCount"` diff --git a/server/admin/internal/modules/appuser/content_blacklist.go b/server/admin/internal/modules/appuser/content_blacklist.go new file mode 100644 index 00000000..50bcb27a --- /dev/null +++ b/server/admin/internal/modules/appuser/content_blacklist.go @@ -0,0 +1,209 @@ +package appuser + +import ( + "context" + "fmt" + "strconv" + "strings" + "time" + + "hyapp-admin-server/internal/appctx" + "hyapp-admin-server/internal/integration/userclient" + userv1 "hyapp.local/api/proto/user/v1" +) + +const maxContentBlacklistIdentifierRunes = 64 + +// AppUserContentBlacklistEntry 是管理端当前态读模型。 +// userId 始终按字符串输出,避免 19 位 Snowflake ID 穿过 JavaScript Number 后失真。 +type AppUserContentBlacklistEntry struct { + Target AppUserBrief `json:"target"` + UserStatus string `json:"userStatus"` + OperatorAdminID string `json:"operatorAdminId"` + Reason string `json:"reason"` + CreatedAtMs int64 `json:"createdAtMs"` + UpdatedAtMs int64 `json:"updatedAtMs"` +} + +type AppUserContentBlacklistCandidate struct { + Target AppUserBrief `json:"target"` + UserStatus string `json:"userStatus"` + Blacklisted bool `json:"blacklisted"` +} + +type contentBlacklistMutationRequest struct { + UserIdentifier string `json:"user_id"` + Reason string `json:"reason"` +} + +// ListUserContentBlacklist 通过 owner service 分页读取,不允许 admin 用直连 userDB 的方式复制治理事实。 +func (s *Service) ListUserContentBlacklist(ctx context.Context, page int, pageSize int, requestID string) ([]AppUserContentBlacklistEntry, int64, error) { + if s.contentBlacklistClient == nil { + return nil, 0, fmt.Errorf("user content blacklist client is not configured") + } + if page < 1 { + page = 1 + } + if pageSize <= 0 { + pageSize = 50 + } + if pageSize > 200 { + pageSize = 200 + } + response, err := s.contentBlacklistClient.ListUserContentBlacklist(ctx, &userv1.ListUserContentBlacklistRequest{ + Meta: contentBlacklistRequestMeta(ctx, requestID), + Page: int32(page), + PageSize: int32(pageSize), + }) + if err != nil { + return nil, 0, err + } + items := make([]AppUserContentBlacklistEntry, 0, len(response.GetItems())) + for _, item := range response.GetItems() { + if item == nil { + continue + } + items = append(items, appUserContentBlacklistEntryFromProto(item)) + } + return items, response.GetTotal(), nil +} + +// ResolveUserContentBlacklistCandidate 复用 user-service 的后台通用 ID 解析: +// 永久默认短号、当前有效展示号、靓号和内部长 user_id 都收敛到同一个真实 user_id。 +func (s *Service) ResolveUserContentBlacklistCandidate(ctx context.Context, identifier string, requestID string) (AppUserContentBlacklistCandidate, error) { + identifier = strings.TrimSpace(identifier) + if identifier == "" || len([]rune(identifier)) > maxContentBlacklistIdentifierRunes { + return AppUserContentBlacklistCandidate{}, fmt.Errorf("%w: 用户 ID 参数不正确", ErrInvalidArgument) + } + if s.contentBlacklistClient == nil { + return AppUserContentBlacklistCandidate{}, fmt.Errorf("user content blacklist client is not configured") + } + identity, err := s.contentBlacklistClient.ResolveAdminUserIdentifier(ctx, userclient.ResolveAdminUserIdentifierRequest{ + RequestID: requestID, + Caller: "hyapp-admin-server", + UserIdentifier: identifier, + }) + if err != nil { + return AppUserContentBlacklistCandidate{}, err + } + if identity == nil || identity.UserID <= 0 { + return AppUserContentBlacklistCandidate{}, ErrNotFound + } + user, err := s.userClient.GetUser(ctx, userclient.GetUserRequest{ + RequestID: requestID, + Caller: "hyapp-admin-server", + UserID: identity.UserID, + }) + if err != nil { + return AppUserContentBlacklistCandidate{}, err + } + if user == nil { + return AppUserContentBlacklistCandidate{}, ErrNotFound + } + return AppUserContentBlacklistCandidate{ + Target: AppUserBrief{ + UserID: strconv.FormatInt(user.UserID, 10), + DisplayUserID: user.DisplayUserID, + Username: user.Username, + Avatar: user.Avatar, + }, + UserStatus: user.Status, + Blacklisted: user.ContentBlacklisted, + }, nil +} + +// AddUserContentBlacklist 先用通用 ID 契约解析真实用户,再仅把真实 user_id 发送给治理 RPC。 +// 这样前端输入的短号即使以后过期,也不会成为黑名单持久键。 +func (s *Service) AddUserContentBlacklist(ctx context.Context, identifier string, operatorAdminID int64, reason string, requestID string) (AppUserContentBlacklistEntry, error) { + if operatorAdminID <= 0 { + return AppUserContentBlacklistEntry{}, fmt.Errorf("%w: 操作管理员参数不正确", ErrInvalidArgument) + } + candidate, err := s.ResolveUserContentBlacklistCandidate(ctx, identifier, requestID) + if err != nil { + return AppUserContentBlacklistEntry{}, err + } + userID, err := strconv.ParseInt(candidate.Target.UserID, 10, 64) + if err != nil || userID <= 0 { + return AppUserContentBlacklistEntry{}, fmt.Errorf("%w: 用户 ID 参数不正确", ErrInvalidArgument) + } + reason = strings.TrimSpace(reason) + if reason == "" { + reason = "admin_content_blacklist" + } + response, err := s.contentBlacklistClient.AdminAddUserContentBlacklist(ctx, &userv1.AdminAddUserContentBlacklistRequest{ + Meta: contentBlacklistRequestMeta(ctx, requestID), + UserId: userID, + OperatorAdminId: operatorAdminID, + Reason: reason, + }) + if err != nil { + return AppUserContentBlacklistEntry{}, err + } + if response.GetItem() == nil { + return AppUserContentBlacklistEntry{}, fmt.Errorf("user-service returned empty content blacklist entry") + } + return appUserContentBlacklistEntryFromProto(response.GetItem()), nil +} + +// RemoveUserContentBlacklist 以内部真实 user_id 移除当前态;重复移除由 owner service 返回 removed=false, +// handler 仍按幂等成功处理,避免管理员因网络重试得到伪失败。 +func (s *Service) RemoveUserContentBlacklist(ctx context.Context, userID int64, operatorAdminID int64, reason string, requestID string) (bool, error) { + if s.contentBlacklistClient == nil { + return false, fmt.Errorf("user content blacklist client is not configured") + } + if userID <= 0 || operatorAdminID <= 0 { + return false, fmt.Errorf("%w: 黑名单移除参数不正确", ErrInvalidArgument) + } + reason = strings.TrimSpace(reason) + if reason == "" { + reason = "admin_remove_content_blacklist" + } + response, err := s.contentBlacklistClient.AdminRemoveUserContentBlacklist(ctx, &userv1.AdminRemoveUserContentBlacklistRequest{ + Meta: contentBlacklistRequestMeta(ctx, requestID), + UserId: userID, + OperatorAdminId: operatorAdminID, + Reason: reason, + }) + if err != nil { + return false, err + } + return response.GetRemoved(), nil +} + +func contentBlacklistRequestMeta(ctx context.Context, requestID string) *userv1.RequestMeta { + return &userv1.RequestMeta{ + RequestId: strings.TrimSpace(requestID), + Caller: "hyapp-admin-server", + SentAtMs: time.Now().UTC().UnixMilli(), + AppCode: appctx.FromContext(ctx), + } +} + +func appUserContentBlacklistEntryFromProto(item *userv1.UserContentBlacklistEntry) AppUserContentBlacklistEntry { + return AppUserContentBlacklistEntry{ + Target: AppUserBrief{ + UserID: strconv.FormatInt(item.GetUserId(), 10), + DisplayUserID: item.GetDisplayUserId(), + Username: item.GetUsername(), + Avatar: item.GetAvatar(), + }, + UserStatus: contentBlacklistUserStatus(item.GetUserStatus()), + OperatorAdminID: strconv.FormatInt(item.GetOperatorAdminId(), 10), + Reason: item.GetReason(), + CreatedAtMs: item.GetCreatedAtMs(), + UpdatedAtMs: item.GetUpdatedAtMs(), + } +} + +func contentBlacklistUserStatus(status userv1.UserStatus) string { + switch status { + case userv1.UserStatus_USER_STATUS_ACTIVE: + return "active" + case userv1.UserStatus_USER_STATUS_DISABLED: + return "disabled" + case userv1.UserStatus_USER_STATUS_BANNED: + return "banned" + default: + return "" + } +} diff --git a/server/admin/internal/modules/appuser/handler.go b/server/admin/internal/modules/appuser/handler.go index 3a11c647..471c37e4 100644 --- a/server/admin/internal/modules/appuser/handler.go +++ b/server/admin/internal/modules/appuser/handler.go @@ -76,6 +76,83 @@ func (h *Handler) ListBannedUsers(c *gin.Context) { response.OK(c, response.Page{Items: items, Page: query.Page, PageSize: query.PageSize, Total: total}) } +func (h *Handler) ListUserContentBlacklist(c *gin.Context) { + options := shared.ListOptions(c) + items, total, err := h.service.ListUserContentBlacklist( + c.Request.Context(), + options.Page, + options.PageSize, + middleware.CurrentRequestID(c), + ) + if err != nil { + writeReadError(c, err, "获取黑名单屏蔽用户失败") + return + } + response.OK(c, response.Page{Items: items, Page: options.Page, PageSize: options.PageSize, Total: total}) +} + +func (h *Handler) ResolveUserContentBlacklistCandidate(c *gin.Context) { + identifier := firstQuery(c, "user_id", "userId", "identifier") + candidate, err := h.service.ResolveUserContentBlacklistCandidate(c.Request.Context(), identifier, middleware.CurrentRequestID(c)) + if err != nil { + // 搜索输入和未找到都需要给管理员可操作的反馈;gRPC 业务错误按原状态映射。 + writeMutationError(c, err, "搜索 App 用户失败") + return + } + response.OK(c, candidate) +} + +func (h *Handler) AddUserContentBlacklist(c *gin.Context) { + var req contentBlacklistMutationRequest + if err := c.ShouldBindJSON(&req); err != nil { + response.BadRequest(c, "黑名单用户参数不正确") + return + } + item, err := h.service.AddUserContentBlacklist( + c.Request.Context(), + req.UserIdentifier, + int64(middleware.CurrentUserID(c)), + req.Reason, + middleware.CurrentRequestID(c), + ) + if err != nil { + writeMutationError(c, err, "添加黑名单屏蔽用户失败") + return + } + userID, _ := strconv.ParseInt(item.Target.UserID, 10, 64) + writeAppUserAuditLog(c, h.audit, "add-user-content-blacklist", "user_content_blacklist", userID, "success", strings.TrimSpace(item.Reason)) + response.OK(c, item) +} + +func (h *Handler) RemoveUserContentBlacklist(c *gin.Context) { + userID, ok := parseInt64ID(c, "id") + if !ok { + return + } + var req contentBlacklistMutationRequest + if err := c.ShouldBindJSON(&req); err != nil && !errors.Is(err, io.EOF) { + response.BadRequest(c, "移除黑名单参数不正确") + return + } + reason := strings.TrimSpace(req.Reason) + if reason == "" { + reason = "admin_remove_content_blacklist" + } + removed, err := h.service.RemoveUserContentBlacklist( + c.Request.Context(), + userID, + int64(middleware.CurrentUserID(c)), + reason, + middleware.CurrentRequestID(c), + ) + if err != nil { + writeMutationError(c, err, "移除黑名单屏蔽用户失败") + return + } + writeAppUserAuditLog(c, h.audit, "remove-user-content-blacklist", "user_content_blacklist", userID, "success", reason) + response.OK(c, gin.H{"removed": removed}) +} + func (h *Handler) ListUserLoginLogs(c *gin.Context) { userID, ok := parseInt64ID(c, "id") if !ok { diff --git a/server/admin/internal/modules/appuser/routes.go b/server/admin/internal/modules/appuser/routes.go index a5caf42b..d82e0d63 100644 --- a/server/admin/internal/modules/appuser/routes.go +++ b/server/admin/internal/modules/appuser/routes.go @@ -15,6 +15,10 @@ func RegisterRoutes(protected *gin.RouterGroup, h *Handler) { protected.POST("/exports/app-users", middleware.RequirePermission("app-user:export"), h.CreateExport) protected.GET("/app/users/bans", middleware.RequirePermission("app-user:view"), h.ListBannedUsers) protected.GET("/app/users/login-logs", middleware.RequirePermission("app-user:view"), h.ListLoginLogs) + protected.GET("/app/users/content-blacklist", middleware.RequirePermission("app-user:view"), h.ListUserContentBlacklist) + protected.GET("/app/users/content-blacklist/candidate", middleware.RequirePermission("app-user:view"), h.ResolveUserContentBlacklistCandidate) + protected.POST("/app/users/content-blacklist", middleware.RequirePermission("app-user:status"), h.AddUserContentBlacklist) + protected.DELETE("/app/users/content-blacklist/:id", middleware.RequirePermission("app-user:status"), h.RemoveUserContentBlacklist) protected.GET("/app/users/:id/login-logs", middleware.RequirePermission("app-user:view"), h.ListUserLoginLogs) protected.GET("/app/users/:id", middleware.RequirePermission("app-user:view"), h.GetUser) protected.PATCH("/app/users/:id", middleware.RequirePermission("app-user:update"), h.UpdateUser) diff --git a/server/admin/internal/modules/appuser/service.go b/server/admin/internal/modules/appuser/service.go index 25fb79f2..65efce25 100644 --- a/server/admin/internal/modules/appuser/service.go +++ b/server/admin/internal/modules/appuser/service.go @@ -31,6 +31,8 @@ var ( type Service struct { userClient userclient.Client userAdminClient userAdminProjectionClient + // contentBlacklistClient 只开放 user-service 的内容屏蔽治理契约;admin 不直连用户库维护第二份状态。 + contentBlacklistClient userContentBlacklistAdminClient // tokenIssuerClient 只在 gRPC client 具备后台重签 token 能力时非 nil。 tokenIssuerClient accessTokenIssuerClient activityClient activityclient.Client @@ -55,6 +57,14 @@ type userAdminProjectionClient interface { AdminUnbanUser(context.Context, *userv1.AdminUnbanUserRequest) (*userv1.AdminUnbanUserResponse, error) } +// userContentBlacklistAdminClient 与通用 Client 分离,避免既有模块和测试替身被迫获得后台治理写能力。 +type userContentBlacklistAdminClient interface { + ResolveAdminUserIdentifier(context.Context, userclient.ResolveAdminUserIdentifierRequest) (*userclient.UserIdentity, error) + ListUserContentBlacklist(context.Context, *userv1.ListUserContentBlacklistRequest) (*userv1.ListUserContentBlacklistResponse, error) + AdminAddUserContentBlacklist(context.Context, *userv1.AdminAddUserContentBlacklistRequest) (*userv1.AdminAddUserContentBlacklistResponse, error) + AdminRemoveUserContentBlacklist(context.Context, *userv1.AdminRemoveUserContentBlacklistRequest) (*userv1.AdminRemoveUserContentBlacklistResponse, error) +} + // levelAdminProjectionClient 只允许后台读 overlay 和一次原子调整,游戏等级没有写入口。 type levelAdminProjectionClient interface { BatchGetUserLevelAdminProfiles(context.Context, *activityv1.BatchGetUserLevelAdminProfilesRequest) (*activityv1.BatchGetUserLevelAdminProfilesResponse, error) @@ -223,6 +233,9 @@ func NewService(userClient userclient.Client, activityClient activityclient.Clie if adminClient, ok := any(userClient).(userAdminProjectionClient); ok { service.userAdminClient = adminClient } + if blacklistClient, ok := any(userClient).(userContentBlacklistAdminClient); ok { + service.contentBlacklistClient = blacklistClient + } if tokenClient, ok := any(userClient).(accessTokenIssuerClient); ok { service.tokenIssuerClient = tokenClient } diff --git a/server/admin/internal/modules/hostagencypolicy/request.go b/server/admin/internal/modules/hostagencypolicy/request.go index 9052c848..81daff74 100644 --- a/server/admin/internal/modules/hostagencypolicy/request.go +++ b/server/admin/internal/modules/hostagencypolicy/request.go @@ -1,28 +1,32 @@ package hostagencypolicy type policyRequest struct { - Name string `json:"name"` - PolicyType string `json:"policy_type"` - RegionID int64 `json:"region_id"` - RegionIDs []int64 `json:"region_ids"` - CycleKey string `json:"cycle_key"` - Status string `json:"status"` - SettlementMode string `json:"settlement_mode"` - SettlementTriggerMode string `json:"settlement_trigger_mode"` - GiftCoinToDiamondRatio string `json:"gift_coin_to_diamond_ratio"` - PointDiamondsPerUSD int64 `json:"point_diamonds_per_usd"` - CoinsPerUSD int64 `json:"coins_per_usd"` - MinimumWithdrawUSDMinor int64 `json:"minimum_withdraw_usd_minor"` - WithdrawFeeBPS int32 `json:"withdraw_fee_bps"` - AgencyPointShareBPS int32 `json:"agency_point_share_bps"` - ResidualDiamondToUSDRate string `json:"residual_diamond_to_usd_rate"` - CoinSellerWithdrawalLimitPeriod string `json:"coin_seller_withdrawal_limit_period"` - CoinSellerWithdrawalLimitCount int64 `json:"coin_seller_withdrawal_limit_count"` - PlatformWithdrawalLimitPeriod string `json:"platform_withdrawal_limit_period"` - PlatformWithdrawalLimitCount int64 `json:"platform_withdrawal_limit_count"` - PlatformWithdrawalAllowedDays []int32 `json:"platform_withdrawal_allowed_days"` - Description string `json:"description"` - Levels []levelRequest `json:"levels"` + Name string `json:"name"` + PolicyType string `json:"policy_type"` + RegionID int64 `json:"region_id"` + RegionIDs []int64 `json:"region_ids"` + CycleKey string `json:"cycle_key"` + Status string `json:"status"` + SettlementMode string `json:"settlement_mode"` + SettlementTriggerMode string `json:"settlement_trigger_mode"` + GiftCoinToDiamondRatio string `json:"gift_coin_to_diamond_ratio"` + PointDiamondsPerUSD int64 `json:"point_diamonds_per_usd"` + CoinsPerUSD int64 `json:"coins_per_usd"` + // MinimumWithdrawUSDMinor 只兼容旧后台;新后台必须分别提交两个渠道金额。 + MinimumWithdrawUSDMinor int64 `json:"minimum_withdraw_usd_minor"` + CoinSellerMinimumWithdrawUSDMinor int64 `json:"coin_seller_minimum_withdraw_usd_minor"` + PlatformMinimumWithdrawUSDMinor int64 `json:"platform_minimum_withdraw_usd_minor"` + DiamondExchangeEnabled *bool `json:"diamond_exchange_enabled"` + WithdrawFeeBPS int32 `json:"withdraw_fee_bps"` + AgencyPointShareBPS int32 `json:"agency_point_share_bps"` + ResidualDiamondToUSDRate string `json:"residual_diamond_to_usd_rate"` + CoinSellerWithdrawalLimitPeriod string `json:"coin_seller_withdrawal_limit_period"` + CoinSellerWithdrawalLimitCount int64 `json:"coin_seller_withdrawal_limit_count"` + PlatformWithdrawalLimitPeriod string `json:"platform_withdrawal_limit_period"` + PlatformWithdrawalLimitCount int64 `json:"platform_withdrawal_limit_count"` + PlatformWithdrawalAllowedDays []int32 `json:"platform_withdrawal_allowed_days"` + Description string `json:"description"` + Levels []levelRequest `json:"levels"` } type levelRequest struct { diff --git a/server/admin/internal/modules/hostagencypolicy/response.go b/server/admin/internal/modules/hostagencypolicy/response.go index a3b034e1..c06e355a 100644 --- a/server/admin/internal/modules/hostagencypolicy/response.go +++ b/server/admin/internal/modules/hostagencypolicy/response.go @@ -7,42 +7,45 @@ import ( ) type policyDTO struct { - ID uint `json:"id"` - AppCode string `json:"app_code"` - Name string `json:"name"` - PolicyType string `json:"policy_type"` - RegionID int64 `json:"region_id"` - RegionIDs []int64 `json:"region_ids"` - CycleKey string `json:"cycle_key"` - PolicyVersion uint64 `json:"policy_version"` - Status string `json:"status"` - SettlementMode string `json:"settlement_mode"` - SettlementTriggerMode string `json:"settlement_trigger_mode"` - GiftCoinToDiamondRatio string `json:"gift_coin_to_diamond_ratio"` - PointDiamondsPerUSD int64 `json:"point_diamonds_per_usd"` - CoinsPerUSD int64 `json:"coins_per_usd"` - MinimumWithdrawUSDMinor int64 `json:"minimum_withdraw_usd_minor"` - WithdrawFeeBPS int32 `json:"withdraw_fee_bps"` - AgencyPointShareBPS int32 `json:"agency_point_share_bps"` - ResidualDiamondToUSDRate string `json:"residual_diamond_to_usd_rate"` - CoinSellerWithdrawalLimitPeriod string `json:"coin_seller_withdrawal_limit_period"` - CoinSellerWithdrawalLimitCount int64 `json:"coin_seller_withdrawal_limit_count"` - PlatformWithdrawalLimitPeriod string `json:"platform_withdrawal_limit_period"` - PlatformWithdrawalLimitCount int64 `json:"platform_withdrawal_limit_count"` - PlatformWithdrawalAllowedDays []int32 `json:"platform_withdrawal_allowed_days"` - Description string `json:"description"` - CreatedByAdminID uint `json:"created_by_admin_id"` - UpdatedByAdminID uint `json:"updated_by_admin_id"` - PublishStatus string `json:"publish_status"` - PublishError string `json:"publish_error"` - PublishedAtMS int64 `json:"published_at_ms"` - PublishedByAdminID uint `json:"published_by_admin_id"` - CopiedFromPolicyID uint `json:"copied_from_policy_id"` - CopiedFromCycleKey string `json:"copied_from_cycle_key"` - Inherited bool `json:"inherited"` - CreatedAtMS int64 `json:"created_at_ms"` - UpdatedAtMS int64 `json:"updated_at_ms"` - Levels []levelDTO `json:"levels"` + ID uint `json:"id"` + AppCode string `json:"app_code"` + Name string `json:"name"` + PolicyType string `json:"policy_type"` + RegionID int64 `json:"region_id"` + RegionIDs []int64 `json:"region_ids"` + CycleKey string `json:"cycle_key"` + PolicyVersion uint64 `json:"policy_version"` + Status string `json:"status"` + SettlementMode string `json:"settlement_mode"` + SettlementTriggerMode string `json:"settlement_trigger_mode"` + GiftCoinToDiamondRatio string `json:"gift_coin_to_diamond_ratio"` + PointDiamondsPerUSD int64 `json:"point_diamonds_per_usd"` + CoinsPerUSD int64 `json:"coins_per_usd"` + MinimumWithdrawUSDMinor int64 `json:"minimum_withdraw_usd_minor"` + CoinSellerMinimumWithdrawUSDMinor int64 `json:"coin_seller_minimum_withdraw_usd_minor"` + PlatformMinimumWithdrawUSDMinor int64 `json:"platform_minimum_withdraw_usd_minor"` + DiamondExchangeEnabled bool `json:"diamond_exchange_enabled"` + WithdrawFeeBPS int32 `json:"withdraw_fee_bps"` + AgencyPointShareBPS int32 `json:"agency_point_share_bps"` + ResidualDiamondToUSDRate string `json:"residual_diamond_to_usd_rate"` + CoinSellerWithdrawalLimitPeriod string `json:"coin_seller_withdrawal_limit_period"` + CoinSellerWithdrawalLimitCount int64 `json:"coin_seller_withdrawal_limit_count"` + PlatformWithdrawalLimitPeriod string `json:"platform_withdrawal_limit_period"` + PlatformWithdrawalLimitCount int64 `json:"platform_withdrawal_limit_count"` + PlatformWithdrawalAllowedDays []int32 `json:"platform_withdrawal_allowed_days"` + Description string `json:"description"` + CreatedByAdminID uint `json:"created_by_admin_id"` + UpdatedByAdminID uint `json:"updated_by_admin_id"` + PublishStatus string `json:"publish_status"` + PublishError string `json:"publish_error"` + PublishedAtMS int64 `json:"published_at_ms"` + PublishedByAdminID uint `json:"published_by_admin_id"` + CopiedFromPolicyID uint `json:"copied_from_policy_id"` + CopiedFromCycleKey string `json:"copied_from_cycle_key"` + Inherited bool `json:"inherited"` + CreatedAtMS int64 `json:"created_at_ms"` + UpdatedAtMS int64 `json:"updated_at_ms"` + Levels []levelDTO `json:"levels"` } type levelDTO struct { @@ -61,48 +64,53 @@ type levelDTO struct { } func policyFromModel(item model.HostAgencySalaryPolicy) policyDTO { + coinSellerMinimum, platformMinimum := resolvedPolicyWithdrawalMinimums(item) levels := make([]levelDTO, 0, len(item.Levels)) for _, level := range item.Levels { levels = append(levels, levelFromModel(level)) } // 响应层只做展示友好的格式化:数据库 decimal 保留固定精度,接口去掉无意义尾零。 return policyDTO{ - ID: item.ID, - AppCode: item.AppCode, - Name: item.Name, - PolicyType: normalizePolicyType(item.PolicyType), - RegionID: item.RegionID, - RegionIDs: responseRegionIDs(item), - CycleKey: item.CycleKey, - PolicyVersion: item.PolicyVersion, - Status: item.Status, - SettlementMode: item.SettlementMode, - SettlementTriggerMode: firstNonBlank(item.SettlementTriggerMode, settlementTriggerAutomatic), - GiftCoinToDiamondRatio: trimDecimalZeros(item.GiftCoinToDiamondRatio), - PointDiamondsPerUSD: item.PointDiamondsPerUSD, - CoinsPerUSD: item.CoinsPerUSD, - MinimumWithdrawUSDMinor: item.MinimumWithdrawUSDMinor, - WithdrawFeeBPS: item.WithdrawFeeBPS, - AgencyPointShareBPS: item.AgencyPointShareBPS, - ResidualDiamondToUSDRate: trimDecimalZeros(item.ResidualDiamondToUSDRate), - CoinSellerWithdrawalLimitPeriod: firstNonBlank(item.CoinSellerWithdrawalLimitPeriod, withdrawalLimitPeriodMonth), - CoinSellerWithdrawalLimitCount: item.CoinSellerWithdrawalLimitCount, - PlatformWithdrawalLimitPeriod: firstNonBlank(item.PlatformWithdrawalLimitPeriod, withdrawalLimitPeriodMonth), - PlatformWithdrawalLimitCount: item.PlatformWithdrawalLimitCount, - PlatformWithdrawalAllowedDays: parseWithdrawalDays(item.PlatformWithdrawalAllowedDays), - Description: item.Description, - CreatedByAdminID: item.CreatedByAdminID, - UpdatedByAdminID: item.UpdatedByAdminID, - PublishStatus: firstNonBlank(item.PublishStatus, publishStatusDraft), - PublishError: item.PublishError, - PublishedAtMS: item.PublishedAtMS, - PublishedByAdminID: item.PublishedByAdminID, - CopiedFromPolicyID: item.CopiedFromPolicyID, - CopiedFromCycleKey: item.CopiedFromCycleKey, - Inherited: item.CopiedFromPolicyID > 0 && item.CopiedFromCycleKey != "", - CreatedAtMS: item.CreatedAtMS, - UpdatedAtMS: item.UpdatedAtMS, - Levels: levels, + ID: item.ID, + AppCode: item.AppCode, + Name: item.Name, + PolicyType: normalizePolicyType(item.PolicyType), + RegionID: item.RegionID, + RegionIDs: responseRegionIDs(item), + CycleKey: item.CycleKey, + PolicyVersion: item.PolicyVersion, + Status: item.Status, + SettlementMode: item.SettlementMode, + SettlementTriggerMode: firstNonBlank(item.SettlementTriggerMode, settlementTriggerAutomatic), + GiftCoinToDiamondRatio: trimDecimalZeros(item.GiftCoinToDiamondRatio), + PointDiamondsPerUSD: item.PointDiamondsPerUSD, + CoinsPerUSD: item.CoinsPerUSD, + // 旧字段继续返回平台提现门槛,旧客户端不会因拆分字段而改变原展示和提交口径。 + MinimumWithdrawUSDMinor: platformMinimum, + CoinSellerMinimumWithdrawUSDMinor: coinSellerMinimum, + PlatformMinimumWithdrawUSDMinor: platformMinimum, + DiamondExchangeEnabled: item.DiamondExchangeEnabled, + WithdrawFeeBPS: item.WithdrawFeeBPS, + AgencyPointShareBPS: item.AgencyPointShareBPS, + ResidualDiamondToUSDRate: trimDecimalZeros(item.ResidualDiamondToUSDRate), + CoinSellerWithdrawalLimitPeriod: firstNonBlank(item.CoinSellerWithdrawalLimitPeriod, withdrawalLimitPeriodMonth), + CoinSellerWithdrawalLimitCount: item.CoinSellerWithdrawalLimitCount, + PlatformWithdrawalLimitPeriod: firstNonBlank(item.PlatformWithdrawalLimitPeriod, withdrawalLimitPeriodMonth), + PlatformWithdrawalLimitCount: item.PlatformWithdrawalLimitCount, + PlatformWithdrawalAllowedDays: parseWithdrawalDays(item.PlatformWithdrawalAllowedDays), + Description: item.Description, + CreatedByAdminID: item.CreatedByAdminID, + UpdatedByAdminID: item.UpdatedByAdminID, + PublishStatus: firstNonBlank(item.PublishStatus, publishStatusDraft), + PublishError: item.PublishError, + PublishedAtMS: item.PublishedAtMS, + PublishedByAdminID: item.PublishedByAdminID, + CopiedFromPolicyID: item.CopiedFromPolicyID, + CopiedFromCycleKey: item.CopiedFromCycleKey, + Inherited: item.CopiedFromPolicyID > 0 && item.CopiedFromCycleKey != "", + CreatedAtMS: item.CreatedAtMS, + UpdatedAtMS: item.UpdatedAtMS, + Levels: levels, } } diff --git a/server/admin/internal/modules/hostagencypolicy/service.go b/server/admin/internal/modules/hostagencypolicy/service.go index 42acbbdf..7170cd0f 100644 --- a/server/admin/internal/modules/hostagencypolicy/service.go +++ b/server/admin/internal/modules/hostagencypolicy/service.go @@ -211,6 +211,10 @@ func (s *Service) Update(ctx context.Context, appCode string, actorID uint, id u // Update DTO 的 policy_type 可选;旧前端没有该字段时必须保留草稿原类型,不能按创建默认值覆盖为工资型。 req.PolicyType = policyTypeForUpdate(req.PolicyType, item.PolicyType) } + if req.DiamondExchangeEnabled == nil { + // PUT 仍兼容尚未提交新开关的旧后台:更新已关闭的政策时保留原值,不能因字段缺失自动重新开启。 + req.DiamondExchangeEnabled = boolPointer(item.DiamondExchangeEnabled) + } // 请求体重新走创建同一套校验,编辑和新增保持完全一致的字段约束。 updated, err := policyModelFromRequest(item.AppCode, actorID, req) if err != nil { @@ -235,6 +239,9 @@ func (s *Service) Update(ctx context.Context, appCode string, actorID uint, id u item.PointDiamondsPerUSD = updated.PointDiamondsPerUSD item.CoinsPerUSD = updated.CoinsPerUSD item.MinimumWithdrawUSDMinor = updated.MinimumWithdrawUSDMinor + item.CoinSellerMinimumWithdrawUSDMinor = updated.CoinSellerMinimumWithdrawUSDMinor + item.PlatformMinimumWithdrawUSDMinor = updated.PlatformMinimumWithdrawUSDMinor + item.DiamondExchangeEnabled = updated.DiamondExchangeEnabled item.WithdrawFeeBPS = updated.WithdrawFeeBPS item.AgencyPointShareBPS = updated.AgencyPointShareBPS item.ResidualDiamondToUSDRate = updated.ResidualDiamondToUSDRate @@ -443,26 +450,29 @@ func (s *Service) publishRuntimePolicy(ctx context.Context, item model.HostAgenc } type runtimeHostSalaryPolicySnapshot struct { - CycleKey string - PolicyVersion uint64 - Name string - PolicyType string - RegionID int64 - Status string - SettlementMode string - SettlementTriggerMode string - GiftCoinToDiamondRatio string - PointDiamondsPerUSD int64 - CoinsPerUSD int64 - MinimumWithdrawUSDMinor int64 - WithdrawFeeBPS int32 - AgencyPointShareBPS int32 - ResidualDiamondToUSDRate string - CoinSellerWithdrawalLimitPeriod string - CoinSellerWithdrawalLimitCount int64 - PlatformWithdrawalLimitPeriod string - PlatformWithdrawalLimitCount int64 - PlatformWithdrawalAllowedDays string + CycleKey string + PolicyVersion uint64 + Name string + PolicyType string + RegionID int64 + Status string + SettlementMode string + SettlementTriggerMode string + GiftCoinToDiamondRatio string + PointDiamondsPerUSD int64 + CoinsPerUSD int64 + MinimumWithdrawUSDMinor int64 + CoinSellerMinimumWithdrawUSDMinor int64 + PlatformMinimumWithdrawUSDMinor int64 + DiamondExchangeEnabled bool + WithdrawFeeBPS int32 + AgencyPointShareBPS int32 + ResidualDiamondToUSDRate string + CoinSellerWithdrawalLimitPeriod string + CoinSellerWithdrawalLimitCount int64 + PlatformWithdrawalLimitPeriod string + PlatformWithdrawalLimitCount int64 + PlatformWithdrawalAllowedDays string } type runtimeHostSalaryLevelSnapshot struct { @@ -476,21 +486,25 @@ type runtimeHostSalaryLevelSnapshot struct { } func ensureRuntimeHostSalaryPolicySnapshot(ctx context.Context, tx *sql.Tx, item model.HostAgencySalaryPolicy, policyVersion uint64, publishedAtMS int64) error { + coinSellerMinimum, platformMinimum := resolvedPolicyWithdrawalMinimums(item) // 先以完整快照尝试原子占位;复合主键包含 policy_version,已存在时只做自赋值,绝不改写业务字段。 // 两个首次发布请求会在同一主键写锁上排队,避免“都 SELECT 到不存在,再 INSERT”形成 gap-lock 死锁。 if _, err := tx.ExecContext(ctx, ` INSERT INTO host_agency_salary_policies ( app_code, policy_id, cycle_key, policy_version, name, policy_type, region_id, status, settlement_mode, settlement_trigger_mode, - gift_coin_to_diamond_ratio, point_diamonds_per_usd, coins_per_usd, minimum_withdraw_usd_minor, withdraw_fee_bps, agency_point_share_bps, + gift_coin_to_diamond_ratio, point_diamonds_per_usd, coins_per_usd, minimum_withdraw_usd_minor, + coin_seller_minimum_withdraw_usd_minor, platform_minimum_withdraw_usd_minor, diamond_exchange_enabled, + withdraw_fee_bps, agency_point_share_bps, residual_diamond_to_usd_rate, coin_seller_withdrawal_limit_period, coin_seller_withdrawal_limit_count, platform_withdrawal_limit_period, platform_withdrawal_limit_count, platform_withdrawal_allowed_days, created_at_ms, updated_at_ms - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE policy_id = VALUES(policy_id)`, item.AppCode, item.ID, item.CycleKey, policyVersion, item.Name, normalizePolicyType(item.PolicyType), item.RegionID, item.Status, item.SettlementMode, firstNonBlank(item.SettlementTriggerMode, settlementTriggerAutomatic), - item.GiftCoinToDiamondRatio, item.PointDiamondsPerUSD, item.CoinsPerUSD, item.MinimumWithdrawUSDMinor, item.WithdrawFeeBPS, item.AgencyPointShareBPS, + item.GiftCoinToDiamondRatio, item.PointDiamondsPerUSD, item.CoinsPerUSD, platformMinimum, + coinSellerMinimum, platformMinimum, item.DiamondExchangeEnabled, item.WithdrawFeeBPS, item.AgencyPointShareBPS, item.ResidualDiamondToUSDRate, firstNonBlank(item.CoinSellerWithdrawalLimitPeriod, withdrawalLimitPeriodMonth), item.CoinSellerWithdrawalLimitCount, firstNonBlank(item.PlatformWithdrawalLimitPeriod, withdrawalLimitPeriodMonth), item.PlatformWithdrawalLimitCount, @@ -504,7 +518,8 @@ func ensureRuntimeHostSalaryPolicySnapshot(ctx context.Context, tx *sql.Tx, item err := tx.QueryRowContext(ctx, ` SELECT cycle_key, policy_version, name, policy_type, region_id, status, settlement_mode, settlement_trigger_mode, CAST(gift_coin_to_diamond_ratio AS CHAR), point_diamonds_per_usd, coins_per_usd, - minimum_withdraw_usd_minor, withdraw_fee_bps, agency_point_share_bps, CAST(residual_diamond_to_usd_rate AS CHAR), + minimum_withdraw_usd_minor, coin_seller_minimum_withdraw_usd_minor, platform_minimum_withdraw_usd_minor, + diamond_exchange_enabled, withdraw_fee_bps, agency_point_share_bps, CAST(residual_diamond_to_usd_rate AS CHAR), coin_seller_withdrawal_limit_period, coin_seller_withdrawal_limit_count, platform_withdrawal_limit_period, platform_withdrawal_limit_count, platform_withdrawal_allowed_days FROM host_agency_salary_policies @@ -513,7 +528,8 @@ func ensureRuntimeHostSalaryPolicySnapshot(ctx context.Context, tx *sql.Tx, item &existing.CycleKey, &existing.PolicyVersion, &existing.Name, &existing.PolicyType, &existing.RegionID, &existing.Status, &existing.SettlementMode, &existing.SettlementTriggerMode, &existing.GiftCoinToDiamondRatio, &existing.PointDiamondsPerUSD, &existing.CoinsPerUSD, - &existing.MinimumWithdrawUSDMinor, &existing.WithdrawFeeBPS, &existing.AgencyPointShareBPS, &existing.ResidualDiamondToUSDRate, + &existing.MinimumWithdrawUSDMinor, &existing.CoinSellerMinimumWithdrawUSDMinor, &existing.PlatformMinimumWithdrawUSDMinor, + &existing.DiamondExchangeEnabled, &existing.WithdrawFeeBPS, &existing.AgencyPointShareBPS, &existing.ResidualDiamondToUSDRate, &existing.CoinSellerWithdrawalLimitPeriod, &existing.CoinSellerWithdrawalLimitCount, &existing.PlatformWithdrawalLimitPeriod, &existing.PlatformWithdrawalLimitCount, &existing.PlatformWithdrawalAllowedDays, @@ -562,13 +578,23 @@ func ensureRuntimeHostSalaryPolicySnapshot(ctx context.Context, tx *sql.Tx, item } func runtimeHostSalaryPolicyMatches(existing runtimeHostSalaryPolicySnapshot, item model.HostAgencySalaryPolicy, policyVersion uint64) bool { + itemCoinSellerMinimum, itemPlatformMinimum := resolvedPolicyWithdrawalMinimums(item) + existingCoinSellerMinimum := existing.CoinSellerMinimumWithdrawUSDMinor + if existingCoinSellerMinimum <= 0 { + existingCoinSellerMinimum = existing.MinimumWithdrawUSDMinor + } + existingPlatformMinimum := existing.PlatformMinimumWithdrawUSDMinor + if existingPlatformMinimum <= 0 { + existingPlatformMinimum = existing.MinimumWithdrawUSDMinor + } return existing.CycleKey == item.CycleKey && existing.PolicyVersion == policyVersion && existing.Name == item.Name && existing.PolicyType == normalizePolicyType(item.PolicyType) && existing.RegionID == item.RegionID && existing.Status == item.Status && existing.SettlementMode == item.SettlementMode && existing.SettlementTriggerMode == firstNonBlank(item.SettlementTriggerMode, settlementTriggerAutomatic) && trimDecimalZeros(existing.GiftCoinToDiamondRatio) == trimDecimalZeros(item.GiftCoinToDiamondRatio) && existing.PointDiamondsPerUSD == item.PointDiamondsPerUSD && existing.CoinsPerUSD == item.CoinsPerUSD && - existing.MinimumWithdrawUSDMinor == item.MinimumWithdrawUSDMinor && existing.WithdrawFeeBPS == item.WithdrawFeeBPS && + existingPlatformMinimum == itemPlatformMinimum && existingCoinSellerMinimum == itemCoinSellerMinimum && + existing.DiamondExchangeEnabled == item.DiamondExchangeEnabled && existing.WithdrawFeeBPS == item.WithdrawFeeBPS && existing.AgencyPointShareBPS == item.AgencyPointShareBPS && trimDecimalZeros(existing.ResidualDiamondToUSDRate) == trimDecimalZeros(item.ResidualDiamondToUSDRate) && existing.CoinSellerWithdrawalLimitPeriod == firstNonBlank(item.CoinSellerWithdrawalLimitPeriod, withdrawalLimitPeriodMonth) && @@ -755,7 +781,20 @@ func policyModelFromRequest(appCode string, actorID uint, req policyRequest) (mo } pointDiamondsPerUSD := req.PointDiamondsPerUSD coinsPerUSD := req.CoinsPerUSD - minimumWithdrawUSDMinor := req.MinimumWithdrawUSDMinor + // 旧请求只有一个 minimum 字段时同时用于两个渠道;新请求分别配置,旧别名固定投影平台金额。 + coinSellerMinimumWithdrawUSDMinor := req.CoinSellerMinimumWithdrawUSDMinor + if coinSellerMinimumWithdrawUSDMinor == 0 { + coinSellerMinimumWithdrawUSDMinor = req.MinimumWithdrawUSDMinor + } + platformMinimumWithdrawUSDMinor := req.PlatformMinimumWithdrawUSDMinor + if platformMinimumWithdrawUSDMinor == 0 { + platformMinimumWithdrawUSDMinor = req.MinimumWithdrawUSDMinor + } + minimumWithdrawUSDMinor := platformMinimumWithdrawUSDMinor + diamondExchangeEnabled := true + if req.DiamondExchangeEnabled != nil { + diamondExchangeEnabled = *req.DiamondExchangeEnabled + } withdrawFeeBPS := req.WithdrawFeeBPS agencyPointShareBPS := req.AgencyPointShareBPS if policyType == policyTypeSalaryDiamond { @@ -763,15 +802,18 @@ func policyModelFromRequest(appCode string, actorID uint, req policyRequest) (mo pointDiamondsPerUSD = 0 coinsPerUSD = 0 minimumWithdrawUSDMinor = 0 + coinSellerMinimumWithdrawUSDMinor = 0 + platformMinimumWithdrawUSDMinor = 0 + diamondExchangeEnabled = false withdrawFeeBPS = 0 agencyPointShareBPS = 0 } - if pointDiamondsPerUSD < 0 || coinsPerUSD < 0 || minimumWithdrawUSDMinor < 0 || withdrawFeeBPS < 0 || withdrawFeeBPS > 10_000 || agencyPointShareBPS < 0 || agencyPointShareBPS > 10_000 { + if pointDiamondsPerUSD < 0 || coinsPerUSD < 0 || coinSellerMinimumWithdrawUSDMinor < 0 || platformMinimumWithdrawUSDMinor < 0 || withdrawFeeBPS < 0 || withdrawFeeBPS > 10_000 || agencyPointShareBPS < 0 || agencyPointShareBPS > 10_000 { return model.HostAgencySalaryPolicy{}, errors.New("钻石积分兑换或提现配置不正确") } - if policyType == policyTypePointDiamond && (pointDiamondsPerUSD <= 0 || coinsPerUSD <= 0 || minimumWithdrawUSDMinor <= 0) { + if policyType == policyTypePointDiamond && (pointDiamondsPerUSD <= 0 || coinsPerUSD <= 0 || coinSellerMinimumWithdrawUSDMinor <= 0 || platformMinimumWithdrawUSDMinor <= 0) { // POINT_DIAMOND 的金额入口全部读取这份月度不可变快照;缺少任一比例时必须拒绝发布前保存,不能回退代码常量。 - return model.HostAgencySalaryPolicy{}, errors.New("钻石积分政策必须配置每美元钻石、每美元金币和最低提现金额") + return model.HostAgencySalaryPolicy{}, errors.New("钻石积分政策必须配置每美元钻石、每美元金币、币商最低提现金额和平台最低提现金额") } if policyType == policyTypePointDiamond && pointDiamondsPerUSD%100 != 0 { // HTTP 只接受美元分整数;比例必须能精确映射每一美分,禁止依赖向下取整吞掉用户积分。 @@ -821,31 +863,52 @@ func policyModelFromRequest(appCode string, actorID uint, req policyRequest) (mo Name: name, PolicyType: policyType, // RegionID 保留首个区域以兼容旧索引和旧客户端;实际覆盖范围只由 RegionIDs 关联表决定。 - RegionID: regionIDs[0], - RegionIDs: regionIDs, - CycleKey: cycleKey, - Status: status, - SettlementMode: settlementMode, - SettlementTriggerMode: settlementTriggerMode, - GiftCoinToDiamondRatio: giftRatio, - PointDiamondsPerUSD: pointDiamondsPerUSD, - CoinsPerUSD: coinsPerUSD, - MinimumWithdrawUSDMinor: minimumWithdrawUSDMinor, - WithdrawFeeBPS: withdrawFeeBPS, - AgencyPointShareBPS: agencyPointShareBPS, - ResidualDiamondToUSDRate: residualRate, - CoinSellerWithdrawalLimitPeriod: coinSellerLimitPeriod, - CoinSellerWithdrawalLimitCount: coinSellerLimitCount, - PlatformWithdrawalLimitPeriod: platformLimitPeriod, - PlatformWithdrawalLimitCount: platformLimitCount, - PlatformWithdrawalAllowedDays: platformAllowedDays, - Description: description, - CreatedByAdminID: actorID, - UpdatedByAdminID: actorID, - Levels: levels, + RegionID: regionIDs[0], + RegionIDs: regionIDs, + CycleKey: cycleKey, + Status: status, + SettlementMode: settlementMode, + SettlementTriggerMode: settlementTriggerMode, + GiftCoinToDiamondRatio: giftRatio, + PointDiamondsPerUSD: pointDiamondsPerUSD, + CoinsPerUSD: coinsPerUSD, + MinimumWithdrawUSDMinor: minimumWithdrawUSDMinor, + CoinSellerMinimumWithdrawUSDMinor: coinSellerMinimumWithdrawUSDMinor, + PlatformMinimumWithdrawUSDMinor: platformMinimumWithdrawUSDMinor, + DiamondExchangeEnabled: diamondExchangeEnabled, + WithdrawFeeBPS: withdrawFeeBPS, + AgencyPointShareBPS: agencyPointShareBPS, + ResidualDiamondToUSDRate: residualRate, + CoinSellerWithdrawalLimitPeriod: coinSellerLimitPeriod, + CoinSellerWithdrawalLimitCount: coinSellerLimitCount, + PlatformWithdrawalLimitPeriod: platformLimitPeriod, + PlatformWithdrawalLimitCount: platformLimitCount, + PlatformWithdrawalAllowedDays: platformAllowedDays, + Description: description, + CreatedByAdminID: actorID, + UpdatedByAdminID: actorID, + Levels: levels, }, nil } +func boolPointer(value bool) *bool { + return &value +} + +// resolvedPolicyWithdrawalMinimums 兼容迁移前快照:渠道字段为 0 时回退原单一门槛。 +// POINT_DIAMOND 新保存会强制两个渠道都大于 0,因此 0 不会与合法的新配置产生歧义。 +func resolvedPolicyWithdrawalMinimums(item model.HostAgencySalaryPolicy) (int64, int64) { + coinSellerMinimum := item.CoinSellerMinimumWithdrawUSDMinor + if coinSellerMinimum <= 0 { + coinSellerMinimum = item.MinimumWithdrawUSDMinor + } + platformMinimum := item.PlatformMinimumWithdrawUSDMinor + if platformMinimum <= 0 { + platformMinimum = item.MinimumWithdrawUSDMinor + } + return coinSellerMinimum, platformMinimum +} + func normalizePolicyType(value string) string { value = strings.ToUpper(strings.TrimSpace(value)) if value == "" { diff --git a/server/admin/internal/modules/hostagencypolicy/service_test.go b/server/admin/internal/modules/hostagencypolicy/service_test.go index acae71f8..f9571070 100644 --- a/server/admin/internal/modules/hostagencypolicy/service_test.go +++ b/server/admin/internal/modules/hostagencypolicy/service_test.go @@ -245,9 +245,11 @@ func TestEnsureRuntimeHostSalaryPolicySnapshotAcceptsIdenticalExistingSnapshot(t mock.ExpectExec("INSERT INTO host_agency_salary_policies").WillReturnResult(sqlmock.NewResult(0, 0)) mock.ExpectQuery("SELECT cycle_key, policy_version").WithArgs("fami", uint(81), uint64(81)).WillReturnRows(sqlmock.NewRows([]string{ "cycle_key", "policy_version", "name", "policy_type", "region_id", "status", "settlement_mode", "settlement_trigger_mode", - "gift_ratio", "points_per_usd", "coins_per_usd", "minimum_usd_minor", "fee_bps", "agency_bps", "residual_rate", + "gift_ratio", "points_per_usd", "coins_per_usd", "minimum_usd_minor", + "coin_seller_minimum_usd_minor", "platform_minimum_usd_minor", "diamond_exchange_enabled", + "fee_bps", "agency_bps", "residual_rate", "coin_period", "coin_count", "platform_period", "platform_count", "platform_allowed_days", - }).AddRow("2026-08", 81, "August policy", "SALARY_DIAMOND", 25, "active", "daily", "automatic", "1.000000", 0, 0, 0, 0, 0, "0.000000000000", "week", 2, "day", 1, "15,30")) + }).AddRow("2026-08", 81, "August policy", "SALARY_DIAMOND", 25, "active", "daily", "automatic", "1.000000", 0, 0, 0, 0, 0, false, 0, 0, "0.000000000000", "week", 2, "day", 1, "15,30")) mock.ExpectQuery("SELECT level_no, required_diamonds").WithArgs("fami", uint(81), uint64(81)).WillReturnRows(sqlmock.NewRows([]string{ "level_no", "required_diamonds", "host_salary_usd_minor", "host_coin_reward", "agency_salary_usd_minor", "status", "sort_order", }).AddRow(1, 100, 150, 20, 50, "active", 1)) diff --git a/server/admin/internal/repository/seed.go b/server/admin/internal/repository/seed.go index aa40c9b7..8659f665 100644 --- a/server/admin/internal/repository/seed.go +++ b/server/admin/internal/repository/seed.go @@ -345,11 +345,12 @@ func (s *Store) seedMenus() error { {ParentID: &systemID, Title: "团队配置", Code: "system-teams", Path: "/system/teams", Icon: "team", PermissionCode: "team:view", Sort: 36, Visible: true}, {ParentID: &appUsersID, Title: "用户列表", Code: "app-user-list", Path: "/app/users", Icon: "users", PermissionCode: "app-user:view", Sort: 60, Visible: true}, {ParentID: &appUsersID, Title: "封禁列表", Code: "app-user-bans", Path: "/app/users/bans", Icon: "block", PermissionCode: "app-user:view", Sort: 61, Visible: true}, - {ParentID: &appUsersID, Title: "登录日志", Code: "app-user-login-logs", Path: "/app/users/login-logs", Icon: "login", PermissionCode: "app-user:view", Sort: 62, Visible: true}, - {ParentID: &appUsersID, Title: "等级配置", Code: "app-user-level-config", Path: "/app/users/level-config", Icon: "military_tech", PermissionCode: "level-config:view", Sort: 63, Visible: true}, - {ParentID: &appUsersID, Title: "靓号管理", Code: "app-user-pretty-ids", Path: "/app/users/pretty-ids", Icon: "tag", PermissionCode: "pretty-id:view", Sort: 64, Visible: true}, - {ParentID: &appUsersID, Title: "风控管理", Code: "app-user-risk-config", Path: "/app/users/risk-config", Icon: "shield", PermissionCode: "risk-config:view", Sort: 65, Visible: true}, - {ParentID: &appUsersID, Title: "地区屏蔽", Code: "app-user-region-blocks", Path: "/app/users/region-blocks", Icon: "public", PermissionCode: "region-block:view", Sort: 66, Visible: true}, + {ParentID: &appUsersID, Title: "黑名单屏蔽用户", Code: "app-user-content-blacklist", Path: "/app/users/content-blacklist", Icon: "visibility_off", PermissionCode: "app-user:view", Sort: 62, Visible: true}, + {ParentID: &appUsersID, Title: "登录日志", Code: "app-user-login-logs", Path: "/app/users/login-logs", Icon: "login", PermissionCode: "app-user:view", Sort: 63, Visible: true}, + {ParentID: &appUsersID, Title: "等级配置", Code: "app-user-level-config", Path: "/app/users/level-config", Icon: "military_tech", PermissionCode: "level-config:view", Sort: 64, Visible: true}, + {ParentID: &appUsersID, Title: "靓号管理", Code: "app-user-pretty-ids", Path: "/app/users/pretty-ids", Icon: "tag", PermissionCode: "pretty-id:view", Sort: 65, Visible: true}, + {ParentID: &appUsersID, Title: "风控管理", Code: "app-user-risk-config", Path: "/app/users/risk-config", Icon: "shield", PermissionCode: "risk-config:view", Sort: 66, Visible: true}, + {ParentID: &appUsersID, Title: "地区屏蔽", Code: "app-user-region-blocks", Path: "/app/users/region-blocks", Icon: "public", PermissionCode: "region-block:view", Sort: 67, Visible: true}, {ParentID: &roomsID, Title: "房间列表", Code: "room-list", Path: "/rooms", Icon: "room", PermissionCode: "room:view", Sort: 65, Visible: true}, {ParentID: &roomsID, Title: "房间置顶", Code: "room-pins", Path: "/rooms/pins", Icon: "push_pin", PermissionCode: "room-pin:view", Sort: 66, Visible: true}, {ParentID: &roomsID, Title: "房间配置", Code: "room-config", Path: "/rooms/config", Icon: "settings", PermissionCode: "room-config:view", Sort: 67, Visible: true}, diff --git a/server/admin/migrations/124_user_content_blacklist_navigation.sql b/server/admin/migrations/124_user_content_blacklist_navigation.sql new file mode 100644 index 00000000..0825a6b2 --- /dev/null +++ b/server/admin/migrations/124_user_content_blacklist_navigation.sql @@ -0,0 +1,46 @@ +-- 内容黑名单复用 app-user:view/status 权限,仅新增用户管理子菜单。 +-- admin_menus.code 有唯一索引,以下调整都是点查/点更;不扫描或锁定 App 用户业务表。 +SET @now_ms := UNIX_TIMESTAMP(UTC_TIMESTAMP(3)) * 1000; + +UPDATE admin_menus +SET sort = CASE code + WHEN 'app-user-login-logs' THEN 63 + WHEN 'app-user-level-config' THEN 64 + WHEN 'app-user-pretty-ids' THEN 65 + WHEN 'app-user-risk-config' THEN 66 + WHEN 'app-user-region-blocks' THEN 67 + ELSE sort +END, +updated_at_ms = @now_ms +WHERE code IN ( + 'app-user-login-logs', + 'app-user-level-config', + 'app-user-pretty-ids', + 'app-user-risk-config', + 'app-user-region-blocks' +); + +INSERT INTO admin_menus ( + parent_id, title, code, path, icon, permission_code, sort, visible, created_at_ms, updated_at_ms +) +SELECT parent.id, + '黑名单屏蔽用户', + 'app-user-content-blacklist', + '/app/users/content-blacklist', + 'visibility_off', + 'app-user:view', + 62, + TRUE, + @now_ms, + @now_ms +FROM admin_menus parent +WHERE parent.code = 'app-users' +ON DUPLICATE KEY UPDATE + parent_id = VALUES(parent_id), + title = VALUES(title), + path = VALUES(path), + icon = VALUES(icon), + permission_code = VALUES(permission_code), + sort = VALUES(sort), + visible = VALUES(visible), + updated_at_ms = VALUES(updated_at_ms); diff --git a/server/admin/migrations/125_host_policy_withdrawal_minimums_and_exchange.sql b/server/admin/migrations/125_host_policy_withdrawal_minimums_and_exchange.sql new file mode 100644 index 00000000..0b3cbce3 --- /dev/null +++ b/server/admin/migrations/125_host_policy_withdrawal_minimums_and_exchange.sql @@ -0,0 +1,15 @@ +SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- Host 政策是小型配置表;迁移仅追加定长列并使用在线 DDL,不扫描钱包、提现或用户流水。 +-- 新渠道字段以 0 表示尚未拆分,运行时回退旧 minimum_withdraw_usd_minor,因此无需全表 UPDATE 回填。 +SET @ddl = IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'admin_host_agency_salary_policies' AND COLUMN_NAME = 'coin_seller_minimum_withdraw_usd_minor') = 0, + 'ALTER TABLE admin_host_agency_salary_policies ADD COLUMN coin_seller_minimum_withdraw_usd_minor BIGINT NOT NULL DEFAULT 0 COMMENT ''POINT_DIAMOND 用户找币商最低提现美元美分;0 回退旧字段'' AFTER minimum_withdraw_usd_minor, ALGORITHM=INPLACE, LOCK=NONE', 'SELECT 1'); +PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @ddl = IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'admin_host_agency_salary_policies' AND COLUMN_NAME = 'platform_minimum_withdraw_usd_minor') = 0, + 'ALTER TABLE admin_host_agency_salary_policies ADD COLUMN platform_minimum_withdraw_usd_minor BIGINT NOT NULL DEFAULT 0 COMMENT ''POINT_DIAMOND 用户找平台最低提现美元美分;0 回退旧字段'' AFTER coin_seller_minimum_withdraw_usd_minor, ALGORITHM=INPLACE, LOCK=NONE', 'SELECT 1'); +PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @ddl = IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'admin_host_agency_salary_policies' AND COLUMN_NAME = 'diamond_exchange_enabled') = 0, + 'ALTER TABLE admin_host_agency_salary_policies ADD COLUMN diamond_exchange_enabled BOOLEAN NOT NULL DEFAULT TRUE COMMENT ''是否开放 POINT_DIAMOND 兑换金币'' AFTER platform_minimum_withdraw_usd_minor, ALGORITHM=INPLACE, LOCK=NONE', 'SELECT 1'); +PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; diff --git a/services/gateway-service/internal/transport/http/appapi/app_config_handler.go b/services/gateway-service/internal/transport/http/appapi/app_config_handler.go index e48d160d..2f68701a 100644 --- a/services/gateway-service/internal/transport/http/appapi/app_config_handler.go +++ b/services/gateway-service/internal/transport/http/appapi/app_config_handler.go @@ -179,6 +179,11 @@ func (h *Handler) applyAuthenticatedBannerAudience(writer http.ResponseWriter, r httpkit.WriteError(writer, request, http.StatusForbidden, httpkit.CodePermissionDenied, "permission denied") return false } + if user.GetContentBlacklisted() { + // Banner 仍保留公开匿名访问兼容;一旦请求携带有效登录态,user-service 的黑名单事实优先并直接返回空列表。 + httpkit.WriteOK(writer, request, map[string]any{"items": []appconfig.Banner{}, "total": 0}) + return false + } // 已登录用户的区域由后端用户资料覆盖;客户端保留 region_id/country 只做老版本参数兼容,不参与裁决。 query.RegionID = user.GetRegionId() diff --git a/services/gateway-service/internal/transport/http/gameapi/game_handler.go b/services/gateway-service/internal/transport/http/gameapi/game_handler.go index d93d513a..00a2116d 100644 --- a/services/gateway-service/internal/transport/http/gameapi/game_handler.go +++ b/services/gateway-service/internal/transport/http/gameapi/game_handler.go @@ -44,12 +44,22 @@ func (h *Handler) listGames(writer http.ResponseWriter, request *http.Request) { httpkit.WriteRPCError(writer, request, err) return } + user := userResp.GetUser() + if user == nil { + httpkit.WriteError(writer, request, http.StatusBadGateway, httpkit.CodeUpstreamError, "upstream service error") + return + } + if user.GetContentBlacklisted() { + // 内容黑名单只隐藏游戏目录,不调用 game-service,也不改变账号、房间或钱包状态。 + httpkit.WriteOK(writer, request, gameListData{Games: []gameItemData{}}) + return + } resp, err := h.gameClient.ListGames(request.Context(), &gamev1.ListGamesRequest{ Meta: gameMeta(request), UserId: userID, Scene: strings.TrimSpace(request.URL.Query().Get("scene")), RoomId: strings.TrimSpace(request.URL.Query().Get("room_id")), - RegionId: userResp.GetUser().GetRegionId(), + RegionId: user.GetRegionId(), Language: requestLanguage(request), ClientPlatform: httpkit.FirstHeader(request, "X-App-Platform", "X-Platform"), }) @@ -75,6 +85,16 @@ func (h *Handler) listRecentGames(writer http.ResponseWriter, request *http.Requ httpkit.WriteRPCError(writer, request, err) return } + user := userResp.GetUser() + if user == nil { + httpkit.WriteError(writer, request, http.StatusBadGateway, httpkit.CodeUpstreamError, "upstream service error") + return + } + if user.GetContentBlacklisted() { + // 最近常玩与完整目录使用同一 owner 判定,避免从第二个 tab 绕过内容屏蔽。 + httpkit.WriteOK(writer, request, gameListData{Games: []gameItemData{}}) + return + } // 最近常玩仍传 scene、room、region、language 和 platform,让 game-service 在真实启动记录之外, // 继续按当前房间场景和用户区域过滤,避免 App 展示用户已不能进入的游戏。 resp, err := h.gameClient.ListRecentGames(request.Context(), &gamev1.ListRecentGamesRequest{ @@ -82,7 +102,7 @@ func (h *Handler) listRecentGames(writer http.ResponseWriter, request *http.Requ UserId: userID, Scene: strings.TrimSpace(request.URL.Query().Get("scene")), RoomId: strings.TrimSpace(request.URL.Query().Get("room_id")), - RegionId: userResp.GetUser().GetRegionId(), + RegionId: user.GetRegionId(), Language: requestLanguage(request), ClientPlatform: httpkit.FirstHeader(request, "X-App-Platform", "X-Platform"), PageSize: pageSize, diff --git a/services/gateway-service/internal/transport/http/roomapi/gift_panel_pipeline.go b/services/gateway-service/internal/transport/http/roomapi/gift_panel_pipeline.go index f0690c6f..7c61d99a 100644 --- a/services/gateway-service/internal/transport/http/roomapi/gift_panel_pipeline.go +++ b/services/gateway-service/internal/transport/http/roomapi/gift_panel_pipeline.go @@ -15,6 +15,7 @@ import ( "hyapp/pkg/appcode" "hyapp/pkg/logx" "hyapp/pkg/roomid" + "hyapp/pkg/xerr" "hyapp/services/gateway-service/internal/appconfig" "hyapp/services/gateway-service/internal/auth" "hyapp/services/gateway-service/internal/transport/http/httpkit" @@ -150,7 +151,9 @@ func (h *Handler) serveRoomGiftPanel(writer http.ResponseWriter, request *http.R }) bagCh := startRoomGiftPanelStage(&stageGroup, totalCtx, requestID, roomID, "bag", func() (*walletv1.ListUserResourcesResponse, bool, error) { resp, err := h.roomGiftBagResources(request, viewerUserID) - return resp, false, err + // 只有 Wallet 明确标记的资源读瞬时冲突可以降级为空背包;鉴权、参数、 + // 网络和未知内部错误仍让面板失败,避免把真实依赖故障静默伪装成“用户没有背包礼物”。 + return resp, xerr.IsCode(err, xerr.WalletResourceReadTransient), err }) comboConfigCh := startRoomGiftPanelStage(&stageGroup, totalCtx, requestID, roomID, "combo_config", func() (appconfig.GiftComboConfig, bool, error) { config, err := h.roomGiftComboConfig(totalCtx, app, viewerUserID) @@ -192,10 +195,15 @@ func (h *Handler) serveRoomGiftPanel(writer http.ResponseWriter, request *http.R h.writeRoomGiftPanelFailure(writer, request, requestID, roomID, totalStartedAt, err) return } - bagResources, _, err := waitRoomGiftPanelStage(totalCtx, bagCh) + bagResources, bagDegraded, err := waitRoomGiftPanelStage(totalCtx, bagCh) if err != nil { - h.writeRoomGiftPanelFailure(writer, request, requestID, roomID, totalStartedAt, err) - return + if !bagDegraded || totalCtx.Err() != nil { + h.writeRoomGiftPanelFailure(writer, request, requestID, roomID, totalStartedAt, err) + return + } + // 背包只影响用户持有礼物的附加列表,目录、余额和送礼主链路仍可安全展示; + // 当前请求返回空背包,下一次打开会重新读取,不缓存这次瞬时降级。 + bagResources = &walletv1.ListUserResourcesResponse{} } recipientProfiles, _, err := waitRoomGiftPanelStage(totalCtx, profileCh) if err != nil { diff --git a/services/gateway-service/internal/transport/http/walletapi/point_diamond_wallet_handler.go b/services/gateway-service/internal/transport/http/walletapi/point_diamond_wallet_handler.go index a3fc6fa5..67fef84d 100644 --- a/services/gateway-service/internal/transport/http/walletapi/point_diamond_wallet_handler.go +++ b/services/gateway-service/internal/transport/http/walletapi/point_diamond_wallet_handler.go @@ -90,14 +90,17 @@ type pointDiamondBalanceData struct { } type pointDiamondPolicyData struct { - PointDiamondsPerUSD string `json:"point_diamonds_per_usd"` - CoinsPerUSD string `json:"coins_per_usd"` - AgencyPointShareBPS string `json:"agency_point_share_bps"` - MinimumWithdrawUSDMinor string `json:"minimum_withdraw_usd_minor"` - WithdrawFeeBPS string `json:"withdraw_fee_bps"` - PolicyID string `json:"policy_id"` - PolicyVersion string `json:"policy_version"` - PolicyInstanceCode string `json:"policy_instance_code"` + PointDiamondsPerUSD string `json:"point_diamonds_per_usd"` + CoinsPerUSD string `json:"coins_per_usd"` + AgencyPointShareBPS string `json:"agency_point_share_bps"` + MinimumWithdrawUSDMinor string `json:"minimum_withdraw_usd_minor"` + CoinSellerMinimumWithdrawUSDMinor string `json:"coin_seller_minimum_withdraw_usd_minor"` + PlatformMinimumWithdrawUSDMinor string `json:"platform_minimum_withdraw_usd_minor"` + DiamondExchangeEnabled bool `json:"diamond_exchange_enabled"` + WithdrawFeeBPS string `json:"withdraw_fee_bps"` + PolicyID string `json:"policy_id"` + PolicyVersion string `json:"policy_version"` + PolicyInstanceCode string `json:"policy_instance_code"` } type pointDiamondActionsData struct { @@ -170,14 +173,17 @@ func (h *Handler) getPointDiamondWalletOverview(writer http.ResponseWriter, requ } } availabilityEvaluated := config.GetAvailabilityEvaluated() + diamondExchangeEnabled := pointDiamondExchangeEnabled(config) actions := pointDiamondActionsData{ - ExchangeToCoins: enabled, + ExchangeToCoins: enabled && diamondExchangeEnabled, Withdraw: enabled && availabilityEvaluated && config.GetPlatformAvailability().GetAllowed(), TransferToCoinSeller: enabled && availabilityEvaluated && config.GetCoinSellerAvailability().GetAllowed() && len(sellers) > 0, } channels := []string{} if enabled { - channels = append(channels, "COIN") + if actions.ExchangeToCoins { + channels = append(channels, "COIN") + } if actions.Withdraw { channels = append(channels, "PLATFORM_USDT") } @@ -197,9 +203,13 @@ func (h *Handler) getPointDiamondWalletOverview(writer http.ResponseWriter, requ }, "available_points": balance.AvailablePoints, "available_amount": balance.AvailableAmount, "point_diamonds_per_usd": policy.PointDiamondsPerUSD, "coins_per_usd": policy.CoinsPerUSD, - "agency_point_share_bps": policy.AgencyPointShareBPS, - "minimum_withdraw_usd_minor": policy.MinimumWithdrawUSDMinor, "withdraw_fee_bps": policy.WithdrawFeeBPS, - "withdraw_address": salaryWithdrawAddressFromProto(profile), + "agency_point_share_bps": policy.AgencyPointShareBPS, + "minimum_withdraw_usd_minor": policy.MinimumWithdrawUSDMinor, + "coin_seller_minimum_withdraw_usd_minor": policy.CoinSellerMinimumWithdrawUSDMinor, + "platform_minimum_withdraw_usd_minor": policy.PlatformMinimumWithdrawUSDMinor, + "diamond_exchange_enabled": policy.DiamondExchangeEnabled, + "withdraw_fee_bps": policy.WithdrawFeeBPS, + "withdraw_address": salaryWithdrawAddressFromProto(profile), }) } @@ -503,10 +513,25 @@ func pointDiamondPolicyFromProto(config *walletv1.GetPointWithdrawalConfigRespon } return pointDiamondPolicyData{ PointDiamondsPerUSD: strconv.FormatInt(config.GetPointsPerUsd(), 10), CoinsPerUSD: strconv.FormatInt(config.GetCoinsPerUsd(), 10), - AgencyPointShareBPS: strconv.FormatInt(int64(config.GetAgencyPointShareBps()), 10), - MinimumWithdrawUSDMinor: strconv.FormatInt(config.GetMinimumWithdrawUsdMinor(), 10), - WithdrawFeeBPS: strconv.FormatInt(int64(config.GetFeeBps()), 10), - PolicyID: strconv.FormatUint(config.GetPolicyId(), 10), PolicyVersion: strconv.FormatUint(config.GetPolicyVersion(), 10), + AgencyPointShareBPS: strconv.FormatInt(int64(config.GetAgencyPointShareBps()), 10), + MinimumWithdrawUSDMinor: strconv.FormatInt(config.GetMinimumWithdrawUsdMinor(), 10), + CoinSellerMinimumWithdrawUSDMinor: strconv.FormatInt(config.GetCoinSellerMinimumWithdrawUsdMinor(), 10), + PlatformMinimumWithdrawUSDMinor: strconv.FormatInt(config.GetPlatformMinimumWithdrawUsdMinor(), 10), + DiamondExchangeEnabled: pointDiamondExchangeEnabled(config), + WithdrawFeeBPS: strconv.FormatInt(int64(config.GetFeeBps()), 10), + PolicyID: strconv.FormatUint(config.GetPolicyId(), 10), PolicyVersion: strconv.FormatUint(config.GetPolicyVersion(), 10), PolicyInstanceCode: config.GetPolicyInstanceCode(), } } + +func pointDiamondExchangeEnabled(config *walletv1.GetPointWithdrawalConfigResponse) bool { + if config == nil { + return false + } + // optional 字段缺失只会来自旧 wallet-service;兼容窗口保持原有开启行为。 + // 新服务无论 true/false 都会显式设置指针,因此运营关闭不会被该回退覆盖。 + if config.DiamondExchangeEnabled == nil { + return true + } + return config.GetDiamondExchangeEnabled() +} 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 6aae0c40..32d2360d 100644 --- a/services/user-service/deploy/mysql/initdb/001_user_service.sql +++ b/services/user-service/deploy/mysql/initdb/001_user_service.sql @@ -315,6 +315,18 @@ CREATE TABLE IF NOT EXISTS admin_user_bans ( KEY idx_admin_user_bans_expire (app_code, status, expires_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='后台管理员用户封禁事实表'; +CREATE TABLE IF NOT EXISTS user_content_blacklist ( + app_code VARCHAR(32) NOT NULL COMMENT '应用编码,用于多租户隔离', + user_id BIGINT NOT NULL COMMENT '被屏蔽用户 ID', + status VARCHAR(16) NOT NULL COMMENT 'active/removed', + operator_admin_id BIGINT NOT NULL COMMENT '最近操作后台管理员 ID', + reason VARCHAR(255) NOT NULL DEFAULT '' 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, user_id), + KEY idx_user_content_blacklist_status_time (app_code, status, created_at_ms, user_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户运营内容屏蔽当前态'; + -- 空 ban_id 解封会按用户选择最新 active 管理员事实;独立命令表把一次选择固定到 resolved_ban_id, -- 避免网络重试继续释放下一条重叠封禁。 CREATE TABLE IF NOT EXISTS admin_user_ban_release_commands ( diff --git a/services/user-service/deploy/mysql/migrations/025_user_content_blacklist.sql b/services/user-service/deploy/mysql/migrations/025_user_content_blacklist.sql new file mode 100644 index 00000000..ee4f36bc --- /dev/null +++ b/services/user-service/deploy/mysql/migrations/025_user_content_blacklist.sql @@ -0,0 +1,14 @@ +-- 运营内容黑名单是独立小表;CREATE TABLE 不扫描或重写 users,发布时只获取数据字典锁。 +-- 运行时单用户判断命中 PRIMARY KEY (app_code,user_id),后台列表命中 status/time 覆盖索引, +-- 不允许把列表裁决退化为 users 全表扫描。 +CREATE TABLE IF NOT EXISTS user_content_blacklist ( + app_code VARCHAR(32) NOT NULL COMMENT '应用编码,用于多租户隔离', + user_id BIGINT NOT NULL COMMENT '被屏蔽用户 ID', + status VARCHAR(16) NOT NULL COMMENT 'active/removed', + operator_admin_id BIGINT NOT NULL COMMENT '最近操作后台管理员 ID', + reason VARCHAR(255) NOT NULL DEFAULT '' 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, user_id), + KEY idx_user_content_blacklist_status_time (app_code, status, created_at_ms, user_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户运营内容屏蔽当前态'; diff --git a/services/user-service/internal/domain/user/user.go b/services/user-service/internal/domain/user/user.go index fe834f48..5fb9b5ef 100644 --- a/services/user-service/internal/domain/user/user.go +++ b/services/user-service/internal/domain/user/user.go @@ -289,12 +289,31 @@ type User struct { OnboardingStatus OnboardingStatus // Status 控制登录和业务可用性。 Status Status + // ContentBlacklisted 只屏蔽游戏列表和 Banner 等运营内容;账号仍可登录,房间和账务状态不受影响。 + ContentBlacklisted bool // CreatedAtMs 是用户创建时间。 CreatedAtMs int64 // UpdatedAtMs 是用户主记录更新时间。 UpdatedAtMs int64 } +// ContentBlacklistEntry 是 user-service 持有的运营内容屏蔽当前态。 +// 用户资料在列表读取时从 users 当前行投影,避免昵称、头像和展示号被固化成过期快照。 +type ContentBlacklistEntry struct { + UserID int64 + CurrentDisplayUserID string + DefaultDisplayUserID string + PrettyID string + PrettyDisplayUserID string + Username string + Avatar string + UserStatus Status + OperatorAdminID int64 + Reason string + CreatedAtMs int64 + UpdatedAtMs int64 +} + // RoomBasicUser 是房间首屏热路径使用的最小用户展示资料,不能混入国家、靓号详情或装扮字段。 type RoomBasicUser struct { // UserID 是系统内部不可变用户 ID,调用方用它和麦位/房主/当前用户状态关联。 diff --git a/services/user-service/internal/service/user/content_blacklist.go b/services/user-service/internal/service/user/content_blacklist.go new file mode 100644 index 00000000..f4d9201d --- /dev/null +++ b/services/user-service/internal/service/user/content_blacklist.go @@ -0,0 +1,83 @@ +package user + +import ( + "context" + "strings" + + "hyapp/pkg/xerr" + userdomain "hyapp/services/user-service/internal/domain/user" +) + +const ( + defaultContentBlacklistPageSize int32 = 50 + maxContentBlacklistPageSize int32 = 200 + maxContentBlacklistReasonRunes = 255 +) + +// UserContentBlacklistCommand 是后台增加/移除运营内容屏蔽的治理命令。 +// 时间由 user-service owner 生成,不能信任后台进程或客户端传入的时钟。 +type UserContentBlacklistCommand struct { + UserID int64 + OperatorAdminID int64 + Reason string + NowMs int64 +} + +// ListUserContentBlacklist 分页读取当前 active 屏蔽用户。 +func (s *Service) ListUserContentBlacklist(ctx context.Context, page int32, pageSize int32) ([]userdomain.ContentBlacklistEntry, int64, error) { + if s.contentBlacklistRepository == nil { + return nil, 0, xerr.New(xerr.Unavailable, "content blacklist repository is not configured") + } + if page < 1 { + page = 1 + } + if pageSize <= 0 { + pageSize = defaultContentBlacklistPageSize + } + if pageSize > maxContentBlacklistPageSize { + pageSize = maxContentBlacklistPageSize + } + return s.contentBlacklistRepository.ListUserContentBlacklist(ctx, page, pageSize) +} + +// AdminAddUserContentBlacklist 启用指定用户的运营内容屏蔽。 +// 重复添加保持单行当前态并更新操作者和原因,不会把账号状态改成 banned/disabled。 +func (s *Service) AdminAddUserContentBlacklist(ctx context.Context, command UserContentBlacklistCommand) (userdomain.ContentBlacklistEntry, error) { + if s.contentBlacklistRepository == nil { + return userdomain.ContentBlacklistEntry{}, xerr.New(xerr.Unavailable, "content blacklist repository is not configured") + } + normalized, err := s.normalizeUserContentBlacklistCommand(command) + if err != nil { + return userdomain.ContentBlacklistEntry{}, err + } + return s.contentBlacklistRepository.AddUserContentBlacklist(ctx, normalized) +} + +// AdminRemoveUserContentBlacklist 关闭指定用户的运营内容屏蔽。 +// 已经移除时返回 removed=false,允许后台重试同一个操作而不产生错误。 +func (s *Service) AdminRemoveUserContentBlacklist(ctx context.Context, command UserContentBlacklistCommand) (bool, error) { + if s.contentBlacklistRepository == nil { + return false, xerr.New(xerr.Unavailable, "content blacklist repository is not configured") + } + normalized, err := s.normalizeUserContentBlacklistCommand(command) + if err != nil { + return false, err + } + return s.contentBlacklistRepository.RemoveUserContentBlacklist(ctx, normalized) +} + +func (s *Service) normalizeUserContentBlacklistCommand(command UserContentBlacklistCommand) (UserContentBlacklistCommand, error) { + if command.UserID <= 0 { + return UserContentBlacklistCommand{}, xerr.New(xerr.InvalidArgument, "user_id is required") + } + if command.OperatorAdminID <= 0 { + return UserContentBlacklistCommand{}, xerr.New(xerr.InvalidArgument, "operator_admin_id is required") + } + command.Reason = strings.TrimSpace(command.Reason) + if len([]rune(command.Reason)) > maxContentBlacklistReasonRunes { + return UserContentBlacklistCommand{}, xerr.New(xerr.InvalidArgument, "reason is too long") + } + // user-service 的 UTC 时钟是持久事实时间源,后台 RequestMeta.sent_at_ms 只用于链路追踪。 + command.NowMs = s.now().UTC().UnixMilli() + return command, nil +} diff --git a/services/user-service/internal/service/user/service.go b/services/user-service/internal/service/user/service.go index 5e5574c2..c5f4f7fd 100644 --- a/services/user-service/internal/service/user/service.go +++ b/services/user-service/internal/service/user/service.go @@ -202,6 +202,15 @@ type DeviceRepository interface { DeletePushToken(ctx context.Context, command userdomain.DeletePushTokenCommand) (bool, error) } +// ContentBlacklistRepository 持有运营内容屏蔽当前态。 +// 它与账号封禁分离:黑名单只改变游戏列表和 Banner 可见性,不能吊销登录态或修改 users.status。 +type ContentBlacklistRepository interface { + IsUserContentBlacklisted(ctx context.Context, userID int64) (bool, error) + ListUserContentBlacklist(ctx context.Context, page int32, pageSize int32) ([]userdomain.ContentBlacklistEntry, int64, error) + AddUserContentBlacklist(ctx context.Context, command UserContentBlacklistCommand) (userdomain.ContentBlacklistEntry, error) + RemoveUserContentBlacklist(ctx context.Context, command UserContentBlacklistCommand) (bool, error) +} + // ModerationRepository 持有用户状态和认证 session 的同库事务。 type ModerationRepository interface { SetUserStatus(ctx context.Context, command UserStatusCommand) (UserStatusPersistenceResult, error) @@ -276,6 +285,8 @@ type Service struct { roleSummaryRepository RoleSummaryRepository // deviceRepository 持有设备 push token 绑定能力。 deviceRepository DeviceRepository + // contentBlacklistRepository 持有游戏列表和 Banner 屏蔽当前态,不参与账号封禁或登录状态判断。 + contentBlacklistRepository ContentBlacklistRepository // moderationRepository 持有用户状态和 session 吊销事务能力。 moderationRepository ModerationRepository // roleScopePolicyResolver 与 Host 组织链路共享同一 owner 配置,经理治理不能复制 App 分支。 @@ -323,6 +334,10 @@ func New(userRepository UserRepository, options ...Option) *Service { // 生产 MySQL 用户 repository 同时拥有 users 与头像授权表,凭证消费才能和资料更新保持原子。 svc.avatarUploadRepository = repository } + if repository, ok := userRepository.(ContentBlacklistRepository); ok { + // 生产 MySQL 用户 repository 同库维护屏蔽名单;测试替身未覆盖该能力时保持可选。 + svc.contentBlacklistRepository = repository + } for _, option := range options { // option 只改依赖或策略,不做 IO。 option(svc) @@ -461,6 +476,15 @@ func WithDeviceRepository(repository DeviceRepository) Option { } } +// WithContentBlacklistRepository 注入运营内容屏蔽 repository。 +func WithContentBlacklistRepository(repository ContentBlacklistRepository) Option { + return func(s *Service) { + if repository != nil { + s.contentBlacklistRepository = repository + } + } +} + // WithCountryChangeCooldown 配置用户国家修改冷却窗口。 func WithCountryChangeCooldown(cooldown time.Duration) Option { return func(s *Service) { diff --git a/services/user-service/internal/service/user/user.go b/services/user-service/internal/service/user/user.go index bfbf5929..779e4908 100644 --- a/services/user-service/internal/service/user/user.go +++ b/services/user-service/internal/service/user/user.go @@ -33,7 +33,20 @@ func (s *Service) GetUser(ctx context.Context, userID int64) (userdomain.User, e } // 查询用户时顺带执行靓号懒过期,返回给上游的是当前有效展示号。 - return s.refreshExpiredUser(ctx, user, "") + user, err = s.refreshExpiredUser(ctx, user, "") + if err != nil { + return userdomain.User{}, err + } + if s.contentBlacklistRepository == nil { + // 纯 service 单测允许只注入最小 UserRepository;生产装配会自动注入同库 blacklist repository。 + return user, nil + } + user.ContentBlacklisted, err = s.contentBlacklistRepository.IsUserContentBlacklisted(ctx, userID) + if err != nil { + // 屏蔽状态读取失败不能按“未屏蔽”降级,否则数据库抖动会把运营限制静默放开。 + return userdomain.User{}, err + } + return user, nil } // GetInviteAttribution 按被邀请用户读取邀请关系;没有关系时返回 Found=false,调用方按普通非邀请充值处理。 diff --git a/services/user-service/internal/storage/mysql/user/content_blacklist.go b/services/user-service/internal/storage/mysql/user/content_blacklist.go new file mode 100644 index 00000000..b511e648 --- /dev/null +++ b/services/user-service/internal/storage/mysql/user/content_blacklist.go @@ -0,0 +1,214 @@ +package user + +import ( + "context" + "database/sql" + "time" + + "hyapp/pkg/appcode" + "hyapp/pkg/xerr" + userdomain "hyapp/services/user-service/internal/domain/user" + userservice "hyapp/services/user-service/internal/service/user" +) + +const contentBlacklistEntryColumns = ` + b.user_id, + CASE + WHEN u.current_display_user_id_kind <> 'default' + AND COALESCE(u.current_display_user_id_expires_at_ms, 0) > 0 + AND u.current_display_user_id_expires_at_ms <= ? + THEN u.default_display_user_id + ELSE u.current_display_user_id + END, + u.default_display_user_id, + COALESCE(( + SELECT pdi.pretty_id + FROM pretty_display_user_id_leases pdl + LEFT JOIN pretty_display_ids pdi + ON pdi.app_code = pdl.app_code + AND pdi.assigned_lease_id = pdl.lease_id + AND pdi.assigned_user_id = pdl.user_id + WHERE pdl.app_code = u.app_code + AND pdl.user_id = u.user_id + AND pdl.status = 'active' + AND (pdl.expires_at_ms = 0 OR pdl.expires_at_ms > ?) + ORDER BY pdl.starts_at_ms DESC + LIMIT 1 + ), ''), + COALESCE(( + SELECT pdl.display_user_id + FROM pretty_display_user_id_leases pdl + WHERE pdl.app_code = u.app_code + AND pdl.user_id = u.user_id + AND pdl.status = 'active' + AND (pdl.expires_at_ms = 0 OR pdl.expires_at_ms > ?) + ORDER BY pdl.starts_at_ms DESC + LIMIT 1 + ), ''), + COALESCE(u.username, ''), + COALESCE(u.avatar, ''), + u.status, + b.operator_admin_id, + b.reason, + b.created_at_ms, + b.updated_at_ms` + +// IsUserContentBlacklisted 使用租户和用户主键做单点判断。 +// 该查询位于 GetUser 链路,必须保持 O(1),不能为运行时裁决扫描黑名单列表。 +func (r *Repository) IsUserContentBlacklisted(ctx context.Context, userID int64) (bool, error) { + var blacklisted bool + err := r.db.QueryRowContext(ctx, ` + SELECT EXISTS ( + SELECT 1 + FROM user_content_blacklist + WHERE app_code = ? AND user_id = ? AND status = 'active' + )`, + appcode.FromContext(ctx), userID, + ).Scan(&blacklisted) + return blacklisted, err +} + +// ListUserContentBlacklist 只列出 active 当前态;用户展示资料实时关联 users,避免后台看到过期昵称或头像快照。 +func (r *Repository) ListUserContentBlacklist(ctx context.Context, page int32, pageSize int32) ([]userdomain.ContentBlacklistEntry, int64, error) { + appCode := appcode.FromContext(ctx) + var total int64 + if err := r.db.QueryRowContext(ctx, ` + SELECT COUNT(*) + FROM user_content_blacklist FORCE INDEX (idx_user_content_blacklist_status_time) + WHERE app_code = ? AND status = 'active'`, + appCode, + ).Scan(&total); err != nil { + return nil, 0, err + } + + nowMS := userserviceNowMillis() + rows, err := r.db.QueryContext(ctx, ` + SELECT `+contentBlacklistEntryColumns+` + FROM user_content_blacklist b FORCE INDEX (idx_user_content_blacklist_status_time) + INNER JOIN users u ON u.user_id = b.user_id AND u.app_code = b.app_code + WHERE b.app_code = ? AND b.status = 'active' + ORDER BY b.created_at_ms DESC, b.user_id DESC + LIMIT ? OFFSET ?`, + nowMS, nowMS, nowMS, appCode, pageSize, int64(page-1)*int64(pageSize), + ) + if err != nil { + return nil, 0, err + } + defer rows.Close() + + items := make([]userdomain.ContentBlacklistEntry, 0, pageSize) + for rows.Next() { + item, err := scanContentBlacklistEntry(rows) + if err != nil { + return nil, 0, err + } + items = append(items, item) + } + if err := rows.Err(); err != nil { + return nil, 0, err + } + return items, total, nil +} + +// AddUserContentBlacklist 以 (app_code,user_id) 保存一行当前态。 +// 从 removed 恢复时重置加入时间;重复 active 添加只更新操作者、原因和更新时间。 +func (r *Repository) AddUserContentBlacklist(ctx context.Context, command userservice.UserContentBlacklistCommand) (userdomain.ContentBlacklistEntry, error) { + appCode := appcode.FromContext(ctx) + if err := r.requireContentBlacklistUser(ctx, appCode, command.UserID); err != nil { + return userdomain.ContentBlacklistEntry{}, err + } + _, err := r.db.ExecContext(ctx, ` + INSERT INTO user_content_blacklist ( + app_code, user_id, status, operator_admin_id, reason, created_at_ms, updated_at_ms + ) VALUES (?, ?, 'active', ?, ?, ?, ?) + ON DUPLICATE KEY UPDATE + created_at_ms = IF(status = 'active', created_at_ms, VALUES(created_at_ms)), + status = 'active', + operator_admin_id = VALUES(operator_admin_id), + reason = VALUES(reason), + updated_at_ms = VALUES(updated_at_ms)`, + appCode, command.UserID, command.OperatorAdminID, command.Reason, command.NowMs, command.NowMs, + ) + if err != nil { + return userdomain.ContentBlacklistEntry{}, err + } + return r.getUserContentBlacklistEntry(ctx, appCode, command.UserID, command.NowMs) +} + +// RemoveUserContentBlacklist 软移除当前态,保留最后一次操作元数据供数据库排障。 +func (r *Repository) RemoveUserContentBlacklist(ctx context.Context, command userservice.UserContentBlacklistCommand) (bool, error) { + result, err := r.db.ExecContext(ctx, ` + UPDATE user_content_blacklist + SET status = 'removed', + operator_admin_id = ?, + reason = ?, + updated_at_ms = ? + WHERE app_code = ? AND user_id = ? AND status = 'active'`, + command.OperatorAdminID, command.Reason, command.NowMs, appcode.FromContext(ctx), command.UserID, + ) + if err != nil { + return false, err + } + affected, err := result.RowsAffected() + if err != nil { + return false, err + } + return affected > 0, nil +} + +func (r *Repository) requireContentBlacklistUser(ctx context.Context, appCode string, userID int64) error { + var exists int + err := r.db.QueryRowContext(ctx, ` + SELECT 1 + FROM users FORCE INDEX (PRIMARY) + WHERE user_id = ? AND app_code = ?`, + userID, appCode, + ).Scan(&exists) + if err == sql.ErrNoRows { + return xerr.New(xerr.NotFound, "user not found") + } + return err +} + +func (r *Repository) getUserContentBlacklistEntry(ctx context.Context, appCode string, userID int64, nowMS int64) (userdomain.ContentBlacklistEntry, error) { + row := r.db.QueryRowContext(ctx, ` + SELECT `+contentBlacklistEntryColumns+` + FROM user_content_blacklist b + INNER JOIN users u ON u.user_id = b.user_id AND u.app_code = b.app_code + WHERE b.app_code = ? AND b.user_id = ? AND b.status = 'active'`, + nowMS, nowMS, nowMS, appCode, userID, + ) + item, err := scanContentBlacklistEntry(row) + if err == sql.ErrNoRows { + return userdomain.ContentBlacklistEntry{}, xerr.New(xerr.NotFound, "content blacklist entry not found") + } + return item, err +} + +func scanContentBlacklistEntry(scanner interface { + Scan(dest ...any) error +}) (userdomain.ContentBlacklistEntry, error) { + var item userdomain.ContentBlacklistEntry + var status string + err := scanner.Scan( + &item.UserID, + &item.CurrentDisplayUserID, + &item.DefaultDisplayUserID, + &item.PrettyID, + &item.PrettyDisplayUserID, + &item.Username, + &item.Avatar, + &status, + &item.OperatorAdminID, + &item.Reason, + &item.CreatedAtMs, + &item.UpdatedAtMs, + ) + item.UserStatus = userdomain.Status(status) + return item, err +} + +func userserviceNowMillis() int64 { + // 列表只用该时间判断展示号租约,不产生持久事实;UTC epoch 不受进程本地时区影响。 + return time.Now().UTC().UnixMilli() +} diff --git a/services/user-service/internal/transport/grpc/convert.go b/services/user-service/internal/transport/grpc/convert.go index a264f90e..3aab0853 100644 --- a/services/user-service/internal/transport/grpc/convert.go +++ b/services/user-service/internal/transport/grpc/convert.go @@ -92,6 +92,24 @@ func toProtoUser(user userdomain.User) *userv1.User { Invite: toProtoInviteOverview(user.InviteOverview), PrettyId: user.PrettyID, PrettyDisplayUserId: user.PrettyDisplayUserID, + ContentBlacklisted: user.ContentBlacklisted, + } +} + +func toProtoUserContentBlacklistEntry(item userdomain.ContentBlacklistEntry) *userv1.UserContentBlacklistEntry { + return &userv1.UserContentBlacklistEntry{ + UserId: item.UserID, + DisplayUserId: item.CurrentDisplayUserID, + DefaultDisplayUserId: item.DefaultDisplayUserID, + PrettyId: item.PrettyID, + PrettyDisplayUserId: item.PrettyDisplayUserID, + Username: item.Username, + Avatar: item.Avatar, + UserStatus: toProtoStatus(item.UserStatus), + OperatorAdminId: item.OperatorAdminID, + Reason: item.Reason, + CreatedAtMs: item.CreatedAtMs, + UpdatedAtMs: item.UpdatedAtMs, } } diff --git a/services/user-service/internal/transport/grpc/server.go b/services/user-service/internal/transport/grpc/server.go index 14f04a74..c23afe06 100644 --- a/services/user-service/internal/transport/grpc/server.go +++ b/services/user-service/internal/transport/grpc/server.go @@ -784,6 +784,48 @@ func (s *Server) AdminIssueUserAccessToken(ctx context.Context, req *userv1.Admi }, nil } +// ListUserContentBlacklist 返回当前 App 的运营内容屏蔽用户。 +func (s *Server) ListUserContentBlacklist(ctx context.Context, req *userv1.ListUserContentBlacklistRequest) (*userv1.ListUserContentBlacklistResponse, error) { + ctx = contextWithApp(ctx, req.GetMeta()) + items, total, err := s.userSvc.ListUserContentBlacklist(ctx, req.GetPage(), req.GetPageSize()) + if err != nil { + return nil, xerr.ToGRPCError(err) + } + result := make([]*userv1.UserContentBlacklistEntry, 0, len(items)) + for _, item := range items { + result = append(result, toProtoUserContentBlacklistEntry(item)) + } + return &userv1.ListUserContentBlacklistResponse{Items: result, Total: total}, nil +} + +// AdminAddUserContentBlacklist 只启用游戏列表和 Banner 屏蔽,不修改用户主状态或会话。 +func (s *Server) AdminAddUserContentBlacklist(ctx context.Context, req *userv1.AdminAddUserContentBlacklistRequest) (*userv1.AdminAddUserContentBlacklistResponse, error) { + ctx = contextWithApp(ctx, req.GetMeta()) + item, err := s.userSvc.AdminAddUserContentBlacklist(ctx, userservice.UserContentBlacklistCommand{ + UserID: req.GetUserId(), + OperatorAdminID: req.GetOperatorAdminId(), + Reason: req.GetReason(), + }) + if err != nil { + return nil, xerr.ToGRPCError(err) + } + return &userv1.AdminAddUserContentBlacklistResponse{Item: toProtoUserContentBlacklistEntry(item)}, nil +} + +// AdminRemoveUserContentBlacklist 幂等关闭运营内容屏蔽,removed=false 表示目标已经不在名单中。 +func (s *Server) AdminRemoveUserContentBlacklist(ctx context.Context, req *userv1.AdminRemoveUserContentBlacklistRequest) (*userv1.AdminRemoveUserContentBlacklistResponse, error) { + ctx = contextWithApp(ctx, req.GetMeta()) + removed, err := s.userSvc.AdminRemoveUserContentBlacklist(ctx, userservice.UserContentBlacklistCommand{ + UserID: req.GetUserId(), + OperatorAdminID: req.GetOperatorAdminId(), + Reason: req.GetReason(), + }) + if err != nil { + return nil, xerr.ToGRPCError(err) + } + return &userv1.AdminRemoveUserContentBlacklistResponse{Removed: removed}, nil +} + // BatchGetRoomBasicUsers 批量返回房间首屏最小用户展示资料。 func (s *Server) BatchGetRoomBasicUsers(ctx context.Context, req *userv1.BatchGetRoomBasicUsersRequest) (*userv1.BatchGetRoomBasicUsersResponse, error) { ctx = contextWithApp(ctx, req.GetMeta()) diff --git a/services/wallet-service/configs/config.docker.yaml b/services/wallet-service/configs/config.docker.yaml index 9ae8486a..9fea18ab 100644 --- a/services/wallet-service/configs/config.docker.yaml +++ b/services/wallet-service/configs/config.docker.yaml @@ -16,6 +16,15 @@ red_packet_expiry_worker: enabled: true poll_interval: "5s" batch_size: 50 +resource_equipment_cleanup_worker: + # 读取链路只过滤有效装备;物理删除由 Wallet 多副本共享的单写者游标任务完成。 + enabled: true + poll_interval: "30s" + query_timeout: "3s" + batch_pause: "25ms" + scan_batch_size: 200 + delete_batch_size: 50 + round_max_scanned_rows: 2000 projection_worker: enabled: true poll_interval: "60s" diff --git a/services/wallet-service/configs/config.tencent.example.yaml b/services/wallet-service/configs/config.tencent.example.yaml index a7d613db..74e630ff 100644 --- a/services/wallet-service/configs/config.tencent.example.yaml +++ b/services/wallet-service/configs/config.tencent.example.yaml @@ -16,6 +16,15 @@ red_packet_expiry_worker: enabled: true poll_interval: "5s" batch_size: 50 +resource_equipment_cleanup_worker: + # 单轮最多扫描 2000 个稳定主键;线上按页短事务,避免和 Equip/Revoke 长时间争锁。 + enabled: true + poll_interval: "30s" + query_timeout: "3s" + batch_pause: "25ms" + scan_batch_size: 200 + delete_batch_size: 50 + round_max_scanned_rows: 2000 projection_worker: enabled: true poll_interval: "60s" diff --git a/services/wallet-service/configs/config.yaml b/services/wallet-service/configs/config.yaml index e94112f2..8b8c5cbc 100644 --- a/services/wallet-service/configs/config.yaml +++ b/services/wallet-service/configs/config.yaml @@ -16,6 +16,15 @@ red_packet_expiry_worker: enabled: true poll_interval: "5s" batch_size: 50 +resource_equipment_cleanup_worker: + # 读取链路只过滤有效装备;物理删除由 Wallet 多副本共享的单写者游标任务完成。 + enabled: true + poll_interval: "30s" + query_timeout: "3s" + batch_pause: "25ms" + scan_batch_size: 200 + delete_batch_size: 50 + round_max_scanned_rows: 2000 projection_worker: enabled: true poll_interval: "60s" diff --git a/services/wallet-service/deploy/mysql/initdb/001_wallet_service.sql b/services/wallet-service/deploy/mysql/initdb/001_wallet_service.sql index fdec849d..14c7a754 100644 --- a/services/wallet-service/deploy/mysql/initdb/001_wallet_service.sql +++ b/services/wallet-service/deploy/mysql/initdb/001_wallet_service.sql @@ -409,7 +409,10 @@ CREATE TABLE IF NOT EXISTS host_agency_salary_policies ( gift_coin_to_diamond_ratio DECIMAL(18,6) NOT NULL DEFAULT 1.000000 COMMENT '周期钻石政策系数快照,1 表示不调整礼物类型倍率', point_diamonds_per_usd BIGINT NOT NULL DEFAULT 0 COMMENT 'POINT_DIAMOND 每美元对应钻石积分', coins_per_usd BIGINT NOT NULL DEFAULT 0 COMMENT 'POINT_DIAMOND 每美元对应金币', - minimum_withdraw_usd_minor BIGINT NOT NULL DEFAULT 0 COMMENT 'POINT_DIAMOND 最低提现美元美分', + minimum_withdraw_usd_minor BIGINT NOT NULL DEFAULT 0 COMMENT '兼容旧客户端的平台最低提现美元美分', + coin_seller_minimum_withdraw_usd_minor BIGINT NOT NULL DEFAULT 0 COMMENT 'POINT_DIAMOND 用户找币商最低提现美元美分;0 回退旧字段', + platform_minimum_withdraw_usd_minor BIGINT NOT NULL DEFAULT 0 COMMENT 'POINT_DIAMOND 用户找平台最低提现美元美分;0 回退旧字段', + diamond_exchange_enabled BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否开放 POINT_DIAMOND 兑换金币', withdraw_fee_bps INT NOT NULL DEFAULT 0 COMMENT 'POINT_DIAMOND 提现费率基点', agency_point_share_bps INT NOT NULL DEFAULT 0 COMMENT 'POINT_DIAMOND 代理分成占主播基础积分的基点', residual_diamond_to_usd_rate DECIMAL(24,12) NOT NULL DEFAULT 0.000000000000 COMMENT '月底剩余钻石转美元比例', @@ -1712,6 +1715,16 @@ CREATE TABLE IF NOT EXISTS user_resource_equipment ( KEY idx_user_resource_equipment_user (app_code, user_id, updated_at_ms) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户资源装备表'; +CREATE TABLE IF NOT EXISTS wallet_resource_equipment_cleanup_state ( + job_name VARCHAR(64) NOT NULL COMMENT 'Wallet owner 清理任务稳定名称', + cursor_app_code VARCHAR(32) NOT NULL DEFAULT '' COMMENT '装备主键游标 App', + cursor_user_id BIGINT NOT NULL DEFAULT 0 COMMENT '装备主键游标用户', + cursor_resource_type VARCHAR(32) NOT NULL DEFAULT '' COMMENT '装备主键游标资源类型', + cursor_entitlement_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '装备主键游标权益', + updated_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '游标提交时间,UTC epoch ms', + PRIMARY KEY (job_name) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Wallet 资源装备物理清理游标'; + -- 装备命令以 (app_code,command_id) 点查并先于 entitlement/equipment 行加锁;不对装备表做历史扫描。 -- 记录首个成功回包快照,确保网络重试不会因资源随后到期或后台下架而改变业务结果。 CREATE TABLE IF NOT EXISTS user_resource_equipment_commands ( diff --git a/services/wallet-service/deploy/mysql/migrations/023_host_policy_withdrawal_minimums_and_exchange.sql b/services/wallet-service/deploy/mysql/migrations/023_host_policy_withdrawal_minimums_and_exchange.sql new file mode 100644 index 00000000..9f74cdee --- /dev/null +++ b/services/wallet-service/deploy/mysql/migrations/023_host_policy_withdrawal_minimums_and_exchange.sql @@ -0,0 +1,18 @@ +SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci; +SET time_zone = '+00:00'; + +USE hyapp_wallet; + +-- 运行政策表远小于钱包流水;只追加定长列并使用在线 DDL,不读取或回填 wallet_transactions/wallet_entries。 +-- 既有快照的新渠道字段保持 0,由运行时回退旧 minimum_withdraw_usd_minor,避免迁移期大范围 UPDATE。 +SET @ddl = IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'host_agency_salary_policies' AND COLUMN_NAME = 'coin_seller_minimum_withdraw_usd_minor') = 0, + 'ALTER TABLE host_agency_salary_policies ADD COLUMN coin_seller_minimum_withdraw_usd_minor BIGINT NOT NULL DEFAULT 0 COMMENT ''POINT_DIAMOND 用户找币商最低提现美元美分;0 回退旧字段'' AFTER minimum_withdraw_usd_minor, ALGORITHM=INPLACE, LOCK=NONE', 'SELECT 1'); +PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @ddl = IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'host_agency_salary_policies' AND COLUMN_NAME = 'platform_minimum_withdraw_usd_minor') = 0, + 'ALTER TABLE host_agency_salary_policies ADD COLUMN platform_minimum_withdraw_usd_minor BIGINT NOT NULL DEFAULT 0 COMMENT ''POINT_DIAMOND 用户找平台最低提现美元美分;0 回退旧字段'' AFTER coin_seller_minimum_withdraw_usd_minor, ALGORITHM=INPLACE, LOCK=NONE', 'SELECT 1'); +PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @ddl = IF((SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'host_agency_salary_policies' AND COLUMN_NAME = 'diamond_exchange_enabled') = 0, + 'ALTER TABLE host_agency_salary_policies ADD COLUMN diamond_exchange_enabled BOOLEAN NOT NULL DEFAULT TRUE COMMENT ''是否开放 POINT_DIAMOND 兑换金币'' AFTER platform_minimum_withdraw_usd_minor, ALGORITHM=INPLACE, LOCK=NONE', 'SELECT 1'); +PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; diff --git a/services/wallet-service/deploy/mysql/migrations/024_resource_equipment_cleanup_state.sql b/services/wallet-service/deploy/mysql/migrations/024_resource_equipment_cleanup_state.sql new file mode 100644 index 00000000..83b215ea --- /dev/null +++ b/services/wallet-service/deploy/mysql/migrations/024_resource_equipment_cleanup_state.sql @@ -0,0 +1,11 @@ +-- 只创建单行游标小表,不扫描或重建 user_resource_equipment;生产执行对现有装备表无锁表 DDL。 +-- 后台清理通过装备复合主键做固定上限范围扫描,游标与删除在同一短事务提交。 +CREATE TABLE IF NOT EXISTS wallet_resource_equipment_cleanup_state ( + job_name VARCHAR(64) NOT NULL COMMENT 'Wallet owner 清理任务稳定名称', + cursor_app_code VARCHAR(32) NOT NULL DEFAULT '' COMMENT '装备主键游标 App', + cursor_user_id BIGINT NOT NULL DEFAULT 0 COMMENT '装备主键游标用户', + cursor_resource_type VARCHAR(32) NOT NULL DEFAULT '' COMMENT '装备主键游标资源类型', + cursor_entitlement_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '装备主键游标权益', + updated_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '游标提交时间,UTC epoch ms', + PRIMARY KEY (job_name) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Wallet 资源装备物理清理游标'; diff --git a/services/wallet-service/internal/app/app.go b/services/wallet-service/internal/app/app.go index d38c1cfa..846abfdd 100644 --- a/services/wallet-service/internal/app/app.go +++ b/services/wallet-service/internal/app/app.go @@ -54,6 +54,7 @@ type App struct { projectionWorkerCfg config.ProjectionWorkerConfig googlePaidSyncWorkerCfg config.GooglePaidSyncWorkerConfig externalRechargeReconcileWorkerCfg config.ExternalRechargeReconcileWorkerConfig + resourceEquipmentCleanupWorkerCfg config.ResourceEquipmentCleanupWorkerConfig walletOutboxTopic string realtimeWalletOutboxTopic string walletEventTagMode config.WalletEventTagMode @@ -232,6 +233,7 @@ func New(cfg config.Config) (*App, error) { projectionWorkerCfg: cfg.ProjectionWorker, googlePaidSyncWorkerCfg: googlePaidSyncWorkerCfg, externalRechargeReconcileWorkerCfg: cfg.ExternalRechargeReconcileWorker, + resourceEquipmentCleanupWorkerCfg: cfg.ResourceEquipmentCleanupWorker, walletOutboxTopic: cfg.RocketMQ.WalletOutbox.Topic, realtimeWalletOutboxTopic: cfg.RocketMQ.RealtimeOutbox.Topic, walletEventTagMode: cfg.RocketMQ.WalletEventTagMode, diff --git a/services/wallet-service/internal/app/background_workers.go b/services/wallet-service/internal/app/background_workers.go index 82bdfd1d..3e3dc06b 100644 --- a/services/wallet-service/internal/app/background_workers.go +++ b/services/wallet-service/internal/app/background_workers.go @@ -35,4 +35,9 @@ func (a *App) runBackgroundWorkers() { if a.redPacketExpiryWorkerCfg.Enabled { a.startRedPacketExpiryWorker(ctx) } + if a.resourceEquipmentCleanupWorkerCfg.Enabled { + // 装备残留是 Wallet owner 数据;多副本只由 advisory lock winner 执行物理删除, + // gateway/cron 都不能直连钱包库或在用户请求内代做清理。 + a.startResourceEquipmentCleanupWorker(ctx) + } } diff --git a/services/wallet-service/internal/app/resource_equipment_cleanup.go b/services/wallet-service/internal/app/resource_equipment_cleanup.go new file mode 100644 index 00000000..01914a82 --- /dev/null +++ b/services/wallet-service/internal/app/resource_equipment_cleanup.go @@ -0,0 +1,90 @@ +package app + +import ( + "context" + "errors" + "log/slog" + "time" + + "hyapp/pkg/logx" +) + +func (a *App) startResourceEquipmentCleanupWorker(ctx context.Context) { + a.workers.Add(1) + go func() { + defer a.workers.Done() + ticker := time.NewTicker(a.resourceEquipmentCleanupWorkerCfg.PollInterval) + defer ticker.Stop() + for { + if err := a.runResourceEquipmentCleanupRound(ctx); err != nil && !errors.Is(err, context.Canceled) { + logx.Error(ctx, "wallet_resource_equipment_cleanup_round_failed", err) + } + select { + case <-ctx.Done(): + return + case <-ticker.C: + } + } + }() +} + +func (a *App) runResourceEquipmentCleanupRound(ctx context.Context) error { + if a.mysqlRepo == nil { + return nil + } + cfg := a.resourceEquipmentCleanupWorkerCfg + lockCtx, lockCancel := context.WithTimeout(ctx, cfg.QueryTimeout) + release, acquired, err := a.mysqlRepo.AcquireResourceEquipmentCleanupLock(lockCtx) + lockCancel() + if err != nil || !acquired { + return err + } + defer release() + + totalScanned := 0 + totalDeleted := 0 + totalDeadlockRetries := 0 + reachedEnd := false + for totalScanned < cfg.RoundMaxScannedRows { + pageCtx, pageCancel := context.WithTimeout(ctx, cfg.QueryTimeout) + result, pageErr := a.mysqlRepo.CleanupExpiredResourceEquipmentPage( + pageCtx, + cfg.ScanBatchSize, + cfg.DeleteBatchSize, + time.Now().UTC().UnixMilli(), + ) + pageCancel() + if pageErr != nil { + return pageErr + } + totalScanned += result.ScannedCount + totalDeleted += result.DeletedCount + totalDeadlockRetries += result.DeadlockRetries + if result.ReachedEnd { + reachedEnd = true + break + } + if cfg.BatchPause > 0 { + timer := time.NewTimer(cfg.BatchPause) + select { + case <-ctx.Done(): + if !timer.Stop() { + <-timer.C + } + return ctx.Err() + case <-timer.C: + } + } + } + + if totalDeleted > 0 || totalDeadlockRetries > 0 { + // 日志只记录有实际回收或发生窄重试的轮次;空表巡检不制造周期性噪音。 + logx.Info(ctx, "wallet_resource_equipment_cleanup_completed", + slog.Int("scanned_count", totalScanned), + slog.Int("deleted_count", totalDeleted), + slog.Int("deadlock_retries", totalDeadlockRetries), + slog.Bool("reached_end", reachedEnd), + ) + } + return nil +} diff --git a/services/wallet-service/internal/config/config.go b/services/wallet-service/internal/config/config.go index f9ff5353..71965590 100644 --- a/services/wallet-service/internal/config/config.go +++ b/services/wallet-service/internal/config/config.go @@ -47,6 +47,8 @@ type Config struct { ExternalRecharge ExternalRechargeConfig `yaml:"external_recharge"` // ExternalRechargeReconcileWorker 控制三方支付回调丢失后的服务端查单补偿。 ExternalRechargeReconcileWorker ExternalRechargeReconcileWorkerConfig `yaml:"external_recharge_reconcile_worker"` + // ResourceEquipmentCleanupWorker 把失效装备的物理删除收敛到 Wallet owner 后台,读取接口只做有效性过滤。 + ResourceEquipmentCleanupWorker ResourceEquipmentCleanupWorkerConfig `yaml:"resource_equipment_cleanup_worker"` // OutboxWorker 控制 wallet_outbox 到 MQ 的补偿投递。 OutboxWorker OutboxWorkerConfig `yaml:"outbox_worker"` // OutboxArchive 把已投递事实归档到外部存储;purge 仅对恢复验证且命中正向安全策略的精确成员开放。 @@ -336,6 +338,17 @@ type ExternalRechargeReconcileWorkerConfig struct { BatchSize int `yaml:"batch_size"` } +// ResourceEquipmentCleanupWorkerConfig 控制失效装备的单写者、游标式物理清理。 +type ResourceEquipmentCleanupWorkerConfig struct { + Enabled bool `yaml:"enabled"` + PollInterval time.Duration `yaml:"poll_interval"` + QueryTimeout time.Duration `yaml:"query_timeout"` + BatchPause time.Duration `yaml:"batch_pause"` + ScanBatchSize int `yaml:"scan_batch_size"` + DeleteBatchSize int `yaml:"delete_batch_size"` + RoundMaxScannedRows int `yaml:"round_max_scanned_rows"` +} + // Default 返回本地开发默认配置。 func Default() Config { return Config{ @@ -402,6 +415,15 @@ func Default() Config { PollInterval: 30 * time.Second, BatchSize: 50, }, + ResourceEquipmentCleanupWorker: ResourceEquipmentCleanupWorkerConfig{ + Enabled: true, + PollInterval: 30 * time.Second, + QueryTimeout: 3 * time.Second, + BatchPause: 25 * time.Millisecond, + ScanBatchSize: 200, + DeleteBatchSize: 50, + RoundMaxScannedRows: 2000, + }, OutboxWorker: OutboxWorkerConfig{ Enabled: false, PollInterval: time.Second, @@ -600,6 +622,10 @@ func Load(path string) (Config, error) { cfg.ExternalRecharge.V5PayReturnURL = strings.TrimSpace(cfg.ExternalRecharge.V5PayReturnURL) // USDT 功能开关默认打开;未配置收款地址时 H5 不展示 USDT 下单入口,但配置本身不被静默改成关闭。 cfg.ExternalRechargeReconcileWorker = normalizeExternalRechargeReconcileWorkerConfig(cfg.ExternalRechargeReconcileWorker, Default().ExternalRechargeReconcileWorker) + cfg.ResourceEquipmentCleanupWorker = normalizeResourceEquipmentCleanupWorkerConfig( + cfg.ResourceEquipmentCleanupWorker, + Default().ResourceEquipmentCleanupWorker, + ) cfg.OutboxWorker = normalizeOutboxWorkerConfig(cfg.OutboxWorker, Default().OutboxWorker) if cfg.OutboxWorker.Enabled && !cfg.RocketMQ.WalletOutbox.Enabled { return Config{}, errors.New("outbox_worker requires rocketmq.wallet_outbox.enabled") @@ -953,6 +979,40 @@ func normalizeOutboxWorkerConfig(cfg OutboxWorkerConfig, defaults OutboxWorkerCo return cfg } +func normalizeResourceEquipmentCleanupWorkerConfig(cfg ResourceEquipmentCleanupWorkerConfig, defaults ResourceEquipmentCleanupWorkerConfig) ResourceEquipmentCleanupWorkerConfig { + if cfg.PollInterval <= 0 { + cfg.PollInterval = defaults.PollInterval + } + if cfg.QueryTimeout <= 0 { + cfg.QueryTimeout = defaults.QueryTimeout + } + if cfg.BatchPause < 0 { + cfg.BatchPause = defaults.BatchPause + } + if cfg.ScanBatchSize <= 0 { + cfg.ScanBatchSize = defaults.ScanBatchSize + } + if cfg.ScanBatchSize > 1000 { + cfg.ScanBatchSize = 1000 + } + if cfg.DeleteBatchSize <= 0 { + cfg.DeleteBatchSize = defaults.DeleteBatchSize + } + if cfg.DeleteBatchSize > cfg.ScanBatchSize { + cfg.DeleteBatchSize = cfg.ScanBatchSize + } + if cfg.RoundMaxScannedRows <= 0 { + cfg.RoundMaxScannedRows = defaults.RoundMaxScannedRows + } + if cfg.RoundMaxScannedRows < cfg.ScanBatchSize { + cfg.RoundMaxScannedRows = cfg.ScanBatchSize + } + if cfg.RoundMaxScannedRows > 100_000 { + cfg.RoundMaxScannedRows = 100_000 + } + return cfg +} + func normalizeOutboxArchiveConfig(cfg OutboxArchiveConfig, defaults OutboxArchiveConfig) (OutboxArchiveConfig, error) { cfg.Mode = OutboxArchiveMode(strings.ToLower(strings.TrimSpace(string(cfg.Mode)))) if cfg.Mode == "" { diff --git a/services/wallet-service/internal/domain/ledger/host_salary.go b/services/wallet-service/internal/domain/ledger/host_salary.go index 43a38ba2..a5d6b8e1 100644 --- a/services/wallet-service/internal/domain/ledger/host_salary.go +++ b/services/wallet-service/internal/domain/ledger/host_salary.go @@ -39,17 +39,21 @@ type HostSalaryPolicy struct { SettlementMode string SettlementTriggerMode string // GiftCoinToDiamondRatio 是叠加在礼物类型倍率上的 Host 政策系数,1 表示不调整。 - GiftCoinToDiamondRatio string - PointDiamondsPerUSD int64 - CoinsPerUSD int64 - MinimumWithdrawUSDMinor int64 - WithdrawFeeBPS int32 - AgencyPointShareBPS int32 - ResidualDiamondToUSDRate string - CoinSellerWithdrawalLimitPeriod string - CoinSellerWithdrawalLimitCount int64 - PlatformWithdrawalLimitPeriod string - PlatformWithdrawalLimitCount int64 + GiftCoinToDiamondRatio string + PointDiamondsPerUSD int64 + CoinsPerUSD int64 + // MinimumWithdrawUSDMinor 是历史客户端兼容值,始终投影平台提现门槛;资金校验必须读取下面的渠道字段。 + MinimumWithdrawUSDMinor int64 + CoinSellerMinimumWithdrawUSDMinor int64 + PlatformMinimumWithdrawUSDMinor int64 + DiamondExchangeEnabled bool + WithdrawFeeBPS int32 + AgencyPointShareBPS int32 + ResidualDiamondToUSDRate string + CoinSellerWithdrawalLimitPeriod string + CoinSellerWithdrawalLimitCount int64 + PlatformWithdrawalLimitPeriod string + PlatformWithdrawalLimitCount int64 // PlatformWithdrawalAllowedDays 是 UTC 月内日的规范逗号串;空串表示不限制提现日期。 PlatformWithdrawalAllowedDays string EffectiveFromMs int64 diff --git a/services/wallet-service/internal/domain/ledger/point_coin_seller.go b/services/wallet-service/internal/domain/ledger/point_coin_seller.go index 6ba0655d..66bcb938 100644 --- a/services/wallet-service/internal/domain/ledger/point_coin_seller.go +++ b/services/wallet-service/internal/domain/ledger/point_coin_seller.go @@ -81,20 +81,24 @@ type PointToCoinReceipt struct { // PointWithdrawalRuntimeConfig 是已发布 wallet 政策中钱包页需要展示并用于冻结的 POINT 参数。 type PointWithdrawalRuntimeConfig struct { - Found bool - PointsPerUSD int64 - CoinsPerUSD int64 - FeeBPS int64 - MinimumPoints int64 - PolicyInstanceCode string - PolicyType string - MinimumWithdrawUSDMinor int64 - AgencyPointShareBPS int32 - PolicyID uint64 - PolicyVersion uint64 - AvailabilityEvaluated bool - CoinSellerAvailability PointWithdrawalActionAvailability - PlatformAvailability PointWithdrawalActionAvailability + Found bool + PointsPerUSD int64 + CoinsPerUSD int64 + FeeBPS int64 + MinimumPoints int64 + PolicyInstanceCode string + PolicyType string + // MinimumWithdrawUSDMinor 兼容旧客户端,值等于平台提现门槛。 + MinimumWithdrawUSDMinor int64 + CoinSellerMinimumWithdrawUSDMinor int64 + PlatformMinimumWithdrawUSDMinor int64 + DiamondExchangeEnabled bool + AgencyPointShareBPS int32 + PolicyID uint64 + PolicyVersion uint64 + AvailabilityEvaluated bool + CoinSellerAvailability PointWithdrawalActionAvailability + PlatformAvailability PointWithdrawalActionAvailability } // PointWithdrawalActionAvailability 是钱包按当前 UTC 日期和已消费次数计算的实时能力; diff --git a/services/wallet-service/internal/storage/mysql/host_salary_settlement.go b/services/wallet-service/internal/storage/mysql/host_salary_settlement.go index a3aa0dbf..55e516d3 100644 --- a/services/wallet-service/internal/storage/mysql/host_salary_settlement.go +++ b/services/wallet-service/internal/storage/mysql/host_salary_settlement.go @@ -491,7 +491,9 @@ func (r *Repository) queryBoundHostSalaryPolicy(ctx context.Context, q hostSalar SELECT p.policy_id, binding.cycle_key, p.policy_version, p.name, p.policy_type, binding.region_id, p.status, p.settlement_mode, p.settlement_trigger_mode, CAST(p.gift_coin_to_diamond_ratio AS CHAR), - p.point_diamonds_per_usd, p.coins_per_usd, p.minimum_withdraw_usd_minor, p.withdraw_fee_bps, p.agency_point_share_bps, + p.point_diamonds_per_usd, p.coins_per_usd, p.minimum_withdraw_usd_minor, + p.coin_seller_minimum_withdraw_usd_minor, p.platform_minimum_withdraw_usd_minor, p.diamond_exchange_enabled, + p.withdraw_fee_bps, p.agency_point_share_bps, CAST(p.residual_diamond_to_usd_rate AS CHAR), p.coin_seller_withdrawal_limit_period, p.coin_seller_withdrawal_limit_count, p.platform_withdrawal_limit_period, p.platform_withdrawal_limit_count, p.platform_withdrawal_allowed_days, @@ -512,7 +514,9 @@ func (r *Repository) queryBoundHostSalaryPolicy(ctx context.Context, q hostSalar err := q.QueryRowContext(ctx, query, args...).Scan( &policy.PolicyID, &policy.CycleKey, &policy.PolicyVersion, &policy.Name, &policy.PolicyType, &policy.RegionID, &policy.Status, &policy.SettlementMode, &policy.SettlementTriggerMode, &policy.GiftCoinToDiamondRatio, - &policy.PointDiamondsPerUSD, &policy.CoinsPerUSD, &policy.MinimumWithdrawUSDMinor, &policy.WithdrawFeeBPS, + &policy.PointDiamondsPerUSD, &policy.CoinsPerUSD, &policy.MinimumWithdrawUSDMinor, + &policy.CoinSellerMinimumWithdrawUSDMinor, &policy.PlatformMinimumWithdrawUSDMinor, &policy.DiamondExchangeEnabled, + &policy.WithdrawFeeBPS, &policy.AgencyPointShareBPS, &policy.ResidualDiamondToUSDRate, &policy.CoinSellerWithdrawalLimitPeriod, &policy.CoinSellerWithdrawalLimitCount, @@ -530,6 +534,7 @@ func (r *Repository) queryBoundHostSalaryPolicy(ctx context.Context, q hostSalar if policy.PolicyType != ledger.HostPolicyTypeSalaryDiamond && policy.PolicyType != ledger.HostPolicyTypePointDiamond { return ledger.HostSalaryPolicy{}, false, xerr.New(xerr.Internal, "host policy type is invalid") } + normalizeHostPolicyWithdrawalMinimums(&policy) levels, err := r.listHostSalaryPolicyLevels(ctx, q, policy.PolicyID, policy.PolicyVersion) if err != nil { return ledger.HostSalaryPolicy{}, false, err diff --git a/services/wallet-service/internal/storage/mysql/outbox_archive.go b/services/wallet-service/internal/storage/mysql/outbox_archive.go index bef6e515..f966756e 100644 --- a/services/wallet-service/internal/storage/mysql/outbox_archive.go +++ b/services/wallet-service/internal/storage/mysql/outbox_archive.go @@ -82,10 +82,15 @@ type WalletOutboxArchiveReceipt struct { // AcquireWalletOutboxArchiveAppLock 用 MySQL connection-scoped advisory lock 保证多副本下每个 App 只有一个归档者。 // release 必须 defer 调用;专用 Conn 在释放前不会回到连接池,避免锁跟随错误会话。 func (r *Repository) AcquireWalletOutboxArchiveAppLock(ctx context.Context) (release func(), acquired bool, err error) { + return r.acquireNamedLock(ctx, "wallet_outbox_archive:"+appcode.FromContext(ctx)) +} + +// acquireNamedLock 为 Wallet owner 后台任务保留专用连接直到显式 release。 +// 名称只能由服务端常量和规范化 app_code 组成,不能接受外部请求值。 +func (r *Repository) acquireNamedLock(ctx context.Context, lockName string) (release func(), acquired bool, err error) { if r == nil || r.db == nil { return nil, false, xerr.New(xerr.Unavailable, "mysql repository is not configured") } - lockName := "wallet_outbox_archive:" + appcode.FromContext(ctx) conn, err := r.db.Conn(ctx) if err != nil { return nil, false, err diff --git a/services/wallet-service/internal/storage/mysql/point_coin_seller.go b/services/wallet-service/internal/storage/mysql/point_coin_seller.go index e97fc445..e84354e6 100644 --- a/services/wallet-service/internal/storage/mysql/point_coin_seller.go +++ b/services/wallet-service/internal/storage/mysql/point_coin_seller.go @@ -143,7 +143,7 @@ func (r *Repository) TransferPointToCoinSeller(ctx context.Context, command ledg if err != nil { return ledger.PointToCoinSellerReceipt{}, err } - if command.GrossUSDMinor < policy.MinimumWithdrawUSDMinor { + if command.GrossUSDMinor < policy.CoinSellerMinimumWithdrawUSDMinor { return ledger.PointToCoinSellerReceipt{}, xerr.New(xerr.InvalidArgument, "withdrawal amount is below configured minimum") } pointAmount, feeUSDMinor, netUSDMinor, sellerCoinAmount, err = calculatePointDiamondCoinSellerAmounts( @@ -326,7 +326,7 @@ func (r *Repository) getPointWithdrawalConfig(ctx context.Context, appCode strin } return ledger.PointWithdrawalRuntimeConfig{}, err } - minimumPoints, calculateErr := checkedMul(policy.MinimumWithdrawUSDMinor, policy.PointDiamondsPerUSD) + minimumPoints, calculateErr := checkedMul(policy.PlatformMinimumWithdrawUSDMinor, policy.PointDiamondsPerUSD) if calculateErr != nil { return ledger.PointWithdrawalRuntimeConfig{}, calculateErr } @@ -334,8 +334,12 @@ func (r *Repository) getPointWithdrawalConfig(ctx context.Context, appCode strin Found: true, PointsPerUSD: policy.PointDiamondsPerUSD, CoinsPerUSD: policy.CoinsPerUSD, FeeBPS: int64(policy.WithdrawFeeBPS), MinimumPoints: minimumPoints / 100, PolicyInstanceCode: fmt.Sprintf("host:%d:%d", policy.PolicyID, policy.PolicyVersion), PolicyType: policy.PolicyType, - MinimumWithdrawUSDMinor: policy.MinimumWithdrawUSDMinor, AgencyPointShareBPS: policy.AgencyPointShareBPS, - PolicyID: policy.PolicyID, PolicyVersion: policy.PolicyVersion, + MinimumWithdrawUSDMinor: policy.PlatformMinimumWithdrawUSDMinor, + CoinSellerMinimumWithdrawUSDMinor: policy.CoinSellerMinimumWithdrawUSDMinor, + PlatformMinimumWithdrawUSDMinor: policy.PlatformMinimumWithdrawUSDMinor, + DiamondExchangeEnabled: policy.DiamondExchangeEnabled, + AgencyPointShareBPS: policy.AgencyPointShareBPS, + PolicyID: policy.PolicyID, PolicyVersion: policy.PolicyVersion, } if userID > 0 { now := time.UnixMilli(nowMS).UTC() diff --git a/services/wallet-service/internal/storage/mysql/point_exchange.go b/services/wallet-service/internal/storage/mysql/point_exchange.go index 22d918d1..0745f247 100644 --- a/services/wallet-service/internal/storage/mysql/point_exchange.go +++ b/services/wallet-service/internal/storage/mysql/point_exchange.go @@ -69,6 +69,11 @@ func (r *Repository) ExchangePointToCoin(ctx context.Context, command ledger.Poi if err != nil { return ledger.PointToCoinReceipt{}, err } + if !policy.DiamondExchangeEnabled { + // UI action 只是展示投影;资金事务必须再次读取同一政策快照,关闭后拒绝所有新 command。 + // 幂等回执查询位于此前,因此开关关闭不会把已经成功但响应丢失的重试改成失败。 + return ledger.PointToCoinReceipt{}, xerr.New(xerr.PermissionDenied, "point diamond exchange is disabled") + } ratioPointAmount, ratioCoinAmount = policy.PointDiamondsPerUSD, policy.CoinsPerUSD policyID, policyVersion = policy.PolicyID, policy.PolicyVersion } else { @@ -177,6 +182,8 @@ func (r *Repository) resolvePointDiamondHostPolicy(ctx context.Context, tx *sql. err := tx.QueryRowContext(ctx, ` SELECT p.policy_id, p.policy_version, binding.cycle_key, binding.region_id, p.point_diamonds_per_usd, p.coins_per_usd, p.minimum_withdraw_usd_minor, + p.coin_seller_minimum_withdraw_usd_minor, p.platform_minimum_withdraw_usd_minor, + p.diamond_exchange_enabled, p.withdraw_fee_bps, p.agency_point_share_bps, p.coin_seller_withdrawal_limit_period, p.coin_seller_withdrawal_limit_count, p.platform_withdrawal_limit_period, p.platform_withdrawal_limit_count, @@ -195,6 +202,8 @@ func (r *Repository) resolvePointDiamondHostPolicy(ctx context.Context, tx *sql. LIMIT 1`, appcode.FromContext(ctx), regionID, cycleKey, ledger.HostPolicyTypePointDiamond).Scan( &policy.PolicyID, &policy.PolicyVersion, &policy.CycleKey, &policy.RegionID, &policy.PointDiamondsPerUSD, &policy.CoinsPerUSD, &policy.MinimumWithdrawUSDMinor, + &policy.CoinSellerMinimumWithdrawUSDMinor, &policy.PlatformMinimumWithdrawUSDMinor, + &policy.DiamondExchangeEnabled, &policy.WithdrawFeeBPS, &policy.AgencyPointShareBPS, &policy.CoinSellerWithdrawalLimitPeriod, &policy.CoinSellerWithdrawalLimitCount, &policy.PlatformWithdrawalLimitPeriod, &policy.PlatformWithdrawalLimitCount, @@ -207,8 +216,24 @@ func (r *Repository) resolvePointDiamondHostPolicy(ctx context.Context, tx *sql. return ledger.HostSalaryPolicy{}, err } policy.PolicyType = ledger.HostPolicyTypePointDiamond - if policy.PointDiamondsPerUSD <= 0 || policy.CoinsPerUSD <= 0 || policy.MinimumWithdrawUSDMinor <= 0 || policy.WithdrawFeeBPS < 0 || policy.WithdrawFeeBPS > 10_000 { + normalizeHostPolicyWithdrawalMinimums(&policy) + if policy.PointDiamondsPerUSD <= 0 || policy.CoinsPerUSD <= 0 || policy.CoinSellerMinimumWithdrawUSDMinor <= 0 || policy.PlatformMinimumWithdrawUSDMinor <= 0 || policy.WithdrawFeeBPS < 0 || policy.WithdrawFeeBPS > 10_000 { return ledger.HostSalaryPolicy{}, xerr.New(xerr.Internal, "point diamond policy is invalid") } return policy, nil } + +// normalizeHostPolicyWithdrawalMinimums 把迁移前单一门槛投影到两个渠道;新快照会直接保存精确字段。 +// 兼容字段固定等于平台门槛,保证旧 Gateway/H5 在滚动升级期间仍执行原平台提现口径。 +func normalizeHostPolicyWithdrawalMinimums(policy *ledger.HostSalaryPolicy) { + if policy == nil { + return + } + if policy.CoinSellerMinimumWithdrawUSDMinor <= 0 { + policy.CoinSellerMinimumWithdrawUSDMinor = policy.MinimumWithdrawUSDMinor + } + if policy.PlatformMinimumWithdrawUSDMinor <= 0 { + policy.PlatformMinimumWithdrawUSDMinor = policy.MinimumWithdrawUSDMinor + } + policy.MinimumWithdrawUSDMinor = policy.PlatformMinimumWithdrawUSDMinor +} diff --git a/services/wallet-service/internal/storage/mysql/resource_entitlement_repository.go b/services/wallet-service/internal/storage/mysql/resource_entitlement_repository.go index e8207e3d..5543b4c5 100644 --- a/services/wallet-service/internal/storage/mysql/resource_entitlement_repository.go +++ b/services/wallet-service/internal/storage/mysql/resource_entitlement_repository.go @@ -16,6 +16,11 @@ import ( ) func (r *Repository) ListUserResources(ctx context.Context, query resourcedomain.ListUserResourcesQuery) ([]resourcedomain.UserResourceEntitlement, error) { + items, err := r.listUserResources(ctx, query) + return items, mapTransientResourceReadError(err) +} + +func (r *Repository) listUserResources(ctx context.Context, query resourcedomain.ListUserResourcesQuery) ([]resourcedomain.UserResourceEntitlement, error) { if r == nil || r.db == nil { return nil, xerr.New(xerr.Unavailable, "mysql repository is not configured") } @@ -25,7 +30,6 @@ func (r *Repository) ListUserResources(ctx context.Context, query resourcedomain } nowMs := time.Now().UnixMilli() - pruneResourceTypes := []string{} where := `WHERE e.app_code = ? AND e.user_id = ?` args := []any{appcode.FromContext(ctx), query.UserID} if strings.TrimSpace(query.ResourceType) != "" { @@ -33,14 +37,9 @@ func (r *Repository) ListUserResources(ctx context.Context, query resourcedomain if !resourcedomain.ValidResourceType(resourceType) { return nil, xerr.New(xerr.InvalidArgument, "resource_type is invalid") } - - if isEquipableResourceType(resourceType) { - pruneResourceTypes = []string{resourceType} - } - } - if err := r.pruneExpiredUserResourceEquipment(ctx, []int64{query.UserID}, pruneResourceTypes, nowMs); err != nil { - return nil, err } + // 背包和资料读取只能过滤事实,不能顺带修改 equipment。过期/失效条件由下方 + // active 谓词和后台单写者清理共同收敛,避免同一用户并发读退化成 DELETE 写锁竞争。 if query.ActiveOnly { where += ` AND e.status = 'active' AND e.effective_at_ms <= ? AND (e.expires_at_ms = 0 OR e.expires_at_ms > ?) AND e.remaining_quantity > 0` @@ -497,6 +496,11 @@ func (r *Repository) UnequipUserResource(ctx context.Context, command resourcedo } func (r *Repository) BatchGetUserEquippedResources(ctx context.Context, query resourcedomain.BatchGetUserEquippedResourcesQuery) ([]resourcedomain.UserEquippedResources, error) { + items, err := r.batchGetUserEquippedResources(ctx, query) + return items, mapTransientResourceReadError(err) +} + +func (r *Repository) batchGetUserEquippedResources(ctx context.Context, query resourcedomain.BatchGetUserEquippedResourcesQuery) ([]resourcedomain.UserEquippedResources, error) { if r == nil || r.db == nil { return nil, xerr.New(xerr.Unavailable, "mysql repository is not configured") } @@ -517,10 +521,8 @@ func (r *Repository) BatchGetUserEquippedResources(ctx context.Context, query re } nowMs := time.Now().UnixMilli() - if err := r.pruneExpiredUserResourceEquipment(ctx, userIDs, resourceTypes, nowMs); err != nil { - return nil, err - } - + // appearance/在线用户批量读不再物理清理 equipment;查询本身完整过滤失效权益, + // 后台任务按稳定主键分页删除残留行,读请求不会因为清理死锁成为 1213 受害者。 args := append([]any{appcode.FromContext(ctx)}, int64AnyArgs(userIDs)...) args = append(args, nowMs, nowMs) typeFilter := "" @@ -972,46 +974,6 @@ func isAutoEquippedOnGrantResourceType(resourceType string) bool { } } -func (r *Repository) pruneExpiredUserResourceEquipment(ctx context.Context, userIDs []int64, resourceTypes []string, nowMs int64) error { - userIDs = compactPositiveInt64s(userIDs) - if r == nil || r.db == nil || len(userIDs) == 0 { - return nil - } - - resourceTypes, err := normalizeEquipableResourceTypes(resourceTypes) - if err != nil { - return err - } - args := append([]any{appcode.FromContext(ctx)}, int64AnyArgs(userIDs)...) - args = append(args, nowMs, nowMs) - typeFilter := "" - if len(resourceTypes) > 0 { - typeFilter = ` AND eq.resource_type IN (` + placeholders(len(resourceTypes)) + `)` - args = append(args, stringAnyArgs(resourceTypes)...) - } - - _, err = r.db.ExecContext(ctx, ` - DELETE eq - FROM user_resource_equipment eq - LEFT JOIN user_resource_entitlements e ON e.app_code = eq.app_code - AND e.user_id = eq.user_id - AND e.resource_id = eq.resource_id - AND e.entitlement_id = eq.entitlement_id - LEFT JOIN resources r ON r.app_code = eq.app_code AND r.resource_id = eq.resource_id - WHERE eq.app_code = ? AND eq.user_id IN (`+placeholders(len(userIDs))+`) - AND ( - e.entitlement_id IS NULL - OR e.status <> 'active' - OR e.effective_at_ms > ? - OR (e.expires_at_ms <> 0 AND e.expires_at_ms <= ?) - OR e.remaining_quantity <= 0 - OR (e.source_snapshot_id = '' AND (r.resource_id IS NULL OR r.status <> 'active')) - )`+typeFilter, - args..., - ) - return err -} - func isEquipableResourceType(resourceType string) bool { switch resourcedomain.NormalizeResourceType(resourceType) { // 麦位中心图标和声波动效必须使用两个独立的 resource_type 单选槽;用户切换 mic_seat_icon diff --git a/services/wallet-service/internal/storage/mysql/resource_equipment_cleanup.go b/services/wallet-service/internal/storage/mysql/resource_equipment_cleanup.go new file mode 100644 index 00000000..9945e1ea --- /dev/null +++ b/services/wallet-service/internal/storage/mysql/resource_equipment_cleanup.go @@ -0,0 +1,333 @@ +package mysql + +import ( + "context" + "database/sql" + "errors" + "fmt" + "math/rand/v2" + "time" + + mysqlDriver "github.com/go-sql-driver/mysql" + "hyapp/pkg/xerr" +) + +const ( + resourceEquipmentCleanupJobName = "resource_equipment_cleanup_v1" + resourceEquipmentCleanupLockName = "wallet_resource_equipment_cleanup:v1" +) + +// ResourceEquipmentCleanupPageResult 描述一个已经提交的有界清理页。 +// ScannedCount 统计主键页读取量,DeletedCount 只统计复核后实际删除的装备指针。 +type ResourceEquipmentCleanupPageResult struct { + ScannedCount int + DeletedCount int + ReachedEnd bool + DeadlockRetries int +} + +type resourceEquipmentCleanupCursor struct { + AppCode string + UserID int64 + ResourceType string + EntitlementID string +} + +type resourceEquipmentCleanupRow struct { + Cursor resourceEquipmentCleanupCursor + ResourceID int64 + Invalid bool +} + +// AcquireResourceEquipmentCleanupLock 保证 Wallet 多副本每轮只有一个物理清理者。 +// 持久游标行仍会在删除事务内 FOR UPDATE,作为连接异常导致 advisory lock 丢失时的第二道串行边界。 +func (r *Repository) AcquireResourceEquipmentCleanupLock(ctx context.Context) (release func(), acquired bool, err error) { + return r.acquireNamedLock(ctx, resourceEquipmentCleanupLockName) +} + +// CleanupExpiredResourceEquipmentPage 清理一个稳定主键页,并且只对 MySQL 1213 做一次短抖动重试。 +// 1205 可能已经消耗完整 lock_wait_timeout,不在本地重试;下一轮 worker 会从未提交游标重新执行。 +func (r *Repository) CleanupExpiredResourceEquipmentPage(ctx context.Context, scanLimit int, deleteLimit int, nowMS int64) (ResourceEquipmentCleanupPageResult, error) { + if r == nil || r.db == nil { + return ResourceEquipmentCleanupPageResult{}, xerr.New(xerr.Unavailable, "mysql repository is not configured") + } + if scanLimit <= 0 || scanLimit > 1000 || deleteLimit <= 0 || deleteLimit > scanLimit { + return ResourceEquipmentCleanupPageResult{}, xerr.New(xerr.InvalidArgument, "resource equipment cleanup limits are invalid") + } + if nowMS <= 0 { + return ResourceEquipmentCleanupPageResult{}, xerr.New(xerr.InvalidArgument, "resource equipment cleanup time is invalid") + } + + var lastErr error + for attempt := 0; attempt < 2; attempt++ { + result, err := r.cleanupExpiredResourceEquipmentPageOnce(ctx, scanLimit, deleteLimit, nowMS) + if err == nil { + result.DeadlockRetries = attempt + return result, nil + } + if !isMySQLDeadlockError(err) || attempt == 1 { + return ResourceEquipmentCleanupPageResult{}, err + } + lastErr = err + timer := time.NewTimer(resourceEquipmentCleanupRetryDelay()) + select { + case <-ctx.Done(): + if !timer.Stop() { + <-timer.C + } + return ResourceEquipmentCleanupPageResult{}, ctx.Err() + case <-timer.C: + } + } + return ResourceEquipmentCleanupPageResult{}, lastErr +} + +func (r *Repository) cleanupExpiredResourceEquipmentPageOnce(ctx context.Context, scanLimit int, deleteLimit int, nowMS int64) (ResourceEquipmentCleanupPageResult, error) { + tx, err := r.db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelReadCommitted}) + if err != nil { + return ResourceEquipmentCleanupPageResult{}, err + } + defer func() { _ = tx.Rollback() }() + + // 单行状态先加锁、装备行后加锁;即使 advisory lock 因连接故障意外释放, + // 两个副本也会按同一顺序串行处理,不能同时推进或跳过游标。 + if _, err = tx.ExecContext(ctx, ` + INSERT IGNORE INTO wallet_resource_equipment_cleanup_state ( + job_name, cursor_app_code, cursor_user_id, cursor_resource_type, + cursor_entitlement_id, updated_at_ms + ) VALUES (?, '', 0, '', '', 0)`, + resourceEquipmentCleanupJobName, + ); err != nil { + return ResourceEquipmentCleanupPageResult{}, err + } + var cursor resourceEquipmentCleanupCursor + if err = tx.QueryRowContext(ctx, ` + SELECT cursor_app_code, cursor_user_id, cursor_resource_type, cursor_entitlement_id + FROM wallet_resource_equipment_cleanup_state + WHERE job_name = ? + FOR UPDATE`, + resourceEquipmentCleanupJobName, + ).Scan(&cursor.AppCode, &cursor.UserID, &cursor.ResourceType, &cursor.EntitlementID); err != nil { + return ResourceEquipmentCleanupPageResult{}, err + } + + rows, err := selectResourceEquipmentCleanupPage(ctx, tx, cursor, scanLimit, nowMS) + if err != nil { + return ResourceEquipmentCleanupPageResult{}, err + } + if len(rows) == 0 { + if cursor != (resourceEquipmentCleanupCursor{}) { + if err = updateResourceEquipmentCleanupCursor(ctx, tx, resourceEquipmentCleanupCursor{}, nowMS); err != nil { + return ResourceEquipmentCleanupPageResult{}, err + } + } + if err = tx.Commit(); err != nil { + return ResourceEquipmentCleanupPageResult{}, err + } + return ResourceEquipmentCleanupPageResult{ReachedEnd: true}, nil + } + + // 删除候选始终保持 equipment PRIMARY KEY 顺序。达到删除上限时只推进到最后一个候选, + // 让本页后续行在下一事务重新复核,不能因为批次截断而永久跳过失效指针。 + candidates := make([]resourceEquipmentCleanupRow, 0, deleteLimit) + nextCursor := rows[len(rows)-1].Cursor + for _, row := range rows { + if !row.Invalid { + continue + } + candidates = append(candidates, row) + if len(candidates) == deleteLimit { + nextCursor = row.Cursor + break + } + } + + deletedCount := 0 + for _, candidate := range candidates { + deleted, deleteErr := deleteInvalidResourceEquipmentCandidate(ctx, tx, candidate, nowMS) + if deleteErr != nil { + return ResourceEquipmentCleanupPageResult{}, deleteErr + } + deletedCount += deleted + } + + lastScannedCursor := rows[len(rows)-1].Cursor + reachedEnd := len(rows) < scanLimit && nextCursor == lastScannedCursor + if reachedEnd { + nextCursor = resourceEquipmentCleanupCursor{} + } + if err = updateResourceEquipmentCleanupCursor(ctx, tx, nextCursor, nowMS); err != nil { + return ResourceEquipmentCleanupPageResult{}, err + } + if err = tx.Commit(); err != nil { + return ResourceEquipmentCleanupPageResult{}, err + } + return ResourceEquipmentCleanupPageResult{ + ScannedCount: len(rows), + DeletedCount: deletedCount, + ReachedEnd: reachedEnd, + }, nil +} + +func selectResourceEquipmentCleanupPage(ctx context.Context, tx *sql.Tx, cursor resourceEquipmentCleanupCursor, limit int, nowMS int64) ([]resourceEquipmentCleanupRow, error) { + const pageProjection = ` + SELECT page.app_code, page.user_id, page.resource_type, page.entitlement_id, page.resource_id, + ( + e.entitlement_id IS NULL + OR e.status <> 'active' + OR e.effective_at_ms > ? + OR (e.expires_at_ms <> 0 AND e.expires_at_ms <= ?) + OR e.remaining_quantity <= 0 + OR (e.source_snapshot_id = '' AND (r.resource_id IS NULL OR r.status <> 'active')) + ) AS invalid + FROM (%s) AS page + LEFT JOIN user_resource_entitlements AS e + ON e.app_code = page.app_code + AND e.user_id = page.user_id + AND e.resource_id = page.resource_id + AND e.entitlement_id = page.entitlement_id + LEFT JOIN resources AS r + ON r.resource_id = page.resource_id + AND r.app_code = page.app_code + ORDER BY page.app_code, page.user_id, page.resource_type, page.entitlement_id` + + // 先从 equipment PRIMARY KEY 截取固定数量,再做两个点查 JOIN。显式字典序 OR 谓词让 + // MySQL 使用 Index range scan;row-constructor `>` 会退化成从主键表头过滤,游标靠后时不够有界。 + var ( + query string + args []any + ) + if cursor == (resourceEquipmentCleanupCursor{}) { + query = ` + SELECT app_code, user_id, resource_type, entitlement_id, resource_id + FROM user_resource_equipment FORCE INDEX (PRIMARY) + ORDER BY app_code, user_id, resource_type, entitlement_id + LIMIT ?` + args = []any{nowMS, nowMS, limit} + } else { + query = ` + SELECT app_code, user_id, resource_type, entitlement_id, resource_id + FROM user_resource_equipment FORCE INDEX (PRIMARY) + WHERE app_code > ? + OR (app_code = ? AND user_id > ?) + OR (app_code = ? AND user_id = ? AND resource_type > ?) + OR (app_code = ? AND user_id = ? AND resource_type = ? AND entitlement_id > ?) + ORDER BY app_code, user_id, resource_type, entitlement_id + LIMIT ?` + args = []any{ + nowMS, nowMS, + cursor.AppCode, + cursor.AppCode, cursor.UserID, + cursor.AppCode, cursor.UserID, cursor.ResourceType, + cursor.AppCode, cursor.UserID, cursor.ResourceType, cursor.EntitlementID, + limit, + } + } + rows, err := tx.QueryContext(ctx, fmt.Sprintf(pageProjection, query), args...) + if err != nil { + return nil, err + } + defer rows.Close() + + result := make([]resourceEquipmentCleanupRow, 0, limit) + for rows.Next() { + var row resourceEquipmentCleanupRow + if err = rows.Scan( + &row.Cursor.AppCode, + &row.Cursor.UserID, + &row.Cursor.ResourceType, + &row.Cursor.EntitlementID, + &row.ResourceID, + &row.Invalid, + ); err != nil { + return nil, err + } + result = append(result, row) + } + if err = rows.Err(); err != nil { + return nil, err + } + return result, nil +} + +func deleteInvalidResourceEquipmentCandidate(ctx context.Context, tx *sql.Tx, candidate resourceEquipmentCleanupRow, nowMS int64) (int, error) { + result, err := tx.ExecContext(ctx, ` + DELETE eq + FROM user_resource_equipment AS eq FORCE INDEX (PRIMARY) + LEFT JOIN user_resource_entitlements AS e + ON e.app_code = eq.app_code + AND e.user_id = eq.user_id + AND e.resource_id = eq.resource_id + AND e.entitlement_id = eq.entitlement_id + LEFT JOIN resources AS r + ON r.resource_id = eq.resource_id + AND r.app_code = eq.app_code + WHERE eq.app_code = ? + AND eq.user_id = ? + AND eq.resource_type = ? + AND eq.entitlement_id = ? + AND eq.resource_id = ? + AND ( + e.entitlement_id IS NULL + OR e.status <> 'active' + OR e.effective_at_ms > ? + OR (e.expires_at_ms <> 0 AND e.expires_at_ms <= ?) + OR e.remaining_quantity <= 0 + OR (e.source_snapshot_id = '' AND (r.resource_id IS NULL OR r.status <> 'active')) + )`, + candidate.Cursor.AppCode, + candidate.Cursor.UserID, + candidate.Cursor.ResourceType, + candidate.Cursor.EntitlementID, + candidate.ResourceID, + nowMS, + nowMS, + ) + if err != nil { + return 0, err + } + affected, err := result.RowsAffected() + if err != nil { + return 0, err + } + return int(affected), nil +} + +func updateResourceEquipmentCleanupCursor(ctx context.Context, tx *sql.Tx, cursor resourceEquipmentCleanupCursor, nowMS int64) error { + _, err := tx.ExecContext(ctx, ` + UPDATE wallet_resource_equipment_cleanup_state + SET cursor_app_code = ?, cursor_user_id = ?, cursor_resource_type = ?, + cursor_entitlement_id = ?, updated_at_ms = ? + WHERE job_name = ?`, + cursor.AppCode, + cursor.UserID, + cursor.ResourceType, + cursor.EntitlementID, + nowMS, + resourceEquipmentCleanupJobName, + ) + return err +} + +func isMySQLDeadlockError(err error) bool { + var mysqlErr *mysqlDriver.MySQLError + return errors.As(err, &mysqlErr) && mysqlErr.Number == 1213 +} + +func mapTransientResourceReadError(err error) error { + if !isMySQLDeadlockError(err) { + return err + } + // 对外只暴露稳定、可判定的瞬时 reason;原始 MySQL 错误继续留在 error chain, + // 供 Wallet 服务端 access log 诊断,不能进入 gRPC message 或 HTTP envelope。 + return fmt.Errorf("%w: %w", + xerr.New(xerr.WalletResourceReadTransient, "wallet resource data is temporarily unavailable"), + err, + ) +} + +func resourceEquipmentCleanupRetryDelay() time.Duration { + // 单次重试固定在 20-60ms 内;随机抖动只用于错开 Equip/Revoke 的瞬时持锁窗口, + // 不能形成无限退避或把持续故障隐藏在 worker 内。 + return 20*time.Millisecond + time.Duration(rand.IntN(41))*time.Millisecond +} diff --git a/services/wallet-service/internal/storage/mysql/salary_withdrawal.go b/services/wallet-service/internal/storage/mysql/salary_withdrawal.go index 5a44d18f..0caef070 100644 --- a/services/wallet-service/internal/storage/mysql/salary_withdrawal.go +++ b/services/wallet-service/internal/storage/mysql/salary_withdrawal.go @@ -108,7 +108,7 @@ func (r *Repository) applySalaryWithdrawal(ctx context.Context, command ledger.S if resolveErr != nil { return ledger.SalaryWithdrawalReceipt{}, resolveErr } - if command.GrossUSDMinor < policy.MinimumWithdrawUSDMinor { + if command.GrossUSDMinor < policy.PlatformMinimumWithdrawUSDMinor { return ledger.SalaryWithdrawalReceipt{}, xerr.New(xerr.InvalidArgument, "withdrawal amount is below configured minimum") } pointProduct, calculateErr := checkedMul(command.GrossUSDMinor, policy.PointDiamondsPerUSD) diff --git a/services/wallet-service/internal/storage/mysql/schema.go b/services/wallet-service/internal/storage/mysql/schema.go index 7a7a5ca1..a6c3c2a1 100644 --- a/services/wallet-service/internal/storage/mysql/schema.go +++ b/services/wallet-service/internal/storage/mysql/schema.go @@ -91,9 +91,26 @@ func ensureHostSalarySettlementSchema(ctx context.Context, db *sql.DB) error { ADD COLUMN minimum_withdraw_usd_minor BIGINT NOT NULL DEFAULT 0 COMMENT 'POINT_DIAMOND 最低提现美元美分' AFTER coins_per_usd, ALGORITHM=INPLACE, LOCK=NONE`); err != nil && !isDuplicateColumnError(err) { return err } + // 渠道门槛不做启动时 UPDATE 回填:旧快照以 0 标记未拆分,资金事务读取时回退历史单一门槛。 + // 这样兼容升级只在线追加小型配置表字段,不扫描任何钱包或提现流水。 if _, err := db.ExecContext(ctx, ` ALTER TABLE host_agency_salary_policies - ADD COLUMN withdraw_fee_bps INT NOT NULL DEFAULT 0 COMMENT 'POINT_DIAMOND 提现费率基点' AFTER minimum_withdraw_usd_minor, ALGORITHM=INPLACE, LOCK=NONE`); err != nil && !isDuplicateColumnError(err) { + ADD COLUMN coin_seller_minimum_withdraw_usd_minor BIGINT NOT NULL DEFAULT 0 COMMENT 'POINT_DIAMOND 用户找币商最低提现美元美分;0 回退旧字段' AFTER minimum_withdraw_usd_minor, ALGORITHM=INPLACE, LOCK=NONE`); err != nil && !isDuplicateColumnError(err) { + return err + } + if _, err := db.ExecContext(ctx, ` + ALTER TABLE host_agency_salary_policies + ADD COLUMN platform_minimum_withdraw_usd_minor BIGINT NOT NULL DEFAULT 0 COMMENT 'POINT_DIAMOND 用户找平台最低提现美元美分;0 回退旧字段' AFTER coin_seller_minimum_withdraw_usd_minor, ALGORITHM=INPLACE, LOCK=NONE`); err != nil && !isDuplicateColumnError(err) { + return err + } + if _, err := db.ExecContext(ctx, ` + ALTER TABLE host_agency_salary_policies + ADD COLUMN diamond_exchange_enabled BOOLEAN NOT NULL DEFAULT TRUE COMMENT '是否开放 POINT_DIAMOND 兑换金币' AFTER platform_minimum_withdraw_usd_minor, ALGORITHM=INPLACE, LOCK=NONE`); err != nil && !isDuplicateColumnError(err) { + return err + } + if _, err := db.ExecContext(ctx, ` + ALTER TABLE host_agency_salary_policies + ADD COLUMN withdraw_fee_bps INT NOT NULL DEFAULT 0 COMMENT 'POINT_DIAMOND 提现费率基点' AFTER diamond_exchange_enabled, ALGORITHM=INPLACE, LOCK=NONE`); err != nil && !isDuplicateColumnError(err) { return err } if _, err := db.ExecContext(ctx, ` @@ -674,6 +691,21 @@ func ensureUserResourceEquipmentSchema(ctx context.Context, db *sql.DB) error { } } + // 清理游标是单行小表;后台每页与装备删除同事务推进,节点滚动或 leader 切换后 + // 不会回到表头反复扫描。表创建不触碰 equipment 大表,也不需要在线索引变更。 + if _, err = db.ExecContext(ctx, ` + CREATE TABLE IF NOT EXISTS wallet_resource_equipment_cleanup_state ( + job_name VARCHAR(64) NOT NULL COMMENT 'Wallet owner 清理任务稳定名称', + cursor_app_code VARCHAR(32) NOT NULL DEFAULT '' COMMENT '装备主键游标 App', + cursor_user_id BIGINT NOT NULL DEFAULT 0 COMMENT '装备主键游标用户', + cursor_resource_type VARCHAR(32) NOT NULL DEFAULT '' COMMENT '装备主键游标资源类型', + cursor_entitlement_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '装备主键游标权益', + updated_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '游标提交时间,UTC epoch ms', + PRIMARY KEY (job_name) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Wallet 资源装备物理清理游标'`); err != nil { + return err + } + // 命令表是 append-only 幂等事实,主键查询不会扫描 equipment 或 entitlement 大表。 // response_json 固化首个成功回包,使资源随后到期/下架也不会改变同 command_id 的重试语义。 _, err = db.ExecContext(ctx, ` diff --git a/services/wallet-service/internal/storage/mysql/vip_program_repository.go b/services/wallet-service/internal/storage/mysql/vip_program_repository.go index 5d5f32d5..f5ea2ce3 100644 --- a/services/wallet-service/internal/storage/mysql/vip_program_repository.go +++ b/services/wallet-service/internal/storage/mysql/vip_program_repository.go @@ -61,11 +61,8 @@ func (r *Repository) GetVipState(ctx context.Context, userID int64) (ledger.VipS return ledger.VipState{}, xerr.New(xerr.InvalidArgument, "user_id is required") } nowMS := time.Now().UnixMilli() - // 先清理失效装备指针,再用一个 repeatable-read 快照读取 program、会员、卡片和权益, - // 防止后台改配置时返回“新 config_version + 旧 benefits”一类混合状态。 - if err := r.pruneExpiredUserResourceEquipment(ctx, []int64{userID}, []string{resourcedomain.TypeVIPTrialCard}, nowMS); err != nil { - return ledger.VipState{}, err - } + // 失效 trial-card equipment 由 Wallet 单写者后台物理清理;这里直接读取同一 + // repeatable-read 快照,避免用户态查询产生 DELETE,同时防止返回跨配置版本组合。 if err := r.ensureTieredVipResourceState(ctx, userID, nowMS); err != nil { return ledger.VipState{}, err } diff --git a/services/wallet-service/internal/storage/mysql/vip_query_repository.go b/services/wallet-service/internal/storage/mysql/vip_query_repository.go index 02ec44b2..1349a3d0 100644 --- a/services/wallet-service/internal/storage/mysql/vip_query_repository.go +++ b/services/wallet-service/internal/storage/mysql/vip_query_repository.go @@ -31,9 +31,8 @@ func (r *Repository) ListVipPackages(ctx context.Context, userID int64) (ledger. return ledger.VipState{}, nil, xerr.New(xerr.Unavailable, "mysql repository is not configured") } nowMS := time.Now().UnixMilli() - if err := r.pruneExpiredUserResourceEquipment(ctx, []int64{userID}, []string{resourcedomain.TypeVIPTrialCard}, nowMS); err != nil { - return ledger.VipState{}, nil, err - } + // VIP 读取不再删除过期 trial-card equipment;快照查询会忽略失效卡片, + // 物理残留统一由 Wallet 单写者清理,避免读取套餐时与 appearance/gift-panel 争写锁。 if err := r.ensureTieredVipResourceState(ctx, userID, nowMS); err != nil { return ledger.VipState{}, nil, err } diff --git a/services/wallet-service/internal/testutil/mysqltest/mysqltest.go b/services/wallet-service/internal/testutil/mysqltest/mysqltest.go index 9bc9b3a0..b9450c03 100644 --- a/services/wallet-service/internal/testutil/mysqltest/mysqltest.go +++ b/services/wallet-service/internal/testutil/mysqltest/mysqltest.go @@ -1053,14 +1053,30 @@ func (r *Repository) SetHostSalaryPolicyForApp(appCode string, policy ledger.Hos if policy.PlatformWithdrawalLimitPeriod == "" { policy.PlatformWithdrawalLimitPeriod = "month" } + legacyPointPolicy := policy.PolicyType == ledger.HostPolicyTypePointDiamond && + policy.CoinSellerMinimumWithdrawUSDMinor == 0 && + policy.PlatformMinimumWithdrawUSDMinor == 0 + if policy.CoinSellerMinimumWithdrawUSDMinor <= 0 { + policy.CoinSellerMinimumWithdrawUSDMinor = policy.MinimumWithdrawUSDMinor + } + if policy.PlatformMinimumWithdrawUSDMinor <= 0 { + policy.PlatformMinimumWithdrawUSDMinor = policy.MinimumWithdrawUSDMinor + } + policy.MinimumWithdrawUSDMinor = policy.PlatformMinimumWithdrawUSDMinor + if legacyPointPolicy { + // 既有测试夹具创建于开关引入前,语义等同线上迁移默认开启;新关闭场景需显式填写两个渠道门槛。 + policy.DiamondExchangeEnabled = true + } _, err := r.schema.DB.ExecContext(context.Background(), ` INSERT INTO host_agency_salary_policies ( app_code, policy_id, cycle_key, policy_version, name, policy_type, region_id, status, settlement_mode, settlement_trigger_mode, gift_coin_to_diamond_ratio, - point_diamonds_per_usd, coins_per_usd, minimum_withdraw_usd_minor, withdraw_fee_bps, agency_point_share_bps, + point_diamonds_per_usd, coins_per_usd, minimum_withdraw_usd_minor, + coin_seller_minimum_withdraw_usd_minor, platform_minimum_withdraw_usd_minor, diamond_exchange_enabled, + withdraw_fee_bps, agency_point_share_bps, residual_diamond_to_usd_rate, coin_seller_withdrawal_limit_period, coin_seller_withdrawal_limit_count, platform_withdrawal_limit_period, platform_withdrawal_limit_count, platform_withdrawal_allowed_days, effective_from_ms, effective_to_ms, created_at_ms, updated_at_ms - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE cycle_key = VALUES(cycle_key), policy_version = VALUES(policy_version), @@ -1074,6 +1090,9 @@ func (r *Repository) SetHostSalaryPolicyForApp(appCode string, policy ledger.Hos point_diamonds_per_usd = VALUES(point_diamonds_per_usd), coins_per_usd = VALUES(coins_per_usd), minimum_withdraw_usd_minor = VALUES(minimum_withdraw_usd_minor), + coin_seller_minimum_withdraw_usd_minor = VALUES(coin_seller_minimum_withdraw_usd_minor), + platform_minimum_withdraw_usd_minor = VALUES(platform_minimum_withdraw_usd_minor), + diamond_exchange_enabled = VALUES(diamond_exchange_enabled), withdraw_fee_bps = VALUES(withdraw_fee_bps), agency_point_share_bps = VALUES(agency_point_share_bps), residual_diamond_to_usd_rate = VALUES(residual_diamond_to_usd_rate), @@ -1086,7 +1105,9 @@ func (r *Repository) SetHostSalaryPolicyForApp(appCode string, policy ledger.Hos effective_to_ms = VALUES(effective_to_ms), updated_at_ms = VALUES(updated_at_ms) `, appCode, policy.PolicyID, policy.CycleKey, policy.PolicyVersion, policy.Name, policy.PolicyType, policy.RegionID, policy.Status, policy.SettlementMode, policy.SettlementTriggerMode, policy.GiftCoinToDiamondRatio, - policy.PointDiamondsPerUSD, policy.CoinsPerUSD, policy.MinimumWithdrawUSDMinor, policy.WithdrawFeeBPS, policy.AgencyPointShareBPS, policy.ResidualDiamondToUSDRate, + policy.PointDiamondsPerUSD, policy.CoinsPerUSD, policy.MinimumWithdrawUSDMinor, + policy.CoinSellerMinimumWithdrawUSDMinor, policy.PlatformMinimumWithdrawUSDMinor, policy.DiamondExchangeEnabled, + policy.WithdrawFeeBPS, policy.AgencyPointShareBPS, policy.ResidualDiamondToUSDRate, policy.CoinSellerWithdrawalLimitPeriod, policy.CoinSellerWithdrawalLimitCount, policy.PlatformWithdrawalLimitPeriod, policy.PlatformWithdrawalLimitCount, policy.PlatformWithdrawalAllowedDays, policy.EffectiveFromMs, policy.EffectiveToMs, nowMs, nowMs) diff --git a/services/wallet-service/internal/transport/grpc/host_salary.go b/services/wallet-service/internal/transport/grpc/host_salary.go index ad256cf3..31047871 100644 --- a/services/wallet-service/internal/transport/grpc/host_salary.go +++ b/services/wallet-service/internal/transport/grpc/host_salary.go @@ -79,25 +79,28 @@ func hostSalaryPolicyToProto(policy ledger.HostSalaryPolicy) *walletv1.HostSalar levels = append(levels, hostSalaryPolicyLevelToProto(level)) } return &walletv1.HostSalaryPolicy{ - PolicyId: policy.PolicyID, - CycleKey: policy.CycleKey, - PolicyVersion: policy.PolicyVersion, - Name: policy.Name, - PolicyType: policy.PolicyType, - RegionId: policy.RegionID, - Status: policy.Status, - SettlementMode: policy.SettlementMode, - SettlementTriggerMode: policy.SettlementTriggerMode, - GiftCoinToDiamondRatio: policy.GiftCoinToDiamondRatio, - PointDiamondsPerUsd: policy.PointDiamondsPerUSD, - CoinsPerUsd: policy.CoinsPerUSD, - MinimumWithdrawUsdMinor: policy.MinimumWithdrawUSDMinor, - WithdrawFeeBps: policy.WithdrawFeeBPS, - AgencyPointShareBps: policy.AgencyPointShareBPS, - ResidualDiamondToUsdRate: policy.ResidualDiamondToUSDRate, - EffectiveFromMs: policy.EffectiveFromMs, - EffectiveToMs: policy.EffectiveToMs, - Levels: levels, + PolicyId: policy.PolicyID, + CycleKey: policy.CycleKey, + PolicyVersion: policy.PolicyVersion, + Name: policy.Name, + PolicyType: policy.PolicyType, + RegionId: policy.RegionID, + Status: policy.Status, + SettlementMode: policy.SettlementMode, + SettlementTriggerMode: policy.SettlementTriggerMode, + GiftCoinToDiamondRatio: policy.GiftCoinToDiamondRatio, + PointDiamondsPerUsd: policy.PointDiamondsPerUSD, + CoinsPerUsd: policy.CoinsPerUSD, + MinimumWithdrawUsdMinor: policy.MinimumWithdrawUSDMinor, + CoinSellerMinimumWithdrawUsdMinor: policy.CoinSellerMinimumWithdrawUSDMinor, + PlatformMinimumWithdrawUsdMinor: policy.PlatformMinimumWithdrawUSDMinor, + DiamondExchangeEnabled: policy.DiamondExchangeEnabled, + WithdrawFeeBps: policy.WithdrawFeeBPS, + AgencyPointShareBps: policy.AgencyPointShareBPS, + ResidualDiamondToUsdRate: policy.ResidualDiamondToUSDRate, + EffectiveFromMs: policy.EffectiveFromMs, + EffectiveToMs: policy.EffectiveToMs, + Levels: levels, } } diff --git a/services/wallet-service/internal/transport/grpc/point_coin_seller.go b/services/wallet-service/internal/transport/grpc/point_coin_seller.go index 702cfc66..828cdab9 100644 --- a/services/wallet-service/internal/transport/grpc/point_coin_seller.go +++ b/services/wallet-service/internal/transport/grpc/point_coin_seller.go @@ -83,7 +83,10 @@ func (s *Server) GetPointWithdrawalConfig(ctx context.Context, req *walletv1.Get Found: config.Found, PointsPerUsd: config.PointsPerUSD, CoinsPerUsd: config.CoinsPerUSD, FeeBps: int32(config.FeeBPS), MinimumPoints: config.MinimumPoints, PolicyInstanceCode: config.PolicyInstanceCode, PolicyType: config.PolicyType, MinimumWithdrawUsdMinor: config.MinimumWithdrawUSDMinor, - AgencyPointShareBps: config.AgencyPointShareBPS, PolicyId: config.PolicyID, PolicyVersion: config.PolicyVersion, + CoinSellerMinimumWithdrawUsdMinor: config.CoinSellerMinimumWithdrawUSDMinor, + PlatformMinimumWithdrawUsdMinor: config.PlatformMinimumWithdrawUSDMinor, + DiamondExchangeEnabled: &config.DiamondExchangeEnabled, + AgencyPointShareBps: config.AgencyPointShareBPS, PolicyId: config.PolicyID, PolicyVersion: config.PolicyVersion, AvailabilityEvaluated: config.AvailabilityEvaluated, CoinSellerAvailability: pointWithdrawalAvailabilityToProto(config.CoinSellerAvailability), PlatformAvailability: pointWithdrawalAvailabilityToProto(config.PlatformAvailability),