You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

144 lines
2.9 KiB
Go

package openplatform
import (
"joybuywork/internal/consts"
"joybuywork/internal/repository/cache"
"joybuywork/internal/repository/finder"
"joybuywork/internal/repository/model"
"joybuywork/internal/repository/mtype"
"joybuywork/internal/service/provider/players"
"joybuywork/internal/utils/logic"
pb "joybuywork/proto/go_proto/w_open_platform"
)
type Player struct {
logic.Logic
Req *pb.PlayerReq
Res *pb.PlayerRes
}
func (s *Player) Run() error {
return logic.Run(s)
}
func (s *Player) Exec() (err error) {
cpn, err := s.campaign()
if err != nil {
return
}
return s.player(cpn)
}
func (s *Player) campaign() (cpn *model.FissionCampaign, err error) {
project, err := finder.Project(s.Ctx, s.Req.GetProjectHashId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if project == nil {
err = s.BE().VerifyError("not found project")
return
}
cpn, err = finder.Campaign(s.Ctx, s.Req.GetCampaignHashId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if cpn == nil || project.ID != cpn.ProjectID {
err = s.BE().VerifyError("not found campaign")
return
}
s.Res.FissionId = cpn.FissionID
if s.Req.GetStartTime() == 0 {
s.Req.StartTime = cpn.StartTime
}
if s.Req.GetEndTime() == 0 {
s.Req.EndTime = cpn.EndTime
}
return
}
func (s *Player) player(cpn *model.FissionCampaign) (err error) {
user, err := cache.NewFissionUser(s.Ctx, cpn.ID).FindBySubUserId(s.Req.GetUserId())
if err != nil {
err = s.BE().CacheError(err)
return
}
if user == nil {
s.Res.Status = 1
return
}
switch cpn.FissionID {
case consts.IdKeep:
var keep *players.KeepDog
keep, err = players.NewKeepDog(s.Ctx, user)
if err != nil {
return
}
player := keep.GetPlayer()
s.Res.Keep = &pb.PlayerRes_Keep{
LoveNum: int64(player.CollectNum),
RemainFood: int64(player.Num),
Action: nil,
}
return s._keepAction(player)
default:
return
}
}
func (s *Player) _keepAction(player *model.FissionKeep) (err error) {
m := s.GetDao().FissionKeepLog
feedNum, err := m.WithContext(s.Ctx).Where(
m.KeepID.Eq(player.ID),
m.Type.Eq(mtype.FissionKeepLogTypeFeed),
m.CreatedAt.Between(s.Req.GetStartTime(), s.Req.GetEndTime()),
).Count()
if err != nil {
err = s.BE().MysqlError(err)
return
}
collectNum, err := m.WithContext(s.Ctx).Where(
m.KeepID.Eq(player.ID),
m.Type.Eq(mtype.FissionKeepLogTypeLove),
m.CreatedAt.Between(s.Req.GetStartTime(), s.Req.GetEndTime()),
).Count()
if err != nil {
err = s.BE().MysqlError(err)
return
}
keepM := s.GetDao().FissionKeep
growPetNum, err := keepM.WithContext(s.Ctx).Where(
keepM.UserID.Eq(player.UserID),
keepM.CreatedAt.Between(s.Req.GetStartTime(), s.Req.GetEndTime()),
).Count()
if err != nil {
err = s.BE().MysqlError(err)
return
}
s.Res.Keep.Action = &pb.PlayerRes_KeepAction{
FeedNum: feedNum,
CollectNum: collectNum,
GrowPet: growPetNum,
}
return
}