接口测试

This commit is contained in:
zhaocy 2022-07-22 18:22:29 +08:00
parent a087b3f668
commit 4f32f23c0f
14 changed files with 126 additions and 67 deletions

View File

@ -33,13 +33,13 @@ var (
mainType: string(comm.ModuleHero), mainType: string(comm.ModuleHero),
subType: hero.StrengthenUplv, subType: hero.StrengthenUplv,
req: &pb.HeroStrengthenUplvReq{ req: &pb.HeroStrengthenUplvReq{
HeroObjID: "62da0353ebe27f9446dd4a1d", HeroObjID: "62da4e1ecd19e620141eed75",
ExpCards: map[string]int32{ ExpCards: map[string]int32{
"62da19017944b60fd473df61": 1, "62da4e40cd19e620141eedeb": 1,
}, },
}, },
rsp: &pb.HeroStrengthenUplvResp{}, rsp: &pb.HeroStrengthenUplvResp{},
// enabled: true, enabled: true,
} }
tcs = append(tcs, tc) tcs = append(tcs, tc)
} }

View File

@ -17,7 +17,7 @@ var (
subType: task.TaskSubTypeList, subType: task.TaskSubTypeList,
req: &pb.TaskListReq{ req: &pb.TaskListReq{
//设置任务类型 //设置任务类型
TaskTag: int32(comm.TASK_DAILY), //每天任务 // TaskTag: int32(comm.TASK_DAILY), //每天任务
// TaskTag: int32(comm.TASK_WEEKLY), //周任务 // TaskTag: int32(comm.TASK_WEEKLY), //周任务
// TaskTag: int32(comm.TASK_ACHIEVE), // TaskTag: int32(comm.TASK_ACHIEVE),
// TaskTag: int32(comm.TASK_STRATEGY), // TaskTag: int32(comm.TASK_STRATEGY),
@ -29,24 +29,24 @@ var (
fmt.Printf("%v \n", v) fmt.Printf("%v \n", v)
} }
}, },
enabled: true, // enabled: true,
next: func(robot *Robot, rsp proto.Message) { next: func(robot *Robot, rsp proto.Message) {
tcs := []*TestCase{} tcs := []*TestCase{}
if v, ok := rsp.(*pb.TaskListResp); ok { if _, ok := rsp.(*pb.TaskListResp); ok {
for _, tt := range v.List { // for _, tt := range v.List {
tc := &TestCase{ tc := &TestCase{
desc: "领取任务奖励", desc: "领取任务奖励",
mainType: string(comm.ModuleTask), mainType: string(comm.ModuleTask),
subType: task.TaskSubTypeReceive, subType: task.TaskSubTypeReceive,
req: &pb.TaskReceiveReq{ req: &pb.TaskReceiveReq{
TaskTag: int32(comm.TASK_DAILY), TaskTag: int32(comm.TASK_DAILY),
Id: tt.Id, Id: "62da4e20cd19e620141eed7b",
}, },
rsp: &pb.TaskReceiveResp{}, rsp: &pb.TaskReceiveResp{},
// enabled: true, // enabled: true,
}
tcs = append(tcs, tc)
} }
tcs = append(tcs, tc)
// }
robot.addBuilders(tcs) robot.addBuilders(tcs)
} }
}, },
@ -64,7 +64,7 @@ var (
fmt.Printf("%v 活跃值:%v\n", v, out.Active) fmt.Printf("%v 活跃值:%v\n", v, out.Active)
} }
}, },
// enabled: true, enabled: true,
}, { }, {
desc: "活跃度领取", desc: "活跃度领取",
mainType: string(comm.ModuleTask), mainType: string(comm.ModuleTask),

View File

@ -32,7 +32,7 @@ var user_builders = []*TestCase{
}, },
}, },
rsp: &pb.UserAddResResp{}, rsp: &pb.UserAddResResp{},
//enabled: true, // enabled: true,
}, },
{ {
desc: "添加资源", desc: "添加资源",
@ -46,7 +46,7 @@ var user_builders = []*TestCase{
}, },
}, },
rsp: &pb.UserAddResResp{}, rsp: &pb.UserAddResResp{},
enabled: true, // enabled: true,
}, { }, {
desc: "获取配置", desc: "获取配置",
mainType: string(comm.ModuleUser), mainType: string(comm.ModuleUser),

View File

@ -82,6 +82,8 @@ type (
InitTaskAll(uid string) InitTaskAll(uid string)
//清空任务 //清空任务
ResetTask(uid string, taskTag TaskTag) ResetTask(uid string, taskTag TaskTag)
//监听任务
ListenTask()
//任务通知 //任务通知
SendToTask(session IUserSession, taskType TaskType, param *pb.TaskParam) (code pb.ErrorCode) SendToTask(session IUserSession, taskType TaskType, param *pb.TaskParam) (code pb.ErrorCode)
// 清理玩家任务数据 // 清理玩家任务数据

View File

@ -182,7 +182,7 @@ func (this *apiComp) StrengthenUplv(session comm.IUserSession, req *pb.HeroStren
session.SendMsg(string(this.module.GetType()), "change", &pb.HeroChangePush{List: []*pb.DBHero{_hero}}) session.SendMsg(string(this.module.GetType()), "change", &pb.HeroChangePush{List: []*pb.DBHero{_hero}})
session.SendMsg(string(this.module.GetType()), StrengthenUplv, &pb.HeroStrengthenUplvResp{Hero: _hero}) session.SendMsg(string(this.module.GetType()), StrengthenUplv, &pb.HeroStrengthenUplvResp{Hero: _hero})
if iLvUp > 0 { // 升级了 统计任务 if iLvUp > 0 { // 升级了 统计任务
this.module.ModuleTask.SendToTask(session, comm.TaskTypeUpHeroLevel, &pb.TaskParam{First: iLvUp}) this.module.ModuleTask.SendToTask(session, comm.TaskTypeUpHeroLevel, &pb.TaskParam{Second: iLvUp})
} }
return return

View File

@ -115,7 +115,7 @@ func (this *ModelHero) initHeroOverlying(uid string, heroCfgId, count int32) (he
this.ChanageUserExpand(uid, initUpdate) this.ChanageUserExpand(uid, initUpdate)
} }
} }
hero.SameCount += count hero.SameCount = count
if err = this.moduleHero.modelHero.AddList(uid, hero.Id, hero); err != nil { if err = this.moduleHero.modelHero.AddList(uid, hero.Id, hero); err != nil {
this.moduleHero.Errorf("%v", err) this.moduleHero.Errorf("%v", err)
return return

View File

@ -8,7 +8,7 @@ import (
"google.golang.org/protobuf/proto" "google.golang.org/protobuf/proto"
) )
//领取 //任务奖励领取
func (this *apiComp) ReceiveCheck(session comm.IUserSession, req *pb.TaskReceiveReq) (code pb.ErrorCode) { func (this *apiComp) ReceiveCheck(session comm.IUserSession, req *pb.TaskReceiveReq) (code pb.ErrorCode) {
if req.TaskTag == 0 || req.Id == "" { if req.TaskTag == 0 || req.Id == "" {
code = pb.ErrorCode_ReqParameterError code = pb.ErrorCode_ReqParameterError
@ -49,7 +49,7 @@ func (this *apiComp) Receive(session comm.IUserSession, req *pb.TaskReceiveReq)
} }
//奖励 //奖励
if code = this.moduleTask.ConsumeRes(session, conf.Reword, true); code != pb.ErrorCode_Success { if code = this.moduleTask.DispenseRes(session, conf.Reword, true); code != pb.ErrorCode_Success {
return return
} }

View File

@ -40,21 +40,27 @@ func (this *ModelTaskActive) initActiveReward(uid string) {
RId: conf.Key, RId: conf.Key,
} }
if err := this.moduleTask.modelTaskActive.AddList(uid, ta.Id, ta); err != nil { if err := this.moduleTask.modelTaskActive.AddList(uid, ta.Id, ta); err != nil {
log.Errorf("uid:%v tag:%v initActiv add err %v", uid, err) log.Errorf("uid:%v tag:%v initActiv add err %v", uid, err)
return return
} }
} }
} }
//获取玩家活跃度列表 //获取玩家活跃度列表
func (this *ModelTaskActive) getUserActiveList(uid string, taskTag comm.TaskTag) []*pb.DBTaskActive { func (this *ModelTaskActive) getUserActiveList(uid string, taskTag comm.TaskTag) (list []*pb.DBTaskActive) {
al := []*pb.DBTaskActive{} al := []*pb.DBTaskActive{}
if err := this.GetList(uid, &al); err != nil { if err := this.GetList(uid, &al); err != nil {
log.Errorf("getUserActiveList err:%v", err) log.Errorf("getUserActiveList err:%v", err)
return al return al
} }
return al for _, v := range al {
if v.Tag == int32(taskTag) {
list = append(list, v)
}
}
return list
} }
//获取玩家活跃记录 id 唯一ID //获取玩家活跃记录 id 唯一ID

