Просмотр исходного кода

update 完善资产统计接口、邀请统计接口

Alvin 8 месяцев назад
Родитель
Сommit
5f6a627f1e

+ 11 - 10
game/game_cluster/internal/mdb/eventmodels/basic.go

@@ -3,19 +3,20 @@ package eventmodels
 type EventBasic struct {
 	ServerId         string `json:"serverId"`           // 服务id或者nodeid
 	IsSuccess        bool   `json:"is_uccess"`          // http响应结果
-	Status           int    `json:"status"`             // 事件状态
+	Status           int    `json:"status"`             // 事件状态 0:表示成功
 	RewardDrawStatus int    `json:"reward_draw_status"` // 奖励领取状态
 	CreateAt         int64  `json:"create_at"`          // 事件创建时间戳
 }
 
 type UserBasic struct {
-	UserId            string `json:"user_id"`              // 用户id
-	UserName          string `json:"user_name"`            // 用户昵称
-	TgId              string `json:"tg_id"`                // 绑定tgid
-	XId               string `json:"x_id"`                 // 绑定推特ID
-	ParentUserId      string `json:"parent_user_id"`       // 上级用户id
-	IsRobot           bool   `json:"is_robot"`             // 是否为机器人
-	PointsRankSeq     int64  `json:"points_rank_seq"`      // 积分排名
-	ThrowDiceRankSeq  int64  `json:"throw_dice_rank_seq"`  // 投掷骰子次数排名
-	InviteUserRankSeq int64  `json:"invite_user_rank_seq"` // 邀请人数排名
+	UserId            string `json:"user_id"`               // 用户id
+	UserName          string `json:"user_name"`             // 用户昵称
+	TgId              string `json:"tg_id"`                 // 绑定tgid
+	XId               string `json:"x_id"`                  // 绑定推特ID
+	ParentUserId      string `json:"parent_user_id"`        // 上级用户id
+	IsRobot           bool   `json:"is_robot"`              // 是否为机器人
+	IfInviteUserTgVip bool   `json:"if_invite_user_tg_vip"` // 被邀请用户是否为telegram会员
+	PointsRankSeq     int64  `json:"points_rank_seq"`       // 积分排名
+	ThrowDiceRankSeq  int64  `json:"throw_dice_rank_seq"`   // 投掷骰子次数排名
+	InviteUserRankSeq int64  `json:"invite_user_rank_seq"`  // 邀请人数排名
 }

+ 5 - 4
game/game_cluster/internal/mdb/eventmodels/inviteEvent.go

