|
|
|
package task
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
giftv1 "git.gz.internal.jumaiyx.cn/jm/jmproto/gift/v1"
|
|
|
|
livev1 "git.gz.internal.jumaiyx.cn/jm/jmproto/live/v1"
|
|
|
|
v2 "git.gz.internal.jumaiyx.cn/jm/jmproto/room/v2"
|
|
|
|
"git.gz.internal.jumaiyx.cn/pkg/client"
|
|
|
|
configv2 "git.gz.internal.jumaiyx.cn/pkg/config/v2"
|
|
|
|
"git.gz.internal.jumaiyx.cn/pkg/config/v2/cproto"
|
|
|
|
"git.gz.internal.jumaiyx.cn/pkg/jtime"
|
|
|
|
"github.com/redis/go-redis/v9"
|
|
|
|
"strconv"
|
|
|
|
"sync"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
hotspotQueueKey = "room:hotspot:sort"
|
|
|
|
hotKey = "room:hot:ranking"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
redisInstance *redis.Client
|
|
|
|
once sync.Once
|
|
|
|
)
|
|
|
|
|
|
|
|
func NewRedis() *redis.Client {
|
|
|
|
redisConfig := &cproto.Redis{}
|
|
|
|
err := configv2.Get(context.Background(), configv2.Redis, redisConfig)
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
}
|
|
|
|
once.Do(func() {
|
|
|
|
redisInstance = redis.NewClient(&redis.Options{
|
|
|
|
Addr: redisConfig.Addr,
|
|
|
|
Password: redisConfig.Password,
|
|
|
|
PoolSize: 10,
|
|
|
|
ReadTimeout: 100 * time.Second,
|
|
|
|
WriteTimeout: 100 * time.Second,
|
|
|
|
})
|
|
|
|
})
|
|
|
|
return redisInstance
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewTask() {
|
|
|
|
for {
|
|
|
|
redisClient := NewRedis()
|
|
|
|
ctx := context.Background()
|
|
|
|
lLen := redisClient.LLen(ctx, hotspotQueueKey).Val()
|
|
|
|
if lLen == 0 {
|
|
|
|
//fmt.Println("等待")
|
|
|
|
time.Sleep(time.Second * 10)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
result, err := redisClient.RPop(ctx, hotspotQueueKey).Result()
|
|
|
|
if err != nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
id, _ := strconv.Atoi(result)
|
|
|
|
if id == 0 {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
roomId := int64(id)
|
|
|
|
var (
|
|
|
|
value int64 // 房间初始热度值
|
|
|
|
currentOnlineTotal int64 // 实时在线人数总值
|
|
|
|
todayOnlineTotal int64 // 一天的人数总值
|
|
|
|
amountTotal int64 // 金额总数值
|
|
|
|
//lastAmountTotal int64 // 上次金额总值
|
|
|
|
)
|
|
|
|
now := time.Now()
|
|
|
|
// 获取房间信息
|
|
|
|
roomClientV2, roomClientV2Close, err := client.GetRoomClientV2(ctx)
|
|
|
|
//roomClientV2, err := client.GetRoomClientLocalV2("127.0.0.1:9001")
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("获取房间服务失败:", err.Error())
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
defer roomClientV2Close()
|
|
|
|
roomRsp, err := roomClientV2.GetRoom(ctx, &v2.GetRoomReq{
|
|
|
|
RoomId: roomId,
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("获取房间失败:", err.Error())
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
// 忽略下播的房间和广场房间
|
|
|
|
if roomRsp.Status != v2.RoomStatus_RoomStatusUp || roomRsp.RoomType == v2.RoomType_Hall {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
// 获取房间
|
|
|
|
// 获取房间初始值
|
|
|
|
value = 100
|
|
|
|
|
|
|
|
liveClient, liveClientClose, err := client.GetLiveClient(ctx)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("获取直播服务失败:", err.Error())
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
defer liveClientClose()
|
|
|
|
defaultHotValueResp, err := liveClient.GetDefaultHotValueList(ctx, &livev1.GetDefaultHotValueListReq{
|
|
|
|
RoomList: []int64{roomId},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("获取热度默认值失败:", err.Error())
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if len(defaultHotValueResp.Items) != 0 {
|
|
|
|
value = int64(defaultHotValueResp.Items[0].HotValue)
|
|
|
|
}
|
|
|
|
// 获取房间在线人数
|
|
|
|
onlineCountRsp, err := roomClientV2.GetOnlineListCount(ctx, &v2.GetOnlineListReq{
|
|
|
|
RoomIdList: []int64{roomId},
|
|
|
|
StatusList: []int32{1},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("获取在线总数失败:", err.Error())
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
currentOnlineTotal = onlineCountRsp.Total
|
|
|
|
// 一天之前的时间
|
|
|
|
//todayMinutesSecond := (now.Unix() - 10*60) * 1000
|
|
|
|
todayMinutes := jtime.TimeTimestamp(jtime.SecondsAgoTime(now, -(86400)))
|
|
|
|
|
|
|
|
// 一个星期前的时间
|
|
|
|
prevWeekTime := jtime.SecondsAgoTime(time.Now(), -86400*7)
|
|
|
|
startTime := prevWeekTime.UnixMilli()
|
|
|
|
|
|
|
|
// 获取房间总流水
|
|
|
|
giftClient, giftClientClose, err := client.GetGiftClient(ctx)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("获取礼物服务失败:", err.Error())
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
defer giftClientClose()
|
|
|
|
giftRsp, err := giftClient.QueryGiveRoomGift(ctx, &giftv1.QueryGiveRoomGiftReq{
|
|
|
|
RoomIdList: []int64{roomId},
|
|
|
|
CreateAtStart: &startTime,
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("获取礼物数据失败:", err.Error())
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
amountTotal = giftRsp.TotalAmountDiamond + giftRsp.TotalAmountGoldCoins
|
|
|
|
|
|
|
|
// 获取一天的总人数
|
|
|
|
lastOnlineCountRsp, err := roomClientV2.GetOnlineListCount(ctx, &v2.GetOnlineListReq{
|
|
|
|
RoomIdList: []int64{roomId},
|
|
|
|
CreatedStart: todayMinutes,
|
|
|
|
Deleted: true,
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("获取一天总人数失败:", err.Error())
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
todayOnlineTotal = lastOnlineCountRsp.Total
|
|
|
|
// 初始热度值 + (一个小时内总人数 * 10 + 一个星期内总流水) - 时间段内((十分钟之前总数 - 现在总人数) + (十分钟之前总流水 - 总流水【一个星期内】)) = 热度值
|
|
|
|
// 总人数【一天内】+(实时在线人数/总人数)* 10 = 人数热度值
|
|
|
|
// 总流水【一个星期内】 * 10 = 流水热度值
|
|
|
|
//currentOnlineTotal + (todayOnlineTotal * todayOnlineTotal) * 10
|
|
|
|
//fmt.Println("amountTotal:", (todayOnlineTotal*todayOnlineTotal)*10)
|
|
|
|
//fmt.Println("amountTotal:", amountTotal*10)
|
|
|
|
v := value + currentOnlineTotal + (todayOnlineTotal*todayOnlineTotal)*10 + amountTotal*10
|
|
|
|
//fmt.Println(v)
|
|
|
|
//usecase.logger.Info("实际人数:", onlineTotal)
|
|
|
|
//usecase.logger.Info("总流水:", amountTotal)
|
|
|
|
//usecase.logger.Info("十分钟之前总数:", lastOnlineTotal)
|
|
|
|
//usecase.logger.Info("十分钟之前总流水:", lastAmountTotal)
|
|
|
|
//usecase.logger.Info("热度值:", v)
|
|
|
|
|
|
|
|
err = redisClient.ZAdd(ctx, hotKey, redis.Z{
|
|
|
|
Member: roomId,
|
|
|
|
Score: float64(v),
|
|
|
|
}).Err()
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("写入热度值失败:", err.Error())
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
// 写入数据库
|
|
|
|
hotValue := int32(v)
|
|
|
|
_, err = roomClientV2.UpdateRoom(ctx, &v2.UpdateRoomReq{
|
|
|
|
Id: roomId,
|
|
|
|
Data: &v2.UpdateRoomReq_Data{
|
|
|
|
HotValue: &hotValue,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|