123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- package dao
- import (
- "context"
- "encoding/json"
- "fmt"
- "github.com/pkg/errors"
- "go-common/app/service/live/wallet/model"
- "go-common/library/ecode"
- "go-common/library/log"
- "net/http"
- "net/url"
- "time"
- )
- const (
- ModifyUrl = "http://api.bilibili.co/x/internal/v1/coin/user/modify"
- InfoUrl = "http://api.bilibili.co/x/internal/v1/coin/user/count"
- ExchangeSilverReason = "兑换直播银瓜子 %d"
- ExchangeMetalReason = "银瓜子兑换硬币"
- )
- var (
- respCodeError = errors.New("query response code err")
- paramError = errors.New("param error")
- )
- func (d *Dao) GetMetal(c context.Context, uid int64) (metal float64, err error) {
- params := url.Values{}
- params.Set("mid", fmt.Sprintf("%d", uid))
- now := time.Now().Unix()
- params.Set("ts", fmt.Sprintf("%d", now))
- var req *http.Request
- if req, err = d.httpClient.NewRequest("GET", InfoUrl, "", params); err != nil {
- log.Error("wallet metal newRequest err:%s", err.Error())
- return
- }
- queryUrl := req.URL.String()
- var res struct {
- Code int `json:"code"`
- Data model.MetalData `json:"data"`
- }
- err = d.httpClient.Do(c, req, &res)
- if err != nil {
- log.Error("wallet query metal err url: %s,err:%s", queryUrl, err.Error())
- return
- }
- resStr, _ := json.Marshal(res)
- log.Info("wallet query metal success url:%s,res:%s", queryUrl, resStr)
- if res.Code != 0 {
- err = respCodeError
- } else {
- metal = res.Data.Count
- }
- return
- }
- func (d *Dao) ModifyMetal(c context.Context, uid int64, coins int64, seeds int64, reason interface{}) (success bool, code int, err error) {
- if coins == 0 {
- err = paramError
- return
- }
- if coins < 0 {
- // 检查是否足够
- metal, _ := d.GetMetal(c, uid)
- if metal < float64(0-coins) {
- err = ecode.CoinNotEnough
- return
- }
- }
- params := url.Values{}
- params.Set("mid", fmt.Sprintf("%d", uid))
- params.Set("count", fmt.Sprintf("%d", coins))
- now := time.Now().Unix()
- params.Set("ts", fmt.Sprintf("%d", now))
- var realReason string
- switch reason.(type) {
- case string:
- realReason = reason.(string)
- default:
- if coins < 0 {
- realReason = fmt.Sprintf(ExchangeSilverReason, seeds)
- } else {
- realReason = ExchangeMetalReason
- }
- }
- log.Info("user %d consume or recharge metal %d by reason %s", uid, coins, realReason)
- params.Set("reason", realReason)
- var req *http.Request
- req, err = d.httpClient.NewRequest("POST", ModifyUrl, "", params)
- if err != nil {
- log.Error("wallet metal newRequest err:%s", err.Error())
- return
- }
- queryUrl := req.URL.String()
- var res struct {
- Code int `json:"code"`
- }
- err = d.httpClient.Do(c, req, &res)
- if err != nil {
- log.Error("Metal#wallet query metal err url: %s,err:%s uid:%d, count:%d", queryUrl, err.Error(), uid, coins)
- // 认为成功
- err = nil
- success = true
- code = 0
- return
- }
- resStr, _ := json.Marshal(res)
- log.Info("wallet query metal success url:%s, uid:%d, count:%d res:%s", queryUrl, uid, coins, resStr)
- code = res.Code
- if res.Code == 0 {
- success = true
- } else {
- if res.Code == ecode.LackOfCoins.Code() {
- err = ecode.CoinNotEnough
- } else {
- log.Error("Metal#wallet query metal code failed : uid:%d, count:%d,code:%d", uid, coins, res.Code)
- err = respCodeError
- }
- }
- return
- }
|