快捷创建账号

This commit is contained in:
zhx 2026-05-21 11:52:06 +08:00
parent 21dd835c75
commit 9d4dd79a86
32 changed files with 1304 additions and 214 deletions

View File

@ -10114,6 +10114,94 @@ func (x *UpsertLuckyGiftConfigResponse) GetConfig() *LuckyGiftConfig {
return nil return nil
} }
type ListLuckyGiftConfigsRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
Meta *RequestMeta `protobuf:"bytes,1,opt,name=meta,proto3" json:"meta,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ListLuckyGiftConfigsRequest) Reset() {
*x = ListLuckyGiftConfigsRequest{}
mi := &file_proto_activity_v1_activity_proto_msgTypes[123]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ListLuckyGiftConfigsRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ListLuckyGiftConfigsRequest) ProtoMessage() {}
func (x *ListLuckyGiftConfigsRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_activity_v1_activity_proto_msgTypes[123]
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 ListLuckyGiftConfigsRequest.ProtoReflect.Descriptor instead.
func (*ListLuckyGiftConfigsRequest) Descriptor() ([]byte, []int) {
return file_proto_activity_v1_activity_proto_rawDescGZIP(), []int{123}
}
func (x *ListLuckyGiftConfigsRequest) GetMeta() *RequestMeta {
if x != nil {
return x.Meta
}
return nil
}
type ListLuckyGiftConfigsResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
Configs []*LuckyGiftConfig `protobuf:"bytes,1,rep,name=configs,proto3" json:"configs,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *ListLuckyGiftConfigsResponse) Reset() {
*x = ListLuckyGiftConfigsResponse{}
mi := &file_proto_activity_v1_activity_proto_msgTypes[124]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *ListLuckyGiftConfigsResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ListLuckyGiftConfigsResponse) ProtoMessage() {}
func (x *ListLuckyGiftConfigsResponse) ProtoReflect() protoreflect.Message {
mi := &file_proto_activity_v1_activity_proto_msgTypes[124]
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 ListLuckyGiftConfigsResponse.ProtoReflect.Descriptor instead.
func (*ListLuckyGiftConfigsResponse) Descriptor() ([]byte, []int) {
return file_proto_activity_v1_activity_proto_rawDescGZIP(), []int{124}
}
func (x *ListLuckyGiftConfigsResponse) GetConfigs() []*LuckyGiftConfig {
if x != nil {
return x.Configs
}
return nil
}
type ListLuckyGiftDrawsRequest struct { type ListLuckyGiftDrawsRequest struct {
state protoimpl.MessageState `protogen:"open.v1"` state protoimpl.MessageState `protogen:"open.v1"`
Meta *RequestMeta `protobuf:"bytes,1,opt,name=meta,proto3" json:"meta,omitempty"` Meta *RequestMeta `protobuf:"bytes,1,opt,name=meta,proto3" json:"meta,omitempty"`
@ -10130,7 +10218,7 @@ type ListLuckyGiftDrawsRequest struct {
func (x *ListLuckyGiftDrawsRequest) Reset() { func (x *ListLuckyGiftDrawsRequest) Reset() {
*x = ListLuckyGiftDrawsRequest{} *x = ListLuckyGiftDrawsRequest{}
mi := &file_proto_activity_v1_activity_proto_msgTypes[123] mi := &file_proto_activity_v1_activity_proto_msgTypes[125]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -10142,7 +10230,7 @@ func (x *ListLuckyGiftDrawsRequest) String() string {
func (*ListLuckyGiftDrawsRequest) ProtoMessage() {} func (*ListLuckyGiftDrawsRequest) ProtoMessage() {}
func (x *ListLuckyGiftDrawsRequest) ProtoReflect() protoreflect.Message { func (x *ListLuckyGiftDrawsRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_activity_v1_activity_proto_msgTypes[123] mi := &file_proto_activity_v1_activity_proto_msgTypes[125]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -10155,7 +10243,7 @@ func (x *ListLuckyGiftDrawsRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use ListLuckyGiftDrawsRequest.ProtoReflect.Descriptor instead. // Deprecated: Use ListLuckyGiftDrawsRequest.ProtoReflect.Descriptor instead.
func (*ListLuckyGiftDrawsRequest) Descriptor() ([]byte, []int) { func (*ListLuckyGiftDrawsRequest) Descriptor() ([]byte, []int) {
return file_proto_activity_v1_activity_proto_rawDescGZIP(), []int{123} return file_proto_activity_v1_activity_proto_rawDescGZIP(), []int{125}
} }
func (x *ListLuckyGiftDrawsRequest) GetMeta() *RequestMeta { func (x *ListLuckyGiftDrawsRequest) GetMeta() *RequestMeta {
@ -10224,7 +10312,7 @@ type ListLuckyGiftDrawsResponse struct {
func (x *ListLuckyGiftDrawsResponse) Reset() { func (x *ListLuckyGiftDrawsResponse) Reset() {
*x = ListLuckyGiftDrawsResponse{} *x = ListLuckyGiftDrawsResponse{}
mi := &file_proto_activity_v1_activity_proto_msgTypes[124] mi := &file_proto_activity_v1_activity_proto_msgTypes[126]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -10236,7 +10324,7 @@ func (x *ListLuckyGiftDrawsResponse) String() string {
func (*ListLuckyGiftDrawsResponse) ProtoMessage() {} func (*ListLuckyGiftDrawsResponse) ProtoMessage() {}
func (x *ListLuckyGiftDrawsResponse) ProtoReflect() protoreflect.Message { func (x *ListLuckyGiftDrawsResponse) ProtoReflect() protoreflect.Message {
mi := &file_proto_activity_v1_activity_proto_msgTypes[124] mi := &file_proto_activity_v1_activity_proto_msgTypes[126]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -10249,7 +10337,7 @@ func (x *ListLuckyGiftDrawsResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use ListLuckyGiftDrawsResponse.ProtoReflect.Descriptor instead. // Deprecated: Use ListLuckyGiftDrawsResponse.ProtoReflect.Descriptor instead.
func (*ListLuckyGiftDrawsResponse) Descriptor() ([]byte, []int) { func (*ListLuckyGiftDrawsResponse) Descriptor() ([]byte, []int) {
return file_proto_activity_v1_activity_proto_rawDescGZIP(), []int{124} return file_proto_activity_v1_activity_proto_rawDescGZIP(), []int{126}
} }
func (x *ListLuckyGiftDrawsResponse) GetDraws() []*LuckyGiftDrawResult { func (x *ListLuckyGiftDrawsResponse) GetDraws() []*LuckyGiftDrawResult {
@ -11208,7 +11296,11 @@ const file_proto_activity_v1_activity_proto_rawDesc = "" +
"\x06config\x18\x02 \x01(\v2\".hyapp.activity.v1.LuckyGiftConfigR\x06config\x12*\n" + "\x06config\x18\x02 \x01(\v2\".hyapp.activity.v1.LuckyGiftConfigR\x06config\x12*\n" +
"\x11operator_admin_id\x18\x03 \x01(\x03R\x0foperatorAdminId\"[\n" + "\x11operator_admin_id\x18\x03 \x01(\x03R\x0foperatorAdminId\"[\n" +
"\x1dUpsertLuckyGiftConfigResponse\x12:\n" + "\x1dUpsertLuckyGiftConfigResponse\x12:\n" +
"\x06config\x18\x01 \x01(\v2\".hyapp.activity.v1.LuckyGiftConfigR\x06config\"\xfc\x01\n" + "\x06config\x18\x01 \x01(\v2\".hyapp.activity.v1.LuckyGiftConfigR\x06config\"Q\n" +
"\x1bListLuckyGiftConfigsRequest\x122\n" +
"\x04meta\x18\x01 \x01(\v2\x1e.hyapp.activity.v1.RequestMetaR\x04meta\"\\\n" +
"\x1cListLuckyGiftConfigsResponse\x12<\n" +
"\aconfigs\x18\x01 \x03(\v2\".hyapp.activity.v1.LuckyGiftConfigR\aconfigs\"\xfc\x01\n" +
"\x19ListLuckyGiftDrawsRequest\x122\n" + "\x19ListLuckyGiftDrawsRequest\x122\n" +
"\x04meta\x18\x01 \x01(\v2\x1e.hyapp.activity.v1.RequestMetaR\x04meta\x12\x17\n" + "\x04meta\x18\x01 \x01(\v2\x1e.hyapp.activity.v1.RequestMetaR\x04meta\x12\x17\n" +
"\agift_id\x18\x02 \x01(\tR\x06giftId\x12\x17\n" + "\agift_id\x18\x02 \x01(\tR\x06giftId\x12\x17\n" +
@ -11286,10 +11378,11 @@ const file_proto_activity_v1_activity_proto_rawDesc = "" +
"\x0fUpsertLevelTier\x12).hyapp.activity.v1.UpsertLevelTierRequest\x1a*.hyapp.activity.v1.UpsertLevelTierResponse2\x9f\x02\n" + "\x0fUpsertLevelTier\x12).hyapp.activity.v1.UpsertLevelTierRequest\x1a*.hyapp.activity.v1.UpsertLevelTierResponse2\x9f\x02\n" +
"\x17AdminAchievementService\x12u\n" + "\x17AdminAchievementService\x12u\n" +
"\x1aListAchievementDefinitions\x12*.hyapp.activity.v1.ListAchievementsRequest\x1a+.hyapp.activity.v1.ListAchievementsResponse\x12\x8c\x01\n" + "\x1aListAchievementDefinitions\x12*.hyapp.activity.v1.ListAchievementsRequest\x1a+.hyapp.activity.v1.ListAchievementsResponse\x12\x8c\x01\n" +
"\x1bUpsertAchievementDefinition\x125.hyapp.activity.v1.UpsertAchievementDefinitionRequest\x1a6.hyapp.activity.v1.UpsertAchievementDefinitionResponse2\xf9\x02\n" + "\x1bUpsertAchievementDefinition\x125.hyapp.activity.v1.UpsertAchievementDefinitionRequest\x1a6.hyapp.activity.v1.UpsertAchievementDefinitionResponse2\xf2\x03\n" +
"\x15AdminLuckyGiftService\x12q\n" + "\x15AdminLuckyGiftService\x12q\n" +
"\x12GetLuckyGiftConfig\x12,.hyapp.activity.v1.GetLuckyGiftConfigRequest\x1a-.hyapp.activity.v1.GetLuckyGiftConfigResponse\x12z\n" + "\x12GetLuckyGiftConfig\x12,.hyapp.activity.v1.GetLuckyGiftConfigRequest\x1a-.hyapp.activity.v1.GetLuckyGiftConfigResponse\x12z\n" +
"\x15UpsertLuckyGiftConfig\x12/.hyapp.activity.v1.UpsertLuckyGiftConfigRequest\x1a0.hyapp.activity.v1.UpsertLuckyGiftConfigResponse\x12q\n" + "\x15UpsertLuckyGiftConfig\x12/.hyapp.activity.v1.UpsertLuckyGiftConfigRequest\x1a0.hyapp.activity.v1.UpsertLuckyGiftConfigResponse\x12w\n" +
"\x14ListLuckyGiftConfigs\x12..hyapp.activity.v1.ListLuckyGiftConfigsRequest\x1a/.hyapp.activity.v1.ListLuckyGiftConfigsResponse\x12q\n" +
"\x12ListLuckyGiftDraws\x12,.hyapp.activity.v1.ListLuckyGiftDrawsRequest\x1a-.hyapp.activity.v1.ListLuckyGiftDrawsResponseB.Z,hyapp.local/api/proto/activity/v1;activityv1b\x06proto3" "\x12ListLuckyGiftDraws\x12,.hyapp.activity.v1.ListLuckyGiftDrawsRequest\x1a-.hyapp.activity.v1.ListLuckyGiftDrawsResponseB.Z,hyapp.local/api/proto/activity/v1;activityv1b\x06proto3"
var ( var (
@ -11304,7 +11397,7 @@ func file_proto_activity_v1_activity_proto_rawDescGZIP() []byte {
return file_proto_activity_v1_activity_proto_rawDescData return file_proto_activity_v1_activity_proto_rawDescData
} }
var file_proto_activity_v1_activity_proto_msgTypes = make([]protoimpl.MessageInfo, 125) var file_proto_activity_v1_activity_proto_msgTypes = make([]protoimpl.MessageInfo, 127)
var file_proto_activity_v1_activity_proto_goTypes = []any{ var file_proto_activity_v1_activity_proto_goTypes = []any{
(*RequestMeta)(nil), // 0: hyapp.activity.v1.RequestMeta (*RequestMeta)(nil), // 0: hyapp.activity.v1.RequestMeta
(*PingActivityRequest)(nil), // 1: hyapp.activity.v1.PingActivityRequest (*PingActivityRequest)(nil), // 1: hyapp.activity.v1.PingActivityRequest
@ -11429,9 +11522,11 @@ var file_proto_activity_v1_activity_proto_goTypes = []any{
(*GetLuckyGiftConfigResponse)(nil), // 120: hyapp.activity.v1.GetLuckyGiftConfigResponse (*GetLuckyGiftConfigResponse)(nil), // 120: hyapp.activity.v1.GetLuckyGiftConfigResponse
(*UpsertLuckyGiftConfigRequest)(nil), // 121: hyapp.activity.v1.UpsertLuckyGiftConfigRequest (*UpsertLuckyGiftConfigRequest)(nil), // 121: hyapp.activity.v1.UpsertLuckyGiftConfigRequest
(*UpsertLuckyGiftConfigResponse)(nil), // 122: hyapp.activity.v1.UpsertLuckyGiftConfigResponse (*UpsertLuckyGiftConfigResponse)(nil), // 122: hyapp.activity.v1.UpsertLuckyGiftConfigResponse
(*ListLuckyGiftDrawsRequest)(nil), // 123: hyapp.activity.v1.ListLuckyGiftDrawsRequest (*ListLuckyGiftConfigsRequest)(nil), // 123: hyapp.activity.v1.ListLuckyGiftConfigsRequest
(*ListLuckyGiftDrawsResponse)(nil), // 124: hyapp.activity.v1.ListLuckyGiftDrawsResponse (*ListLuckyGiftConfigsResponse)(nil), // 124: hyapp.activity.v1.ListLuckyGiftConfigsResponse
(*v1.EventEnvelope)(nil), // 125: hyapp.events.room.v1.EventEnvelope (*ListLuckyGiftDrawsRequest)(nil), // 125: hyapp.activity.v1.ListLuckyGiftDrawsRequest
(*ListLuckyGiftDrawsResponse)(nil), // 126: hyapp.activity.v1.ListLuckyGiftDrawsResponse
(*v1.EventEnvelope)(nil), // 127: hyapp.events.room.v1.EventEnvelope
} }
var file_proto_activity_v1_activity_proto_depIdxs = []int32{ var file_proto_activity_v1_activity_proto_depIdxs = []int32{
0, // 0: hyapp.activity.v1.PingActivityRequest.meta:type_name -> hyapp.activity.v1.RequestMeta 0, // 0: hyapp.activity.v1.PingActivityRequest.meta:type_name -> hyapp.activity.v1.RequestMeta
@ -11456,7 +11551,7 @@ var file_proto_activity_v1_activity_proto_depIdxs = []int32{
0, // 19: hyapp.activity.v1.PublishGlobalBroadcastRequest.meta:type_name -> hyapp.activity.v1.RequestMeta 0, // 19: hyapp.activity.v1.PublishGlobalBroadcastRequest.meta:type_name -> hyapp.activity.v1.RequestMeta
0, // 20: hyapp.activity.v1.RemoveRegionBroadcastMemberRequest.meta:type_name -> hyapp.activity.v1.RequestMeta 0, // 20: hyapp.activity.v1.RemoveRegionBroadcastMemberRequest.meta:type_name -> hyapp.activity.v1.RequestMeta
0, // 21: hyapp.activity.v1.ConsumeRoomEventRequest.meta:type_name -> hyapp.activity.v1.RequestMeta 0, // 21: hyapp.activity.v1.ConsumeRoomEventRequest.meta:type_name -> hyapp.activity.v1.RequestMeta
125, // 22: hyapp.activity.v1.ConsumeRoomEventRequest.envelope:type_name -> hyapp.events.room.v1.EventEnvelope 127, // 22: hyapp.activity.v1.ConsumeRoomEventRequest.envelope:type_name -> hyapp.events.room.v1.EventEnvelope
0, // 23: hyapp.activity.v1.ListTaskDefinitionsRequest.meta:type_name -> hyapp.activity.v1.RequestMeta 0, // 23: hyapp.activity.v1.ListTaskDefinitionsRequest.meta:type_name -> hyapp.activity.v1.RequestMeta
42, // 24: hyapp.activity.v1.ListTaskDefinitionsResponse.tasks:type_name -> hyapp.activity.v1.TaskDefinition 42, // 24: hyapp.activity.v1.ListTaskDefinitionsResponse.tasks:type_name -> hyapp.activity.v1.TaskDefinition
0, // 25: hyapp.activity.v1.UpsertTaskDefinitionRequest.meta:type_name -> hyapp.activity.v1.RequestMeta 0, // 25: hyapp.activity.v1.UpsertTaskDefinitionRequest.meta:type_name -> hyapp.activity.v1.RequestMeta
@ -11529,119 +11624,123 @@ var file_proto_activity_v1_activity_proto_depIdxs = []int32{
0, // 92: hyapp.activity.v1.UpsertLuckyGiftConfigRequest.meta:type_name -> hyapp.activity.v1.RequestMeta 0, // 92: hyapp.activity.v1.UpsertLuckyGiftConfigRequest.meta:type_name -> hyapp.activity.v1.RequestMeta
113, // 93: hyapp.activity.v1.UpsertLuckyGiftConfigRequest.config:type_name -> hyapp.activity.v1.LuckyGiftConfig 113, // 93: hyapp.activity.v1.UpsertLuckyGiftConfigRequest.config:type_name -> hyapp.activity.v1.LuckyGiftConfig
113, // 94: hyapp.activity.v1.UpsertLuckyGiftConfigResponse.config:type_name -> hyapp.activity.v1.LuckyGiftConfig 113, // 94: hyapp.activity.v1.UpsertLuckyGiftConfigResponse.config:type_name -> hyapp.activity.v1.LuckyGiftConfig
0, // 95: hyapp.activity.v1.ListLuckyGiftDrawsRequest.meta:type_name -> hyapp.activity.v1.RequestMeta 0, // 95: hyapp.activity.v1.ListLuckyGiftConfigsRequest.meta:type_name -> hyapp.activity.v1.RequestMeta
116, // 96: hyapp.activity.v1.ListLuckyGiftDrawsResponse.draws:type_name -> hyapp.activity.v1.LuckyGiftDrawResult 113, // 96: hyapp.activity.v1.ListLuckyGiftConfigsResponse.configs:type_name -> hyapp.activity.v1.LuckyGiftConfig
1, // 97: hyapp.activity.v1.ActivityService.PingActivity:input_type -> hyapp.activity.v1.PingActivityRequest 0, // 97: hyapp.activity.v1.ListLuckyGiftDrawsRequest.meta:type_name -> hyapp.activity.v1.RequestMeta
3, // 98: hyapp.activity.v1.ActivityService.GetActivityStatus:input_type -> hyapp.activity.v1.GetActivityStatusRequest 116, // 98: hyapp.activity.v1.ListLuckyGiftDrawsResponse.draws:type_name -> hyapp.activity.v1.LuckyGiftDrawResult
6, // 99: hyapp.activity.v1.MessageInboxService.ListMessageTabs:input_type -> hyapp.activity.v1.ListMessageTabsRequest 1, // 99: hyapp.activity.v1.ActivityService.PingActivity:input_type -> hyapp.activity.v1.PingActivityRequest
9, // 100: hyapp.activity.v1.MessageInboxService.ListInboxMessages:input_type -> hyapp.activity.v1.ListInboxMessagesRequest 3, // 100: hyapp.activity.v1.ActivityService.GetActivityStatus:input_type -> hyapp.activity.v1.GetActivityStatusRequest
11, // 101: hyapp.activity.v1.MessageInboxService.MarkInboxMessageRead:input_type -> hyapp.activity.v1.MarkInboxMessageReadRequest 6, // 101: hyapp.activity.v1.MessageInboxService.ListMessageTabs:input_type -> hyapp.activity.v1.ListMessageTabsRequest
13, // 102: hyapp.activity.v1.MessageInboxService.MarkInboxSectionRead:input_type -> hyapp.activity.v1.MarkInboxSectionReadRequest 9, // 102: hyapp.activity.v1.MessageInboxService.ListInboxMessages:input_type -> hyapp.activity.v1.ListInboxMessagesRequest
15, // 103: hyapp.activity.v1.MessageInboxService.DeleteInboxMessage:input_type -> hyapp.activity.v1.DeleteInboxMessageRequest 11, // 103: hyapp.activity.v1.MessageInboxService.MarkInboxMessageRead:input_type -> hyapp.activity.v1.MarkInboxMessageReadRequest
17, // 104: hyapp.activity.v1.MessageInboxService.CreateInboxMessage:input_type -> hyapp.activity.v1.CreateInboxMessageRequest 13, // 104: hyapp.activity.v1.MessageInboxService.MarkInboxSectionRead:input_type -> hyapp.activity.v1.MarkInboxSectionReadRequest
19, // 105: hyapp.activity.v1.MessageInboxService.CreateFanoutJob:input_type -> hyapp.activity.v1.CreateFanoutJobRequest 15, // 105: hyapp.activity.v1.MessageInboxService.DeleteInboxMessage:input_type -> hyapp.activity.v1.DeleteInboxMessageRequest
21, // 106: hyapp.activity.v1.ActivityCronService.ProcessMessageFanoutBatch:input_type -> hyapp.activity.v1.CronBatchRequest 17, // 106: hyapp.activity.v1.MessageInboxService.CreateInboxMessage:input_type -> hyapp.activity.v1.CreateInboxMessageRequest
21, // 107: hyapp.activity.v1.ActivityCronService.ProcessLevelRewardBatch:input_type -> hyapp.activity.v1.CronBatchRequest 19, // 107: hyapp.activity.v1.MessageInboxService.CreateFanoutJob:input_type -> hyapp.activity.v1.CreateFanoutJobRequest
21, // 108: hyapp.activity.v1.ActivityCronService.ProcessAchievementRewardBatch:input_type -> hyapp.activity.v1.CronBatchRequest 21, // 108: hyapp.activity.v1.ActivityCronService.ProcessMessageFanoutBatch:input_type -> hyapp.activity.v1.CronBatchRequest
25, // 109: hyapp.activity.v1.TaskService.ListUserTasks:input_type -> hyapp.activity.v1.ListUserTasksRequest 21, // 109: hyapp.activity.v1.ActivityCronService.ProcessLevelRewardBatch:input_type -> hyapp.activity.v1.CronBatchRequest
27, // 110: hyapp.activity.v1.TaskService.ClaimTaskReward:input_type -> hyapp.activity.v1.ClaimTaskRewardRequest 21, // 110: hyapp.activity.v1.ActivityCronService.ProcessAchievementRewardBatch:input_type -> hyapp.activity.v1.CronBatchRequest
29, // 111: hyapp.activity.v1.TaskService.ConsumeTaskEvent:input_type -> hyapp.activity.v1.ConsumeTaskEventRequest 25, // 111: hyapp.activity.v1.TaskService.ListUserTasks:input_type -> hyapp.activity.v1.ListUserTasksRequest
80, // 112: hyapp.activity.v1.GrowthLevelService.GetMyLevelOverview:input_type -> hyapp.activity.v1.GetMyLevelOverviewRequest 27, // 112: hyapp.activity.v1.TaskService.ClaimTaskReward:input_type -> hyapp.activity.v1.ClaimTaskRewardRequest
82, // 113: hyapp.activity.v1.GrowthLevelService.GetLevelTrack:input_type -> hyapp.activity.v1.GetLevelTrackRequest 29, // 113: hyapp.activity.v1.TaskService.ConsumeTaskEvent:input_type -> hyapp.activity.v1.ConsumeTaskEventRequest
85, // 114: hyapp.activity.v1.GrowthLevelService.ListLevelRewards:input_type -> hyapp.activity.v1.ListLevelRewardsRequest 80, // 114: hyapp.activity.v1.GrowthLevelService.GetMyLevelOverview:input_type -> hyapp.activity.v1.GetMyLevelOverviewRequest
87, // 115: hyapp.activity.v1.GrowthLevelService.ConsumeLevelEvent:input_type -> hyapp.activity.v1.ConsumeLevelEventRequest 82, // 115: hyapp.activity.v1.GrowthLevelService.GetLevelTrack:input_type -> hyapp.activity.v1.GetLevelTrackRequest
100, // 116: hyapp.activity.v1.AchievementService.ListAchievements:input_type -> hyapp.activity.v1.ListAchievementsRequest 85, // 116: hyapp.activity.v1.GrowthLevelService.ListLevelRewards:input_type -> hyapp.activity.v1.ListLevelRewardsRequest
102, // 117: hyapp.activity.v1.AchievementService.ConsumeAchievementEvent:input_type -> hyapp.activity.v1.ConsumeAchievementEventRequest 87, // 117: hyapp.activity.v1.GrowthLevelService.ConsumeLevelEvent:input_type -> hyapp.activity.v1.ConsumeLevelEventRequest
105, // 118: hyapp.activity.v1.AchievementService.ListMyBadges:input_type -> hyapp.activity.v1.ListMyBadgesRequest 100, // 118: hyapp.activity.v1.AchievementService.ListAchievements:input_type -> hyapp.activity.v1.ListAchievementsRequest
107, // 119: hyapp.activity.v1.AchievementService.SetBadgeDisplay:input_type -> hyapp.activity.v1.SetBadgeDisplayRequest 102, // 119: hyapp.activity.v1.AchievementService.ConsumeAchievementEvent:input_type -> hyapp.activity.v1.ConsumeAchievementEventRequest
114, // 120: hyapp.activity.v1.LuckyGiftService.CheckLuckyGift:input_type -> hyapp.activity.v1.CheckLuckyGiftRequest 105, // 120: hyapp.activity.v1.AchievementService.ListMyBadges:input_type -> hyapp.activity.v1.ListMyBadgesRequest
117, // 121: hyapp.activity.v1.LuckyGiftService.ExecuteLuckyGiftDraw:input_type -> hyapp.activity.v1.ExecuteLuckyGiftDrawRequest 107, // 121: hyapp.activity.v1.AchievementService.SetBadgeDisplay:input_type -> hyapp.activity.v1.SetBadgeDisplayRequest
32, // 122: hyapp.activity.v1.BroadcastService.EnsureBroadcastGroups:input_type -> hyapp.activity.v1.EnsureBroadcastGroupsRequest 114, // 122: hyapp.activity.v1.LuckyGiftService.CheckLuckyGift:input_type -> hyapp.activity.v1.CheckLuckyGiftRequest
34, // 123: hyapp.activity.v1.BroadcastService.PublishRegionBroadcast:input_type -> hyapp.activity.v1.PublishRegionBroadcastRequest 117, // 123: hyapp.activity.v1.LuckyGiftService.ExecuteLuckyGiftDraw:input_type -> hyapp.activity.v1.ExecuteLuckyGiftDrawRequest
35, // 124: hyapp.activity.v1.BroadcastService.PublishGlobalBroadcast:input_type -> hyapp.activity.v1.PublishGlobalBroadcastRequest 32, // 124: hyapp.activity.v1.BroadcastService.EnsureBroadcastGroups:input_type -> hyapp.activity.v1.EnsureBroadcastGroupsRequest
37, // 125: hyapp.activity.v1.BroadcastService.RemoveRegionBroadcastMember:input_type -> hyapp.activity.v1.RemoveRegionBroadcastMemberRequest 34, // 125: hyapp.activity.v1.BroadcastService.PublishRegionBroadcast:input_type -> hyapp.activity.v1.PublishRegionBroadcastRequest
21, // 126: hyapp.activity.v1.BroadcastService.ProcessBroadcastOutboxBatch:input_type -> hyapp.activity.v1.CronBatchRequest 35, // 126: hyapp.activity.v1.BroadcastService.PublishGlobalBroadcast:input_type -> hyapp.activity.v1.PublishGlobalBroadcastRequest
40, // 127: hyapp.activity.v1.RoomEventConsumerService.ConsumeRoomEvent:input_type -> hyapp.activity.v1.ConsumeRoomEventRequest 37, // 127: hyapp.activity.v1.BroadcastService.RemoveRegionBroadcastMember:input_type -> hyapp.activity.v1.RemoveRegionBroadcastMemberRequest
43, // 128: hyapp.activity.v1.AdminTaskService.ListTaskDefinitions:input_type -> hyapp.activity.v1.ListTaskDefinitionsRequest 21, // 128: hyapp.activity.v1.BroadcastService.ProcessBroadcastOutboxBatch:input_type -> hyapp.activity.v1.CronBatchRequest
45, // 129: hyapp.activity.v1.AdminTaskService.UpsertTaskDefinition:input_type -> hyapp.activity.v1.UpsertTaskDefinitionRequest 40, // 129: hyapp.activity.v1.RoomEventConsumerService.ConsumeRoomEvent:input_type -> hyapp.activity.v1.ConsumeRoomEventRequest
47, // 130: hyapp.activity.v1.AdminTaskService.SetTaskDefinitionStatus:input_type -> hyapp.activity.v1.SetTaskDefinitionStatusRequest 43, // 130: hyapp.activity.v1.AdminTaskService.ListTaskDefinitions:input_type -> hyapp.activity.v1.ListTaskDefinitionsRequest
52, // 131: hyapp.activity.v1.RegistrationRewardService.GetRegistrationRewardEligibility:input_type -> hyapp.activity.v1.GetRegistrationRewardEligibilityRequest 45, // 131: hyapp.activity.v1.AdminTaskService.UpsertTaskDefinition:input_type -> hyapp.activity.v1.UpsertTaskDefinitionRequest
54, // 132: hyapp.activity.v1.RegistrationRewardService.IssueRegistrationReward:input_type -> hyapp.activity.v1.IssueRegistrationRewardRequest 47, // 132: hyapp.activity.v1.AdminTaskService.SetTaskDefinitionStatus:input_type -> hyapp.activity.v1.SetTaskDefinitionStatusRequest
56, // 133: hyapp.activity.v1.AdminRegistrationRewardService.GetRegistrationRewardConfig:input_type -> hyapp.activity.v1.GetRegistrationRewardConfigRequest 52, // 133: hyapp.activity.v1.RegistrationRewardService.GetRegistrationRewardEligibility:input_type -> hyapp.activity.v1.GetRegistrationRewardEligibilityRequest
58, // 134: hyapp.activity.v1.AdminRegistrationRewardService.UpdateRegistrationRewardConfig:input_type -> hyapp.activity.v1.UpdateRegistrationRewardConfigRequest 54, // 134: hyapp.activity.v1.RegistrationRewardService.IssueRegistrationReward:input_type -> hyapp.activity.v1.IssueRegistrationRewardRequest
60, // 135: hyapp.activity.v1.AdminRegistrationRewardService.ListRegistrationRewardClaims:input_type -> hyapp.activity.v1.ListRegistrationRewardClaimsRequest 56, // 135: hyapp.activity.v1.AdminRegistrationRewardService.GetRegistrationRewardConfig:input_type -> hyapp.activity.v1.GetRegistrationRewardConfigRequest
65, // 136: hyapp.activity.v1.SevenDayCheckInService.GetSevenDayCheckInStatus:input_type -> hyapp.activity.v1.GetSevenDayCheckInStatusRequest 58, // 136: hyapp.activity.v1.AdminRegistrationRewardService.UpdateRegistrationRewardConfig:input_type -> hyapp.activity.v1.UpdateRegistrationRewardConfigRequest
67, // 137: hyapp.activity.v1.SevenDayCheckInService.SignSevenDayCheckIn:input_type -> hyapp.activity.v1.SignSevenDayCheckInRequest 60, // 137: hyapp.activity.v1.AdminRegistrationRewardService.ListRegistrationRewardClaims:input_type -> hyapp.activity.v1.ListRegistrationRewardClaimsRequest
69, // 138: hyapp.activity.v1.AdminSevenDayCheckInService.GetSevenDayCheckInConfig:input_type -> hyapp.activity.v1.GetSevenDayCheckInConfigRequest 65, // 138: hyapp.activity.v1.SevenDayCheckInService.GetSevenDayCheckInStatus:input_type -> hyapp.activity.v1.GetSevenDayCheckInStatusRequest
71, // 139: hyapp.activity.v1.AdminSevenDayCheckInService.UpdateSevenDayCheckInConfig:input_type -> hyapp.activity.v1.UpdateSevenDayCheckInConfigRequest 67, // 139: hyapp.activity.v1.SevenDayCheckInService.SignSevenDayCheckIn:input_type -> hyapp.activity.v1.SignSevenDayCheckInRequest
74, // 140: hyapp.activity.v1.AdminSevenDayCheckInService.ListSevenDayCheckInClaims:input_type -> hyapp.activity.v1.ListSevenDayCheckInClaimsRequest 69, // 140: hyapp.activity.v1.AdminSevenDayCheckInService.GetSevenDayCheckInConfig:input_type -> hyapp.activity.v1.GetSevenDayCheckInConfigRequest
95, // 141: hyapp.activity.v1.AdminGrowthLevelService.ListLevelConfig:input_type -> hyapp.activity.v1.ListLevelConfigRequest 71, // 141: hyapp.activity.v1.AdminSevenDayCheckInService.UpdateSevenDayCheckInConfig:input_type -> hyapp.activity.v1.UpdateSevenDayCheckInConfigRequest
89, // 142: hyapp.activity.v1.AdminGrowthLevelService.UpsertLevelTrack:input_type -> hyapp.activity.v1.UpsertLevelTrackRequest 74, // 142: hyapp.activity.v1.AdminSevenDayCheckInService.ListSevenDayCheckInClaims:input_type -> hyapp.activity.v1.ListSevenDayCheckInClaimsRequest
91, // 143: hyapp.activity.v1.AdminGrowthLevelService.UpsertLevelRule:input_type -> hyapp.activity.v1.UpsertLevelRuleRequest 95, // 143: hyapp.activity.v1.AdminGrowthLevelService.ListLevelConfig:input_type -> hyapp.activity.v1.ListLevelConfigRequest
93, // 144: hyapp.activity.v1.AdminGrowthLevelService.UpsertLevelTier:input_type -> hyapp.activity.v1.UpsertLevelTierRequest 89, // 144: hyapp.activity.v1.AdminGrowthLevelService.UpsertLevelTrack:input_type -> hyapp.activity.v1.UpsertLevelTrackRequest
100, // 145: hyapp.activity.v1.AdminAchievementService.ListAchievementDefinitions:input_type -> hyapp.activity.v1.ListAchievementsRequest 91, // 145: hyapp.activity.v1.AdminGrowthLevelService.UpsertLevelRule:input_type -> hyapp.activity.v1.UpsertLevelRuleRequest
109, // 146: hyapp.activity.v1.AdminAchievementService.UpsertAchievementDefinition:input_type -> hyapp.activity.v1.UpsertAchievementDefinitionRequest 93, // 146: hyapp.activity.v1.AdminGrowthLevelService.UpsertLevelTier:input_type -> hyapp.activity.v1.UpsertLevelTierRequest
119, // 147: hyapp.activity.v1.AdminLuckyGiftService.GetLuckyGiftConfig:input_type -> hyapp.activity.v1.GetLuckyGiftConfigRequest 100, // 147: hyapp.activity.v1.AdminAchievementService.ListAchievementDefinitions:input_type -> hyapp.activity.v1.ListAchievementsRequest
121, // 148: hyapp.activity.v1.AdminLuckyGiftService.UpsertLuckyGiftConfig:input_type -> hyapp.activity.v1.UpsertLuckyGiftConfigRequest 109, // 148: hyapp.activity.v1.AdminAchievementService.UpsertAchievementDefinition:input_type -> hyapp.activity.v1.UpsertAchievementDefinitionRequest
123, // 149: hyapp.activity.v1.AdminLuckyGiftService.ListLuckyGiftDraws:input_type -> hyapp.activity.v1.ListLuckyGiftDrawsRequest 119, // 149: hyapp.activity.v1.AdminLuckyGiftService.GetLuckyGiftConfig:input_type -> hyapp.activity.v1.GetLuckyGiftConfigRequest
2, // 150: hyapp.activity.v1.ActivityService.PingActivity:output_type -> hyapp.activity.v1.PingActivityResponse 121, // 150: hyapp.activity.v1.AdminLuckyGiftService.UpsertLuckyGiftConfig:input_type -> hyapp.activity.v1.UpsertLuckyGiftConfigRequest
4, // 151: hyapp.activity.v1.ActivityService.GetActivityStatus:output_type -> hyapp.activity.v1.GetActivityStatusResponse 123, // 151: hyapp.activity.v1.AdminLuckyGiftService.ListLuckyGiftConfigs:input_type -> hyapp.activity.v1.ListLuckyGiftConfigsRequest
7, // 152: hyapp.activity.v1.MessageInboxService.ListMessageTabs:output_type -> hyapp.activity.v1.ListMessageTabsResponse 125, // 152: hyapp.activity.v1.AdminLuckyGiftService.ListLuckyGiftDraws:input_type -> hyapp.activity.v1.ListLuckyGiftDrawsRequest
10, // 153: hyapp.activity.v1.MessageInboxService.ListInboxMessages:output_type -> hyapp.activity.v1.ListInboxMessagesResponse 2, // 153: hyapp.activity.v1.ActivityService.PingActivity:output_type -> hyapp.activity.v1.PingActivityResponse
12, // 154: hyapp.activity.v1.MessageInboxService.MarkInboxMessageRead:output_type -> hyapp.activity.v1.MarkInboxMessageReadResponse 4, // 154: hyapp.activity.v1.ActivityService.GetActivityStatus:output_type -> hyapp.activity.v1.GetActivityStatusResponse
14, // 155: hyapp.activity.v1.MessageInboxService.MarkInboxSectionRead:output_type -> hyapp.activity.v1.MarkInboxSectionReadResponse 7, // 155: hyapp.activity.v1.MessageInboxService.ListMessageTabs:output_type -> hyapp.activity.v1.ListMessageTabsResponse
16, // 156: hyapp.activity.v1.MessageInboxService.DeleteInboxMessage:output_type -> hyapp.activity.v1.DeleteInboxMessageResponse 10, // 156: hyapp.activity.v1.MessageInboxService.ListInboxMessages:output_type -> hyapp.activity.v1.ListInboxMessagesResponse
18, // 157: hyapp.activity.v1.MessageInboxService.CreateInboxMessage:output_type -> hyapp.activity.v1.CreateInboxMessageResponse 12, // 157: hyapp.activity.v1.MessageInboxService.MarkInboxMessageRead:output_type -> hyapp.activity.v1.MarkInboxMessageReadResponse
20, // 158: hyapp.activity.v1.MessageInboxService.CreateFanoutJob:output_type -> hyapp.activity.v1.CreateFanoutJobResponse 14, // 158: hyapp.activity.v1.MessageInboxService.MarkInboxSectionRead:output_type -> hyapp.activity.v1.MarkInboxSectionReadResponse
22, // 159: hyapp.activity.v1.ActivityCronService.ProcessMessageFanoutBatch:output_type -> hyapp.activity.v1.CronBatchResponse 16, // 159: hyapp.activity.v1.MessageInboxService.DeleteInboxMessage:output_type -> hyapp.activity.v1.DeleteInboxMessageResponse
22, // 160: hyapp.activity.v1.ActivityCronService.ProcessLevelRewardBatch:output_type -> hyapp.activity.v1.CronBatchResponse 18, // 160: hyapp.activity.v1.MessageInboxService.CreateInboxMessage:output_type -> hyapp.activity.v1.CreateInboxMessageResponse
22, // 161: hyapp.activity.v1.ActivityCronService.ProcessAchievementRewardBatch:output_type -> hyapp.activity.v1.CronBatchResponse 20, // 161: hyapp.activity.v1.MessageInboxService.CreateFanoutJob:output_type -> hyapp.activity.v1.CreateFanoutJobResponse
26, // 162: hyapp.activity.v1.TaskService.ListUserTasks:output_type -> hyapp.activity.v1.ListUserTasksResponse 22, // 162: hyapp.activity.v1.ActivityCronService.ProcessMessageFanoutBatch:output_type -> hyapp.activity.v1.CronBatchResponse
28, // 163: hyapp.activity.v1.TaskService.ClaimTaskReward:output_type -> hyapp.activity.v1.ClaimTaskRewardResponse 22, // 163: hyapp.activity.v1.ActivityCronService.ProcessLevelRewardBatch:output_type -> hyapp.activity.v1.CronBatchResponse
30, // 164: hyapp.activity.v1.TaskService.ConsumeTaskEvent:output_type -> hyapp.activity.v1.ConsumeTaskEventResponse 22, // 164: hyapp.activity.v1.ActivityCronService.ProcessAchievementRewardBatch:output_type -> hyapp.activity.v1.CronBatchResponse
81, // 165: hyapp.activity.v1.GrowthLevelService.GetMyLevelOverview:output_type -> hyapp.activity.v1.GetMyLevelOverviewResponse 26, // 165: hyapp.activity.v1.TaskService.ListUserTasks:output_type -> hyapp.activity.v1.ListUserTasksResponse
83, // 166: hyapp.activity.v1.GrowthLevelService.GetLevelTrack:output_type -> hyapp.activity.v1.GetLevelTrackResponse 28, // 166: hyapp.activity.v1.TaskService.ClaimTaskReward:output_type -> hyapp.activity.v1.ClaimTaskRewardResponse
86, // 167: hyapp.activity.v1.GrowthLevelService.ListLevelRewards:output_type -> hyapp.activity.v1.ListLevelRewardsResponse 30, // 167: hyapp.activity.v1.TaskService.ConsumeTaskEvent:output_type -> hyapp.activity.v1.ConsumeTaskEventResponse
88, // 168: hyapp.activity.v1.GrowthLevelService.ConsumeLevelEvent:output_type -> hyapp.activity.v1.ConsumeLevelEventResponse 81, // 168: hyapp.activity.v1.GrowthLevelService.GetMyLevelOverview:output_type -> hyapp.activity.v1.GetMyLevelOverviewResponse
101, // 169: hyapp.activity.v1.AchievementService.ListAchievements:output_type -> hyapp.activity.v1.ListAchievementsResponse 83, // 169: hyapp.activity.v1.GrowthLevelService.GetLevelTrack:output_type -> hyapp.activity.v1.GetLevelTrackResponse
103, // 170: hyapp.activity.v1.AchievementService.ConsumeAchievementEvent:output_type -> hyapp.activity.v1.ConsumeAchievementEventResponse 86, // 170: hyapp.activity.v1.GrowthLevelService.ListLevelRewards:output_type -> hyapp.activity.v1.ListLevelRewardsResponse
106, // 171: hyapp.activity.v1.AchievementService.ListMyBadges:output_type -> hyapp.activity.v1.ListMyBadgesResponse 88, // 171: hyapp.activity.v1.GrowthLevelService.ConsumeLevelEvent:output_type -> hyapp.activity.v1.ConsumeLevelEventResponse
108, // 172: hyapp.activity.v1.AchievementService.SetBadgeDisplay:output_type -> hyapp.activity.v1.SetBadgeDisplayResponse 101, // 172: hyapp.activity.v1.AchievementService.ListAchievements:output_type -> hyapp.activity.v1.ListAchievementsResponse
115, // 173: hyapp.activity.v1.LuckyGiftService.CheckLuckyGift:output_type -> hyapp.activity.v1.CheckLuckyGiftResponse 103, // 173: hyapp.activity.v1.AchievementService.ConsumeAchievementEvent:output_type -> hyapp.activity.v1.ConsumeAchievementEventResponse
118, // 174: hyapp.activity.v1.LuckyGiftService.ExecuteLuckyGiftDraw:output_type -> hyapp.activity.v1.ExecuteLuckyGiftDrawResponse 106, // 174: hyapp.activity.v1.AchievementService.ListMyBadges:output_type -> hyapp.activity.v1.ListMyBadgesResponse
33, // 175: hyapp.activity.v1.BroadcastService.EnsureBroadcastGroups:output_type -> hyapp.activity.v1.EnsureBroadcastGroupsResponse 108, // 175: hyapp.activity.v1.AchievementService.SetBadgeDisplay:output_type -> hyapp.activity.v1.SetBadgeDisplayResponse
36, // 176: hyapp.activity.v1.BroadcastService.PublishRegionBroadcast:output_type -> hyapp.activity.v1.PublishBroadcastResponse 115, // 176: hyapp.activity.v1.LuckyGiftService.CheckLuckyGift:output_type -> hyapp.activity.v1.CheckLuckyGiftResponse
36, // 177: hyapp.activity.v1.BroadcastService.PublishGlobalBroadcast:output_type -> hyapp.activity.v1.PublishBroadcastResponse 118, // 177: hyapp.activity.v1.LuckyGiftService.ExecuteLuckyGiftDraw:output_type -> hyapp.activity.v1.ExecuteLuckyGiftDrawResponse
38, // 178: hyapp.activity.v1.BroadcastService.RemoveRegionBroadcastMember:output_type -> hyapp.activity.v1.RemoveRegionBroadcastMemberResponse 33, // 178: hyapp.activity.v1.BroadcastService.EnsureBroadcastGroups:output_type -> hyapp.activity.v1.EnsureBroadcastGroupsResponse
39, // 179: hyapp.activity.v1.BroadcastService.ProcessBroadcastOutboxBatch:output_type -> hyapp.activity.v1.ProcessBroadcastOutboxBatchResponse 36, // 179: hyapp.activity.v1.BroadcastService.PublishRegionBroadcast:output_type -> hyapp.activity.v1.PublishBroadcastResponse
41, // 180: hyapp.activity.v1.RoomEventConsumerService.ConsumeRoomEvent:output_type -> hyapp.activity.v1.ConsumeRoomEventResponse 36, // 180: hyapp.activity.v1.BroadcastService.PublishGlobalBroadcast:output_type -> hyapp.activity.v1.PublishBroadcastResponse
44, // 181: hyapp.activity.v1.AdminTaskService.ListTaskDefinitions:output_type -> hyapp.activity.v1.ListTaskDefinitionsResponse 38, // 181: hyapp.activity.v1.BroadcastService.RemoveRegionBroadcastMember:output_type -> hyapp.activity.v1.RemoveRegionBroadcastMemberResponse
46, // 182: hyapp.activity.v1.AdminTaskService.UpsertTaskDefinition:output_type -> hyapp.activity.v1.UpsertTaskDefinitionResponse 39, // 182: hyapp.activity.v1.BroadcastService.ProcessBroadcastOutboxBatch:output_type -> hyapp.activity.v1.ProcessBroadcastOutboxBatchResponse
48, // 183: hyapp.activity.v1.AdminTaskService.SetTaskDefinitionStatus:output_type -> hyapp.activity.v1.SetTaskDefinitionStatusResponse 41, // 183: hyapp.activity.v1.RoomEventConsumerService.ConsumeRoomEvent:output_type -> hyapp.activity.v1.ConsumeRoomEventResponse
53, // 184: hyapp.activity.v1.RegistrationRewardService.GetRegistrationRewardEligibility:output_type -> hyapp.activity.v1.GetRegistrationRewardEligibilityResponse 44, // 184: hyapp.activity.v1.AdminTaskService.ListTaskDefinitions:output_type -> hyapp.activity.v1.ListTaskDefinitionsResponse
55, // 185: hyapp.activity.v1.RegistrationRewardService.IssueRegistrationReward:output_type -> hyapp.activity.v1.IssueRegistrationRewardResponse 46, // 185: hyapp.activity.v1.AdminTaskService.UpsertTaskDefinition:output_type -> hyapp.activity.v1.UpsertTaskDefinitionResponse
57, // 186: hyapp.activity.v1.AdminRegistrationRewardService.GetRegistrationRewardConfig:output_type -> hyapp.activity.v1.GetRegistrationRewardConfigResponse 48, // 186: hyapp.activity.v1.AdminTaskService.SetTaskDefinitionStatus:output_type -> hyapp.activity.v1.SetTaskDefinitionStatusResponse
59, // 187: hyapp.activity.v1.AdminRegistrationRewardService.UpdateRegistrationRewardConfig:output_type -> hyapp.activity.v1.UpdateRegistrationRewardConfigResponse 53, // 187: hyapp.activity.v1.RegistrationRewardService.GetRegistrationRewardEligibility:output_type -> hyapp.activity.v1.GetRegistrationRewardEligibilityResponse
61, // 188: hyapp.activity.v1.AdminRegistrationRewardService.ListRegistrationRewardClaims:output_type -> hyapp.activity.v1.ListRegistrationRewardClaimsResponse 55, // 188: hyapp.activity.v1.RegistrationRewardService.IssueRegistrationReward:output_type -> hyapp.activity.v1.IssueRegistrationRewardResponse
66, // 189: hyapp.activity.v1.SevenDayCheckInService.GetSevenDayCheckInStatus:output_type -> hyapp.activity.v1.GetSevenDayCheckInStatusResponse 57, // 189: hyapp.activity.v1.AdminRegistrationRewardService.GetRegistrationRewardConfig:output_type -> hyapp.activity.v1.GetRegistrationRewardConfigResponse
68, // 190: hyapp.activity.v1.SevenDayCheckInService.SignSevenDayCheckIn:output_type -> hyapp.activity.v1.SignSevenDayCheckInResponse 59, // 190: hyapp.activity.v1.AdminRegistrationRewardService.UpdateRegistrationRewardConfig:output_type -> hyapp.activity.v1.UpdateRegistrationRewardConfigResponse
70, // 191: hyapp.activity.v1.AdminSevenDayCheckInService.GetSevenDayCheckInConfig:output_type -> hyapp.activity.v1.GetSevenDayCheckInConfigResponse 61, // 191: hyapp.activity.v1.AdminRegistrationRewardService.ListRegistrationRewardClaims:output_type -> hyapp.activity.v1.ListRegistrationRewardClaimsResponse
72, // 192: hyapp.activity.v1.AdminSevenDayCheckInService.UpdateSevenDayCheckInConfig:output_type -> hyapp.activity.v1.UpdateSevenDayCheckInConfigResponse 66, // 192: hyapp.activity.v1.SevenDayCheckInService.GetSevenDayCheckInStatus:output_type -> hyapp.activity.v1.GetSevenDayCheckInStatusResponse
75, // 193: hyapp.activity.v1.AdminSevenDayCheckInService.ListSevenDayCheckInClaims:output_type -> hyapp.activity.v1.ListSevenDayCheckInClaimsResponse 68, // 193: hyapp.activity.v1.SevenDayCheckInService.SignSevenDayCheckIn:output_type -> hyapp.activity.v1.SignSevenDayCheckInResponse
96, // 194: hyapp.activity.v1.AdminGrowthLevelService.ListLevelConfig:output_type -> hyapp.activity.v1.ListLevelConfigResponse 70, // 194: hyapp.activity.v1.AdminSevenDayCheckInService.GetSevenDayCheckInConfig:output_type -> hyapp.activity.v1.GetSevenDayCheckInConfigResponse
90, // 195: hyapp.activity.v1.AdminGrowthLevelService.UpsertLevelTrack:output_type -> hyapp.activity.v1.UpsertLevelTrackResponse 72, // 195: hyapp.activity.v1.AdminSevenDayCheckInService.UpdateSevenDayCheckInConfig:output_type -> hyapp.activity.v1.UpdateSevenDayCheckInConfigResponse
92, // 196: hyapp.activity.v1.AdminGrowthLevelService.UpsertLevelRule:output_type -> hyapp.activity.v1.UpsertLevelRuleResponse 75, // 196: hyapp.activity.v1.AdminSevenDayCheckInService.ListSevenDayCheckInClaims:output_type -> hyapp.activity.v1.ListSevenDayCheckInClaimsResponse
94, // 197: hyapp.activity.v1.AdminGrowthLevelService.UpsertLevelTier:output_type -> hyapp.activity.v1.UpsertLevelTierResponse 96, // 197: hyapp.activity.v1.AdminGrowthLevelService.ListLevelConfig:output_type -> hyapp.activity.v1.ListLevelConfigResponse
101, // 198: hyapp.activity.v1.AdminAchievementService.ListAchievementDefinitions:output_type -> hyapp.activity.v1.ListAchievementsResponse 90, // 198: hyapp.activity.v1.AdminGrowthLevelService.UpsertLevelTrack:output_type -> hyapp.activity.v1.UpsertLevelTrackResponse
110, // 199: hyapp.activity.v1.AdminAchievementService.UpsertAchievementDefinition:output_type -> hyapp.activity.v1.UpsertAchievementDefinitionResponse 92, // 199: hyapp.activity.v1.AdminGrowthLevelService.UpsertLevelRule:output_type -> hyapp.activity.v1.UpsertLevelRuleResponse
120, // 200: hyapp.activity.v1.AdminLuckyGiftService.GetLuckyGiftConfig:output_type -> hyapp.activity.v1.GetLuckyGiftConfigResponse 94, // 200: hyapp.activity.v1.AdminGrowthLevelService.UpsertLevelTier:output_type -> hyapp.activity.v1.UpsertLevelTierResponse
122, // 201: hyapp.activity.v1.AdminLuckyGiftService.UpsertLuckyGiftConfig:output_type -> hyapp.activity.v1.UpsertLuckyGiftConfigResponse 101, // 201: hyapp.activity.v1.AdminAchievementService.ListAchievementDefinitions:output_type -> hyapp.activity.v1.ListAchievementsResponse
124, // 202: hyapp.activity.v1.AdminLuckyGiftService.ListLuckyGiftDraws:output_type -> hyapp.activity.v1.ListLuckyGiftDrawsResponse 110, // 202: hyapp.activity.v1.AdminAchievementService.UpsertAchievementDefinition:output_type -> hyapp.activity.v1.UpsertAchievementDefinitionResponse
150, // [150:203] is the sub-list for method output_type 120, // 203: hyapp.activity.v1.AdminLuckyGiftService.GetLuckyGiftConfig:output_type -> hyapp.activity.v1.GetLuckyGiftConfigResponse
97, // [97:150] is the sub-list for method input_type 122, // 204: hyapp.activity.v1.AdminLuckyGiftService.UpsertLuckyGiftConfig:output_type -> hyapp.activity.v1.UpsertLuckyGiftConfigResponse
97, // [97:97] is the sub-list for extension type_name 124, // 205: hyapp.activity.v1.AdminLuckyGiftService.ListLuckyGiftConfigs:output_type -> hyapp.activity.v1.ListLuckyGiftConfigsResponse
97, // [97:97] is the sub-list for extension extendee 126, // 206: hyapp.activity.v1.AdminLuckyGiftService.ListLuckyGiftDraws:output_type -> hyapp.activity.v1.ListLuckyGiftDrawsResponse
0, // [0:97] is the sub-list for field type_name 153, // [153:207] is the sub-list for method output_type
99, // [99:153] is the sub-list for method input_type
99, // [99:99] is the sub-list for extension type_name
99, // [99:99] is the sub-list for extension extendee
0, // [0:99] is the sub-list for field type_name
} }
func init() { file_proto_activity_v1_activity_proto_init() } func init() { file_proto_activity_v1_activity_proto_init() }
@ -11655,7 +11754,7 @@ func file_proto_activity_v1_activity_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(), GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_proto_activity_v1_activity_proto_rawDesc), len(file_proto_activity_v1_activity_proto_rawDesc)), RawDescriptor: unsafe.Slice(unsafe.StringData(file_proto_activity_v1_activity_proto_rawDesc), len(file_proto_activity_v1_activity_proto_rawDesc)),
NumEnums: 0, NumEnums: 0,
NumMessages: 125, NumMessages: 127,
NumExtensions: 0, NumExtensions: 0,
NumServices: 17, NumServices: 17,
}, },

View File

@ -1132,6 +1132,14 @@ message UpsertLuckyGiftConfigResponse {
LuckyGiftConfig config = 1; LuckyGiftConfig config = 1;
} }
message ListLuckyGiftConfigsRequest {
RequestMeta meta = 1;
}
message ListLuckyGiftConfigsResponse {
repeated LuckyGiftConfig configs = 1;
}
message ListLuckyGiftDrawsRequest { message ListLuckyGiftDrawsRequest {
RequestMeta meta = 1; RequestMeta meta = 1;
string gift_id = 2; string gift_id = 2;
@ -1266,5 +1274,6 @@ service AdminAchievementService {
service AdminLuckyGiftService { service AdminLuckyGiftService {
rpc GetLuckyGiftConfig(GetLuckyGiftConfigRequest) returns (GetLuckyGiftConfigResponse); rpc GetLuckyGiftConfig(GetLuckyGiftConfigRequest) returns (GetLuckyGiftConfigResponse);
rpc UpsertLuckyGiftConfig(UpsertLuckyGiftConfigRequest) returns (UpsertLuckyGiftConfigResponse); rpc UpsertLuckyGiftConfig(UpsertLuckyGiftConfigRequest) returns (UpsertLuckyGiftConfigResponse);
rpc ListLuckyGiftConfigs(ListLuckyGiftConfigsRequest) returns (ListLuckyGiftConfigsResponse);
rpc ListLuckyGiftDraws(ListLuckyGiftDrawsRequest) returns (ListLuckyGiftDrawsResponse); rpc ListLuckyGiftDraws(ListLuckyGiftDrawsRequest) returns (ListLuckyGiftDrawsResponse);
} }

View File

@ -3016,6 +3016,7 @@ var AdminAchievementService_ServiceDesc = grpc.ServiceDesc{
const ( const (
AdminLuckyGiftService_GetLuckyGiftConfig_FullMethodName = "/hyapp.activity.v1.AdminLuckyGiftService/GetLuckyGiftConfig" AdminLuckyGiftService_GetLuckyGiftConfig_FullMethodName = "/hyapp.activity.v1.AdminLuckyGiftService/GetLuckyGiftConfig"
AdminLuckyGiftService_UpsertLuckyGiftConfig_FullMethodName = "/hyapp.activity.v1.AdminLuckyGiftService/UpsertLuckyGiftConfig" AdminLuckyGiftService_UpsertLuckyGiftConfig_FullMethodName = "/hyapp.activity.v1.AdminLuckyGiftService/UpsertLuckyGiftConfig"
AdminLuckyGiftService_ListLuckyGiftConfigs_FullMethodName = "/hyapp.activity.v1.AdminLuckyGiftService/ListLuckyGiftConfigs"
AdminLuckyGiftService_ListLuckyGiftDraws_FullMethodName = "/hyapp.activity.v1.AdminLuckyGiftService/ListLuckyGiftDraws" AdminLuckyGiftService_ListLuckyGiftDraws_FullMethodName = "/hyapp.activity.v1.AdminLuckyGiftService/ListLuckyGiftDraws"
) )
@ -3027,6 +3028,7 @@ const (
type AdminLuckyGiftServiceClient interface { type AdminLuckyGiftServiceClient interface {
GetLuckyGiftConfig(ctx context.Context, in *GetLuckyGiftConfigRequest, opts ...grpc.CallOption) (*GetLuckyGiftConfigResponse, error) GetLuckyGiftConfig(ctx context.Context, in *GetLuckyGiftConfigRequest, opts ...grpc.CallOption) (*GetLuckyGiftConfigResponse, error)
UpsertLuckyGiftConfig(ctx context.Context, in *UpsertLuckyGiftConfigRequest, opts ...grpc.CallOption) (*UpsertLuckyGiftConfigResponse, error) UpsertLuckyGiftConfig(ctx context.Context, in *UpsertLuckyGiftConfigRequest, opts ...grpc.CallOption) (*UpsertLuckyGiftConfigResponse, error)
ListLuckyGiftConfigs(ctx context.Context, in *ListLuckyGiftConfigsRequest, opts ...grpc.CallOption) (*ListLuckyGiftConfigsResponse, error)
ListLuckyGiftDraws(ctx context.Context, in *ListLuckyGiftDrawsRequest, opts ...grpc.CallOption) (*ListLuckyGiftDrawsResponse, error) ListLuckyGiftDraws(ctx context.Context, in *ListLuckyGiftDrawsRequest, opts ...grpc.CallOption) (*ListLuckyGiftDrawsResponse, error)
} }
@ -3058,6 +3060,16 @@ func (c *adminLuckyGiftServiceClient) UpsertLuckyGiftConfig(ctx context.Context,
return out, nil return out, nil
} }
func (c *adminLuckyGiftServiceClient) ListLuckyGiftConfigs(ctx context.Context, in *ListLuckyGiftConfigsRequest, opts ...grpc.CallOption) (*ListLuckyGiftConfigsResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(ListLuckyGiftConfigsResponse)
err := c.cc.Invoke(ctx, AdminLuckyGiftService_ListLuckyGiftConfigs_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *adminLuckyGiftServiceClient) ListLuckyGiftDraws(ctx context.Context, in *ListLuckyGiftDrawsRequest, opts ...grpc.CallOption) (*ListLuckyGiftDrawsResponse, error) { func (c *adminLuckyGiftServiceClient) ListLuckyGiftDraws(ctx context.Context, in *ListLuckyGiftDrawsRequest, opts ...grpc.CallOption) (*ListLuckyGiftDrawsResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(ListLuckyGiftDrawsResponse) out := new(ListLuckyGiftDrawsResponse)
@ -3076,6 +3088,7 @@ func (c *adminLuckyGiftServiceClient) ListLuckyGiftDraws(ctx context.Context, in
type AdminLuckyGiftServiceServer interface { type AdminLuckyGiftServiceServer interface {
GetLuckyGiftConfig(context.Context, *GetLuckyGiftConfigRequest) (*GetLuckyGiftConfigResponse, error) GetLuckyGiftConfig(context.Context, *GetLuckyGiftConfigRequest) (*GetLuckyGiftConfigResponse, error)
UpsertLuckyGiftConfig(context.Context, *UpsertLuckyGiftConfigRequest) (*UpsertLuckyGiftConfigResponse, error) UpsertLuckyGiftConfig(context.Context, *UpsertLuckyGiftConfigRequest) (*UpsertLuckyGiftConfigResponse, error)
ListLuckyGiftConfigs(context.Context, *ListLuckyGiftConfigsRequest) (*ListLuckyGiftConfigsResponse, error)
ListLuckyGiftDraws(context.Context, *ListLuckyGiftDrawsRequest) (*ListLuckyGiftDrawsResponse, error) ListLuckyGiftDraws(context.Context, *ListLuckyGiftDrawsRequest) (*ListLuckyGiftDrawsResponse, error)
mustEmbedUnimplementedAdminLuckyGiftServiceServer() mustEmbedUnimplementedAdminLuckyGiftServiceServer()
} }
@ -3093,6 +3106,9 @@ func (UnimplementedAdminLuckyGiftServiceServer) GetLuckyGiftConfig(context.Conte
func (UnimplementedAdminLuckyGiftServiceServer) UpsertLuckyGiftConfig(context.Context, *UpsertLuckyGiftConfigRequest) (*UpsertLuckyGiftConfigResponse, error) { func (UnimplementedAdminLuckyGiftServiceServer) UpsertLuckyGiftConfig(context.Context, *UpsertLuckyGiftConfigRequest) (*UpsertLuckyGiftConfigResponse, error) {
return nil, status.Error(codes.Unimplemented, "method UpsertLuckyGiftConfig not implemented") return nil, status.Error(codes.Unimplemented, "method UpsertLuckyGiftConfig not implemented")
} }
func (UnimplementedAdminLuckyGiftServiceServer) ListLuckyGiftConfigs(context.Context, *ListLuckyGiftConfigsRequest) (*ListLuckyGiftConfigsResponse, error) {
return nil, status.Error(codes.Unimplemented, "method ListLuckyGiftConfigs not implemented")
}
func (UnimplementedAdminLuckyGiftServiceServer) ListLuckyGiftDraws(context.Context, *ListLuckyGiftDrawsRequest) (*ListLuckyGiftDrawsResponse, error) { func (UnimplementedAdminLuckyGiftServiceServer) ListLuckyGiftDraws(context.Context, *ListLuckyGiftDrawsRequest) (*ListLuckyGiftDrawsResponse, error) {
return nil, status.Error(codes.Unimplemented, "method ListLuckyGiftDraws not implemented") return nil, status.Error(codes.Unimplemented, "method ListLuckyGiftDraws not implemented")
} }
@ -3153,6 +3169,24 @@ func _AdminLuckyGiftService_UpsertLuckyGiftConfig_Handler(srv interface{}, ctx c
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _AdminLuckyGiftService_ListLuckyGiftConfigs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ListLuckyGiftConfigsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(AdminLuckyGiftServiceServer).ListLuckyGiftConfigs(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: AdminLuckyGiftService_ListLuckyGiftConfigs_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(AdminLuckyGiftServiceServer).ListLuckyGiftConfigs(ctx, req.(*ListLuckyGiftConfigsRequest))
}
return interceptor(ctx, in, info, handler)
}
func _AdminLuckyGiftService_ListLuckyGiftDraws_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { func _AdminLuckyGiftService_ListLuckyGiftDraws_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ListLuckyGiftDrawsRequest) in := new(ListLuckyGiftDrawsRequest)
if err := dec(in); err != nil { if err := dec(in); err != nil {
@ -3186,6 +3220,10 @@ var AdminLuckyGiftService_ServiceDesc = grpc.ServiceDesc{
MethodName: "UpsertLuckyGiftConfig", MethodName: "UpsertLuckyGiftConfig",
Handler: _AdminLuckyGiftService_UpsertLuckyGiftConfig_Handler, Handler: _AdminLuckyGiftService_UpsertLuckyGiftConfig_Handler,
}, },
{
MethodName: "ListLuckyGiftConfigs",
Handler: _AdminLuckyGiftService_ListLuckyGiftConfigs_Handler,
},
{ {
MethodName: "ListLuckyGiftDraws", MethodName: "ListLuckyGiftDraws",
Handler: _AdminLuckyGiftService_ListLuckyGiftDraws_Handler, Handler: _AdminLuckyGiftService_ListLuckyGiftDraws_Handler,

View File

@ -703,6 +703,9 @@ type LaunchGameRequest struct {
GameId string `protobuf:"bytes,4,opt,name=game_id,json=gameId,proto3" json:"game_id,omitempty"` GameId string `protobuf:"bytes,4,opt,name=game_id,json=gameId,proto3" json:"game_id,omitempty"`
Scene string `protobuf:"bytes,5,opt,name=scene,proto3" json:"scene,omitempty"` Scene string `protobuf:"bytes,5,opt,name=scene,proto3" json:"scene,omitempty"`
RoomId string `protobuf:"bytes,6,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"` RoomId string `protobuf:"bytes,6,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"`
// access_token is the same bearer token used by the App request.
// Provider adapters pass it through as the game token instead of minting a separate game token.
AccessToken string `protobuf:"bytes,7,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"`
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
} }
@ -779,6 +782,13 @@ func (x *LaunchGameRequest) GetRoomId() string {
return "" return ""
} }
func (x *LaunchGameRequest) GetAccessToken() string {
if x != nil {
return x.AccessToken
}
return ""
}
type LaunchGameResponse struct { type LaunchGameResponse struct {
state protoimpl.MessageState `protogen:"open.v1"` state protoimpl.MessageState `protogen:"open.v1"`
SessionId string `protobuf:"bytes,1,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"` SessionId string `protobuf:"bytes,1,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"`
@ -1737,14 +1747,15 @@ const file_proto_game_v1_game_proto_rawDesc = "" +
"\x0fclient_platform\x18\a \x01(\tR\x0eclientPlatform\"g\n" + "\x0fclient_platform\x18\a \x01(\tR\x0eclientPlatform\"g\n" +
"\x11ListGamesResponse\x12,\n" + "\x11ListGamesResponse\x12,\n" +
"\x05games\x18\x01 \x03(\v2\x16.hyapp.game.v1.AppGameR\x05games\x12$\n" + "\x05games\x18\x01 \x03(\v2\x16.hyapp.game.v1.AppGameR\x05games\x12$\n" +
"\x0eserver_time_ms\x18\x02 \x01(\x03R\fserverTimeMs\"\xcc\x01\n" + "\x0eserver_time_ms\x18\x02 \x01(\x03R\fserverTimeMs\"\xef\x01\n" +
"\x11LaunchGameRequest\x12.\n" + "\x11LaunchGameRequest\x12.\n" +
"\x04meta\x18\x01 \x01(\v2\x1a.hyapp.game.v1.RequestMetaR\x04meta\x12\x17\n" + "\x04meta\x18\x01 \x01(\v2\x1a.hyapp.game.v1.RequestMetaR\x04meta\x12\x17\n" +
"\auser_id\x18\x02 \x01(\x03R\x06userId\x12&\n" + "\auser_id\x18\x02 \x01(\x03R\x06userId\x12&\n" +
"\x0fdisplay_user_id\x18\x03 \x01(\tR\rdisplayUserId\x12\x17\n" + "\x0fdisplay_user_id\x18\x03 \x01(\tR\rdisplayUserId\x12\x17\n" +
"\agame_id\x18\x04 \x01(\tR\x06gameId\x12\x14\n" + "\agame_id\x18\x04 \x01(\tR\x06gameId\x12\x14\n" +
"\x05scene\x18\x05 \x01(\tR\x05scene\x12\x17\n" + "\x05scene\x18\x05 \x01(\tR\x05scene\x12\x17\n" +
"\aroom_id\x18\x06 \x01(\tR\x06roomId\"\xbe\x01\n" + "\aroom_id\x18\x06 \x01(\tR\x06roomId\x12!\n" +
"\faccess_token\x18\a \x01(\tR\vaccessToken\"\xbe\x01\n" +
"\x12LaunchGameResponse\x12\x1d\n" + "\x12LaunchGameResponse\x12\x1d\n" +
"\n" + "\n" +
"session_id\x18\x01 \x01(\tR\tsessionId\x12\x1d\n" + "session_id\x18\x01 \x01(\tR\tsessionId\x12\x1d\n" +

View File

@ -88,6 +88,9 @@ message LaunchGameRequest {
string game_id = 4; string game_id = 4;
string scene = 5; string scene = 5;
string room_id = 6; string room_id = 6;
// access_token is the same bearer token used by the App request.
// Provider adapters pass it through as the game token instead of minting a separate game token.
string access_token = 7;
} }
message LaunchGameResponse { message LaunchGameResponse {

View File

@ -454,6 +454,248 @@ func (x *SetPasswordResponse) GetPasswordSet() bool {
return false return false
} }
// QuickCreateAccountRequest 为测试和三方联调快速创建一个可密码登录的完整账号。
type QuickCreateAccountRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
Meta *RequestMeta `protobuf:"bytes,1,opt,name=meta,proto3" json:"meta,omitempty"`
Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"`
Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"`
Avatar string `protobuf:"bytes,4,opt,name=avatar,proto3" json:"avatar,omitempty"`
Gender string `protobuf:"bytes,5,opt,name=gender,proto3" json:"gender,omitempty"`
Country string `protobuf:"bytes,6,opt,name=country,proto3" json:"country,omitempty"`
InviteCode string `protobuf:"bytes,7,opt,name=invite_code,json=inviteCode,proto3" json:"invite_code,omitempty"`
DeviceId string `protobuf:"bytes,8,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
Device string `protobuf:"bytes,9,opt,name=device,proto3" json:"device,omitempty"`
OsVersion string `protobuf:"bytes,10,opt,name=os_version,json=osVersion,proto3" json:"os_version,omitempty"`
Birth string `protobuf:"bytes,11,opt,name=birth,proto3" json:"birth,omitempty"`
AppVersion string `protobuf:"bytes,12,opt,name=app_version,json=appVersion,proto3" json:"app_version,omitempty"`
BuildNumber string `protobuf:"bytes,13,opt,name=build_number,json=buildNumber,proto3" json:"build_number,omitempty"`
Source string `protobuf:"bytes,14,opt,name=source,proto3" json:"source,omitempty"`
InstallChannel string `protobuf:"bytes,15,opt,name=install_channel,json=installChannel,proto3" json:"install_channel,omitempty"`
Campaign string `protobuf:"bytes,16,opt,name=campaign,proto3" json:"campaign,omitempty"`
Platform string `protobuf:"bytes,17,opt,name=platform,proto3" json:"platform,omitempty"`
Language string `protobuf:"bytes,18,opt,name=language,proto3" json:"language,omitempty"`
Timezone string `protobuf:"bytes,19,opt,name=timezone,proto3" json:"timezone,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *QuickCreateAccountRequest) Reset() {
*x = QuickCreateAccountRequest{}
mi := &file_proto_user_v1_auth_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *QuickCreateAccountRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*QuickCreateAccountRequest) ProtoMessage() {}
func (x *QuickCreateAccountRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_user_v1_auth_proto_msgTypes[5]
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 QuickCreateAccountRequest.ProtoReflect.Descriptor instead.
func (*QuickCreateAccountRequest) Descriptor() ([]byte, []int) {
return file_proto_user_v1_auth_proto_rawDescGZIP(), []int{5}
}
func (x *QuickCreateAccountRequest) GetMeta() *RequestMeta {
if x != nil {
return x.Meta
}
return nil
}
func (x *QuickCreateAccountRequest) GetPassword() string {
if x != nil {
return x.Password
}
return ""
}
func (x *QuickCreateAccountRequest) GetUsername() string {
if x != nil {
return x.Username
}
return ""
}
func (x *QuickCreateAccountRequest) GetAvatar() string {
if x != nil {
return x.Avatar
}
return ""
}
func (x *QuickCreateAccountRequest) GetGender() string {
if x != nil {
return x.Gender
}
return ""
}
func (x *QuickCreateAccountRequest) GetCountry() string {
if x != nil {
return x.Country
}
return ""
}
func (x *QuickCreateAccountRequest) GetInviteCode() string {
if x != nil {
return x.InviteCode
}
return ""
}
func (x *QuickCreateAccountRequest) GetDeviceId() string {
if x != nil {
return x.DeviceId
}
return ""
}
func (x *QuickCreateAccountRequest) GetDevice() string {
if x != nil {
return x.Device
}
return ""
}
func (x *QuickCreateAccountRequest) GetOsVersion() string {
if x != nil {
return x.OsVersion
}
return ""
}
func (x *QuickCreateAccountRequest) GetBirth() string {
if x != nil {
return x.Birth
}
return ""
}
func (x *QuickCreateAccountRequest) GetAppVersion() string {
if x != nil {
return x.AppVersion
}
return ""
}
func (x *QuickCreateAccountRequest) GetBuildNumber() string {
if x != nil {
return x.BuildNumber
}
return ""
}
func (x *QuickCreateAccountRequest) GetSource() string {
if x != nil {
return x.Source
}
return ""
}
func (x *QuickCreateAccountRequest) GetInstallChannel() string {
if x != nil {
return x.InstallChannel
}
return ""
}
func (x *QuickCreateAccountRequest) GetCampaign() string {
if x != nil {
return x.Campaign
}
return ""
}
func (x *QuickCreateAccountRequest) GetPlatform() string {
if x != nil {
return x.Platform
}
return ""
}
func (x *QuickCreateAccountRequest) GetLanguage() string {
if x != nil {
return x.Language
}
return ""
}
func (x *QuickCreateAccountRequest) GetTimezone() string {
if x != nil {
return x.Timezone
}
return ""
}
// QuickCreateAccountResponse 返回新账号登录态display_user_id 即后续账号密码登录用账号。
type QuickCreateAccountResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
Token *AuthToken `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
PasswordSet bool `protobuf:"varint,2,opt,name=password_set,json=passwordSet,proto3" json:"password_set,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *QuickCreateAccountResponse) Reset() {
*x = QuickCreateAccountResponse{}
mi := &file_proto_user_v1_auth_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *QuickCreateAccountResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*QuickCreateAccountResponse) ProtoMessage() {}
func (x *QuickCreateAccountResponse) ProtoReflect() protoreflect.Message {
mi := &file_proto_user_v1_auth_proto_msgTypes[6]
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 QuickCreateAccountResponse.ProtoReflect.Descriptor instead.
func (*QuickCreateAccountResponse) Descriptor() ([]byte, []int) {
return file_proto_user_v1_auth_proto_rawDescGZIP(), []int{6}
}
func (x *QuickCreateAccountResponse) GetToken() *AuthToken {
if x != nil {
return x.Token
}
return nil
}
func (x *QuickCreateAccountResponse) GetPasswordSet() bool {
if x != nil {
return x.PasswordSet
}
return false
}
// RefreshTokenRequest 使用 refresh token 换取新 token。 // RefreshTokenRequest 使用 refresh token 换取新 token。
type RefreshTokenRequest struct { type RefreshTokenRequest struct {
state protoimpl.MessageState `protogen:"open.v1"` state protoimpl.MessageState `protogen:"open.v1"`
@ -465,7 +707,7 @@ type RefreshTokenRequest struct {
func (x *RefreshTokenRequest) Reset() { func (x *RefreshTokenRequest) Reset() {
*x = RefreshTokenRequest{} *x = RefreshTokenRequest{}
mi := &file_proto_user_v1_auth_proto_msgTypes[5] mi := &file_proto_user_v1_auth_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -477,7 +719,7 @@ func (x *RefreshTokenRequest) String() string {
func (*RefreshTokenRequest) ProtoMessage() {} func (*RefreshTokenRequest) ProtoMessage() {}
func (x *RefreshTokenRequest) ProtoReflect() protoreflect.Message { func (x *RefreshTokenRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_user_v1_auth_proto_msgTypes[5] mi := &file_proto_user_v1_auth_proto_msgTypes[7]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -490,7 +732,7 @@ func (x *RefreshTokenRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use RefreshTokenRequest.ProtoReflect.Descriptor instead. // Deprecated: Use RefreshTokenRequest.ProtoReflect.Descriptor instead.
func (*RefreshTokenRequest) Descriptor() ([]byte, []int) { func (*RefreshTokenRequest) Descriptor() ([]byte, []int) {
return file_proto_user_v1_auth_proto_rawDescGZIP(), []int{5} return file_proto_user_v1_auth_proto_rawDescGZIP(), []int{7}
} }
func (x *RefreshTokenRequest) GetMeta() *RequestMeta { func (x *RefreshTokenRequest) GetMeta() *RequestMeta {
@ -517,7 +759,7 @@ type RefreshTokenResponse struct {
func (x *RefreshTokenResponse) Reset() { func (x *RefreshTokenResponse) Reset() {
*x = RefreshTokenResponse{} *x = RefreshTokenResponse{}
mi := &file_proto_user_v1_auth_proto_msgTypes[6] mi := &file_proto_user_v1_auth_proto_msgTypes[8]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -529,7 +771,7 @@ func (x *RefreshTokenResponse) String() string {
func (*RefreshTokenResponse) ProtoMessage() {} func (*RefreshTokenResponse) ProtoMessage() {}
func (x *RefreshTokenResponse) ProtoReflect() protoreflect.Message { func (x *RefreshTokenResponse) ProtoReflect() protoreflect.Message {
mi := &file_proto_user_v1_auth_proto_msgTypes[6] mi := &file_proto_user_v1_auth_proto_msgTypes[8]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -542,7 +784,7 @@ func (x *RefreshTokenResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use RefreshTokenResponse.ProtoReflect.Descriptor instead. // Deprecated: Use RefreshTokenResponse.ProtoReflect.Descriptor instead.
func (*RefreshTokenResponse) Descriptor() ([]byte, []int) { func (*RefreshTokenResponse) Descriptor() ([]byte, []int) {
return file_proto_user_v1_auth_proto_rawDescGZIP(), []int{6} return file_proto_user_v1_auth_proto_rawDescGZIP(), []int{8}
} }
func (x *RefreshTokenResponse) GetToken() *AuthToken { func (x *RefreshTokenResponse) GetToken() *AuthToken {
@ -564,7 +806,7 @@ type LogoutRequest struct {
func (x *LogoutRequest) Reset() { func (x *LogoutRequest) Reset() {
*x = LogoutRequest{} *x = LogoutRequest{}
mi := &file_proto_user_v1_auth_proto_msgTypes[7] mi := &file_proto_user_v1_auth_proto_msgTypes[9]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -576,7 +818,7 @@ func (x *LogoutRequest) String() string {
func (*LogoutRequest) ProtoMessage() {} func (*LogoutRequest) ProtoMessage() {}
func (x *LogoutRequest) ProtoReflect() protoreflect.Message { func (x *LogoutRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_user_v1_auth_proto_msgTypes[7] mi := &file_proto_user_v1_auth_proto_msgTypes[9]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -589,7 +831,7 @@ func (x *LogoutRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use LogoutRequest.ProtoReflect.Descriptor instead. // Deprecated: Use LogoutRequest.ProtoReflect.Descriptor instead.
func (*LogoutRequest) Descriptor() ([]byte, []int) { func (*LogoutRequest) Descriptor() ([]byte, []int) {
return file_proto_user_v1_auth_proto_rawDescGZIP(), []int{7} return file_proto_user_v1_auth_proto_rawDescGZIP(), []int{9}
} }
func (x *LogoutRequest) GetMeta() *RequestMeta { func (x *LogoutRequest) GetMeta() *RequestMeta {
@ -623,7 +865,7 @@ type LogoutResponse struct {
func (x *LogoutResponse) Reset() { func (x *LogoutResponse) Reset() {
*x = LogoutResponse{} *x = LogoutResponse{}
mi := &file_proto_user_v1_auth_proto_msgTypes[8] mi := &file_proto_user_v1_auth_proto_msgTypes[10]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -635,7 +877,7 @@ func (x *LogoutResponse) String() string {
func (*LogoutResponse) ProtoMessage() {} func (*LogoutResponse) ProtoMessage() {}
func (x *LogoutResponse) ProtoReflect() protoreflect.Message { func (x *LogoutResponse) ProtoReflect() protoreflect.Message {
mi := &file_proto_user_v1_auth_proto_msgTypes[8] mi := &file_proto_user_v1_auth_proto_msgTypes[10]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -648,7 +890,7 @@ func (x *LogoutResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use LogoutResponse.ProtoReflect.Descriptor instead. // Deprecated: Use LogoutResponse.ProtoReflect.Descriptor instead.
func (*LogoutResponse) Descriptor() ([]byte, []int) { func (*LogoutResponse) Descriptor() ([]byte, []int) {
return file_proto_user_v1_auth_proto_rawDescGZIP(), []int{8} return file_proto_user_v1_auth_proto_rawDescGZIP(), []int{10}
} }
func (x *LogoutResponse) GetRevoked() bool { func (x *LogoutResponse) GetRevoked() bool {
@ -673,7 +915,7 @@ type RecordLoginBlockedRequest struct {
func (x *RecordLoginBlockedRequest) Reset() { func (x *RecordLoginBlockedRequest) Reset() {
*x = RecordLoginBlockedRequest{} *x = RecordLoginBlockedRequest{}
mi := &file_proto_user_v1_auth_proto_msgTypes[9] mi := &file_proto_user_v1_auth_proto_msgTypes[11]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -685,7 +927,7 @@ func (x *RecordLoginBlockedRequest) String() string {
func (*RecordLoginBlockedRequest) ProtoMessage() {} func (*RecordLoginBlockedRequest) ProtoMessage() {}
func (x *RecordLoginBlockedRequest) ProtoReflect() protoreflect.Message { func (x *RecordLoginBlockedRequest) ProtoReflect() protoreflect.Message {
mi := &file_proto_user_v1_auth_proto_msgTypes[9] mi := &file_proto_user_v1_auth_proto_msgTypes[11]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -698,7 +940,7 @@ func (x *RecordLoginBlockedRequest) ProtoReflect() protoreflect.Message {
// Deprecated: Use RecordLoginBlockedRequest.ProtoReflect.Descriptor instead. // Deprecated: Use RecordLoginBlockedRequest.ProtoReflect.Descriptor instead.
func (*RecordLoginBlockedRequest) Descriptor() ([]byte, []int) { func (*RecordLoginBlockedRequest) Descriptor() ([]byte, []int) {
return file_proto_user_v1_auth_proto_rawDescGZIP(), []int{9} return file_proto_user_v1_auth_proto_rawDescGZIP(), []int{11}
} }
func (x *RecordLoginBlockedRequest) GetMeta() *RequestMeta { func (x *RecordLoginBlockedRequest) GetMeta() *RequestMeta {
@ -753,7 +995,7 @@ type RecordLoginBlockedResponse struct {
func (x *RecordLoginBlockedResponse) Reset() { func (x *RecordLoginBlockedResponse) Reset() {
*x = RecordLoginBlockedResponse{} *x = RecordLoginBlockedResponse{}
mi := &file_proto_user_v1_auth_proto_msgTypes[10] mi := &file_proto_user_v1_auth_proto_msgTypes[12]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi) ms.StoreMessageInfo(mi)
} }
@ -765,7 +1007,7 @@ func (x *RecordLoginBlockedResponse) String() string {
func (*RecordLoginBlockedResponse) ProtoMessage() {} func (*RecordLoginBlockedResponse) ProtoMessage() {}
func (x *RecordLoginBlockedResponse) ProtoReflect() protoreflect.Message { func (x *RecordLoginBlockedResponse) ProtoReflect() protoreflect.Message {
mi := &file_proto_user_v1_auth_proto_msgTypes[10] mi := &file_proto_user_v1_auth_proto_msgTypes[12]
if x != nil { if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil { if ms.LoadMessageInfo() == nil {
@ -778,7 +1020,7 @@ func (x *RecordLoginBlockedResponse) ProtoReflect() protoreflect.Message {
// Deprecated: Use RecordLoginBlockedResponse.ProtoReflect.Descriptor instead. // Deprecated: Use RecordLoginBlockedResponse.ProtoReflect.Descriptor instead.
func (*RecordLoginBlockedResponse) Descriptor() ([]byte, []int) { func (*RecordLoginBlockedResponse) Descriptor() ([]byte, []int) {
return file_proto_user_v1_auth_proto_rawDescGZIP(), []int{10} return file_proto_user_v1_auth_proto_rawDescGZIP(), []int{12}
} }
func (x *RecordLoginBlockedResponse) GetRecorded() bool { func (x *RecordLoginBlockedResponse) GetRecorded() bool {
@ -834,7 +1076,34 @@ const file_proto_user_v1_auth_proto_rawDesc = "" +
"\auser_id\x18\x02 \x01(\x03R\x06userId\x12\x1a\n" + "\auser_id\x18\x02 \x01(\x03R\x06userId\x12\x1a\n" +
"\bpassword\x18\x03 \x01(\tR\bpassword\"8\n" + "\bpassword\x18\x03 \x01(\tR\bpassword\"8\n" +
"\x13SetPasswordResponse\x12!\n" + "\x13SetPasswordResponse\x12!\n" +
"\fpassword_set\x18\x01 \x01(\bR\vpasswordSet\"j\n" + "\fpassword_set\x18\x01 \x01(\bR\vpasswordSet\"\xcd\x04\n" +
"\x19QuickCreateAccountRequest\x12.\n" +
"\x04meta\x18\x01 \x01(\v2\x1a.hyapp.user.v1.RequestMetaR\x04meta\x12\x1a\n" +
"\bpassword\x18\x02 \x01(\tR\bpassword\x12\x1a\n" +
"\busername\x18\x03 \x01(\tR\busername\x12\x16\n" +
"\x06avatar\x18\x04 \x01(\tR\x06avatar\x12\x16\n" +
"\x06gender\x18\x05 \x01(\tR\x06gender\x12\x18\n" +
"\acountry\x18\x06 \x01(\tR\acountry\x12\x1f\n" +
"\vinvite_code\x18\a \x01(\tR\n" +
"inviteCode\x12\x1b\n" +
"\tdevice_id\x18\b \x01(\tR\bdeviceId\x12\x16\n" +
"\x06device\x18\t \x01(\tR\x06device\x12\x1d\n" +
"\n" +
"os_version\x18\n" +
" \x01(\tR\tosVersion\x12\x14\n" +
"\x05birth\x18\v \x01(\tR\x05birth\x12\x1f\n" +
"\vapp_version\x18\f \x01(\tR\n" +
"appVersion\x12!\n" +
"\fbuild_number\x18\r \x01(\tR\vbuildNumber\x12\x16\n" +
"\x06source\x18\x0e \x01(\tR\x06source\x12'\n" +
"\x0finstall_channel\x18\x0f \x01(\tR\x0einstallChannel\x12\x1a\n" +
"\bcampaign\x18\x10 \x01(\tR\bcampaign\x12\x1a\n" +
"\bplatform\x18\x11 \x01(\tR\bplatform\x12\x1a\n" +
"\blanguage\x18\x12 \x01(\tR\blanguage\x12\x1a\n" +
"\btimezone\x18\x13 \x01(\tR\btimezone\"o\n" +
"\x1aQuickCreateAccountResponse\x12.\n" +
"\x05token\x18\x01 \x01(\v2\x18.hyapp.user.v1.AuthTokenR\x05token\x12!\n" +
"\fpassword_set\x18\x02 \x01(\bR\vpasswordSet\"j\n" +
"\x13RefreshTokenRequest\x12.\n" + "\x13RefreshTokenRequest\x12.\n" +
"\x04meta\x18\x01 \x01(\v2\x1a.hyapp.user.v1.RequestMetaR\x04meta\x12#\n" + "\x04meta\x18\x01 \x01(\v2\x1a.hyapp.user.v1.RequestMetaR\x04meta\x12#\n" +
"\rrefresh_token\x18\x02 \x01(\tR\frefreshToken\"F\n" + "\rrefresh_token\x18\x02 \x01(\tR\frefreshToken\"F\n" +
@ -855,11 +1124,12 @@ const file_proto_user_v1_auth_proto_rawDesc = "" +
"\btimezone\x18\x05 \x01(\tR\btimezone\x12!\n" + "\btimezone\x18\x05 \x01(\tR\btimezone\x12!\n" +
"\fblock_reason\x18\x06 \x01(\tR\vblockReason\"8\n" + "\fblock_reason\x18\x06 \x01(\tR\vblockReason\"8\n" +
"\x1aRecordLoginBlockedResponse\x12\x1a\n" + "\x1aRecordLoginBlockedResponse\x12\x1a\n" +
"\brecorded\x18\x01 \x01(\bR\brecorded2\x98\x04\n" + "\brecorded\x18\x01 \x01(\bR\brecorded2\x83\x05\n" +
"\vAuthService\x12Q\n" + "\vAuthService\x12Q\n" +
"\rLoginPassword\x12#.hyapp.user.v1.LoginPasswordRequest\x1a\x1b.hyapp.user.v1.AuthResponse\x12U\n" + "\rLoginPassword\x12#.hyapp.user.v1.LoginPasswordRequest\x1a\x1b.hyapp.user.v1.AuthResponse\x12U\n" +
"\x0fLoginThirdParty\x12%.hyapp.user.v1.LoginThirdPartyRequest\x1a\x1b.hyapp.user.v1.AuthResponse\x12T\n" + "\x0fLoginThirdParty\x12%.hyapp.user.v1.LoginThirdPartyRequest\x1a\x1b.hyapp.user.v1.AuthResponse\x12T\n" +
"\vSetPassword\x12!.hyapp.user.v1.SetPasswordRequest\x1a\".hyapp.user.v1.SetPasswordResponse\x12W\n" + "\vSetPassword\x12!.hyapp.user.v1.SetPasswordRequest\x1a\".hyapp.user.v1.SetPasswordResponse\x12i\n" +
"\x12QuickCreateAccount\x12(.hyapp.user.v1.QuickCreateAccountRequest\x1a).hyapp.user.v1.QuickCreateAccountResponse\x12W\n" +
"\fRefreshToken\x12\".hyapp.user.v1.RefreshTokenRequest\x1a#.hyapp.user.v1.RefreshTokenResponse\x12E\n" + "\fRefreshToken\x12\".hyapp.user.v1.RefreshTokenRequest\x1a#.hyapp.user.v1.RefreshTokenResponse\x12E\n" +
"\x06Logout\x12\x1c.hyapp.user.v1.LogoutRequest\x1a\x1d.hyapp.user.v1.LogoutResponse\x12i\n" + "\x06Logout\x12\x1c.hyapp.user.v1.LogoutRequest\x1a\x1d.hyapp.user.v1.LogoutResponse\x12i\n" +
"\x12RecordLoginBlocked\x12(.hyapp.user.v1.RecordLoginBlockedRequest\x1a).hyapp.user.v1.RecordLoginBlockedResponseB&Z$hyapp.local/api/proto/user/v1;userv1b\x06proto3" "\x12RecordLoginBlocked\x12(.hyapp.user.v1.RecordLoginBlockedRequest\x1a).hyapp.user.v1.RecordLoginBlockedResponseB&Z$hyapp.local/api/proto/user/v1;userv1b\x06proto3"
@ -876,48 +1146,54 @@ func file_proto_user_v1_auth_proto_rawDescGZIP() []byte {
return file_proto_user_v1_auth_proto_rawDescData return file_proto_user_v1_auth_proto_rawDescData
} }
var file_proto_user_v1_auth_proto_msgTypes = make([]protoimpl.MessageInfo, 11) var file_proto_user_v1_auth_proto_msgTypes = make([]protoimpl.MessageInfo, 13)
var file_proto_user_v1_auth_proto_goTypes = []any{ var file_proto_user_v1_auth_proto_goTypes = []any{
(*LoginPasswordRequest)(nil), // 0: hyapp.user.v1.LoginPasswordRequest (*LoginPasswordRequest)(nil), // 0: hyapp.user.v1.LoginPasswordRequest
(*LoginThirdPartyRequest)(nil), // 1: hyapp.user.v1.LoginThirdPartyRequest (*LoginThirdPartyRequest)(nil), // 1: hyapp.user.v1.LoginThirdPartyRequest
(*AuthResponse)(nil), // 2: hyapp.user.v1.AuthResponse (*AuthResponse)(nil), // 2: hyapp.user.v1.AuthResponse
(*SetPasswordRequest)(nil), // 3: hyapp.user.v1.SetPasswordRequest (*SetPasswordRequest)(nil), // 3: hyapp.user.v1.SetPasswordRequest
(*SetPasswordResponse)(nil), // 4: hyapp.user.v1.SetPasswordResponse (*SetPasswordResponse)(nil), // 4: hyapp.user.v1.SetPasswordResponse
(*RefreshTokenRequest)(nil), // 5: hyapp.user.v1.RefreshTokenRequest (*QuickCreateAccountRequest)(nil), // 5: hyapp.user.v1.QuickCreateAccountRequest
(*RefreshTokenResponse)(nil), // 6: hyapp.user.v1.RefreshTokenResponse (*QuickCreateAccountResponse)(nil), // 6: hyapp.user.v1.QuickCreateAccountResponse
(*LogoutRequest)(nil), // 7: hyapp.user.v1.LogoutRequest (*RefreshTokenRequest)(nil), // 7: hyapp.user.v1.RefreshTokenRequest
(*LogoutResponse)(nil), // 8: hyapp.user.v1.LogoutResponse (*RefreshTokenResponse)(nil), // 8: hyapp.user.v1.RefreshTokenResponse
(*RecordLoginBlockedRequest)(nil), // 9: hyapp.user.v1.RecordLoginBlockedRequest (*LogoutRequest)(nil), // 9: hyapp.user.v1.LogoutRequest
(*RecordLoginBlockedResponse)(nil), // 10: hyapp.user.v1.RecordLoginBlockedResponse (*LogoutResponse)(nil), // 10: hyapp.user.v1.LogoutResponse
(*RequestMeta)(nil), // 11: hyapp.user.v1.RequestMeta (*RecordLoginBlockedRequest)(nil), // 11: hyapp.user.v1.RecordLoginBlockedRequest
(*AuthToken)(nil), // 12: hyapp.user.v1.AuthToken (*RecordLoginBlockedResponse)(nil), // 12: hyapp.user.v1.RecordLoginBlockedResponse
(*RequestMeta)(nil), // 13: hyapp.user.v1.RequestMeta
(*AuthToken)(nil), // 14: hyapp.user.v1.AuthToken
} }
var file_proto_user_v1_auth_proto_depIdxs = []int32{ var file_proto_user_v1_auth_proto_depIdxs = []int32{
11, // 0: hyapp.user.v1.LoginPasswordRequest.meta:type_name -> hyapp.user.v1.RequestMeta 13, // 0: hyapp.user.v1.LoginPasswordRequest.meta:type_name -> hyapp.user.v1.RequestMeta
11, // 1: hyapp.user.v1.LoginThirdPartyRequest.meta:type_name -> hyapp.user.v1.RequestMeta 13, // 1: hyapp.user.v1.LoginThirdPartyRequest.meta:type_name -> hyapp.user.v1.RequestMeta
12, // 2: hyapp.user.v1.AuthResponse.token:type_name -> hyapp.user.v1.AuthToken 14, // 2: hyapp.user.v1.AuthResponse.token:type_name -> hyapp.user.v1.AuthToken
11, // 3: hyapp.user.v1.SetPasswordRequest.meta:type_name -> hyapp.user.v1.RequestMeta 13, // 3: hyapp.user.v1.SetPasswordRequest.meta:type_name -> hyapp.user.v1.RequestMeta
11, // 4: hyapp.user.v1.RefreshTokenRequest.meta:type_name -> hyapp.user.v1.RequestMeta 13, // 4: hyapp.user.v1.QuickCreateAccountRequest.meta:type_name -> hyapp.user.v1.RequestMeta
12, // 5: hyapp.user.v1.RefreshTokenResponse.token:type_name -> hyapp.user.v1.AuthToken 14, // 5: hyapp.user.v1.QuickCreateAccountResponse.token:type_name -> hyapp.user.v1.AuthToken
11, // 6: hyapp.user.v1.LogoutRequest.meta:type_name -> hyapp.user.v1.RequestMeta 13, // 6: hyapp.user.v1.RefreshTokenRequest.meta:type_name -> hyapp.user.v1.RequestMeta
11, // 7: hyapp.user.v1.RecordLoginBlockedRequest.meta:type_name -> hyapp.user.v1.RequestMeta 14, // 7: hyapp.user.v1.RefreshTokenResponse.token:type_name -> hyapp.user.v1.AuthToken
0, // 8: hyapp.user.v1.AuthService.LoginPassword:input_type -> hyapp.user.v1.LoginPasswordRequest 13, // 8: hyapp.user.v1.LogoutRequest.meta:type_name -> hyapp.user.v1.RequestMeta
1, // 9: hyapp.user.v1.AuthService.LoginThirdParty:input_type -> hyapp.user.v1.LoginThirdPartyRequest 13, // 9: hyapp.user.v1.RecordLoginBlockedRequest.meta:type_name -> hyapp.user.v1.RequestMeta
3, // 10: hyapp.user.v1.AuthService.SetPassword:input_type -> hyapp.user.v1.SetPasswordRequest 0, // 10: hyapp.user.v1.AuthService.LoginPassword:input_type -> hyapp.user.v1.LoginPasswordRequest
5, // 11: hyapp.user.v1.AuthService.RefreshToken:input_type -> hyapp.user.v1.RefreshTokenRequest 1, // 11: hyapp.user.v1.AuthService.LoginThirdParty:input_type -> hyapp.user.v1.LoginThirdPartyRequest
7, // 12: hyapp.user.v1.AuthService.Logout:input_type -> hyapp.user.v1.LogoutRequest 3, // 12: hyapp.user.v1.AuthService.SetPassword:input_type -> hyapp.user.v1.SetPasswordRequest
9, // 13: hyapp.user.v1.AuthService.RecordLoginBlocked:input_type -> hyapp.user.v1.RecordLoginBlockedRequest 5, // 13: hyapp.user.v1.AuthService.QuickCreateAccount:input_type -> hyapp.user.v1.QuickCreateAccountRequest
2, // 14: hyapp.user.v1.AuthService.LoginPassword:output_type -> hyapp.user.v1.AuthResponse 7, // 14: hyapp.user.v1.AuthService.RefreshToken:input_type -> hyapp.user.v1.RefreshTokenRequest
2, // 15: hyapp.user.v1.AuthService.LoginThirdParty:output_type -> hyapp.user.v1.AuthResponse 9, // 15: hyapp.user.v1.AuthService.Logout:input_type -> hyapp.user.v1.LogoutRequest
4, // 16: hyapp.user.v1.AuthService.SetPassword:output_type -> hyapp.user.v1.SetPasswordResponse 11, // 16: hyapp.user.v1.AuthService.RecordLoginBlocked:input_type -> hyapp.user.v1.RecordLoginBlockedRequest
6, // 17: hyapp.user.v1.AuthService.RefreshToken:output_type -> hyapp.user.v1.RefreshTokenResponse 2, // 17: hyapp.user.v1.AuthService.LoginPassword:output_type -> hyapp.user.v1.AuthResponse
8, // 18: hyapp.user.v1.AuthService.Logout:output_type -> hyapp.user.v1.LogoutResponse 2, // 18: hyapp.user.v1.AuthService.LoginThirdParty:output_type -> hyapp.user.v1.AuthResponse
10, // 19: hyapp.user.v1.AuthService.RecordLoginBlocked:output_type -> hyapp.user.v1.RecordLoginBlockedResponse 4, // 19: hyapp.user.v1.AuthService.SetPassword:output_type -> hyapp.user.v1.SetPasswordResponse
14, // [14:20] is the sub-list for method output_type 6, // 20: hyapp.user.v1.AuthService.QuickCreateAccount:output_type -> hyapp.user.v1.QuickCreateAccountResponse
8, // [8:14] is the sub-list for method input_type 8, // 21: hyapp.user.v1.AuthService.RefreshToken:output_type -> hyapp.user.v1.RefreshTokenResponse
8, // [8:8] is the sub-list for extension type_name 10, // 22: hyapp.user.v1.AuthService.Logout:output_type -> hyapp.user.v1.LogoutResponse
8, // [8:8] is the sub-list for extension extendee 12, // 23: hyapp.user.v1.AuthService.RecordLoginBlocked:output_type -> hyapp.user.v1.RecordLoginBlockedResponse
0, // [0:8] is the sub-list for field type_name 17, // [17:24] is the sub-list for method output_type
10, // [10:17] is the sub-list for method input_type
10, // [10:10] is the sub-list for extension type_name
10, // [10:10] is the sub-list for extension extendee
0, // [0:10] is the sub-list for field type_name
} }
func init() { file_proto_user_v1_auth_proto_init() } func init() { file_proto_user_v1_auth_proto_init() }
@ -932,7 +1208,7 @@ func file_proto_user_v1_auth_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(), GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_proto_user_v1_auth_proto_rawDesc), len(file_proto_user_v1_auth_proto_rawDesc)), RawDescriptor: unsafe.Slice(unsafe.StringData(file_proto_user_v1_auth_proto_rawDesc), len(file_proto_user_v1_auth_proto_rawDesc)),
NumEnums: 0, NumEnums: 0,
NumMessages: 11, NumMessages: 13,
NumExtensions: 0, NumExtensions: 0,
NumServices: 1, NumServices: 1,
}, },

View File

@ -57,6 +57,35 @@ message SetPasswordResponse {
bool password_set = 1; bool password_set = 1;
} }
// QuickCreateAccountRequest
message QuickCreateAccountRequest {
RequestMeta meta = 1;
string password = 2;
string username = 3;
string avatar = 4;
string gender = 5;
string country = 6;
string invite_code = 7;
string device_id = 8;
string device = 9;
string os_version = 10;
string birth = 11;
string app_version = 12;
string build_number = 13;
string source = 14;
string install_channel = 15;
string campaign = 16;
string platform = 17;
string language = 18;
string timezone = 19;
}
// QuickCreateAccountResponse display_user_id
message QuickCreateAccountResponse {
AuthToken token = 1;
bool password_set = 2;
}
// RefreshTokenRequest 使 refresh token token // RefreshTokenRequest 使 refresh token token
message RefreshTokenRequest { message RefreshTokenRequest {
RequestMeta meta = 1; RequestMeta meta = 1;
@ -100,6 +129,7 @@ service AuthService {
rpc LoginPassword(LoginPasswordRequest) returns (AuthResponse); rpc LoginPassword(LoginPasswordRequest) returns (AuthResponse);
rpc LoginThirdParty(LoginThirdPartyRequest) returns (AuthResponse); rpc LoginThirdParty(LoginThirdPartyRequest) returns (AuthResponse);
rpc SetPassword(SetPasswordRequest) returns (SetPasswordResponse); rpc SetPassword(SetPasswordRequest) returns (SetPasswordResponse);
rpc QuickCreateAccount(QuickCreateAccountRequest) returns (QuickCreateAccountResponse);
rpc RefreshToken(RefreshTokenRequest) returns (RefreshTokenResponse); rpc RefreshToken(RefreshTokenRequest) returns (RefreshTokenResponse);
rpc Logout(LogoutRequest) returns (LogoutResponse); rpc Logout(LogoutRequest) returns (LogoutResponse);
rpc RecordLoginBlocked(RecordLoginBlockedRequest) returns (RecordLoginBlockedResponse); rpc RecordLoginBlocked(RecordLoginBlockedRequest) returns (RecordLoginBlockedResponse);

View File

@ -22,6 +22,7 @@ const (
AuthService_LoginPassword_FullMethodName = "/hyapp.user.v1.AuthService/LoginPassword" AuthService_LoginPassword_FullMethodName = "/hyapp.user.v1.AuthService/LoginPassword"
AuthService_LoginThirdParty_FullMethodName = "/hyapp.user.v1.AuthService/LoginThirdParty" AuthService_LoginThirdParty_FullMethodName = "/hyapp.user.v1.AuthService/LoginThirdParty"
AuthService_SetPassword_FullMethodName = "/hyapp.user.v1.AuthService/SetPassword" AuthService_SetPassword_FullMethodName = "/hyapp.user.v1.AuthService/SetPassword"
AuthService_QuickCreateAccount_FullMethodName = "/hyapp.user.v1.AuthService/QuickCreateAccount"
AuthService_RefreshToken_FullMethodName = "/hyapp.user.v1.AuthService/RefreshToken" AuthService_RefreshToken_FullMethodName = "/hyapp.user.v1.AuthService/RefreshToken"
AuthService_Logout_FullMethodName = "/hyapp.user.v1.AuthService/Logout" AuthService_Logout_FullMethodName = "/hyapp.user.v1.AuthService/Logout"
AuthService_RecordLoginBlocked_FullMethodName = "/hyapp.user.v1.AuthService/RecordLoginBlocked" AuthService_RecordLoginBlocked_FullMethodName = "/hyapp.user.v1.AuthService/RecordLoginBlocked"
@ -36,6 +37,7 @@ type AuthServiceClient interface {
LoginPassword(ctx context.Context, in *LoginPasswordRequest, opts ...grpc.CallOption) (*AuthResponse, error) LoginPassword(ctx context.Context, in *LoginPasswordRequest, opts ...grpc.CallOption) (*AuthResponse, error)
LoginThirdParty(ctx context.Context, in *LoginThirdPartyRequest, opts ...grpc.CallOption) (*AuthResponse, error) LoginThirdParty(ctx context.Context, in *LoginThirdPartyRequest, opts ...grpc.CallOption) (*AuthResponse, error)
SetPassword(ctx context.Context, in *SetPasswordRequest, opts ...grpc.CallOption) (*SetPasswordResponse, error) SetPassword(ctx context.Context, in *SetPasswordRequest, opts ...grpc.CallOption) (*SetPasswordResponse, error)
QuickCreateAccount(ctx context.Context, in *QuickCreateAccountRequest, opts ...grpc.CallOption) (*QuickCreateAccountResponse, error)
RefreshToken(ctx context.Context, in *RefreshTokenRequest, opts ...grpc.CallOption) (*RefreshTokenResponse, error) RefreshToken(ctx context.Context, in *RefreshTokenRequest, opts ...grpc.CallOption) (*RefreshTokenResponse, error)
Logout(ctx context.Context, in *LogoutRequest, opts ...grpc.CallOption) (*LogoutResponse, error) Logout(ctx context.Context, in *LogoutRequest, opts ...grpc.CallOption) (*LogoutResponse, error)
RecordLoginBlocked(ctx context.Context, in *RecordLoginBlockedRequest, opts ...grpc.CallOption) (*RecordLoginBlockedResponse, error) RecordLoginBlocked(ctx context.Context, in *RecordLoginBlockedRequest, opts ...grpc.CallOption) (*RecordLoginBlockedResponse, error)
@ -79,6 +81,16 @@ func (c *authServiceClient) SetPassword(ctx context.Context, in *SetPasswordRequ
return out, nil return out, nil
} }
func (c *authServiceClient) QuickCreateAccount(ctx context.Context, in *QuickCreateAccountRequest, opts ...grpc.CallOption) (*QuickCreateAccountResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(QuickCreateAccountResponse)
err := c.cc.Invoke(ctx, AuthService_QuickCreateAccount_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *authServiceClient) RefreshToken(ctx context.Context, in *RefreshTokenRequest, opts ...grpc.CallOption) (*RefreshTokenResponse, error) { func (c *authServiceClient) RefreshToken(ctx context.Context, in *RefreshTokenRequest, opts ...grpc.CallOption) (*RefreshTokenResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(RefreshTokenResponse) out := new(RefreshTokenResponse)
@ -118,6 +130,7 @@ type AuthServiceServer interface {
LoginPassword(context.Context, *LoginPasswordRequest) (*AuthResponse, error) LoginPassword(context.Context, *LoginPasswordRequest) (*AuthResponse, error)
LoginThirdParty(context.Context, *LoginThirdPartyRequest) (*AuthResponse, error) LoginThirdParty(context.Context, *LoginThirdPartyRequest) (*AuthResponse, error)
SetPassword(context.Context, *SetPasswordRequest) (*SetPasswordResponse, error) SetPassword(context.Context, *SetPasswordRequest) (*SetPasswordResponse, error)
QuickCreateAccount(context.Context, *QuickCreateAccountRequest) (*QuickCreateAccountResponse, error)
RefreshToken(context.Context, *RefreshTokenRequest) (*RefreshTokenResponse, error) RefreshToken(context.Context, *RefreshTokenRequest) (*RefreshTokenResponse, error)
Logout(context.Context, *LogoutRequest) (*LogoutResponse, error) Logout(context.Context, *LogoutRequest) (*LogoutResponse, error)
RecordLoginBlocked(context.Context, *RecordLoginBlockedRequest) (*RecordLoginBlockedResponse, error) RecordLoginBlocked(context.Context, *RecordLoginBlockedRequest) (*RecordLoginBlockedResponse, error)
@ -140,6 +153,9 @@ func (UnimplementedAuthServiceServer) LoginThirdParty(context.Context, *LoginThi
func (UnimplementedAuthServiceServer) SetPassword(context.Context, *SetPasswordRequest) (*SetPasswordResponse, error) { func (UnimplementedAuthServiceServer) SetPassword(context.Context, *SetPasswordRequest) (*SetPasswordResponse, error) {
return nil, status.Error(codes.Unimplemented, "method SetPassword not implemented") return nil, status.Error(codes.Unimplemented, "method SetPassword not implemented")
} }
func (UnimplementedAuthServiceServer) QuickCreateAccount(context.Context, *QuickCreateAccountRequest) (*QuickCreateAccountResponse, error) {
return nil, status.Error(codes.Unimplemented, "method QuickCreateAccount not implemented")
}
func (UnimplementedAuthServiceServer) RefreshToken(context.Context, *RefreshTokenRequest) (*RefreshTokenResponse, error) { func (UnimplementedAuthServiceServer) RefreshToken(context.Context, *RefreshTokenRequest) (*RefreshTokenResponse, error) {
return nil, status.Error(codes.Unimplemented, "method RefreshToken not implemented") return nil, status.Error(codes.Unimplemented, "method RefreshToken not implemented")
} }
@ -224,6 +240,24 @@ func _AuthService_SetPassword_Handler(srv interface{}, ctx context.Context, dec
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _AuthService_QuickCreateAccount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(QuickCreateAccountRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(AuthServiceServer).QuickCreateAccount(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: AuthService_QuickCreateAccount_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(AuthServiceServer).QuickCreateAccount(ctx, req.(*QuickCreateAccountRequest))
}
return interceptor(ctx, in, info, handler)
}
func _AuthService_RefreshToken_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { func _AuthService_RefreshToken_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(RefreshTokenRequest) in := new(RefreshTokenRequest)
if err := dec(in); err != nil { if err := dec(in); err != nil {
@ -297,6 +331,10 @@ var AuthService_ServiceDesc = grpc.ServiceDesc{
MethodName: "SetPassword", MethodName: "SetPassword",
Handler: _AuthService_SetPassword_Handler, Handler: _AuthService_SetPassword_Handler,
}, },
{
MethodName: "QuickCreateAccount",
Handler: _AuthService_QuickCreateAccount_Handler,
},
{ {
MethodName: "RefreshToken", MethodName: "RefreshToken",
Handler: _AuthService_RefreshToken_Handler, Handler: _AuthService_RefreshToken_Handler,

View File

@ -23,6 +23,7 @@ type Client interface {
ListSevenDayCheckInClaims(ctx context.Context, req *activityv1.ListSevenDayCheckInClaimsRequest) (*activityv1.ListSevenDayCheckInClaimsResponse, error) ListSevenDayCheckInClaims(ctx context.Context, req *activityv1.ListSevenDayCheckInClaimsRequest) (*activityv1.ListSevenDayCheckInClaimsResponse, error)
GetLuckyGiftConfig(ctx context.Context, req *activityv1.GetLuckyGiftConfigRequest) (*activityv1.GetLuckyGiftConfigResponse, error) GetLuckyGiftConfig(ctx context.Context, req *activityv1.GetLuckyGiftConfigRequest) (*activityv1.GetLuckyGiftConfigResponse, error)
UpsertLuckyGiftConfig(ctx context.Context, req *activityv1.UpsertLuckyGiftConfigRequest) (*activityv1.UpsertLuckyGiftConfigResponse, error) UpsertLuckyGiftConfig(ctx context.Context, req *activityv1.UpsertLuckyGiftConfigRequest) (*activityv1.UpsertLuckyGiftConfigResponse, error)
ListLuckyGiftConfigs(ctx context.Context, req *activityv1.ListLuckyGiftConfigsRequest) (*activityv1.ListLuckyGiftConfigsResponse, error)
ListLuckyGiftDraws(ctx context.Context, req *activityv1.ListLuckyGiftDrawsRequest) (*activityv1.ListLuckyGiftDrawsResponse, error) ListLuckyGiftDraws(ctx context.Context, req *activityv1.ListLuckyGiftDrawsRequest) (*activityv1.ListLuckyGiftDrawsResponse, error)
RemoveRegionBroadcastMember(ctx context.Context, req *activityv1.RemoveRegionBroadcastMemberRequest) (*activityv1.RemoveRegionBroadcastMemberResponse, error) RemoveRegionBroadcastMember(ctx context.Context, req *activityv1.RemoveRegionBroadcastMemberRequest) (*activityv1.RemoveRegionBroadcastMemberResponse, error)
ListLevelConfig(ctx context.Context, req *activityv1.ListLevelConfigRequest) (*activityv1.ListLevelConfigResponse, error) ListLevelConfig(ctx context.Context, req *activityv1.ListLevelConfigRequest) (*activityv1.ListLevelConfigResponse, error)
@ -105,6 +106,10 @@ func (c *GRPCClient) UpsertLuckyGiftConfig(ctx context.Context, req *activityv1.
return c.luckyGiftClient.UpsertLuckyGiftConfig(ctx, req) return c.luckyGiftClient.UpsertLuckyGiftConfig(ctx, req)
} }
func (c *GRPCClient) ListLuckyGiftConfigs(ctx context.Context, req *activityv1.ListLuckyGiftConfigsRequest) (*activityv1.ListLuckyGiftConfigsResponse, error) {
return c.luckyGiftClient.ListLuckyGiftConfigs(ctx, req)
}
func (c *GRPCClient) ListLuckyGiftDraws(ctx context.Context, req *activityv1.ListLuckyGiftDrawsRequest) (*activityv1.ListLuckyGiftDrawsResponse, error) { func (c *GRPCClient) ListLuckyGiftDraws(ctx context.Context, req *activityv1.ListLuckyGiftDrawsRequest) (*activityv1.ListLuckyGiftDrawsResponse, error) {
return c.luckyGiftClient.ListLuckyGiftDraws(ctx, req) return c.luckyGiftClient.ListLuckyGiftDraws(ctx, req)
} }

View File

@ -138,6 +138,21 @@ func (h *Handler) UpsertLuckyGiftConfig(c *gin.Context) {
response.OK(c, item) response.OK(c, item)
} }
func (h *Handler) ListLuckyGiftConfigs(c *gin.Context) {
resp, err := h.activity.ListLuckyGiftConfigs(c.Request.Context(), &activityv1.ListLuckyGiftConfigsRequest{
Meta: h.meta(c),
})
if err != nil {
response.ServerError(c, "获取幸运礼物奖池列表失败")
return
}
items := make([]configDTO, 0, len(resp.GetConfigs()))
for _, config := range resp.GetConfigs() {
items = append(items, configFromProto(config))
}
response.OK(c, items)
}
func (h *Handler) ListLuckyGiftDraws(c *gin.Context) { func (h *Handler) ListLuckyGiftDraws(c *gin.Context) {
options := shared.ListOptions(c) options := shared.ListOptions(c)
resp, err := h.activity.ListLuckyGiftDraws(c.Request.Context(), &activityv1.ListLuckyGiftDrawsRequest{ resp, err := h.activity.ListLuckyGiftDraws(c.Request.Context(), &activityv1.ListLuckyGiftDrawsRequest{

View File

@ -13,5 +13,6 @@ func RegisterRoutes(protected *gin.RouterGroup, h *Handler) {
protected.GET("/admin/activity/lucky-gifts/config", middleware.RequirePermission("lucky-gift:view"), h.GetLuckyGiftConfig) protected.GET("/admin/activity/lucky-gifts/config", middleware.RequirePermission("lucky-gift:view"), h.GetLuckyGiftConfig)
protected.PUT("/admin/activity/lucky-gifts/config", middleware.RequirePermission("lucky-gift:update"), h.UpsertLuckyGiftConfig) protected.PUT("/admin/activity/lucky-gifts/config", middleware.RequirePermission("lucky-gift:update"), h.UpsertLuckyGiftConfig)
protected.GET("/admin/activity/lucky-gifts/configs", middleware.RequirePermission("lucky-gift:view"), h.ListLuckyGiftConfigs)
protected.GET("/admin/activity/lucky-gifts/draws", middleware.RequirePermission("lucky-gift:view"), h.ListLuckyGiftDraws) protected.GET("/admin/activity/lucky-gifts/draws", middleware.RequirePermission("lucky-gift:view"), h.ListLuckyGiftDraws)
} }

View File

@ -14,6 +14,7 @@ import (
type Repository interface { type Repository interface {
GetLuckyGiftConfig(ctx context.Context, poolID string) (domain.Config, bool, error) GetLuckyGiftConfig(ctx context.Context, poolID string) (domain.Config, bool, error)
UpsertLuckyGiftConfig(ctx context.Context, config domain.Config, nowMS int64) (domain.Config, error) UpsertLuckyGiftConfig(ctx context.Context, config domain.Config, nowMS int64) (domain.Config, error)
ListLuckyGiftConfigs(ctx context.Context) ([]domain.Config, error)
CheckLuckyGift(ctx context.Context, cmd domain.CheckCommand) (domain.CheckResult, error) CheckLuckyGift(ctx context.Context, cmd domain.CheckCommand) (domain.CheckResult, error)
ExecuteLuckyGiftDraw(ctx context.Context, cmd domain.DrawCommand, nowMS int64) (domain.DrawResult, error) ExecuteLuckyGiftDraw(ctx context.Context, cmd domain.DrawCommand, nowMS int64) (domain.DrawResult, error)
ListLuckyGiftDraws(ctx context.Context, query domain.DrawQuery) ([]domain.DrawResult, int64, error) ListLuckyGiftDraws(ctx context.Context, query domain.DrawQuery) ([]domain.DrawResult, int64, error)
@ -96,6 +97,13 @@ func (s *Service) UpsertConfig(ctx context.Context, config domain.Config) (domai
return s.repository.UpsertLuckyGiftConfig(ctx, config, s.now().UTC().UnixMilli()) return s.repository.UpsertLuckyGiftConfig(ctx, config, s.now().UTC().UnixMilli())
} }
func (s *Service) ListConfigs(ctx context.Context) ([]domain.Config, error) {
if err := s.requireRepository(); err != nil {
return nil, err
}
return s.repository.ListLuckyGiftConfigs(ctx)
}
func (s *Service) ListDraws(ctx context.Context, query domain.DrawQuery) ([]domain.DrawResult, int64, error) { func (s *Service) ListDraws(ctx context.Context, query domain.DrawQuery) ([]domain.DrawResult, int64, error) {
if err := s.requireRepository(); err != nil { if err := s.requireRepository(); err != nil {
return nil, 0, err return nil, 0, err

View File

@ -53,6 +53,10 @@ func (r *fakeLuckyGiftRepository) UpsertLuckyGiftConfig(_ context.Context, confi
return config, nil return config, nil
} }
func (r *fakeLuckyGiftRepository) ListLuckyGiftConfigs(context.Context) ([]domain.Config, error) {
return nil, nil
}
func (r *fakeLuckyGiftRepository) CheckLuckyGift(context.Context, domain.CheckCommand) (domain.CheckResult, error) { func (r *fakeLuckyGiftRepository) CheckLuckyGift(context.Context, domain.CheckCommand) (domain.CheckResult, error) {
return domain.CheckResult{}, nil return domain.CheckResult{}, nil
} }

View File

@ -232,6 +232,41 @@ func (r *Repository) UpsertLuckyGiftConfig(ctx context.Context, config domain.Co
return config, nil return config, nil
} }
func (r *Repository) ListLuckyGiftConfigs(ctx context.Context) ([]domain.Config, error) {
if r == nil || r.db == nil {
return nil, xerr.New(xerr.Unavailable, "mysql repository is not configured")
}
appCode := appcode.FromContext(ctx)
rows, err := r.db.QueryContext(ctx, `
SELECT app_code, gift_id, enabled, rule_version, gift_price, target_rtp_ppm, pool_rate_ppm,
global_window_draws, gift_window_draws, novice_draw_limit, intermediate_draw_limit,
high_multiplier, high_water_pool_multiple, platform_pool_weight_ppm, room_pool_weight_ppm,
gift_pool_weight_ppm, initial_platform_pool, initial_gift_pool, initial_room_pool,
platform_reserve, gift_reserve, room_reserve, max_single_payout, user_hourly_payout_cap,
user_daily_payout_cap, device_daily_payout_cap, room_hourly_payout_cap, anchor_daily_payout_cap,
room_atmosphere_rate_ppm, room_atmosphere_initial, room_atmosphere_reserve,
activity_budget, activity_daily_limit, large_tier_enabled,
COALESCE(CAST(tiers_json AS CHAR), '[]'), updated_by_admin_id, created_at_ms, updated_at_ms
FROM lucky_gift_rules
WHERE app_code = ?
ORDER BY updated_at_ms DESC, gift_id ASC`,
appCode,
)
if err != nil {
return nil, err
}
defer rows.Close()
configs := make([]domain.Config, 0)
for rows.Next() {
config, err := scanLuckyConfig(rows)
if err != nil {
return nil, err
}
configs = append(configs, config)
}
return configs, rows.Err()
}
func (r *Repository) CheckLuckyGift(ctx context.Context, cmd domain.CheckCommand) (domain.CheckResult, error) { func (r *Repository) CheckLuckyGift(ctx context.Context, cmd domain.CheckCommand) (domain.CheckResult, error) {
poolID := luckyPoolID(cmd.PoolID) poolID := luckyPoolID(cmd.PoolID)
config, exists, err := r.GetLuckyGiftConfig(ctx, poolID) config, exists, err := r.GetLuckyGiftConfig(ctx, poolID)
@ -621,6 +656,10 @@ type luckyQueryer interface {
QueryRowContext(context.Context, string, ...any) *sql.Row QueryRowContext(context.Context, string, ...any) *sql.Row
} }
type luckyScanner interface {
Scan(...any) error
}
func (r *Repository) getLuckyGiftConfig(ctx context.Context, q luckyQueryer, appCode string, giftID string, forUpdate bool) (domain.Config, bool, error) { func (r *Repository) getLuckyGiftConfig(ctx context.Context, q luckyQueryer, appCode string, giftID string, forUpdate bool) (domain.Config, bool, error) {
if giftID == "" { if giftID == "" {
return domain.Config{}, false, nil return domain.Config{}, false, nil
@ -643,9 +682,20 @@ func (r *Repository) getLuckyGiftConfig(ctx context.Context, q luckyQueryer, app
WHERE app_code = ? AND gift_id = ?`+lockSQL, WHERE app_code = ? AND gift_id = ?`+lockSQL,
appCode, giftID, appCode, giftID,
) )
config, err := scanLuckyConfig(row)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
return domain.Config{}, false, nil
}
return domain.Config{}, false, err
}
return config, true, nil
}
func scanLuckyConfig(scanner luckyScanner) (domain.Config, error) {
var config domain.Config var config domain.Config
var tiersJSON string var tiersJSON string
if err := row.Scan(&config.AppCode, &config.GiftID, &config.Enabled, &config.RuleVersion, &config.GiftPrice, &config.TargetRTPPPM, &config.PoolRatePPM, if err := scanner.Scan(&config.AppCode, &config.GiftID, &config.Enabled, &config.RuleVersion, &config.GiftPrice, &config.TargetRTPPPM, &config.PoolRatePPM,
&config.GlobalWindowDraws, &config.GiftWindowDraws, &config.NoviceDrawLimit, &config.IntermediateDrawLimit, &config.GlobalWindowDraws, &config.GiftWindowDraws, &config.NoviceDrawLimit, &config.IntermediateDrawLimit,
&config.HighMultiplier, &config.HighWaterPoolMultiple, &config.PlatformPoolWeightPPM, &config.RoomPoolWeightPPM, &config.HighMultiplier, &config.HighWaterPoolMultiple, &config.PlatformPoolWeightPPM, &config.RoomPoolWeightPPM,
&config.GiftPoolWeightPPM, &config.InitialPlatformPool, &config.InitialGiftPool, &config.InitialRoomPool, &config.GiftPoolWeightPPM, &config.InitialPlatformPool, &config.InitialGiftPool, &config.InitialRoomPool,
@ -654,17 +704,14 @@ func (r *Repository) getLuckyGiftConfig(ctx context.Context, q luckyQueryer, app
&config.RoomAtmosphereRatePPM, &config.RoomAtmosphereInitial, &config.RoomAtmosphereReserve, &config.RoomAtmosphereRatePPM, &config.RoomAtmosphereInitial, &config.RoomAtmosphereReserve,
&config.ActivityBudget, &config.ActivityDailyLimit, &config.LargeTierEnabled, &config.ActivityBudget, &config.ActivityDailyLimit, &config.LargeTierEnabled,
&tiersJSON, &config.UpdatedByAdminID, &config.CreatedAtMS, &config.UpdatedAtMS); err != nil { &tiersJSON, &config.UpdatedByAdminID, &config.CreatedAtMS, &config.UpdatedAtMS); err != nil {
if errors.Is(err, sql.ErrNoRows) { return domain.Config{}, err
return domain.Config{}, false, nil
}
return domain.Config{}, false, err
} }
if err := json.Unmarshal([]byte(tiersJSON), &config.Tiers); err != nil { if err := json.Unmarshal([]byte(tiersJSON), &config.Tiers); err != nil {
return domain.Config{}, false, err return domain.Config{}, err
} }
config.PoolID = config.GiftID config.PoolID = config.GiftID
config.MultiplierPPMs = luckyMultiplierPPMsFromTiers(config.Tiers, config.GiftPrice) config.MultiplierPPMs = luckyMultiplierPPMsFromTiers(config.Tiers, config.GiftPrice)
return config, true, nil return config, nil
} }
func (r *Repository) getLuckyUserPaidDraws(ctx context.Context, appCode string, userID int64, giftID string) (int64, error) { func (r *Repository) getLuckyUserPaidDraws(ctx context.Context, appCode string, userID int64, giftID string) (int64, error) {

View File

@ -95,6 +95,19 @@ func (s *AdminLuckyGiftServer) UpsertLuckyGiftConfig(ctx context.Context, req *a
return &activityv1.UpsertLuckyGiftConfigResponse{Config: luckyConfigToProto(updated)}, nil return &activityv1.UpsertLuckyGiftConfigResponse{Config: luckyConfigToProto(updated)}, nil
} }
func (s *AdminLuckyGiftServer) ListLuckyGiftConfigs(ctx context.Context, req *activityv1.ListLuckyGiftConfigsRequest) (*activityv1.ListLuckyGiftConfigsResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
configs, err := s.svc.ListConfigs(ctx)
if err != nil {
return nil, xerr.ToGRPCError(err)
}
resp := &activityv1.ListLuckyGiftConfigsResponse{Configs: make([]*activityv1.LuckyGiftConfig, 0, len(configs))}
for _, config := range configs {
resp.Configs = append(resp.Configs, luckyConfigToProto(config))
}
return resp, nil
}
func (s *AdminLuckyGiftServer) ListLuckyGiftDraws(ctx context.Context, req *activityv1.ListLuckyGiftDrawsRequest) (*activityv1.ListLuckyGiftDrawsResponse, error) { func (s *AdminLuckyGiftServer) ListLuckyGiftDraws(ctx context.Context, req *activityv1.ListLuckyGiftDrawsRequest) (*activityv1.ListLuckyGiftDrawsResponse, error) {
ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode()) ctx = appcode.WithContext(ctx, req.GetMeta().GetAppCode())
draws, total, err := s.svc.ListDraws(ctx, domain.DrawQuery{ draws, total, err := s.svc.ListDraws(ctx, domain.DrawQuery{

View File

@ -62,11 +62,7 @@ func (c leaderccAdapterConfig) TokenTTL() time.Duration {
} }
func (s *Service) handleLeaderCCOperation(ctx context.Context, app string, platform gamedomain.Platform, req *gamev1.CallbackRequest, operation string, requestHash string) ([]byte, string, string, bool, string, error) { func (s *Service) handleLeaderCCOperation(ctx context.Context, app string, platform gamedomain.Platform, req *gamev1.CallbackRequest, operation string, requestHash string) ([]byte, string, string, bool, string, error) {
// 灵仙是明文 JSON + MD5 签名,所以先做 IP 白名单,再进入具体接口校验签名。 // 灵仙不做 IP 白名单过滤,来源校验只依赖每个接口的 MD5 签名和 token/session 绑定。
if !callbackIPAllowed(req, platform.CallbackIPWhitelist) {
raw, contentType := leaderccJSON(leaderccCodeRiskRejected, "ip forbidden", map[string]any{})
return raw, contentType, strconv.Itoa(leaderccCodeRiskRejected), false, "", nil
}
switch operation { switch operation {
// operation 由统一 callback 路由传入,兼容不同命名可以减少网关层特殊分支。 // operation 由统一 callback 路由传入,兼容不同命名可以减少网关层特殊分支。
case "userinfo", "user_info", "get_user_info": case "userinfo", "user_info", "get_user_info":

View File

@ -102,6 +102,7 @@ type LaunchCommand struct {
GameID string GameID string
Scene string Scene string
RoomID string RoomID string
AccessToken string
} }
type LaunchResult struct { type LaunchResult struct {
@ -183,7 +184,13 @@ func (s *Service) LaunchGame(ctx context.Context, command LaunchCommand) (Launch
now := s.now() now := s.now()
sessionID := "game_sess_" + strconv.FormatInt(now.UnixMilli(), 10) + "_" + randomHex(6) sessionID := "game_sess_" + strconv.FormatInt(now.UnixMilli(), 10) + "_" + randomHex(6)
token := "gt_" + randomHex(24) token := strings.TrimSpace(command.AccessToken)
if token == "" {
if strings.EqualFold(game.AdapterType, gamedomain.AdapterYomiV4) || strings.EqualFold(game.AdapterType, gamedomain.AdapterLeaderCCV1) {
return LaunchResult{}, xerr.New(xerr.InvalidArgument, "access token is required for provider game launch")
}
token = "gt_" + randomHex(24)
}
sessionTTL := s.config.LaunchSessionTTL sessionTTL := s.config.LaunchSessionTTL
// 三方游戏会在 H5 运行期间持续回调 token厂商适配器可以把默认 15 分钟启动 TTL 拉长。 // 三方游戏会在 H5 运行期间持续回调 token厂商适配器可以把默认 15 分钟启动 TTL 拉长。
if strings.EqualFold(game.AdapterType, gamedomain.AdapterYomiV4) { if strings.EqualFold(game.AdapterType, gamedomain.AdapterYomiV4) {
@ -542,6 +549,10 @@ func normalizeScene(scene string) string {
func buildLaunchURL(game gamedomain.LaunchableGame, session gamedomain.LaunchSession, token string) (string, error) { func buildLaunchURL(game gamedomain.LaunchableGame, session gamedomain.LaunchSession, token string) (string, error) {
base := strings.TrimSpace(game.APIBaseURL) base := strings.TrimSpace(game.APIBaseURL)
if strings.EqualFold(game.AdapterType, gamedomain.AdapterLeaderCCV1) && base == "" {
// 灵仙当前只需要我们提供回调域名和接口,不要求服务端拼 H5/Auth URL。
return "", nil
}
if base == "" { if base == "" {
// demo 平台可以没有真实厂商域名,保留本地默认地址用于开发自测。 // demo 平台可以没有真实厂商域名,保留本地默认地址用于开发自测。
base = "https://game.example.local/h5" base = "https://game.example.local/h5"

View File

@ -91,6 +91,7 @@ func TestLaunchGameBuildsYomiAuthURL(t *testing.T) {
DisplayUserID: "420001", DisplayUserID: "420001",
GameID: "yomi_fish_001", GameID: "yomi_fish_001",
RoomID: "room_1", RoomID: "room_1",
AccessToken: "app_access_token_yomi",
}) })
if err != nil { if err != nil {
t.Fatalf("LaunchGame failed: %v", err) t.Fatalf("LaunchGame failed: %v", err)
@ -98,7 +99,7 @@ func TestLaunchGameBuildsYomiAuthURL(t *testing.T) {
if result.ExpiresAtMS != 1700086400000 { if result.ExpiresAtMS != 1700086400000 {
t.Fatalf("yomi launch must use adapter token ttl, got %+v", result) t.Fatalf("yomi launch must use adapter token ttl, got %+v", result)
} }
for _, part := range []string{"gameUid=33", "platUserId=42", "lang=en", "gameLevelUid=0", "platRoomId=room_1", "platAuthCode=gt_"} { for _, part := range []string{"gameUid=33", "platUserId=42", "lang=en", "gameLevelUid=0", "platRoomId=room_1", "platAuthCode=app_access_token_yomi"} {
if !strings.Contains(result.LaunchURL, part) { if !strings.Contains(result.LaunchURL, part) {
t.Fatalf("yomi launch url missing %s: %s", part, result.LaunchURL) t.Fatalf("yomi launch url missing %s: %s", part, result.LaunchURL)
} }
@ -132,6 +133,7 @@ func TestLaunchGameBuildsLeaderCCURL(t *testing.T) {
DisplayUserID: "420001", DisplayUserID: "420001",
GameID: "lingxian_rocket_001", GameID: "lingxian_rocket_001",
RoomID: "room_1", RoomID: "room_1",
AccessToken: "app_access_token_lingxian",
}) })
if err != nil { if err != nil {
t.Fatalf("LaunchGame failed: %v", err) t.Fatalf("LaunchGame failed: %v", err)
@ -139,13 +141,47 @@ func TestLaunchGameBuildsLeaderCCURL(t *testing.T) {
if result.ExpiresAtMS != 1700086400000 { if result.ExpiresAtMS != 1700086400000 {
t.Fatalf("leadercc launch must use adapter token ttl, got %+v", result) t.Fatalf("leadercc launch must use adapter token ttl, got %+v", result)
} }
for _, part := range []string{"uid=420001", "token=gt_", "lang=zh-CN", "roomid=room_1"} { for _, part := range []string{"uid=420001", "token=app_access_token_lingxian", "lang=zh-CN", "roomid=room_1"} {
if !strings.Contains(result.LaunchURL, part) { if !strings.Contains(result.LaunchURL, part) {
t.Fatalf("leadercc launch url missing %s: %s", part, result.LaunchURL) t.Fatalf("leadercc launch url missing %s: %s", part, result.LaunchURL)
} }
} }
} }
func TestLaunchGameAllowsLeaderCCWithoutLaunchURL(t *testing.T) {
repo := &fakeRepository{
launchable: gamedomain.LaunchableGame{
CatalogItem: gamedomain.CatalogItem{
AppCode: "lalu",
GameID: "lingxian_rocket_001",
PlatformCode: "lingxian",
ProviderGameID: "101",
GameName: "Rocket",
Status: gamedomain.StatusActive,
},
PlatformStatus: gamedomain.StatusActive,
AdapterType: gamedomain.AdapterLeaderCCV1,
AdapterConfigJSON: `{"token_ttl_seconds":86400}`,
},
}
svc := New(Config{LaunchSessionTTL: 15 * time.Minute}, repo, &fakeWallet{}, &fakeUser{})
svc.now = func() time.Time { return time.UnixMilli(1700000000000) }
result, err := svc.LaunchGame(context.Background(), LaunchCommand{
AppCode: "lalu",
UserID: 42,
DisplayUserID: "420001",
GameID: "lingxian_rocket_001",
AccessToken: "app_access_token_lingxian",
})
if err != nil {
t.Fatalf("LaunchGame failed: %v", err)
}
if result.LaunchURL != "" || repo.session.LaunchTokenHash != stableHash("app_access_token_lingxian") {
t.Fatalf("leadercc without launch url should only create session: result=%+v session=%+v", result, repo.session)
}
}
func TestHandleLeaderCCUserInfoValidatesSignAndToken(t *testing.T) { func TestHandleLeaderCCUserInfoValidatesSignAndToken(t *testing.T) {
key := "leadercc-test-key" key := "leadercc-test-key"
token := "gt_lingxian_token" token := "gt_lingxian_token"
@ -181,7 +217,7 @@ func TestHandleLeaderCCUserInfoValidatesSignAndToken(t *testing.T) {
PlatformCode: "lingxian", PlatformCode: "lingxian",
Operation: "userinfo", Operation: "userinfo",
RawBody: []byte(`{"gameId":"101","uid":"420001","token":"` + token + `","roomId":"room_1","sign":"` + sign + `"}`), RawBody: []byte(`{"gameId":"101","uid":"420001","token":"` + token + `","roomId":"room_1","sign":"` + sign + `"}`),
RemoteAddr: "3.1.174.194:443", RemoteAddr: "203.0.113.10:443",
}) })
if err != nil { if err != nil {
t.Fatalf("HandleCallback failed: %v", err) t.Fatalf("HandleCallback failed: %v", err)

View File

@ -57,6 +57,7 @@ func (s *Server) LaunchGame(ctx context.Context, req *gamev1.LaunchGameRequest)
GameID: req.GetGameId(), GameID: req.GetGameId(),
Scene: req.GetScene(), Scene: req.GetScene(),
RoomID: req.GetRoomId(), RoomID: req.GetRoomId(),
AccessToken: req.GetAccessToken(),
}) })
if err != nil { if err != nil {
return nil, xerr.ToGRPCError(err) return nil, xerr.ToGRPCError(err)

View File

@ -13,6 +13,7 @@ type UserAuthClient interface {
LoginPassword(ctx context.Context, req *userv1.LoginPasswordRequest) (*userv1.AuthResponse, error) LoginPassword(ctx context.Context, req *userv1.LoginPasswordRequest) (*userv1.AuthResponse, error)
LoginThirdParty(ctx context.Context, req *userv1.LoginThirdPartyRequest) (*userv1.AuthResponse, error) LoginThirdParty(ctx context.Context, req *userv1.LoginThirdPartyRequest) (*userv1.AuthResponse, error)
SetPassword(ctx context.Context, req *userv1.SetPasswordRequest) (*userv1.SetPasswordResponse, error) SetPassword(ctx context.Context, req *userv1.SetPasswordRequest) (*userv1.SetPasswordResponse, error)
QuickCreateAccount(ctx context.Context, req *userv1.QuickCreateAccountRequest) (*userv1.QuickCreateAccountResponse, error)
RefreshToken(ctx context.Context, req *userv1.RefreshTokenRequest) (*userv1.RefreshTokenResponse, error) RefreshToken(ctx context.Context, req *userv1.RefreshTokenRequest) (*userv1.RefreshTokenResponse, error)
Logout(ctx context.Context, req *userv1.LogoutRequest) (*userv1.LogoutResponse, error) Logout(ctx context.Context, req *userv1.LogoutRequest) (*userv1.LogoutResponse, error)
RecordLoginBlocked(ctx context.Context, req *userv1.RecordLoginBlockedRequest) (*userv1.RecordLoginBlockedResponse, error) RecordLoginBlocked(ctx context.Context, req *userv1.RecordLoginBlockedRequest) (*userv1.RecordLoginBlockedResponse, error)
@ -177,6 +178,10 @@ func (c *grpcUserAuthClient) SetPassword(ctx context.Context, req *userv1.SetPas
return c.client.SetPassword(ctx, req) return c.client.SetPassword(ctx, req)
} }
func (c *grpcUserAuthClient) QuickCreateAccount(ctx context.Context, req *userv1.QuickCreateAccountRequest) (*userv1.QuickCreateAccountResponse, error) {
return c.client.QuickCreateAccount(ctx, req)
}
func (c *grpcUserAuthClient) RefreshToken(ctx context.Context, req *userv1.RefreshTokenRequest) (*userv1.RefreshTokenResponse, error) { func (c *grpcUserAuthClient) RefreshToken(ctx context.Context, req *userv1.RefreshTokenRequest) (*userv1.RefreshTokenResponse, error) {
return c.client.RefreshToken(ctx, req) return c.client.RefreshToken(ctx, req)
} }

View File

@ -5,11 +5,13 @@ import (
"net" "net"
"net/http" "net/http"
"net/netip" "net/netip"
"strconv"
"strings" "strings"
"time" "time"
userv1 "hyapp.local/api/proto/user/v1" userv1 "hyapp.local/api/proto/user/v1"
"hyapp/pkg/appcode" "hyapp/pkg/appcode"
"hyapp/pkg/idgen"
"hyapp/services/gateway-service/internal/auth" "hyapp/services/gateway-service/internal/auth"
) )
@ -31,6 +33,16 @@ type authTokenData struct {
OnboardingStatus string `json:"onboarding_status"` OnboardingStatus string `json:"onboarding_status"`
} }
// quickCreateAccountData 直接把联调最关心的 uid/token 放到顶层token 内仍保留标准登录响应。
type quickCreateAccountData struct {
UID string `json:"uid"`
Account string `json:"account"`
AccessToken string `json:"access_token"`
RefreshToken string `json:"refresh_token,omitempty"`
PasswordSet bool `json:"password_set"`
Token authTokenData `json:"token"`
}
// loginPassword 处理账号密码登录;账号就是当前有效短号。 // loginPassword 处理账号密码登录;账号就是当前有效短号。
func (h *Handler) loginPassword(writer http.ResponseWriter, request *http.Request) { func (h *Handler) loginPassword(writer http.ResponseWriter, request *http.Request) {
var body struct { var body struct {
@ -78,6 +90,126 @@ func (h *Handler) loginPassword(writer http.ResponseWriter, request *http.Reques
httpkit.WriteOK(writer, request, authData(resp.GetToken(), nil)) httpkit.WriteOK(writer, request, authData(resp.GetToken(), nil))
} }
// quickCreateAccount 为游戏厂商联调快速创建一个完整账号;返回 uid 即 App 登录账号和游戏 uid。
func (h *Handler) quickCreateAccount(writer http.ResponseWriter, request *http.Request) {
var body struct {
Password string `json:"password"`
Username string `json:"username"`
Avatar string `json:"avatar"`
Gender string `json:"gender"`
Country string `json:"country"`
InviteCode string `json:"invite_code"`
DeviceID string `json:"device_id"`
Device string `json:"device"`
OSVersion string `json:"os_version"`
Birth string `json:"birth"`
AppVersion string `json:"app_version"`
BuildNumber string `json:"build_number"`
Source string `json:"source"`
InstallChannel string `json:"install_channel"`
Campaign string `json:"campaign"`
Platform string `json:"platform"`
Language string `json:"language"`
Timezone string `json:"timezone"`
}
if !decode(writer, request, &body) {
return
}
body.Password = strings.TrimSpace(body.Password)
if body.Password == "" {
httpkit.WriteError(writer, request, http.StatusBadRequest, httpkit.CodeInvalidArgument, "invalid argument")
return
}
// 默认值全部保持可落库、可登录、可过 user-service 资料校验;调用方仍可按需覆盖。
if strings.TrimSpace(body.Username) == "" {
body.Username = "quick_" + strconv.FormatInt(time.Now().UnixMilli(), 10)
}
if strings.TrimSpace(body.Avatar) == "" {
body.Avatar = "https://cdn.example.com/avatar/default.png"
}
if strings.TrimSpace(body.Gender) == "" {
body.Gender = "unknown"
}
if strings.TrimSpace(body.Country) == "" {
body.Country = "SG"
}
if strings.TrimSpace(body.DeviceID) == "" {
body.DeviceID = idgen.New("quick_device")
}
if strings.TrimSpace(body.Platform) == "" {
body.Platform = "android"
}
if strings.TrimSpace(body.Language) == "" {
body.Language = "zh-CN"
}
if strings.TrimSpace(body.Timezone) == "" {
body.Timezone = "Asia/Shanghai"
}
if strings.TrimSpace(body.Source) == "" {
body.Source = "quick_account"
}
if strings.TrimSpace(body.InstallChannel) == "" {
body.InstallChannel = "game_integration"
}
if !h.allowPublicAuthRequest(writer, request, authRateInput{
operation: authOperationThirdParty,
deviceID: body.DeviceID,
provider: "quick_account",
}) {
return
}
if !h.allowLoginRisk(writer, request, loginRiskInput{
Channel: "quick_account",
Platform: body.Platform,
Language: body.Language,
Timezone: body.Timezone,
}) {
return
}
if h.userClient == nil {
httpkit.WriteError(writer, request, http.StatusBadGateway, httpkit.CodeUpstreamError, "upstream service error")
return
}
resp, err := h.userClient.QuickCreateAccount(request.Context(), &userv1.QuickCreateAccountRequest{
Meta: authRequestMetaWithLoginContext(request, body.DeviceID, body.Platform, body.Language, body.Timezone),
Password: body.Password,
Username: body.Username,
Avatar: body.Avatar,
Gender: body.Gender,
Country: body.Country,
InviteCode: body.InviteCode,
DeviceId: body.DeviceID,
Device: body.Device,
OsVersion: body.OSVersion,
Birth: body.Birth,
AppVersion: body.AppVersion,
BuildNumber: body.BuildNumber,
Source: body.Source,
InstallChannel: body.InstallChannel,
Campaign: body.Campaign,
Platform: body.Platform,
Language: body.Language,
Timezone: body.Timezone,
})
if err != nil {
httpkit.WriteRPCError(writer, request, err)
return
}
token := authData(resp.GetToken(), nil)
httpkit.WriteOK(writer, request, quickCreateAccountData{
UID: token.DisplayUserID,
Account: token.DisplayUserID,
AccessToken: token.AccessToken,
RefreshToken: token.RefreshToken,
PasswordSet: resp.GetPasswordSet(),
Token: token,
})
}
// loginThirdParty 处理三方登录即注册。 // loginThirdParty 处理三方登录即注册。
func (h *Handler) loginThirdParty(writer http.ResponseWriter, request *http.Request) { func (h *Handler) loginThirdParty(writer http.ResponseWriter, request *http.Request) {
var body struct { var body struct {

View File

@ -64,8 +64,9 @@ func TestLaunchGameForwardsDisplayUserID(t *testing.T) {
handler := NewHandlerWithClients(&fakeRoomClient{}, nil, nil, &fakeUserProfileClient{}) handler := NewHandlerWithClients(&fakeRoomClient{}, nil, nil, &fakeUserProfileClient{})
handler.SetGameClient(gameClient) handler.SetGameClient(gameClient)
router := handler.Routes(auth.NewVerifier("secret")) router := handler.Routes(auth.NewVerifier("secret"))
accessToken := signGatewayToken(t, "secret", 42)
request := httptest.NewRequest(http.MethodPost, "/api/v1/games/demo_rocket_001/launch", bytes.NewReader([]byte(`{"scene":"voice_room","room_id":"room-1"}`))) request := httptest.NewRequest(http.MethodPost, "/api/v1/games/demo_rocket_001/launch", bytes.NewReader([]byte(`{"scene":"voice_room","room_id":"room-1"}`)))
request.Header.Set("Authorization", "Bearer "+signGatewayToken(t, "secret", 42)) request.Header.Set("Authorization", "Bearer "+accessToken)
recorder := httptest.NewRecorder() recorder := httptest.NewRecorder()
router.ServeHTTP(recorder, request) router.ServeHTTP(recorder, request)
@ -73,7 +74,7 @@ func TestLaunchGameForwardsDisplayUserID(t *testing.T) {
if recorder.Code != http.StatusOK { if recorder.Code != http.StatusOK {
t.Fatalf("status mismatch: got %d body=%s", recorder.Code, recorder.Body.String()) t.Fatalf("status mismatch: got %d body=%s", recorder.Code, recorder.Body.String())
} }
if gameClient.lastLaunch.GetGameId() != "demo_rocket_001" || gameClient.lastLaunch.GetDisplayUserId() != "100001" || gameClient.lastLaunch.GetRoomId() != "room-1" { if gameClient.lastLaunch.GetGameId() != "demo_rocket_001" || gameClient.lastLaunch.GetDisplayUserId() != "100001" || gameClient.lastLaunch.GetRoomId() != "room-1" || gameClient.lastLaunch.GetAccessToken() != accessToken {
t.Fatalf("LaunchGame request mismatch: %+v", gameClient.lastLaunch) t.Fatalf("LaunchGame request mismatch: %+v", gameClient.lastLaunch)
} }
} }

View File

@ -73,6 +73,7 @@ func (h *Handler) launchGame(writer http.ResponseWriter, request *http.Request)
GameId: gameID, GameId: gameID,
Scene: body.Scene, Scene: body.Scene,
RoomId: body.RoomID, RoomId: body.RoomID,
AccessToken: bearerAccessToken(request),
}) })
httpkit.Write(writer, request, gameLaunchDataFromProto(resp), err) httpkit.Write(writer, request, gameLaunchDataFromProto(resp), err)
} }
@ -132,6 +133,14 @@ func requestLanguage(request *http.Request) string {
return strings.TrimSpace(value) return strings.TrimSpace(value)
} }
func bearerAccessToken(request *http.Request) string {
header := strings.TrimSpace(request.Header.Get("Authorization"))
if !strings.HasPrefix(header, "Bearer ") {
return ""
}
return strings.TrimSpace(strings.TrimPrefix(header, "Bearer "))
}
func flattenedHeaders(request *http.Request) map[string]string { func flattenedHeaders(request *http.Request) map[string]string {
headers := make(map[string]string, len(request.Header)) headers := make(map[string]string, len(request.Header))
for key, values := range request.Header { for key, values := range request.Header {

View File

@ -29,11 +29,12 @@ type Config struct {
} }
type AuthHandlers struct { type AuthHandlers struct {
LoginPassword http.HandlerFunc LoginPassword http.HandlerFunc
SetPassword http.HandlerFunc SetPassword http.HandlerFunc
LoginThirdParty http.HandlerFunc QuickCreateAccount http.HandlerFunc
RefreshToken http.HandlerFunc LoginThirdParty http.HandlerFunc
Logout http.HandlerFunc RefreshToken http.HandlerFunc
Logout http.HandlerFunc
} }
type AppHandlers struct { type AppHandlers struct {
@ -220,6 +221,7 @@ func (r routes) registerAuthRoutes() {
h := r.config.Auth h := r.config.Auth
r.public("/auth/account/login", "", h.LoginPassword) r.public("/auth/account/login", "", h.LoginPassword)
r.auth("/auth/password/set", "", h.SetPassword) r.auth("/auth/password/set", "", h.SetPassword)
r.public("/auth/account/quick-create", http.MethodPost, h.QuickCreateAccount)
r.public("/auth/third-party/login", "", h.LoginThirdParty) r.public("/auth/third-party/login", "", h.LoginThirdParty)
r.public("/auth/token/refresh", "", h.RefreshToken) r.public("/auth/token/refresh", "", h.RefreshToken)
r.public("/auth/logout", "", h.Logout) r.public("/auth/logout", "", h.Logout)

View File

@ -236,6 +236,7 @@ type fakeUserAuthClient struct {
lastLoginThirdParty *userv1.LoginThirdPartyRequest lastLoginThirdParty *userv1.LoginThirdPartyRequest
lastLoginPassword *userv1.LoginPasswordRequest lastLoginPassword *userv1.LoginPasswordRequest
lastSetPassword *userv1.SetPasswordRequest lastSetPassword *userv1.SetPasswordRequest
lastQuickCreate *userv1.QuickCreateAccountRequest
lastRefresh *userv1.RefreshTokenRequest lastRefresh *userv1.RefreshTokenRequest
lastLogout *userv1.LogoutRequest lastLogout *userv1.LogoutRequest
lastBlocked *userv1.RecordLoginBlockedRequest lastBlocked *userv1.RecordLoginBlockedRequest
@ -445,6 +446,21 @@ func (f *fakeUserAuthClient) SetPassword(_ context.Context, req *userv1.SetPassw
return &userv1.SetPasswordResponse{PasswordSet: true}, nil return &userv1.SetPasswordResponse{PasswordSet: true}, nil
} }
func (f *fakeUserAuthClient) QuickCreateAccount(_ context.Context, req *userv1.QuickCreateAccountRequest) (*userv1.QuickCreateAccountResponse, error) {
f.lastQuickCreate = req
return &userv1.QuickCreateAccountResponse{Token: &userv1.AuthToken{
UserId: 10001,
DisplayUserId: "100001",
SessionId: "sess-quick",
AccessToken: "access-quick",
RefreshToken: "refresh-quick",
ExpiresInSec: 1800,
TokenType: "Bearer",
ProfileCompleted: true,
OnboardingStatus: "completed",
}, PasswordSet: true}, nil
}
func (f *fakeUserAuthClient) RefreshToken(_ context.Context, req *userv1.RefreshTokenRequest) (*userv1.RefreshTokenResponse, error) { func (f *fakeUserAuthClient) RefreshToken(_ context.Context, req *userv1.RefreshTokenRequest) (*userv1.RefreshTokenResponse, error) {
f.lastRefresh = req f.lastRefresh = req
f.refreshCount++ f.refreshCount++
@ -2563,6 +2579,50 @@ func TestAccountLoginAcceptsAccountField(t *testing.T) {
} }
} }
func TestQuickCreateAccountCreatesCompletedPasswordAccount(t *testing.T) {
userClient := &fakeUserAuthClient{}
router := NewHandler(&fakeRoomClient{}, userClient).Routes(auth.NewVerifier("secret"))
body := []byte(`{"password":"secret-pass"}`)
request := httptest.NewRequest(http.MethodPost, "/api/v1/auth/account/quick-create", bytes.NewReader(body))
request.Header.Set("X-Request-ID", "req-quick-create")
request.Header.Set("X-App-Code", "lalu")
recorder := httptest.NewRecorder()
router.ServeHTTP(recorder, request)
if recorder.Code != http.StatusOK {
t.Fatalf("status mismatch: got %d body=%s", recorder.Code, recorder.Body.String())
}
var response httpkit.ResponseEnvelope
if err := json.NewDecoder(recorder.Body).Decode(&response); err != nil {
t.Fatalf("decode response failed: %v", err)
}
if response.Code != httpkit.CodeOK || response.RequestID != assertGeneratedRequestID(t, recorder, "req-quick-create") {
t.Fatalf("unexpected envelope: %+v", response)
}
req := userClient.lastQuickCreate
if req == nil {
t.Fatal("QuickCreateAccount request was not sent")
}
if req.GetPassword() != "secret-pass" || req.GetUsername() == "" || req.GetAvatar() == "" {
t.Fatalf("quick create profile defaults were not populated: %+v", req)
}
if req.GetCountry() != "SG" || req.GetGender() != "unknown" || req.GetDeviceId() == "" {
t.Fatalf("quick create required defaults mismatch: %+v", req)
}
if req.GetPlatform() != "android" || req.GetLanguage() != "zh-CN" || req.GetTimezone() != "Asia/Shanghai" {
t.Fatalf("quick create login context mismatch: %+v", req)
}
if req.GetMeta().GetAppCode() != "lalu" || req.GetMeta().GetDeviceId() != req.GetDeviceId() {
t.Fatalf("quick create meta mismatch: %+v", req.GetMeta())
}
data, ok := response.Data.(map[string]any)
if !ok || data["uid"] != "100001" || data["account"] != "100001" || data["access_token"] != "access-quick" || data["password_set"] != true {
t.Fatalf("quick create response mismatch: %+v", response.Data)
}
}
func TestLoginRiskFastGuardBlocksLanguage(t *testing.T) { func TestLoginRiskFastGuardBlocksLanguage(t *testing.T) {
userClient := &fakeUserAuthClient{} userClient := &fakeUserAuthClient{}
handler := NewHandler(&fakeRoomClient{}, userClient) handler := NewHandler(&fakeRoomClient{}, userClient)

View File

@ -114,11 +114,12 @@ func (h *Handler) Routes(jwtVerifier *auth.Verifier) http.Handler {
return h.profileAPIHandler(jwtVerifier, handler) return h.profileAPIHandler(jwtVerifier, handler)
}, },
Auth: httproutes.AuthHandlers{ Auth: httproutes.AuthHandlers{
LoginPassword: h.loginPassword, LoginPassword: h.loginPassword,
SetPassword: h.setPassword, SetPassword: h.setPassword,
LoginThirdParty: h.loginThirdParty, QuickCreateAccount: h.quickCreateAccount,
RefreshToken: h.refreshToken, LoginThirdParty: h.loginThirdParty,
Logout: h.logout, RefreshToken: h.refreshToken,
Logout: h.logout,
}, },
App: httproutes.AppHandlers{ App: httproutes.AppHandlers{
ListRegistrationCountries: userAPI.ListRegistrationCountries, ListRegistrationCountries: userAPI.ListRegistrationCountries,

View File

@ -0,0 +1,119 @@
package auth
import (
"context"
"strings"
"hyapp/pkg/appcode"
"hyapp/pkg/xerr"
authdomain "hyapp/services/user-service/internal/domain/auth"
invitedomain "hyapp/services/user-service/internal/domain/invite"
userdomain "hyapp/services/user-service/internal/domain/user"
)
// QuickCreateAccount 创建一个已完成资料、已设置密码、可立即登录的账号。
// 该能力只复用内部领域事务,不依赖 firebase/mock provider方便游戏方联调时快速拿 uid/token。
func (s *Service) QuickCreateAccount(ctx context.Context, password string, registration authdomain.ThirdPartyRegistration, meta Meta) (authdomain.Token, error) {
meta.AppCode = appcode.Normalize(meta.AppCode)
registration.AppCode = meta.AppCode
registration = normalizeThirdPartyRegistration(registration, meta)
meta.Platform = registration.Platform
meta.Language = registration.Language
meta.Timezone = registration.Timezone
password = strings.TrimSpace(password)
if password == "" {
return authdomain.Token{}, xerr.New(xerr.InvalidArgument, "password is required")
}
if registration.DeviceID == "" || registration.Platform == "" {
// refresh session 必须绑定设备,平台也会进入注册来源和风控审计。
return authdomain.Token{}, xerr.New(xerr.InvalidArgument, "device_id and platform are required")
}
if registration.Username == "" || registration.Avatar == "" || registration.Gender == "" || registration.Country == "" {
// 快捷账号直接跳过 onboarding因此必须一次性写齐客户端准入所需的最小资料。
return authdomain.Token{}, xerr.New(xerr.InvalidArgument, "username, avatar, gender and country are required")
}
if err := validateThirdPartyRegistration(registration); err != nil {
return authdomain.Token{}, err
}
if s.authRepository == nil {
return authdomain.Token{}, xerr.New(xerr.Unavailable, "auth repository is not configured")
}
registration, err := s.resolveRegistrationCountry(ctx, registration)
if err != nil {
return authdomain.Token{}, err
}
passwordHash, err := hashPassword(password)
if err != nil {
return authdomain.Token{}, err
}
var lastErr error
for attempt := 0; attempt < s.allocateMaxAttempts; attempt++ {
user, displayIdentity := s.newUserWithIdentity(attempt)
user = applyThirdPartyRegistration(user, registration)
user.ProfileCompleted = true
user.ProfileCompletedAtMs = user.CreatedAtMs
user.OnboardingStatus = userdomain.OnboardingStatusCompleted
displayUserID, err := s.authRepository.AllocateDisplayUserID(ctx, registration.AppCode)
if err != nil {
return authdomain.Token{}, err
}
user.DefaultDisplayUserID = displayUserID
user.CurrentDisplayUserID = displayUserID
displayIdentity.AppCode = registration.AppCode
displayIdentity.DisplayUserID = displayUserID
displayIdentity.DefaultDisplayUserID = displayUserID
if !userdomain.ValidDisplayUserID(displayIdentity.DisplayUserID) {
// 分配器或历史种子异常时不写库,直接尝试下一个候选。
continue
}
session, refreshToken, err := s.newSession(registration.AppCode, user.UserID, registration.DeviceID)
if err != nil {
return authdomain.Token{}, err
}
account := authdomain.PasswordAccount{
AppCode: registration.AppCode,
UserID: user.UserID,
DisplayUserID: displayUserID,
PasswordHash: passwordHash,
HashAlg: hashAlgBcrypt,
CreatedAtMs: user.CreatedAtMs,
UpdatedAtMs: user.UpdatedAtMs,
}
inviteBind := invitedomain.BindCommand{
AppCode: registration.AppCode,
InvitedUserID: user.UserID,
InvitedRegionID: registration.RegionID,
InviteCode: registration.InviteCode,
Source: "quick_account_creation",
RequestID: meta.RequestID,
BoundAtMs: user.CreatedAtMs,
}
err = s.authRepository.CreatePasswordUser(ctx, user, displayIdentity, account, session, inviteBind)
if err == nil {
s.audit(ctx, meta, user.UserID, loginPassword, "", resultSuccess, "")
token, tokenErr := s.issueToken(user, session.SessionID, refreshToken)
if tokenErr != nil {
return authdomain.Token{}, tokenErr
}
s.enqueueLoginIPRiskJob(ctx, meta, token, "account", registration.Platform, registration.Language, registration.Timezone)
return token, nil
}
if xerr.IsCode(err, xerr.DisplayUserIDExists) {
// 默认短号冲突可重试,避免少量并发建号把快捷入口打成失败。
lastErr = err
continue
}
s.audit(ctx, meta, 0, loginPassword, "", resultFailed, string(xerr.CodeOf(err)))
return authdomain.Token{}, err
}
if lastErr != nil {
s.audit(ctx, meta, 0, loginPassword, "", resultFailed, string(xerr.DisplayUserIDAllocateFailed))
}
return authdomain.Token{}, xerr.New(xerr.DisplayUserIDAllocateFailed, "display_user_id allocation failed")
}

View File

@ -40,6 +40,8 @@ type AuthRepository interface {
AllocateDisplayUserID(ctx context.Context, appCode string) (string, error) AllocateDisplayUserID(ctx context.Context, appCode string) (string, error)
// SetPassword 为已有用户首次写入密码身份。 // SetPassword 为已有用户首次写入密码身份。
SetPassword(ctx context.Context, account authdomain.PasswordAccount) error SetPassword(ctx context.Context, account authdomain.PasswordAccount) error
// CreatePasswordUser 原子创建用户、默认短号、密码身份和首个 session。
CreatePasswordUser(ctx context.Context, user userdomain.User, identity userdomain.Identity, account authdomain.PasswordAccount, session authdomain.Session, invite invitedomain.BindCommand) error
// FindPasswordByDisplayUserID 通过当前 active display_user_id 读取密码身份。 // FindPasswordByDisplayUserID 通过当前 active display_user_id 读取密码身份。
FindPasswordByDisplayUserID(ctx context.Context, displayUserID string, nowMs int64) (authdomain.PasswordAccount, error) FindPasswordByDisplayUserID(ctx context.Context, displayUserID string, nowMs int64) (authdomain.PasswordAccount, error)
// CreateSession 创建新的 refresh session。 // CreateSession 创建新的 refresh session。

View File

@ -224,6 +224,51 @@ func TestThirdPartyUserSetsPasswordThenLogsIn(t *testing.T) {
} }
} }
func TestQuickCreateAccountCreatesCompletedPasswordLogin(t *testing.T) {
// 快捷建号必须一次性得到可登录短号、已完成资料快照和密码身份,服务游戏联调直接取 uid/token。
ctx := context.Background()
repository := mysqltest.NewRepository(t)
seedCountry(t, repository, "SG")
now := time.UnixMilli(2000)
svc := newAuthService(repository, &now, []int64{900011}, []string{"100011"})
token, err := svc.QuickCreateAccount(ctx, "secret-pass", authdomain.ThirdPartyRegistration{
Username: "Lingxian Test",
Avatar: "https://cdn.example/avatar.png",
Gender: "unknown",
Country: "SG",
DeviceID: "quick-dev",
Platform: "ios",
Language: "en-US",
Timezone: "Asia/Shanghai",
AppVersion: "1.0.0",
}, authservice.Meta{RequestID: "req-quick-create", AppCode: "lalu", ClientIP: "203.0.113.10", UserAgent: "quick-test/1.0"})
if err != nil {
t.Fatalf("QuickCreateAccount failed: %v", err)
}
if token.UserID != 900011 || token.DisplayUserID == "" || token.AccessToken == "" || token.RefreshToken == "" {
t.Fatalf("unexpected quick token: %+v", token)
}
if !token.ProfileCompleted || token.OnboardingStatus != string(userdomain.OnboardingStatusCompleted) {
t.Fatalf("quick account must be completed: %+v", token)
}
user, err := repository.GetUser(ctx, token.UserID)
if err != nil {
t.Fatalf("GetUser failed: %v", err)
}
if user.Username != "Lingxian Test" || user.Country != "SG" || !user.ProfileCompleted {
t.Fatalf("quick user profile mismatch: %+v", user)
}
loginToken, err := svc.LoginPassword(ctx, token.DisplayUserID, "secret-pass", "quick-dev", authservice.Meta{RequestID: "req-quick-login", AppCode: "lalu"})
if err != nil {
t.Fatalf("LoginPassword for quick account failed: %v", err)
}
if loginToken.UserID != token.UserID || loginToken.DisplayUserID != token.DisplayUserID || !loginToken.ProfileCompleted {
t.Fatalf("quick account login token mismatch: %+v", loginToken)
}
}
func TestRefreshTokenCarriesCompletedOnboardingStatus(t *testing.T) { func TestRefreshTokenCarriesCompletedOnboardingStatus(t *testing.T) {
// gateway profile gate 依赖 access token 快照refresh 必须在用户完成注册后带出最新状态。 // gateway profile gate 依赖 access token 快照refresh 必须在用户完成注册后带出最新状态。
ctx := context.Background() ctx := context.Background()

View File

@ -7,7 +7,11 @@ import (
"hyapp/pkg/appcode" "hyapp/pkg/appcode"
"hyapp/pkg/xerr" "hyapp/pkg/xerr"
authdomain "hyapp/services/user-service/internal/domain/auth" authdomain "hyapp/services/user-service/internal/domain/auth"
invitedomain "hyapp/services/user-service/internal/domain/invite"
userdomain "hyapp/services/user-service/internal/domain/user"
identitystorage "hyapp/services/user-service/internal/storage/mysql/identity" identitystorage "hyapp/services/user-service/internal/storage/mysql/identity"
invitestorage "hyapp/services/user-service/internal/storage/mysql/invite"
userstorage "hyapp/services/user-service/internal/storage/mysql/user"
) )
func (r *Repository) SetPassword(ctx context.Context, account authdomain.PasswordAccount) error { func (r *Repository) SetPassword(ctx context.Context, account authdomain.PasswordAccount) error {
@ -24,6 +28,39 @@ func (r *Repository) SetPassword(ctx context.Context, account authdomain.Passwor
return nil return nil
} }
// CreatePasswordUser 原子创建完整密码账号,服务快捷建号和联调账号准备。
func (r *Repository) CreatePasswordUser(ctx context.Context, user userdomain.User, identity userdomain.Identity, account authdomain.PasswordAccount, session authdomain.Session, inviteBind invitedomain.BindCommand) error {
// 账号创建必须和默认短号、密码身份、refresh session 同事务提交,避免返回不可登录的 uid。
tx, err := r.db.BeginTx(ctx, nil)
if err != nil {
return err
}
defer tx.Rollback()
if err := userstorage.InsertUserIdentity(ctx, tx, user, identity); err != nil {
// 默认短号唯一键冲突交给 service 使用新 user_id/display_user_id 重试。
return mapAuthDuplicateError(err)
}
if _, err := invitestorage.EnsurePrimaryCodeForUser(ctx, tx, user.AppCode, user.UserID, user.CreatedAtMs); err != nil {
return err
}
if _, err := invitestorage.BindRelation(ctx, tx, inviteBind); err != nil {
return err
}
if _, err := tx.ExecContext(ctx, `
INSERT INTO password_accounts (app_code, user_id, password_hash, hash_alg, created_at_ms, updated_at_ms)
VALUES (?, ?, ?, ?, ?, ?)
`, appcode.Normalize(account.AppCode), account.UserID, account.PasswordHash, account.HashAlg, account.CreatedAtMs, account.UpdatedAtMs); err != nil {
return mapAuthDuplicateError(err)
}
if err := insertSession(ctx, tx, session); err != nil {
// session 写入失败时必须回滚用户和密码身份,否则客户端拿不到 refresh token 却占用账号。
return err
}
return tx.Commit()
}
// FindPasswordByDisplayUserID 通过当前 active display_user_id 查找用户密码身份。 // FindPasswordByDisplayUserID 通过当前 active display_user_id 查找用户密码身份。
func (r *Repository) FindPasswordByDisplayUserID(ctx context.Context, displayUserID string, nowMs int64) (authdomain.PasswordAccount, error) { func (r *Repository) FindPasswordByDisplayUserID(ctx context.Context, displayUserID string, nowMs int64) (authdomain.PasswordAccount, error) {

View File

@ -241,6 +241,11 @@ func (r *Repository) SetPassword(ctx context.Context, account authdomain.Passwor
return r.Repository.AuthRepository().SetPassword(ctx, account) return r.Repository.AuthRepository().SetPassword(ctx, account)
} }
// CreatePasswordUser 让测试 wrapper 继续满足认证接口。
func (r *Repository) CreatePasswordUser(ctx context.Context, user userdomain.User, identity userdomain.Identity, account authdomain.PasswordAccount, session authdomain.Session, invite invitedomain.BindCommand) error {
return r.Repository.AuthRepository().CreatePasswordUser(ctx, user, identity, account, session, invite)
}
// FindPasswordByDisplayUserID 让测试 wrapper 继续满足认证接口。 // FindPasswordByDisplayUserID 让测试 wrapper 继续满足认证接口。
func (r *Repository) FindPasswordByDisplayUserID(ctx context.Context, displayUserID string, nowMs int64) (authdomain.PasswordAccount, error) { func (r *Repository) FindPasswordByDisplayUserID(ctx context.Context, displayUserID string, nowMs int64) (authdomain.PasswordAccount, error) {
return r.Repository.AuthRepository().FindPasswordByDisplayUserID(ctx, displayUserID, nowMs) return r.Repository.AuthRepository().FindPasswordByDisplayUserID(ctx, displayUserID, nowMs)

View File

@ -136,6 +136,37 @@ func (s *Server) SetPassword(ctx context.Context, req *userv1.SetPasswordRequest
return &userv1.SetPasswordResponse{PasswordSet: true}, nil return &userv1.SetPasswordResponse{PasswordSet: true}, nil
} }
// QuickCreateAccount 为游戏联调快速创建一个已完成资料且可密码登录的账号。
func (s *Server) QuickCreateAccount(ctx context.Context, req *userv1.QuickCreateAccountRequest) (*userv1.QuickCreateAccountResponse, error) {
ctx = contextWithApp(ctx, req.GetMeta())
registration := authdomain.ThirdPartyRegistration{
Username: req.GetUsername(),
Gender: req.GetGender(),
Country: req.GetCountry(),
InviteCode: req.GetInviteCode(),
IP: req.GetMeta().GetClientIp(),
DeviceID: req.GetDeviceId(),
Device: req.GetDevice(),
OSVersion: req.GetOsVersion(),
Avatar: req.GetAvatar(),
BirthDate: req.GetBirth(),
AppVersion: req.GetAppVersion(),
BuildNumber: req.GetBuildNumber(),
Source: req.GetSource(),
InstallChannel: req.GetInstallChannel(),
Campaign: req.GetCampaign(),
Platform: req.GetPlatform(),
Language: req.GetLanguage(),
Timezone: req.GetTimezone(),
}
token, err := s.authSvc.QuickCreateAccount(ctx, req.GetPassword(), registration, authMeta(req.GetMeta()))
if err != nil {
return nil, xerr.ToGRPCError(err)
}
return &userv1.QuickCreateAccountResponse{Token: toProtoToken(token), PasswordSet: true}, nil
}
// RefreshToken 执行 refresh token 轮换。 // RefreshToken 执行 refresh token 轮换。
func (s *Server) RefreshToken(ctx context.Context, req *userv1.RefreshTokenRequest) (*userv1.RefreshTokenResponse, error) { func (s *Server) RefreshToken(ctx context.Context, req *userv1.RefreshTokenRequest) (*userv1.RefreshTokenResponse, error) {
ctx = contextWithApp(ctx, req.GetMeta()) ctx = contextWithApp(ctx, req.GetMeta())