@@ -4,10 +4,11 @@ package eventmodels
 type InviteEventContent struct {
 	UserBasic
 	EventBasic
-	InviterUserId string `json:"inviter_user_id"` // 邀请用户id
-	InviteUserId  string `json:"invite_user_id"`  // 被邀请用户id
-	Platform      string `json:"platform"`        // 平台
-	Channel       string `json:"channel"`         // 渠道
+	InviterUserId     string `json:"inviter_user_id"`       // 邀请用户id
+	InviteUserId      string `json:"invite_user_id"`        // 被邀请用户id
+	IfInviteUserTgVip bool   `json:"if_invite_user_tg_vip"` // 被邀请用户是否为telegram会员
+	Platform          string `json:"platform"`              // 平台
+	Channel           string `json:"channel"`               // 渠道
 }
 
 func (e *InviteEventContent) EventName() string {

+ 264 - 162
game/game_cluster/nodes/webadmin/service/synthesis.go

@@ -255,6 +255,7 @@ func (s *Synthesis) FindMDBUserLogDaily(req entity.UserLogDailyReq) (*entity.Use
 func (s *Synthesis) FindWithdrawal(req entity.UserWithdrawalReq) (*entity.UserWithdrawalResp, *code.Result) {
 	page, pageSize := checkPageParam(req.Page, req.Size)
 
+	// TODO 是否需要校验货币类型
 	// if !constant.CurrencyValid(req.Currency) {
 	// 	mhayaLogger.Warnf("FindWithdrawal unknow currency:%v", req.Currency)
 	// 	return nil, common.NewResult(code.ParamError)
@@ -797,16 +798,7 @@ func (s *Synthesis) Turntable(req entity.TurntableReq) (*entity.TurntableResp, *
 func (s *Synthesis) Assets(req entity.AssetsReq) (*entity.AssetsResp, *code.Result) {
 	page, pageSize := checkPageParam(req.Page, req.Size)
 
-	playerMgr := NewPlayerManage()
-	listResp, codeResult := playerMgr.List(context.Background(), entity.PlayerListReq{
-		Page: page,
-		Size: pageSize,
-	})
-	if codeResult != nil {
-		mhayaLogger.Warnf("Assets List error:%v", codeResult)
-		return nil, codeResult
-	}
-
+	// 根据条件查询
 	if req.UserName != "" || req.OpenId != "" {
 		// 构建查询条件
 		filter := bson.M{}
@@ -825,55 +817,18 @@ func (s *Synthesis) Assets(req entity.AssetsReq) (*entity.AssetsResp, *code.Resu
 		}
 
 		if playerInfo == nil {
-			var results []*entity.AssetsDetail
-			results = append(results, &entity.AssetsDetail{
-				UserName:        "",
-				OpenId:          "",
-				TonValue:        0,
-				UsdtValue:       0,
-				StatisticalDate: mhayaTime.Now().Unix(),
-			})
-
-			return &entity.AssetsResp{
-				Details: results,
-				Total:   0,
-			}, nil
+			return nil, nil
 		}
 
 		var results []*entity.AssetsDetail
 
-		var totalUsdtAmount int64
-		var totalTonAmount int64
-		where := &eventmodels.AssetsEventContent{
-			UserBasic: eventmodels.UserBasic{
-				UserId: req.UserName,
-				TgId:   req.OpenId,
-			},
-			EventBasic: eventmodels.EventBasic{
-				ServerId: s.nodeId,
-			},
-		}
-		where.Currency = string(constant.UsdtCurrency)
-		err = mdb.LogstashDB.Model(&eventmodels.AssetsEventContent{}).Where(where).Pluck("SUM(amount) as total_amount", &totalUsdtAmount).Error
-		if err != nil {
-			mhayaLogger.Warnf("Assets Pluck UsdtCurrency error:%v", err)
-			return nil, common.NewResult(code.InternalError)
+		detail, codeResult := s.getAsset(req.UserName, req.OpenId)
+		if codeResult != nil {
+			mhayaLogger.Warnf("Assets getAsset error:%v", codeResult)
+			return nil, codeResult
 		}
 
-		where.Currency = string(constant.TonCurrency)
-		err = mdb.LogstashDB.Model(&eventmodels.AssetsEventContent{}).Where(where).Pluck("SUM(amount) as total_amount", &totalTonAmount).Error
-		if err != nil {
-			mhayaLogger.Warnf("Assets Pluck TonCurrency error:%v", err)
-			return nil, common.NewResult(code.InternalError)
-		}
-
-		results = append(results, &entity.AssetsDetail{
-			UserName:        playerInfo.UserName,
-			OpenId:          playerInfo.OpenId,
-			TonValue:        totalTonAmount,
-			UsdtValue:       totalUsdtAmount,
-			StatisticalDate: mhayaTime.Now().Unix(),
-		})
+		results = append(results, detail)
 
 		return &entity.AssetsResp{
 			Details: results,
@@ -881,40 +836,26 @@ func (s *Synthesis) Assets(req entity.AssetsReq) (*entity.AssetsResp, *code.Resu
 		}, nil
 	}
 
+	// 查询列表
+	playerMgr := NewPlayerManage()
+	listResp, codeResult := playerMgr.List(context.Background(), entity.PlayerListReq{
+		Page: page,
+		Size: pageSize,
+	})
+	if codeResult != nil {
+		mhayaLogger.Warnf("Assets List error:%v", codeResult)
+		return nil, codeResult
+	}
+
 	var results []*entity.AssetsDetail
 	for _, detail := range listResp.Details {
-		var totalUsdtAmount int64
-		var totalTonAmount int64
-		where := &eventmodels.AssetsEventContent{
-			UserBasic: eventmodels.UserBasic{
-				UserId: detail.UserName,
-				TgId:   detail.OpenId,
-			},
-			EventBasic: eventmodels.EventBasic{
-				ServerId: s.nodeId,
-			},
-		}
-		where.Currency = string(constant.UsdtCurrency)
-		err := mdb.LogstashDB.Model(&eventmodels.AssetsEventContent{}).Where(where).Pluck("SUM(amount) as total_amount", &totalUsdtAmount).Error
-		if err != nil {
-			mhayaLogger.Warnf("Assets Pluck UsdtCurrency error:%v", err)
-			return nil, common.NewResult(code.InternalError)
-		}
-
-		where.Currency = string(constant.TonCurrency)
-		err = mdb.LogstashDB.Model(&eventmodels.AssetsEventContent{}).Where(where).Pluck("SUM(amount) as total_amount", &totalTonAmount).Error
-		if err != nil {
-			mhayaLogger.Warnf("Assets Pluck TonCurrency error:%v", err)
-			return nil, common.NewResult(code.InternalError)
+		ret, codeResult := s.getAsset(detail.UserName, detail.OpenId)
+		if codeResult != nil {
+			mhayaLogger.Warnf("Assets getAsset error:%v", codeResult)
+			return nil, codeResult
 		}
 
-		results = append(results, &entity.AssetsDetail{
-			UserName:        detail.UserName,
-			OpenId:          detail.OpenId,
-			TonValue:        totalTonAmount,
-			UsdtValue:       totalUsdtAmount,
-			StatisticalDate: mhayaTime.Now().Unix(),
-		})
+		results = append(results, ret)
 	}
 
 	count, codeResult := playerMgr.GetPlayerTotalCount()
@@ -929,15 +870,52 @@ func (s *Synthesis) Assets(req entity.AssetsReq) (*entity.AssetsResp, *code.Resu
 	}, nil
 }
 
+func (s *Synthesis) getAsset(userName, openId string) (*entity.AssetsDetail, *code.Result) {
+	var totalUsdtAmount int64
+	var totalTonAmount int64
+	where := &eventmodels.AssetsEventContent{
+		UserBasic: eventmodels.UserBasic{
+			UserId: userName,
+			TgId:   openId,
+		},
+		EventBasic: eventmodels.EventBasic{
+			ServerId: s.nodeId,
+		},
+	}
+	where.Currency = string(constant.UsdtCurrency)
+	err := mdb.LogstashDB.Model(&eventmodels.AssetsEventContent{}).Where(where).Pluck("SUM(amount) as total_amount", &totalUsdtAmount).Error
+	if err != nil {
+		mhayaLogger.Warnf("getAsset Pluck UsdtCurrency error:%v", err)
+		return nil, common.NewResult(code.InternalError)
+	}
+
+	where.Currency = string(constant.TonCurrency)
+	err = mdb.LogstashDB.Model(&eventmodels.AssetsEventContent{}).Where(where).Pluck("SUM(amount) as total_amount", &totalTonAmount).Error
+	if err != nil {
+		mhayaLogger.Warnf("getAsset Pluck TonCurrency error:%v", err)
+		return nil, common.NewResult(code.InternalError)
+	}
+
+	return &entity.AssetsDetail{
+		UserName:        userName,
+		OpenId:          openId,
+		TonValue:        totalTonAmount,
+		UsdtValue:       totalUsdtAmount,
+		StatisticalDate: mhayaTime.Now().Unix(),
+	}, nil
+}
+
 // 资产变动记录
 func (s *Synthesis) AssetsRecord(req entity.AssetsRecordReq) (*entity.AssetsRecordResp, *code.Result) {
 	page, pageSize := checkPageParam(req.Page, req.Size)
 
+	// TODO 是否需要校验货币类型
 	// if !constant.CurrencyValid(req.Currency) {
 	// 	mhayaLogger.Warnf("AssetsRecord unknow currency:%v", req.Currency)
 	// 	return nil, common.NewResult(code.ParamError)
 	// }
 
+	// TODO 是否需要校验资产变动的操作类型
 	// if req.OperationType != string(constant.IncreaseOp) && req.OperationType != string(constant.DecreaseOp) {
 	// 	mhayaLogger.Warnf("AssetsRecord unknow OperationType:%v", req.OperationType)
 	// 	return nil, common.NewResult(code.ParamError)
@@ -992,119 +970,243 @@ func (s *Synthesis) AssetsRecord(req entity.AssetsRecordReq) (*entity.AssetsReco
 func (s *Synthesis) Invite(req entity.InviteReq) (*entity.InviteResp, *code.Result) {
 	page, pageSize := checkPageParam(req.Page, req.Size)
 
-	// 构建查询条件
-	filter := bson.M{}
-	if req.UserName != "" {
-		filter["userName"] = req.UserName
+	var records []*eventmodels.InviteEventContent
+
+	where := &eventmodels.InviteEventContent{
+		UserBasic: eventmodels.UserBasic{
+			UserId: req.UserName,
+			TgId:   req.OpenId,
+		},
 	}
-	if req.OpenId != "" {
-		filter["openId"] = req.OpenId
+	db := mdb.LogstashDB.Model(&eventmodels.InviteEventContent{}).Where(where).Order("create_at")
+
+	pages := Paginate(db, page, pageSize)
+	err := db.Scopes(pages.Limit).Find(&records).Error
+	if err != nil && err != gorm.ErrRecordNotFound {
+		mhayaLogger.Warnf("Invite Find error:%v", err)
+		return nil, common.NewResult(code.InternalError)
 	}
 
-	// 设置分页选项
-	findOptions := options.Find()
-	findOptions.SetSkip(int64((page - 1) * pageSize))
-	findOptions.SetLimit(int64(pageSize))
-	findOptions.SetSort(bson.D{{"createTime", -1}})
+	var results []*entity.InviteDetail
+	for _, v := range records {
+		results = append(results, &entity.InviteDetail{
+			UserName:                        v.UserName,
+			OpenId:                          v.TgId,
+			InvitationHits:                  0, // TODO
+			InviteID:                        v.InviterUserId,
+			IfInviteVIP:                     v.IfInviteUserTgVip,
+			InviteTime:                      v.CreateAt,
+			SuccessfulInvitationsLV2:        0, // TODO
+			CumulativesuccessfulInvitations: 0, // TODO
+			InvitationChannel:               v.Channel,
+		})
+	}
 
-	ctx, cancel := context.WithTimeout(context.Background(), 100*time.Second)
-	defer cancel()
+	return &entity.InviteResp{
+		Details: results,
+		Total:   pages.Count,
+	}, nil
+}
 
-	collection := mdb.MDB.Collection(constant.CNamePlayer)
+// 活跃统计
+func (s *Synthesis) Active(req entity.ActiveReq) (*entity.ActiveResp, *code.Result) {
+	page, pageSize := checkPageParam(req.Page, req.Size)
 
-	// 查询数据
-	var results []*entity.InviteDetail
-	cursor, err := collection.Find(ctx, filter, findOptions)
-	if err != nil {
-		mhayaLogger.Warnf("Invite Find error:%v", err)
-		return nil, common.NewResult(code.InternalError)
-	}
+	// 根据条件查询
+	if req.UserName != "" || req.OpenId != "" {
+		// 构建查询条件
+		filter := bson.M{}
+		if req.UserName != "" {
+			filter["userName"] = req.UserName
+		}
+		if req.OpenId != "" {
+			filter["openId"] = req.OpenId
+		}
 
-	defer cursor.Close(ctx)
-	// 解析结果
-	for cursor.Next(ctx) {
-		var result entity.InviteDetail
-		if err := cursor.Decode(&result); err != nil {
-			mhayaLogger.Warnf("Invite Decode error:%v", err)
+		var playerInfo *models.Player
+		err := mdb.MDB.Collection(constant.CNamePlayer).FindOne(context.Background(), filter).Decode(&playerInfo)
+		if err != nil && err != mongo.ErrNoDocuments {
+			mhayaLogger.Warnf("Active FindOne playerInfo error:%v", err)
 			return nil, common.NewResult(code.InternalError)
 		}
 
-		results = append(results, &result)
+		if playerInfo == nil {
+			return nil, nil
+		}
+
+		var results []*entity.ActiveDetail
+
+		detail, codeResult := s.getActive(playerInfo)
+		if codeResult != nil {
+			mhayaLogger.Warnf("Active getActive error:%v", codeResult)
+			return nil, codeResult
+		}
+
+		results = append(results, detail)
+
+		return &entity.ActiveResp{
+			Details: results,
+			Total:   1,
+		}, nil
 	}
 
-	if err := cursor.Err(); err != nil {
-		mhayaLogger.Warnf("Invite cursor error:%v", err)
-		return nil, common.NewResult(code.InternalError)
+	// 查询列表
+	playerMgr := NewPlayerManage()
+	listResp, codeResult := playerMgr.List(context.Background(), entity.PlayerListReq{
+		Page: page,
+		Size: pageSize,
+	})
+	if codeResult != nil {
+		mhayaLogger.Warnf("Active List error:%v", codeResult)
+		return nil, codeResult
 	}
 
-	// TODO 邀请统计相关信息
+	var results []*entity.ActiveDetail
+	for _, detail := range listResp.Details {
+		var playerInfo *models.Player
+		err := mdb.MDB.Collection(constant.CNamePlayer).FindOne(context.Background(), bson.M{"userName": detail.UserName}).Decode(&playerInfo)
+		if err != nil && err != mongo.ErrNoDocuments {
+			mhayaLogger.Warnf("Active FindOne playerInfo error:%v", err)
+			return nil, common.NewResult(code.InternalError)
+		}
+
+		detail, codeResult := s.getActive(playerInfo)
+		if codeResult != nil {
+			mhayaLogger.Warnf("Active getActive error:%v", codeResult)
+			return nil, codeResult
+		}
 
-	// TODO 获取总数total
-	var count int64
+		results = append(results, detail)
+	}
 
-	return &entity.InviteResp{
+	count, codeResult := playerMgr.GetPlayerTotalCount()
+	if codeResult != nil {
+		mhayaLogger.Warnf("Active GetPlayerTotalCount codeResult:%v", codeResult)
+		return nil, codeResult
+	}
+
+	return &entity.ActiveResp{
 		Details: results,
 		Total:   count,
 	}, nil
 }
 
-// 活跃统计
-func (s *Synthesis) Active(req entity.ActiveReq) (*entity.ActiveResp, *code.Result) {
-	page, pageSize := checkPageParam(req.Page, req.Size)
-
-	// 构建查询条件
-	filter := bson.M{}
-	if req.UserName != "" {
-		filter["userName"] = req.UserName
+func (s *Synthesis) getActive(playerInfo *models.Player) (*entity.ActiveDetail, *code.Result) {
+	// 累计登录次数
+	loginWhere := &eventmodels.UserLoginEventContent{
+		UserBasic: eventmodels.UserBasic{
+			UserId: playerInfo.UserName,
+			TgId:   playerInfo.OpenId,
+		},
 	}
-	if req.OpenId != "" {
-		filter["openId"] = req.OpenId
+	loginDb := mdb.LogstashDB.Model(&eventmodels.UserLoginEventContent{}).Where(loginWhere).Order("create_at")
+	var loginCount int64
+	loginDb.Count(&loginCount)
+
+	// 骰子点击次数
+	diceClickWhere := &eventmodels.ClickEventContent{
+		UserBasic: eventmodels.UserBasic{
+			UserId: playerInfo.UserName,
+			TgId:   playerInfo.OpenId,
+		},
+		ClickName: string(constant.DiceClickName),
 	}
+	clickDb := mdb.LogstashDB.Model(&eventmodels.ClickEventContent{}).Where(diceClickWhere).Order("create_at")
+	var diceHits int64
+	clickDb.Count(&diceHits)
 
-	// 设置分页选项
-	findOptions := options.Find()
-	findOptions.SetSkip(int64((page - 1) * pageSize))
-	findOptions.SetLimit(int64(pageSize))
-	findOptions.SetSort(bson.D{{"createTime", -1}})
+	// 邀请点击次数
+	inviteClickWhere := &eventmodels.ClickEventContent{
+		UserBasic: eventmodels.UserBasic{
+			UserId: playerInfo.UserName,
+			TgId:   playerInfo.OpenId,
+		},
+		ClickName: string(constant.InviteClickName),
+	}
+	clickDb = mdb.LogstashDB.Model(&eventmodels.ClickEventContent{}).Where(inviteClickWhere).Order("create_at")
+	var invitationHits int64
+	clickDb.Count(&invitationHits)
 
-	ctx, cancel := context.WithTimeout(context.Background(), 100*time.Second)
-	defer cancel()
+	// 邀请成功人数
+	inviteWhere := &eventmodels.InviteEventContent{
+		UserBasic: eventmodels.UserBasic{
+			UserId: playerInfo.UserName,
+			TgId:   playerInfo.OpenId,
+		},
+	}
+	inviteDb := mdb.LogstashDB.Model(&eventmodels.InviteEventContent{}).Where(inviteWhere).Order("create_at")
+	var successfulInvitations int64
+	inviteDb.Count(&successfulInvitations)
 
-	collection := mdb.MDB.Collection(constant.CNamePlayer)
+	// 提现次数
+	withdrawalWhere := &eventmodels.UserWithdrawEventContent{
+		UserBasic: eventmodels.UserBasic{
+			UserId: playerInfo.UserName,
+			TgId:   playerInfo.OpenId,
+		},
+		EventBasic: eventmodels.EventBasic{
+			Status: 0,
+		},
+	}
+	withdrawalDb := mdb.LogstashDB.Model(&eventmodels.UserWithdrawEventContent{}).Where(withdrawalWhere).Order("create_at")
+	var withdrawals int64
+	withdrawalDb.Count(&withdrawals)
 
-	// 查询数据
-	var results []*entity.ActiveDetail
-	cursor, err := collection.Find(ctx, filter, findOptions)
+	// 累计提现金额
+	withdrawalAmountWhere := &eventmodels.UserWithdrawEventContent{
+		UserBasic: eventmodels.UserBasic{
+			UserId: playerInfo.UserName,
+			TgId:   playerInfo.OpenId,
+		},
+		EventBasic: eventmodels.EventBasic{
+			Status: 0,
+		},
+		// Currency: string(constant.UsdtCurrency), // TODO 是否需要区分货币类型
+	}
+	var cumulativeWithdrawalAmount int64
+	err := mdb.LogstashDB.Model(&eventmodels.UserWithdrawEventContent{}).Where(withdrawalAmountWhere).Pluck("SUM(amount) as total_amount", &cumulativeWithdrawalAmount).Error
 	if err != nil {
-		mhayaLogger.Warnf("Active Find error:%v", err)
+		mhayaLogger.Warnf("getActive Pluck currency error:%v", err)
 		return nil, common.NewResult(code.InternalError)
 	}
 
-	defer cursor.Close(ctx)
-	// 解析结果
-	for cursor.Next(ctx) {
-		var result entity.ActiveDetail
-		if err := cursor.Decode(&result); err != nil {
-			mhayaLogger.Warnf("Active Decode error:%v", err)
-			return nil, common.NewResult(code.InternalError)
-		}
-
-		results = append(results, &result)
+	// 转盘点击次数
+	turntableClickWhere := &eventmodels.ClickEventContent{
+		UserBasic: eventmodels.UserBasic{
+			UserId: playerInfo.UserName,
+			TgId:   playerInfo.OpenId,
+		},
+		ClickName: string(constant.TurntableClickName),
 	}
+	clickDb = mdb.LogstashDB.Model(&eventmodels.ClickEventContent{}).Where(turntableClickWhere).Order("create_at")
+	var turntableClicks int64
+	clickDb.Count(&turntableClicks)
 
-	if err := cursor.Err(); err != nil {
-		mhayaLogger.Warnf("Active cursor error:%v", err)
-		return nil, common.NewResult(code.InternalError)
+	// 转盘实际抽奖次数
+	turntableWhere := &eventmodels.TurntableEventContent{
+		UserBasic: eventmodels.UserBasic{
+			UserId: playerInfo.UserName,
+			TgId:   playerInfo.OpenId,
+		},
 	}
-
-	// TODO Active 活跃统计相关信息
-
-	// TODO 获取总数total
-	var count int64
-
-	return &entity.ActiveResp{
-		Details: results,
-		Total:   count,
+	turntableDb := mdb.LogstashDB.Model(&eventmodels.TurntableEventContent{}).Where(turntableWhere).Order("create_at")
+	var turntableRuns int64
+	turntableDb.Count(&turntableRuns)
+
+	return &entity.ActiveDetail{
+		UserName:                   playerInfo.UserName,
+		OpenId:                     playerInfo.OpenId,
+		IfUserVip:                  false, // TODO 玩家信息需要添加该字段
+		CreateTime:                 playerInfo.JoinTime,
+		LastLoginTime:              playerInfo.PrevTime,
+		MaxSuccessions:             int(loginCount),
+		DiceHits:                   diceHits,
+		InvitationHits:             invitationHits,
+		SuccessfulInvitations:      successfulInvitations,
+		Withdrawals:                withdrawals,
+		CumulativeWithdrawalAmount: cumulativeWithdrawalAmount,
+		TurntableClicks:            turntableClicks,
+		TurntableRuns:              turntableRuns,
 	}, nil
 }