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.
114 lines
2.3 KiB
Go
114 lines
2.3 KiB
Go
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
|
|
}
|