package campaignuser import ( "joybuywork/internal/repository/finder" "joybuywork/internal/repository/model" "joybuywork/internal/service/provider" "joybuywork/internal/service/provider/players" "joybuywork/internal/utils/logic" pb "joybuywork/proto/go_proto/w_campaign_user" "joybuywork/proto/go_proto/workerr" ) type UnoRandCard struct { logic.Logic Req *pb.UnoRandCardReq Res *pb.UnoRandCardRes cpnControl *provider.CampaignTZ lvLimitMap map[int64][]string } func (s *UnoRandCard) Run() error { return logic.Run(s) } func (s *UnoRandCard) Exec() (err error) { user, cpn, err := s.user() if err != nil { return } return s.rand(cpn, user) } // 用户信息 func (s *UnoRandCard) user() (user *model.FissionUser, cpn *model.FissionCampaign, err error) { cpn, err = finder.Campaign(s.Ctx, s.Req.GetCampaignId()) if err != nil { err = s.BE().CacheError(err) return } user, err = finder.FissionUser(s.Ctx, cpn.ID, s.Req.GetUserId()) if err != nil { err = s.BE().CacheError(err) return } if user == nil { err = workerr.NotFound("not found user") return } s.cpnControl = provider.NewCampaignTZ(s.Ctx, cpn, user.LangMark) return } func (s *UnoRandCard) rand(cpn *model.FissionCampaign, user *model.FissionUser) (err error) { if s.Req.GetPropMark() == "" { return s._collect(cpn, user) } return s._useProp(cpn, user) } func (s *UnoRandCard) _useProp(cpn *model.FissionCampaign, user *model.FissionUser) (err error) { player, err := players.NewUno(s.Ctx, user, players.SetCpn(cpn), players.SetDao(s.GetDao())) if err != nil { return } status, cards, err := player.UseProp(s.Req.GetPropMark(), s.Req.GetColorMark()) if err != nil { return } s.Res.Status = status s.Res.Cards = make([]*pb.UnoRandCardRes_Card, 0, len(cards)) for _, card := range cards { s.Res.Cards = append(s.Res.Cards, &pb.UnoRandCardRes_Card{ Mark: card.Mark, CardNo: card.CardNo, }) } return } func (s *UnoRandCard) _collect(cpn *model.FissionCampaign, user *model.FissionUser) (err error) { player, err := players.NewUno(s.Ctx, user, players.SetCpn(cpn), players.SetDao(s.GetDao())) if err != nil { return } status, card, err := player.Collect() if err != nil { return } if card != nil { s.Res.Cards = append(s.Res.Cards, &pb.UnoRandCardRes_Card{ Mark: card.Mark, CardNo: card.CardNo, }) } s.Res.Status = status return }