View File

@ -1,7 +1,6 @@
package task package task
import ( import (
"fmt"
"go_dreamfactory/comm" "go_dreamfactory/comm"
"go_dreamfactory/lego/core" "go_dreamfactory/lego/core"
"go_dreamfactory/lego/sys/log" "go_dreamfactory/lego/sys/log"
@ -19,12 +18,15 @@ const ( //Redis
type ModelTask struct { type ModelTask struct {
modules.MCompModel modules.MCompModel
moduleTask *ModuleTask moduleTask *ModuleTask
handleHandle ITaskHandle
} }
func (this *ModelTask) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) { func (this *ModelTask) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) {
err = this.MCompModel.Init(service, module, comp, options) err = this.MCompModel.Init(service, module, comp, options)
this.moduleTask = module.(*ModuleTask) this.moduleTask = module.(*ModuleTask)
this.TableName = string(TableTask) this.TableName = string(TableTask)
this.handleHandle = new(TaskHandler)
return return
} }
@ -44,15 +46,36 @@ func (this *ModelTask) getTaskList(uid string, taskTag comm.TaskTag) (newlist []
return return
} }
func (this *ModelTask) getTaskTypeList(uid string, taskType comm.TaskType) (newlist []*pb.DBTask) {
list := []*pb.DBTask{}
if err := this.GetList(uid, &list); err != nil {
log.Errorf("getTaskList err %v", err)
return
}
for _, v := range list {
if v.TypeId == int32(taskType) {
newlist = append(newlist, v)
}
}
return
}
//任务处理器注册
//初始化任务 //初始化任务
func (this *ModelTask) initTask(uid string) error { func (this *ModelTask) initTask(uid string) error {
if data, err := this.moduleTask.configure.getTaskList(); err == nil { if data, err := this.moduleTask.configure.getTaskList(); err == nil {
for _, cnf := range data { for _, cnf := range data {
//注册任务处理器
//初始玩家任务数据
objId := primitive.NewObjectID().Hex() objId := primitive.NewObjectID().Hex()
task := &pb.DBTask{ task := &pb.DBTask{
Id: objId, Id: objId,
Tag: cnf.IdTag, Tag: cnf.IdTag,
Uid: uid, Uid: uid,
TypeId: cnf.TypeId,
TaskId: cnf.Key, TaskId: cnf.Key,
Active: cnf.Active, Active: cnf.Active,
Progress: cnf.ConditionSecond, Progress: cnf.ConditionSecond,
@ -77,8 +100,8 @@ func (this *ModelTask) getUserTask(uid string, taskId string) *pb.DBTask {
} }
//获取未完成的任务列表 //获取未完成的任务列表
func (this *ModelTask) getUnFinishTaskList(uid string, taskTag comm.TaskTag) (list []*pb.DBTask) { func (this *ModelTask) getUnFinishTaskList(uid string, taskType comm.TaskType) (list []*pb.DBTask) {
taskList := this.getTaskList(uid, taskTag) taskList := this.getTaskTypeList(uid, taskType)
for _, v := range taskList { for _, v := range taskList {
if v.Status == 0 { if v.Status == 0 {
list = append(list, v) list = append(list, v)
@ -100,7 +123,7 @@ func (this *ModelTask) countActive(uid string, taskTag comm.TaskTag) (total int3
//检查任务进度 返回未完成的 //检查任务进度 返回未完成的
func (this *ModelTask) checkTaskProgress(uid string, config *cfg.Game_taskRoundData) (*pb.DBTask, bool) { func (this *ModelTask) checkTaskProgress(uid string, config *cfg.Game_taskRoundData) (*pb.DBTask, bool) {
taskList := this.getUnFinishTaskList(uid, comm.TaskTag(config.IdTag)) taskList := this.getUnFinishTaskList(uid, comm.TaskType(config.TypeId))
for _, v := range taskList { for _, v := range taskList {
if config.Key == v.TaskId && v.Status == 0 { if config.Key == v.TaskId && v.Status == 0 {
return v, true return v, true
@ -120,7 +143,7 @@ func (this *ModelTask) modifyUserTask(uid string, taskId string, data map[string
} }
//任务处理 //任务处理
func (this *ModelTask) taskHandle(uid string, taskType comm.TaskType, taskParam *pb.TaskParam) (*pb.DBTask, error) { func (this *ModelTask) taskHandle(uid string, taskType comm.TaskType, taskParam *pb.TaskParam) (tasks []*pb.DBTask, err error) {
data, err := this.moduleTask.configure.getTasks(int32(taskType)) data, err := this.moduleTask.configure.getTasks(int32(taskType))
if err != nil { if err != nil {
log.Errorf("taskHandle err %v", err) log.Errorf("taskHandle err %v", err)
@ -135,7 +158,7 @@ func (this *ModelTask) taskHandle(uid string, taskType comm.TaskType, taskParam
} }
} }
if taskParam.Second != conf.ConditionSecond { if taskParam.Second < conf.ConditionSecond {
continue continue
} }
@ -144,35 +167,34 @@ func (this *ModelTask) taskHandle(uid string, taskType comm.TaskType, taskParam
if tt, err := this.finishHandle(v, conf, taskParam.Second); err != nil { if tt, err := this.finishHandle(v, conf, taskParam.Second); err != nil {
return nil, err return nil, err
} else { } else {
return tt, nil tasks = append(tasks, tt)
} }
} }
} }
return nil, nil return tasks, nil
} }
//任务完成处理 //任务完成处理
func (this *ModelTask) finishHandle(userTask *pb.DBTask, config *cfg.Game_taskRoundData, count int32) (*pb.DBTask, error) { func (this *ModelTask) finishHandle(userTask *pb.DBTask, config *cfg.Game_taskRoundData, count int32) (*pb.DBTask, error) {
progress := userTask.Progress - count var progress int32
if progress < 0 { if count >= userTask.Progress {
return nil, fmt.Errorf("uid %s task[%s] was finished", userTask.Uid, userTask.Id) progress = 0
} }
//修改玩家任务状态和进度
update := map[string]interface{}{
"progress": progress,
}
if progress == 0 { if progress == 0 {
//修改玩家任务状态和进度
update := map[string]interface{}{
"progress": progress,
}
update["status"] = 1 update["status"] = 1
if err := this.modifyUserTask(userTask.Uid, userTask.Id, update); err != nil {
log.Errorf("err %v", err)
return nil, err
}
userTask.Progress = progress
userTask.Status = 1
} }
if err := this.modifyUserTask(userTask.Uid, userTask.Id, update); err != nil {
log.Errorf("err %v", err)
return nil, err
}
userTask.Progress = progress
userTask.Status = 1
return userTask, nil return userTask, nil
} }

View File

@ -67,11 +67,11 @@ func (this *ModuleTask) ResetTask(uid string, taskTag comm.TaskTag) {
//任务处理 //任务处理
func (this *ModuleTask) SendToTask(session comm.IUserSession, taskType comm.TaskType, taskPram *pb.TaskParam) (code pb.ErrorCode) { func (this *ModuleTask) SendToTask(session comm.IUserSession, taskType comm.TaskType, taskPram *pb.TaskParam) (code pb.ErrorCode) {
if task, err := this.modelTask.taskHandle(session.GetUserId(), taskType, taskPram); err != nil { if tasks, err := this.modelTask.taskHandle(session.GetUserId(), taskType, taskPram); err != nil {
code = pb.ErrorCode_TaskHandle code = pb.ErrorCode_TaskHandle
} else { } else {
if task != nil { for _, t := range tasks {
if err := session.SendMsg(string(comm.ModuleTask), TaskSubTypeFinishedPush, &pb.TaskFinishedPush{TaskId: task.TaskId}); err != nil { if err := session.SendMsg(string(comm.ModuleTask), TaskSubTypeFinishedPush, &pb.TaskFinishedPush{TaskId: t.TaskId}); err != nil {
this.modelTask.moduleTask.Errorf("SendToTask sendmsg err:%v", err) this.modelTask.moduleTask.Errorf("SendToTask sendmsg err:%v", err)
} }
} }

View File

@ -26,3 +26,10 @@ func (this *ModelSession) getUserSession(uid string) (cuser *pb.CacheUser) {
} }
return return
} }
//清除session缓存
func (this *ModelSession) cleanSession(uid string) {
if err := this.Del(uid); err != nil {
log.Errorf("clean session err: %v", err)
}
}

View File

@ -6,6 +6,7 @@ import (
"go_dreamfactory/pb" "go_dreamfactory/pb"
"go_dreamfactory/lego/core" "go_dreamfactory/lego/core"
"go_dreamfactory/lego/sys/event"
"go_dreamfactory/lego/sys/log" "go_dreamfactory/lego/sys/log"
) )
@ -33,6 +34,12 @@ func (this *User) Init(service core.IService, module core.IModule, options core.
return return
} }
func (this *User) Start() (err error) {
err = this.ModuleBase.Start()
event.RegisterGO(comm.EventUserOffline, this.CleanSession)
return
}
func (this *User) OnInstallComp() { func (this *User) OnInstallComp() {
this.ModuleBase.OnInstallComp() this.ModuleBase.OnInstallComp()
this.api = this.RegisterComp(new(apiComp)).(*apiComp) this.api = this.RegisterComp(new(apiComp)).(*apiComp)
@ -59,6 +66,11 @@ func (this *User) GetUserSession(uid string) *pb.CacheUser {
return cuser return cuser
} }
// 清除session
func (this *User) CleanSession(session comm.IUserSession) {
this.modelSession.cleanSession(session.GetUserId())
}
//查询用户属性值 例如 金币 经验 //查询用户属性值 例如 金币 经验
func (this *User) QueryAttributeValue(uid string, attr string) (value int32) { func (this *User) QueryAttributeValue(uid string, attr string) (value int32) {
user := this.modelUser.GetUser(uid) user := this.modelUser.GetUser(uid)

View File

@ -10,12 +10,13 @@ message DBTask {
int32 active = 6; //@go_tags(`bson:"active"`) int32 active = 6; //@go_tags(`bson:"active"`)
int32 status = 7; //@go_tags(`bson:"status"`) 0 1 int32 status = 7; //@go_tags(`bson:"status"`) 0 1
int32 received = 8; //@go_tags(`bson:"received"`) 0 1 int32 received = 8; //@go_tags(`bson:"received"`) 0 1
int32 typeId = 9; //@go_tags(`bson:"typeId"`)
} }
message DBTaskActive { message DBTaskActive {
string id = 1; //@go_tags(`bson:"_id"`) ID string id = 1; //@go_tags(`bson:"_id"`) ID
string uid = 2; //@go_tags(`bson:"uid"`) ID string uid = 2; //@go_tags(`bson:"uid"`) ID
int32 rId = 3; //@go_tags(`bson:"taskId"`) rewardId int32 rId = 3; //@go_tags(`bson:"taskId"`) rewardId
int32 tag = 4; //@go_tags(`bson:"tag"`) int32 tag = 4; //@go_tags(`bson:"tag"`)
int32 received = 5; //@go_tags(`bson:"received"`) 0 1 int32 received = 5; //@go_tags(`bson:"received"`) 0 1
} }

View File

@ -33,6 +33,7 @@ type DBTask struct {
Active int32 `protobuf:"varint,6,opt,name=active,proto3" json:"active" bson:"active"` //活跃度 Active int32 `protobuf:"varint,6,opt,name=active,proto3" json:"active" bson:"active"` //活跃度
Status int32 `protobuf:"varint,7,opt,name=status,proto3" json:"status" bson:"status"` // 任务状态 默认0未完成 1已完成 Status int32 `protobuf:"varint,7,opt,name=status,proto3" json:"status" bson:"status"` // 任务状态 默认0未完成 1已完成
Received int32 `protobuf:"varint,8,opt,name=received,proto3" json:"received" bson:"received"` //领取状态 默认0未领取 1已领取 Received int32 `protobuf:"varint,8,opt,name=received,proto3" json:"received" bson:"received"` //领取状态 默认0未领取 1已领取
TypeId int32 `protobuf:"varint,9,opt,name=typeId,proto3" json:"typeId" bson:"typeId"`
} }
func (x *DBTask) Reset() { func (x *DBTask) Reset() {
@ -123,6 +124,13 @@ func (x *DBTask) GetReceived() int32 {
return 0 return 0
} }
func (x *DBTask) GetTypeId() int32 {
if x != nil {
return x.TypeId
}
return 0
}
type DBTaskActive struct { type DBTaskActive struct {
state protoimpl.MessageState state protoimpl.MessageState
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
@ -206,7 +214,7 @@ var File_task_task_db_proto protoreflect.FileDescriptor
var file_task_task_db_proto_rawDesc = []byte{ var file_task_task_db_proto_rawDesc = []byte{
0x0a, 0x12, 0x74, 0x61, 0x73, 0x6b, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x64, 0x62, 0x2e, 0x70, 0x0a, 0x12, 0x74, 0x61, 0x73, 0x6b, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x64, 0x62, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbc, 0x01, 0x0a, 0x06, 0x44, 0x42, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd4, 0x01, 0x0a, 0x06, 0x44, 0x42, 0x54, 0x61, 0x73, 0x6b, 0x12,
0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,
0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69,
0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
@ -218,15 +226,16 @@ var file_task_task_db_proto_rawDesc = []byte{
0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52,
0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69,
0x76, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69,
0x76, 0x65, 0x64, 0x22, 0x70, 0x0a, 0x0c, 0x44, 0x42, 0x54, 0x61, 0x73, 0x6b, 0x41, 0x63, 0x74, 0x76, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x18, 0x09, 0x20,
0x69, 0x76, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x01, 0x28, 0x05, 0x52, 0x06, 0x74, 0x79, 0x70, 0x65, 0x49, 0x64, 0x22, 0x70, 0x0a, 0x0c, 0x44,
0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x54, 0x61, 0x73, 0x6b, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69,
0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x75,
0x28, 0x05, 0x52, 0x03, 0x72, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x04, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a,
0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x03, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x72, 0x49, 0x64, 0x12,
0x65, 0x69, 0x76, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, 0x63, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x74, 0x61,
0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x18, 0x05, 0x20,
0x72, 0x6f, 0x74, 0x6f, 0x33, 0x01, 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x42, 0x06, 0x5a,
0x04, 0x2e, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
} }
var ( var (