123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321 |
- package v1
- import (
- "context"
- "encoding/json"
- "fmt"
- "strconv"
- "time"
- "google.golang.org/grpc/status"
- "go-common/library/log"
- "github.com/pkg/errors"
- v1pb "go-common/app/interface/live/web-ucenter/api/http/v1"
- "go-common/app/interface/live/web-ucenter/conf"
- capsuledao "go-common/app/interface/live/web-ucenter/dao/capsule"
- "go-common/library/log/infoc"
- bm "go-common/library/net/http/blademaster"
- "go-common/library/net/metadata"
- )
- // CapsuleService struct
- type CapsuleService struct {
- conf *conf.Config
- // optionally add other properties here, such as dao
- dao *capsuledao.Dao
- infoc *infoc.Infoc
- }
- //NewCapsuleService init
- func NewCapsuleService(c *conf.Config) (s *CapsuleService) {
- s = &CapsuleService{
- conf: c,
- dao: capsuledao.New(c),
- }
- if c.Infoc != nil && c.Infoc.CapsuleInfoc != nil {
- s.infoc = infoc.New(c.Infoc.CapsuleInfoc)
- }
- return s
- }
- // GetDetail implementation
- func (s *CapsuleService) GetDetail(ctx context.Context, req *v1pb.CapsuleGetDetailReq) (resp *v1pb.CapsuleGetDetailResp, err error) {
- resp = &v1pb.CapsuleGetDetailResp{}
- uid, ok := metadata.Value(ctx, metadata.Mid).(int64)
- if !ok {
- err = errors.Wrap(err, "未取到uid")
- return
- }
- data, err := s.dao.GetDetail(ctx, uid, req.From)
- if err != nil {
- return
- }
- if data.Normal != nil {
- normal := &v1pb.CapsuleGetDetailResp_CapsuleInfo{}
- normal.Status = data.Normal.Status
- normal.Coin = data.Normal.Coin
- normal.Change = data.Normal.Change
- normal.Rule = data.Normal.Rule
- if data.Normal.Progress != nil {
- normal.Progress = &v1pb.Progress{}
- normal.Progress.Now = data.Normal.Progress.Now
- normal.Progress.Max = data.Normal.Progress.Max
- }
- glen := len(data.Normal.Gift)
- normal.Gift = make([]*v1pb.CapsuleGetDetailResp_Gift, glen)
- for i := 0; i < glen; i++ {
- gift := &v1pb.CapsuleGetDetailResp_Gift{}
- gift.Name = data.Normal.Gift[i].Name
- gift.WebImage = data.Normal.Gift[i].WebImage
- gift.MobileImage = data.Normal.Gift[i].MobileImage
- gift.Image = data.Normal.Gift[i].Image
- if data.Normal.Gift[i].Usage != nil {
- gift.Usage = &v1pb.Usage{}
- gift.Usage.Text = data.Normal.Gift[i].Usage.Text
- gift.Usage.Url = data.Normal.Gift[i].Usage.Url
- }
- normal.Gift[i] = gift
- }
- glen = len(data.Normal.List)
- normal.List = make([]*v1pb.CapsuleGetDetailResp_List, glen)
- for i := 0; i < glen; i++ {
- info := &v1pb.CapsuleGetDetailResp_List{}
- info.Name = data.Normal.List[i].Name
- info.Num = data.Normal.List[i].Num
- info.Date = data.Normal.List[i].Date
- info.Gift = data.Normal.List[i].Gift
- normal.List[i] = info
- }
- resp.Normal = normal
- }
- if data.Colorful != nil {
- colorful := &v1pb.CapsuleGetDetailResp_CapsuleInfo{}
- colorful.Status = data.Colorful.Status
- colorful.Coin = data.Colorful.Coin
- colorful.Change = data.Colorful.Change
- colorful.Rule = data.Colorful.Rule
- if data.Colorful.Progress != nil {
- colorful.Progress = &v1pb.Progress{}
- colorful.Progress.Now = data.Colorful.Progress.Now
- colorful.Progress.Max = data.Colorful.Progress.Max
- }
- glen := len(data.Colorful.Gift)
- colorful.Gift = make([]*v1pb.CapsuleGetDetailResp_Gift, glen)
- for i := 0; i < glen; i++ {
- gift := &v1pb.CapsuleGetDetailResp_Gift{}
- gift.Name = data.Colorful.Gift[i].Name
- gift.WebImage = data.Colorful.Gift[i].WebImage
- gift.MobileImage = data.Colorful.Gift[i].MobileImage
- gift.Image = data.Colorful.Gift[i].Image
- if data.Colorful.Gift[i].Usage != nil {
- gift.Usage = &v1pb.Usage{}
- gift.Usage.Text = data.Colorful.Gift[i].Usage.Text
- gift.Usage.Url = data.Colorful.Gift[i].Usage.Url
- }
- colorful.Gift[i] = gift
- }
- glen = len(data.Colorful.List)
- colorful.List = make([]*v1pb.CapsuleGetDetailResp_List, glen)
- for i := 0; i < glen; i++ {
- info := &v1pb.CapsuleGetDetailResp_List{}
- info.Name = data.Colorful.List[i].Name
- info.Num = data.Colorful.List[i].Num
- info.Date = data.Colorful.List[i].Date
- info.Gift = data.Colorful.List[i].Gift
- colorful.List[i] = info
- }
- resp.Colorful = colorful
- }
- return
- }
- // OpenCapsule implementation
- func (s *CapsuleService) OpenCapsule(ctx context.Context, req *v1pb.CapsuleOpenCapsuleReq) (resp *v1pb.CapsuleOpenCapsuleResp, err error) {
- resp = &v1pb.CapsuleOpenCapsuleResp{}
- uid, ok := metadata.Value(ctx, metadata.Mid).(int64)
- if !ok {
- err = errors.Wrap(err, "未取到uid")
- return
- }
- data, err := s.dao.OpenCapsule(ctx, uid, req.Type, req.Count, req.Platform)
- if err != nil {
- return
- }
- if data.Info != nil {
- resp.Info = &v1pb.CapsuleOpenCapsuleResp_Info{}
- if data.Info.Colorful != nil {
- resp.Info.Colorful = &v1pb.CapsuleOpenCapsuleResp_CapsuleInfo{}
- resp.Info.Colorful.Change = data.Info.Colorful.Change
- resp.Info.Colorful.Coin = data.Info.Colorful.Coin
- if data.Info.Colorful.Progress != nil {
- resp.Info.Colorful.Progress = &v1pb.Progress{}
- resp.Info.Colorful.Progress.Max = data.Info.Colorful.Progress.Max
- resp.Info.Colorful.Progress.Now = data.Info.Colorful.Progress.Now
- }
- }
- if data.Info.Normal != nil {
- resp.Info.Normal = &v1pb.CapsuleOpenCapsuleResp_CapsuleInfo{}
- resp.Info.Normal.Change = data.Info.Normal.Change
- resp.Info.Normal.Coin = data.Info.Normal.Coin
- if data.Info.Normal.Progress != nil {
- resp.Info.Normal.Progress = &v1pb.Progress{}
- resp.Info.Normal.Progress.Max = data.Info.Normal.Progress.Max
- resp.Info.Normal.Progress.Now = data.Info.Normal.Progress.Now
- }
- }
- }
- resp.Status = data.Status
- resp.IsEntity = data.IsEntity
- resp.ShowTitle = data.ShowTitle
- resp.Text = data.Text
- l := len(data.Awards)
- resp.Awards = make([]*v1pb.CapsuleOpenCapsuleResp_Award, l)
- for i := 0; i < l; i++ {
- resp.Awards[i] = &v1pb.CapsuleOpenCapsuleResp_Award{}
- resp.Awards[i].Num = data.Awards[i].Num
- resp.Awards[i].Name = data.Awards[i].Name
- resp.Awards[i].Text = data.Awards[i].Text
- resp.Awards[i].MobileImage = data.Awards[i].MobileImage
- resp.Awards[i].WebImage = data.Awards[i].WebImage
- resp.Awards[i].Img = data.Awards[i].Img
- if data.Awards[i].Usage != nil {
- resp.Awards[i].Usage = &v1pb.Usage{}
- resp.Awards[i].Usage.Text = data.Awards[i].Usage.Text
- resp.Awards[i].Usage.Url = data.Awards[i].Usage.Url
- }
- }
- if s.infoc != nil {
- awards, err1 := json.Marshal(resp.Awards)
- if err1 != nil {
- log.Error("OpenCapsule OpenCapsule err")
- return
- }
- bmc, ok := ctx.(bm.Context)
- if !ok {
- return
- }
- header := bmc.Request.Header
- userip := header.Get("x-backend-bili-real-ip")
- if userip == "" {
- userip = bmc.Request.RemoteAddr
- }
- s.infoc.Infov(context.Background(), uid, userip, strconv.FormatInt(time.Now().Unix(), 10), awards, header.Get("platform"), header.Get("version"), header.Get("buvid"), bmc.Request.UserAgent(), bmc.Request.Referer())
- }
- return
- }
- // FormatErr format error msg
- func (s *CapsuleService) FormatErr(statusCode *status.Status) (code int32, msg string) {
- gCode := statusCode.Code()
- fmt.Printf("FormatErr %d %s", gCode, statusCode.Message())
- code = 1
- if gCode == 2 {
- code, _ := strconv.Atoi(statusCode.Message())
- switch code {
- case -400:
- msg = "参数错误"
- case -401:
- msg = "扭蛋币不足"
- case -500:
- msg = "系统繁忙,请稍后再试"
- case -501:
- msg = "系统繁忙,请稍后再试"
- default:
- msg = "系统繁忙,请稍后再试"
- }
- } else {
- msg = "系统繁忙,请稍后再试"
- }
- return
- }
- // GetCapsuleInfo implementation
- // `midware:"guest"`
- func (s *CapsuleService) GetCapsuleInfo(ctx context.Context, req *v1pb.CapsuleGetCapsuleInfoReq) (resp *v1pb.CapsuleGetCapsuleInfoResp, err error) {
- resp = &v1pb.CapsuleGetCapsuleInfoResp{}
- uid, _ := metadata.Value(ctx, metadata.Mid).(int64)
- data, err := s.dao.GetCapsuleInfo(ctx, uid, req.Type, req.From)
- if err != nil || data == nil {
- return
- }
- resp.Coin = data.Coin
- resp.Rule = data.Rule
- if len(data.GiftFilter) > 0 {
- resp.GiftFilter = make([]*v1pb.CapsuleGetCapsuleInfoResp_GiftFilter, len(data.GiftFilter))
- for ix, award := range data.GiftFilter {
- resp.GiftFilter[ix] = &v1pb.CapsuleGetCapsuleInfoResp_GiftFilter{}
- resp.GiftFilter[ix].Id = award.Id
- resp.GiftFilter[ix].Name = award.Name
- resp.GiftFilter[ix].WebUrl = award.WebUrl
- resp.GiftFilter[ix].MobileUrl = award.MobileUrl
- if award.Usage != nil {
- resp.GiftFilter[ix].Usage = &v1pb.Usage{}
- resp.GiftFilter[ix].Usage.Text = award.Usage.Text
- resp.GiftFilter[ix].Usage.Url = award.Usage.Url
- }
- }
- }
- if len(data.GiftList) > 0 {
- resp.GiftList = make([]*v1pb.CapsuleGetCapsuleInfoResp_GiftList, len(data.GiftList))
- for ix, award := range data.GiftList {
- resp.GiftList[ix] = &v1pb.CapsuleGetCapsuleInfoResp_GiftList{}
- resp.GiftList[ix].Id = award.Id
- resp.GiftList[ix].Name = award.Name
- resp.GiftList[ix].Num = award.Num
- resp.GiftList[ix].WebUrl = award.WebUrl
- resp.GiftList[ix].MobileUrl = award.MobileUrl
- resp.GiftList[ix].Type = award.Type
- resp.GiftList[ix].Expire = award.Expire
- if award.Usage != nil {
- resp.GiftList[ix].Usage = &v1pb.Usage{}
- resp.GiftList[ix].Usage.Text = award.Usage.Text
- resp.GiftList[ix].Usage.Url = award.Usage.Url
- }
- }
- }
- return
- }
- // OpenCapsuleByType implementation
- // `method:"POST" midware:"auth"`
- func (s *CapsuleService) OpenCapsuleByType(ctx context.Context, req *v1pb.CapsuleOpenCapsuleByTypeReq) (resp *v1pb.CapsuleOpenCapsuleByTypeResp, err error) {
- resp = &v1pb.CapsuleOpenCapsuleByTypeResp{}
- uid, ok := metadata.Value(ctx, metadata.Mid).(int64)
- if !ok {
- err = errors.Wrap(err, "未取到uid")
- return
- }
- data, err := s.dao.OpenCapsuleByType(ctx, uid, req.Type, req.Count, req.Platform)
- if err != nil || data == nil {
- return
- }
- resp.IsEntity = data.IsEntity
- resp.Status = data.Status
- resp.Text = data.Text
- resp.Info = &v1pb.CapsuleOpenCapsuleByTypeResp_CapsuleInfo{Coin: 0}
- if data.Info != nil {
- resp.Info.Coin = data.Info.Coin
- }
- resp.Awards = make([]*v1pb.CapsuleOpenCapsuleByTypeResp_Award, len(data.Awards))
- for ix, award := range data.Awards {
- resp.Awards[ix] = &v1pb.CapsuleOpenCapsuleByTypeResp_Award{}
- resp.Awards[ix].Id = award.Id
- resp.Awards[ix].Name = award.Name
- resp.Awards[ix].Num = award.Num
- resp.Awards[ix].Text = award.Text
- resp.Awards[ix].WebUrl = award.WebUrl
- resp.Awards[ix].MobileUrl = award.MobileUrl
- resp.Awards[ix].Type = award.Type
- resp.Awards[ix].Expire = award.Expire
- if award.Usage != nil {
- resp.Awards[ix].Usage = &v1pb.Usage{}
- resp.Awards[ix].Usage.Text = award.Usage.Text
- resp.Awards[ix].Usage.Url = award.Usage.Url
- }
- }
- return
- }
|