package games import ( "joybuywork/internal/app" "joybuywork/internal/consts" "joybuywork/internal/consts/ckey" "joybuywork/internal/plugins/hashid" "joybuywork/internal/plugins/jsonm" "joybuywork/internal/repository/dbcheck" "joybuywork/internal/repository/model" "joybuywork/internal/repository/mtype" "joybuywork/internal/service/queue/producer" "joybuywork/internal/service/queue/types" "joybuywork/internal/utils/logic" pb "joybuywork/proto/go_proto/w_games" "time" ) type Trace struct { logic.Logic Req *pb.TraceReq Res *pb.TraceRes } func (s *Trace) Run() error { return logic.Run(s) } func (s *Trace) Data() (data jsonm.JsonM) { data, _ = jsonm.Marshal(s.Req) return } func (s *Trace) Exec() (err error) { user, err := s.user() if err != nil || user == nil { return } switch s.Req.GetType() { case mtype.GameActionTypeStay: return s.stay(user) } return } func (s *Trace) user() (user *model.GameUser, err error) { m := s.GetDao().GameUser user, err = m.WithContext(s.Ctx).Where(m.ID.Eq(s.Req.GetUserId())).First() if err = dbcheck.DbError(err); err != nil { err = s.BE().MysqlError(err) return } return } func (s *Trace) stay(user *model.GameUser) (err error) { id := hashid.IdBigint() var stayId int64 key := ckey.GameActionStayId(user.ID, s.Req.GetLinkId()) if !app.Redis.Cache.WithContext(s.Ctx).SetNX(s.Ctx, key, id, 2*consts.TimeDay).Val() { stayId, _ = app.Redis.Cache.WithContext(s.Ctx).Get(s.Ctx, key).Int64() } producer.NewCampaignNotice(s.Ctx).GameAction(types.GameAction{ ID: id, ProjectId: user.ProjectID, GameId: user.GameID, UserId: user.ID, LinkId: s.Req.GetLinkId(), Type: mtype.GameActionTypeStay, ActionTime: time.Now().Unix(), Dimension: mtype.GameDimension{ GameDimensionOption: mtype.GameDimensionOption{ StaySec: s.Req.GetStaySec(), StayId: stayId, }, }, }) return }