capsule.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. package v1
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "strconv"
  7. "time"
  8. "google.golang.org/grpc/status"
  9. "go-common/library/log"
  10. "github.com/pkg/errors"
  11. v1pb "go-common/app/interface/live/web-ucenter/api/http/v1"
  12. "go-common/app/interface/live/web-ucenter/conf"
  13. capsuledao "go-common/app/interface/live/web-ucenter/dao/capsule"
  14. "go-common/library/log/infoc"
  15. bm "go-common/library/net/http/blademaster"
  16. "go-common/library/net/metadata"
  17. )
  18. // CapsuleService struct
  19. type CapsuleService struct {
  20. conf *conf.Config
  21. // optionally add other properties here, such as dao
  22. dao *capsuledao.Dao
  23. infoc *infoc.Infoc
  24. }
  25. //NewCapsuleService init
  26. func NewCapsuleService(c *conf.Config) (s *CapsuleService) {
  27. s = &CapsuleService{
  28. conf: c,
  29. dao: capsuledao.New(c),
  30. }
  31. if c.Infoc != nil && c.Infoc.CapsuleInfoc != nil {
  32. s.infoc = infoc.New(c.Infoc.CapsuleInfoc)
  33. }
  34. return s
  35. }
  36. // GetDetail implementation
  37. func (s *CapsuleService) GetDetail(ctx context.Context, req *v1pb.CapsuleGetDetailReq) (resp *v1pb.CapsuleGetDetailResp, err error) {
  38. resp = &v1pb.CapsuleGetDetailResp{}
  39. uid, ok := metadata.Value(ctx, metadata.Mid).(int64)
  40. if !ok {
  41. err = errors.Wrap(err, "未取到uid")
  42. return
  43. }
  44. data, err := s.dao.GetDetail(ctx, uid, req.From)
  45. if err != nil {
  46. return
  47. }
  48. if data.Normal != nil {
  49. normal := &v1pb.CapsuleGetDetailResp_CapsuleInfo{}
  50. normal.Status = data.Normal.Status
  51. normal.Coin = data.Normal.Coin
  52. normal.Change = data.Normal.Change
  53. normal.Rule = data.Normal.Rule
  54. if data.Normal.Progress != nil {
  55. normal.Progress = &v1pb.Progress{}
  56. normal.Progress.Now = data.Normal.Progress.Now
  57. normal.Progress.Max = data.Normal.Progress.Max
  58. }
  59. glen := len(data.Normal.Gift)
  60. normal.Gift = make([]*v1pb.CapsuleGetDetailResp_Gift, glen)
  61. for i := 0; i < glen; i++ {
  62. gift := &v1pb.CapsuleGetDetailResp_Gift{}
  63. gift.Name = data.Normal.Gift[i].Name
  64. gift.WebImage = data.Normal.Gift[i].WebImage
  65. gift.MobileImage = data.Normal.Gift[i].MobileImage
  66. gift.Image = data.Normal.Gift[i].Image
  67. if data.Normal.Gift[i].Usage != nil {
  68. gift.Usage = &v1pb.Usage{}
  69. gift.Usage.Text = data.Normal.Gift[i].Usage.Text
  70. gift.Usage.Url = data.Normal.Gift[i].Usage.Url
  71. }
  72. normal.Gift[i] = gift
  73. }
  74. glen = len(data.Normal.List)
  75. normal.List = make([]*v1pb.CapsuleGetDetailResp_List, glen)
  76. for i := 0; i < glen; i++ {
  77. info := &v1pb.CapsuleGetDetailResp_List{}
  78. info.Name = data.Normal.List[i].Name
  79. info.Num = data.Normal.List[i].Num
  80. info.Date = data.Normal.List[i].Date
  81. info.Gift = data.Normal.List[i].Gift
  82. normal.List[i] = info
  83. }
  84. resp.Normal = normal
  85. }
  86. if data.Colorful != nil {
  87. colorful := &v1pb.CapsuleGetDetailResp_CapsuleInfo{}
  88. colorful.Status = data.Colorful.Status
  89. colorful.Coin = data.Colorful.Coin
  90. colorful.Change = data.Colorful.Change
  91. colorful.Rule = data.Colorful.Rule
  92. if data.Colorful.Progress != nil {
  93. colorful.Progress = &v1pb.Progress{}
  94. colorful.Progress.Now = data.Colorful.Progress.Now
  95. colorful.Progress.Max = data.Colorful.Progress.Max
  96. }
  97. glen := len(data.Colorful.Gift)
  98. colorful.Gift = make([]*v1pb.CapsuleGetDetailResp_Gift, glen)
  99. for i := 0; i < glen; i++ {
  100. gift := &v1pb.CapsuleGetDetailResp_Gift{}
  101. gift.Name = data.Colorful.Gift[i].Name
  102. gift.WebImage = data.Colorful.Gift[i].WebImage
  103. gift.MobileImage = data.Colorful.Gift[i].MobileImage
  104. gift.Image = data.Colorful.Gift[i].Image
  105. if data.Colorful.Gift[i].Usage != nil {
  106. gift.Usage = &v1pb.Usage{}
  107. gift.Usage.Text = data.Colorful.Gift[i].Usage.Text
  108. gift.Usage.Url = data.Colorful.Gift[i].Usage.Url
  109. }
  110. colorful.Gift[i] = gift
  111. }
  112. glen = len(data.Colorful.List)
  113. colorful.List = make([]*v1pb.CapsuleGetDetailResp_List, glen)
  114. for i := 0; i < glen; i++ {
  115. info := &v1pb.CapsuleGetDetailResp_List{}
  116. info.Name = data.Colorful.List[i].Name
  117. info.Num = data.Colorful.List[i].Num
  118. info.Date = data.Colorful.List[i].Date
  119. info.Gift = data.Colorful.List[i].Gift
  120. colorful.List[i] = info
  121. }
  122. resp.Colorful = colorful
  123. }
  124. return
  125. }
  126. // OpenCapsule implementation
  127. func (s *CapsuleService) OpenCapsule(ctx context.Context, req *v1pb.CapsuleOpenCapsuleReq) (resp *v1pb.CapsuleOpenCapsuleResp, err error) {
  128. resp = &v1pb.CapsuleOpenCapsuleResp{}
  129. uid, ok := metadata.Value(ctx, metadata.Mid).(int64)
  130. if !ok {
  131. err = errors.Wrap(err, "未取到uid")
  132. return
  133. }
  134. data, err := s.dao.OpenCapsule(ctx, uid, req.Type, req.Count, req.Platform)
  135. if err != nil {
  136. return
  137. }
  138. if data.Info != nil {
  139. resp.Info = &v1pb.CapsuleOpenCapsuleResp_Info{}
  140. if data.Info.Colorful != nil {
  141. resp.Info.Colorful = &v1pb.CapsuleOpenCapsuleResp_CapsuleInfo{}
  142. resp.Info.Colorful.Change = data.Info.Colorful.Change
  143. resp.Info.Colorful.Coin = data.Info.Colorful.Coin
  144. if data.Info.Colorful.Progress != nil {
  145. resp.Info.Colorful.Progress = &v1pb.Progress{}
  146. resp.Info.Colorful.Progress.Max = data.Info.Colorful.Progress.Max
  147. resp.Info.Colorful.Progress.Now = data.Info.Colorful.Progress.Now
  148. }
  149. }
  150. if data.Info.Normal != nil {
  151. resp.Info.Normal = &v1pb.CapsuleOpenCapsuleResp_CapsuleInfo{}
  152. resp.Info.Normal.Change = data.Info.Normal.Change
  153. resp.Info.Normal.Coin = data.Info.Normal.Coin
  154. if data.Info.Normal.Progress != nil {
  155. resp.Info.Normal.Progress = &v1pb.Progress{}
  156. resp.Info.Normal.Progress.Max = data.Info.Normal.Progress.Max
  157. resp.Info.Normal.Progress.Now = data.Info.Normal.Progress.Now
  158. }
  159. }
  160. }
  161. resp.Status = data.Status
  162. resp.IsEntity = data.IsEntity
  163. resp.ShowTitle = data.ShowTitle
  164. resp.Text = data.Text
  165. l := len(data.Awards)
  166. resp.Awards = make([]*v1pb.CapsuleOpenCapsuleResp_Award, l)
  167. for i := 0; i < l; i++ {
  168. resp.Awards[i] = &v1pb.CapsuleOpenCapsuleResp_Award{}
  169. resp.Awards[i].Num = data.Awards[i].Num
  170. resp.Awards[i].Name = data.Awards[i].Name
  171. resp.Awards[i].Text = data.Awards[i].Text
  172. resp.Awards[i].MobileImage = data.Awards[i].MobileImage
  173. resp.Awards[i].WebImage = data.Awards[i].WebImage
  174. resp.Awards[i].Img = data.Awards[i].Img
  175. if data.Awards[i].Usage != nil {
  176. resp.Awards[i].Usage = &v1pb.Usage{}
  177. resp.Awards[i].Usage.Text = data.Awards[i].Usage.Text
  178. resp.Awards[i].Usage.Url = data.Awards[i].Usage.Url
  179. }
  180. }
  181. if s.infoc != nil {
  182. awards, err1 := json.Marshal(resp.Awards)
  183. if err1 != nil {
  184. log.Error("OpenCapsule OpenCapsule err")
  185. return
  186. }
  187. bmc, ok := ctx.(bm.Context)
  188. if !ok {
  189. return
  190. }
  191. header := bmc.Request.Header
  192. userip := header.Get("x-backend-bili-real-ip")
  193. if userip == "" {
  194. userip = bmc.Request.RemoteAddr
  195. }
  196. 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())
  197. }
  198. return
  199. }
  200. // FormatErr format error msg
  201. func (s *CapsuleService) FormatErr(statusCode *status.Status) (code int32, msg string) {
  202. gCode := statusCode.Code()
  203. fmt.Printf("FormatErr %d %s", gCode, statusCode.Message())
  204. code = 1
  205. if gCode == 2 {
  206. code, _ := strconv.Atoi(statusCode.Message())
  207. switch code {
  208. case -400:
  209. msg = "参数错误"
  210. case -401:
  211. msg = "扭蛋币不足"
  212. case -500:
  213. msg = "系统繁忙,请稍后再试"
  214. case -501:
  215. msg = "系统繁忙,请稍后再试"
  216. default:
  217. msg = "系统繁忙,请稍后再试"
  218. }
  219. } else {
  220. msg = "系统繁忙,请稍后再试"
  221. }
  222. return
  223. }
  224. // GetCapsuleInfo implementation
  225. // `midware:"guest"`
  226. func (s *CapsuleService) GetCapsuleInfo(ctx context.Context, req *v1pb.CapsuleGetCapsuleInfoReq) (resp *v1pb.CapsuleGetCapsuleInfoResp, err error) {
  227. resp = &v1pb.CapsuleGetCapsuleInfoResp{}
  228. uid, _ := metadata.Value(ctx, metadata.Mid).(int64)
  229. data, err := s.dao.GetCapsuleInfo(ctx, uid, req.Type, req.From)
  230. if err != nil || data == nil {
  231. return
  232. }
  233. resp.Coin = data.Coin
  234. resp.Rule = data.Rule
  235. if len(data.GiftFilter) > 0 {
  236. resp.GiftFilter = make([]*v1pb.CapsuleGetCapsuleInfoResp_GiftFilter, len(data.GiftFilter))
  237. for ix, award := range data.GiftFilter {
  238. resp.GiftFilter[ix] = &v1pb.CapsuleGetCapsuleInfoResp_GiftFilter{}
  239. resp.GiftFilter[ix].Id = award.Id
  240. resp.GiftFilter[ix].Name = award.Name
  241. resp.GiftFilter[ix].WebUrl = award.WebUrl
  242. resp.GiftFilter[ix].MobileUrl = award.MobileUrl
  243. if award.Usage != nil {
  244. resp.GiftFilter[ix].Usage = &v1pb.Usage{}
  245. resp.GiftFilter[ix].Usage.Text = award.Usage.Text
  246. resp.GiftFilter[ix].Usage.Url = award.Usage.Url
  247. }
  248. }
  249. }
  250. if len(data.GiftList) > 0 {
  251. resp.GiftList = make([]*v1pb.CapsuleGetCapsuleInfoResp_GiftList, len(data.GiftList))
  252. for ix, award := range data.GiftList {
  253. resp.GiftList[ix] = &v1pb.CapsuleGetCapsuleInfoResp_GiftList{}
  254. resp.GiftList[ix].Id = award.Id
  255. resp.GiftList[ix].Name = award.Name
  256. resp.GiftList[ix].Num = award.Num
  257. resp.GiftList[ix].WebUrl = award.WebUrl
  258. resp.GiftList[ix].MobileUrl = award.MobileUrl
  259. resp.GiftList[ix].Type = award.Type
  260. resp.GiftList[ix].Expire = award.Expire
  261. if award.Usage != nil {
  262. resp.GiftList[ix].Usage = &v1pb.Usage{}
  263. resp.GiftList[ix].Usage.Text = award.Usage.Text
  264. resp.GiftList[ix].Usage.Url = award.Usage.Url
  265. }
  266. }
  267. }
  268. return
  269. }
  270. // OpenCapsuleByType implementation
  271. // `method:"POST" midware:"auth"`
  272. func (s *CapsuleService) OpenCapsuleByType(ctx context.Context, req *v1pb.CapsuleOpenCapsuleByTypeReq) (resp *v1pb.CapsuleOpenCapsuleByTypeResp, err error) {
  273. resp = &v1pb.CapsuleOpenCapsuleByTypeResp{}
  274. uid, ok := metadata.Value(ctx, metadata.Mid).(int64)
  275. if !ok {
  276. err = errors.Wrap(err, "未取到uid")
  277. return
  278. }
  279. data, err := s.dao.OpenCapsuleByType(ctx, uid, req.Type, req.Count, req.Platform)
  280. if err != nil || data == nil {
  281. return
  282. }
  283. resp.IsEntity = data.IsEntity
  284. resp.Status = data.Status
  285. resp.Text = data.Text
  286. resp.Info = &v1pb.CapsuleOpenCapsuleByTypeResp_CapsuleInfo{Coin: 0}
  287. if data.Info != nil {
  288. resp.Info.Coin = data.Info.Coin
  289. }
  290. resp.Awards = make([]*v1pb.CapsuleOpenCapsuleByTypeResp_Award, len(data.Awards))
  291. for ix, award := range data.Awards {
  292. resp.Awards[ix] = &v1pb.CapsuleOpenCapsuleByTypeResp_Award{}
  293. resp.Awards[ix].Id = award.Id
  294. resp.Awards[ix].Name = award.Name
  295. resp.Awards[ix].Num = award.Num
  296. resp.Awards[ix].Text = award.Text
  297. resp.Awards[ix].WebUrl = award.WebUrl
  298. resp.Awards[ix].MobileUrl = award.MobileUrl
  299. resp.Awards[ix].Type = award.Type
  300. resp.Awards[ix].Expire = award.Expire
  301. if award.Usage != nil {
  302. resp.Awards[ix].Usage = &v1pb.Usage{}
  303. resp.Awards[ix].Usage.Text = award.Usage.Text
  304. resp.Awards[ix].Usage.Url = award.Usage.Url
  305. }
  306. }
  307. return
  308. }