123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- package wxbroadcastv2
- import (
- "active/internal/model/goldbrick"
- "active/tools"
- "crypto/aes"
- "crypto/cipher"
- "encoding/base64"
- "encoding/json"
- "fmt"
- "runtime/debug"
- "strings"
- "time"
- "git.jiaxianghudong.com/go/logs"
- "git.jiaxianghudong.com/webs/pkg/rds"
- "git.jiaxianghudong.com/webs/pkg/xgorm"
- "gorm.io/gorm/clause"
- )
- // 直播数据的一些参数
- const (
- LiveWatcherMin = 1 // 场观人数小于此数,算不合格开播
- LiveOpenBelowStandardMax = 3 //开播多少次不合格,关闭一键直播推荐
- )
- type WxBroadcastInfo struct {
- TaskMap map[int64]bool `json:"task_map"`
- StartTime int64 `json:"start_time"`
- StartNumber int64 `json:"start_number"`
- Time int64 `json:"time"`
- Number int64 `json:"number"` //游戏局数
- First bool `json:"first"`
- WatchCount int64 `json:"watch_count"` //观看人数
- }
- type Wxbroadcast struct {
- Id int64 `json:"id" gorm:"column:id"`
- Daily3 int64 `json:"daily_3" gorm:"column:daily_3"`
- Daily7 int64 `json:"daily_7" gorm:"column:daily_7"`
- UpdateTime int64 `json:"update_time" gorm:"column:update_time"`
- FirstBroadcast int64 `json:"first_broadcast" gorm:"column:first_broadcast"`
- LiveLessCount int64 `json:"live_less_count" gorm:"column:live_less_count"` //场观人数小于等于1的开播次数
- }
- // 直播数据
- type GameLiveDetails struct {
- FeedId int64 `json:"feedId"` // 直播id
- Description string `json:"description"` // 直播主题
- StartTime int64 `json:"startTime"` // 开播时间戳
- EndTime int64 `json:"endTime"` // 关播时间戳
- TotalCheerCount int64 `json:"totalCheerCount"` // 主播收到的喝彩总数
- TotalAudienceCount int64 `json:"totalAudienceCount"` // 直播间总观众人数
- LiveDurationInSeconds int64 `json:"liveDurationInSeconds"` // 直播总时长
- Watermark struct {
- Timestamp int64 `json:"timestamp"`
- AppID string `json:"appid"`
- } `json:"watermark"`
- }
- func (w Wxbroadcast) TableName() string {
- return "wxbroadcast"
- }
- func (w *Wxbroadcast) Save() error {
- xdb := xgorm.NewConn(goldbrick.GoldBrickGorm)
- return xdb.Clauses(clause.OnConflict{
- Columns: []clause.Column{{Name: "id"}},
- UpdateAll: true,
- }).Save(w).Error
- }
- func (w *Wxbroadcast) One() error {
- id := w.Id
- xdb := xgorm.NewConn(goldbrick.GoldBrickGorm)
- err := xdb.Where("id = ?", w.Id).Find(w).Error
- w.Id = id
- return err
- }
- func (w *WxBroadcastInfo) Get(userId string, tm string) {
- data := rds.Redis.HGet(fmt.Sprintf(WXBROADCASTDAY, tm), userId).Val()
- if data != "" {
- err := json.Unmarshal([]byte(data), w)
- if err != nil {
- logs.Errorf("redpacket[%s] WxBroadcastInfo json err:%v", userId, err)
- }
- }
- if w.TaskMap == nil {
- w.TaskMap = make(map[int64]bool)
- }
- }
- func (w *WxBroadcastInfo) Set(userId string, tm string) bool {
- data, _ := json.Marshal(w)
- rds.Redis.HSet(fmt.Sprintf(WXBROADCASTDAY, tm), userId, string(data)).Err()
- end, _ := time.Parse("2006-01-02", tm)
- expireAt := end.Add(48 * time.Hour)
- rds.Redis.ExpireAt(fmt.Sprintf(WXBROADCASTDAY, tm), expireAt)
- return true
- }
- func Init() {
- tools.ReloadYaml("wxbroadcastv2.yaml", &confv2)
- for i := 0; i < len(confv2.AwardList); i++ {
- fmt.Printf("AwardList %+v \n", confv2.AwardList[i])
- }
- for i := 0; i < len(confv2.AwardListV1); i++ {
- fmt.Printf("AwardListV1 %+v \n", confv2.AwardListV1[i])
- }
- tools.ReloadYaml("wxbroadcastv2.yaml", &upListConf)
- fmt.Printf("upddd %v \n", upListConf)
- }
- // 获取小游戏用户的已结束的直播数据
- func EncryptedGameLiveDetails(userid uint32, encryptedData, iv string) *GameLiveDetails {
- sessionKey := rds.Redis2.HGet(fmt.Sprintf("user_%d", userid), "min_session_key").Val()
- if sessionKey == "" {
- logs.Errorf("userid %d min_session_key is not find:", userid)
- return nil
- }
- aesKey, _ := base64.StdEncoding.DecodeString(fmt.Sprintf("%s", sessionKey))
- encryptedStr, _ := base64.StdEncoding.DecodeString(strings.Replace(encryptedData, " ", "+", -1))
- IV, err := base64.StdEncoding.DecodeString(strings.Replace(iv, " ", "+", -1))
- if err != nil {
- logs.Errorf("iv decodeString[%v] err=%v", encryptedStr, iv)
- return nil
- }
- liveDetail, err := WxAESDecode(encryptedStr, aesKey, IV, userid)
- if err != nil {
- logs.Errorf("WxAESDecode|wechat_data decrypt err:userid:%v,encryptedStr=%v,iv=%v,err=%v", userid, encryptedStr, IV, err)
- return nil
- }
- logs.Infof("encryptedData=%v,iv=%v,userid:%v,GameLiveDetails=%+v", encryptedData, iv, userid, liveDetail)
- return liveDetail
- }
- // WxAESDecode 微信aes解码
- func WxAESDecode(encryptedData []byte, sessionKey []byte, iv []byte, userid uint32) (*GameLiveDetails, error) {
- var err error
- var info GameLiveDetails
- defer func() { // 必须要先声明defer,否则不能捕获到panic异常
- if err1 := recover(); err1 != nil {
- logs.Error(fmt.Sprintf("[WxAESDecode] | sessionKey: %s | iv: %s | err: %v | userid: %d", string(sessionKey), string(iv), err1, userid))
- debug.PrintStack()
- }
- }()
- var aesBlockDecrypter cipher.Block
- aesBlockDecrypter, err = aes.NewCipher(sessionKey)
- if err != nil {
- return &info, err
- }
- decrypted := make([]byte, len(encryptedData))
- aesDecrypter := cipher.NewCBCDecrypter(aesBlockDecrypter, iv)
- aesDecrypter.CryptBlocks(decrypted, encryptedData)
- aesPlantText := PKCS7UnPadding(decrypted)
- err = json.Unmarshal(aesPlantText, &info)
- return &info, err
- }
- func PKCS7UnPadding(plantText []byte) []byte {
- length := len(plantText)
- if length > 0 {
- unPadding := int(plantText[length-1])
- return plantText[:(length - unPadding)]
- }
- return plantText
- }
|