parent
2bbef647e9
commit
02acc3095f
20 changed files with 521 additions and 28 deletions
@ -0,0 +1,243 @@ |
||||
package call |
||||
|
||||
import ( |
||||
"context" |
||||
"fmt" |
||||
"math/rand" |
||||
"server/common" |
||||
"server/db" |
||||
"strconv" |
||||
"time" |
||||
|
||||
"github.com/liangdas/mqant/log" |
||||
) |
||||
|
||||
const ( |
||||
RankNum = 20 |
||||
) |
||||
|
||||
var ( |
||||
Robots = []*common.ConfigShareRobot{{ |
||||
RobotID: 21891253, |
||||
}, { |
||||
RobotID: 23923560, |
||||
}, { |
||||
RobotID: 25956230, |
||||
}} |
||||
) |
||||
|
||||
// RankInfo 机器人结构
|
||||
type RankInfo struct { |
||||
Rank int |
||||
InviteCount int64 |
||||
Avtar int |
||||
UserName string |
||||
} |
||||
|
||||
func IsRobot(uid int) bool { |
||||
for _, robot := range Robots { |
||||
if robot.RobotID == uid { |
||||
return true |
||||
} |
||||
} |
||||
if db.Mysql().Exist(&common.ConfigShareRobot{RobotID: uid}) { |
||||
return true |
||||
} |
||||
return false |
||||
} |
||||
|
||||
// 获取排行榜key
|
||||
func GetRedisRankKey() string { |
||||
activity := GetConfigActivityByID(common.ActivityIDInviteRank) |
||||
if activity == nil { |
||||
log.Error("GetRedisRankKey ==nil") |
||||
return "" |
||||
} |
||||
return fmt.Sprintf("robot_ranking:%v", activity.Start) |
||||
} |
||||
|
||||
func GetRedisRankRobotKey(uid int) string { |
||||
today := time.Now().Format("20060102") |
||||
activity := GetConfigActivityByID(common.ActivityIDInviteRank) |
||||
if activity == nil { |
||||
log.Error("GetRedisRankKey ==nil") |
||||
return "" |
||||
} |
||||
return fmt.Sprintf("robot_ranking:%v:robot:%v:%v", activity.Start, uid, today) |
||||
} |
||||
|
||||
func GetRedisRankRewardKey() string { |
||||
activity := GetConfigActivityByID(common.ActivityIDInviteRank) |
||||
if activity == nil { |
||||
log.Error("GetRedisRankKey ==nil") |
||||
return "" |
||||
} |
||||
return fmt.Sprintf("robot_ranking:%v:reward", activity.Start) |
||||
} |
||||
|
||||
func TodayLogic(key string, uid int, num, times int64) { |
||||
robotKey := GetRedisRankRobotKey(uid) |
||||
timesCount := db.Redis().HGetInt(robotKey, "times_count") |
||||
// timesUse := db.Redis().HGetInt(robotKey, "times_use")
|
||||
if timesCount == 0 { |
||||
err := db.Redis().HSet(robotKey, map[string]interface{}{ |
||||
"times_count": times, |
||||
"times_use": 1, |
||||
"num": 1, |
||||
}) |
||||
if err != nil { |
||||
log.Error("err:%v", err) |
||||
return |
||||
} |
||||
timesCount = int(times) |
||||
} else { |
||||
err := db.Redis().HIncrBy(robotKey, "times_use", 1) |
||||
if err != nil { |
||||
log.Error("err:%v", err) |
||||
return |
||||
} |
||||
if err = db.Redis().HIncrBy(robotKey, "num", num); err != nil { |
||||
log.Error("err:%v", err) |
||||
return |
||||
} |
||||
} |
||||
// if timesUse < timesCount {
|
||||
IncreaseInviteCount(fmt.Sprintf("%v", uid), num, true) |
||||
// }
|
||||
} |
||||
|
||||
// IncreaseInviteCount 增长机器人邀请人数
|
||||
func IncreaseInviteCount(robotName string, increment int64, isRobot bool) { |
||||
if increment > 0 { |
||||
ctx := context.Background() |
||||
rdb := db.Redis().GetRedis() |
||||
key := GetRedisRankKey() |
||||
newScore, err := rdb.ZIncrBy(ctx, key, float64(increment), robotName).Result() |
||||
if err != nil { |
||||
log.Error("增长失败: %v", err) |
||||
} else { |
||||
log.Info("机器人 %s 增长 %d 人,新的邀请人数为 %d", robotName, increment, int64(newScore)) |
||||
} |
||||
} |
||||
} |
||||
|
||||
func GetUserRank(uid int) (ret RankInfo) { |
||||
ctx := context.Background() |
||||
rdb := db.Redis().GetRedis() |
||||
key := GetRedisRankKey() |
||||
member := fmt.Sprintf("%v", uid) |
||||
score, err := rdb.ZScore(ctx, key, member).Result() |
||||
if err != nil { |
||||
log.Error("Error:", err) |
||||
return |
||||
} else { |
||||
log.Info("Score of %s: %f", member, score) |
||||
} |
||||
|
||||
// 获取指定成员的排名 (从小到大)
|
||||
rank, err := rdb.ZRevRank(ctx, key, member).Result() |
||||
if err != nil { |
||||
log.Error("Error:", err) |
||||
return |
||||
} else { |
||||
log.Info("Rank of %s (ascending): %d", member, rank) |
||||
} |
||||
user, _ := GetUserXInfo(uid, "avatar") |
||||
if user != nil { |
||||
ret.Avtar, _ = strconv.Atoi(user.Avatar) |
||||
} |
||||
ret.Rank = int(rank) + 1 |
||||
ret.InviteCount = int64(score) |
||||
ret.UserName = fmt.Sprintf("User%v", uid) |
||||
return |
||||
} |
||||
|
||||
func GetTopShareRank(rank int64) (ret []RankInfo) { |
||||
ctx := context.Background() |
||||
rdb := db.Redis().GetRedis() |
||||
key := GetRedisRankKey() |
||||
rankList, err := rdb.ZRevRangeWithScores(ctx, key, 0, rank-1).Result() |
||||
if err != nil { |
||||
log.Error("获取排名失败: %v", err) |
||||
return nil |
||||
} |
||||
for idx, robot := range rankList { |
||||
username := fmt.Sprintf("%v", robot.Member) |
||||
uid, _ := strconv.Atoi(username) |
||||
|
||||
log.Debug("用户: %s,邀请人数: %d", robot.Member, int(robot.Score)) |
||||
info := RankInfo{ |
||||
Rank: idx + 1, |
||||
UserName: fmt.Sprintf("%v", robot.Member), |
||||
InviteCount: int64(robot.Score), |
||||
Avtar: rand.Intn(28) + 1, |
||||
} |
||||
if !IsRobot(uid) { |
||||
user, _ := GetUserXInfo(uid, "avatar") |
||||
info.Avtar, _ = strconv.Atoi(user.Avatar) |
||||
|
||||
} |
||||
ret = append(ret, info) |
||||
} |
||||
return |
||||
} |
||||
|
||||
// RiskControl 风控逻辑
|
||||
func RiskControl() { |
||||
rankList := GetTopShareRank(RankNum) |
||||
log.Info("rishControl:%v", rankList) |
||||
playerMap := make([]RankInfo, 0, 10) |
||||
robotMap := make([]RankInfo, 0, 10) |
||||
for _, rankInfo := range rankList { |
||||
uid, _ := strconv.Atoi(rankInfo.UserName) |
||||
// 判断是否为机器人
|
||||
if !IsRobot(uid) { |
||||
playerMap = append(playerMap, rankInfo) |
||||
} else { |
||||
robotMap = append(robotMap, rankInfo) |
||||
} |
||||
} |
||||
log.Debug("playerMap:%+v", playerMap) |
||||
log.Debug("robotMap:%+v", robotMap) |
||||
for idx, robot := range robotMap { |
||||
if idx < 3 { |
||||
player := playerMap[0] |
||||
log.Debug("player:%v,robot:%v", player, robot) |
||||
if robot.InviteCount < player.InviteCount { |
||||
IncreaseInviteCount(robot.UserName, player.InviteCount-robot.InviteCount+rand.Int63n(15), true) |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
func SendReward() { |
||||
rankList := GetTopShareRank(RankNum) |
||||
log.Info("SendReward:%v", rankList) |
||||
for _, rankInfo := range rankList { |
||||
if rankInfo.InviteCount > 0 { |
||||
uid, err := strconv.Atoi(rankInfo.UserName) |
||||
if err != nil { |
||||
log.Error("err:%v", err) |
||||
continue |
||||
} |
||||
if rankInfo.Rank <= 3 && !IsRobot(uid) { |
||||
// 强制修改成第四名
|
||||
rankInfo.Rank = 4 |
||||
} |
||||
conf := GetConfigRobotRankRewardByRank(rankInfo.Rank) |
||||
if conf.Reward > 0 { |
||||
UpdateCurrencyPro(&common.UpdateCurrency{ |
||||
CurrencyBalance: &common.CurrencyBalance{ |
||||
UID: uid, |
||||
Event: common.CurrencyEventActivityShareRank, |
||||
Type: common.CurrencyINR, |
||||
Value: conf.Reward, |
||||
// NeedBet: GetConfigCurrencyResourceNeedBet(common.CurrencyResourceBonus, conf.Reward),
|
||||
}, |
||||
}) |
||||
SendMailWithContent(uid, SystemTitle, fmt.Sprintf(EmailShareRank, rankInfo.Rank, conf.Reward/common.DecimalDigits)) |
||||
} |
||||
} |
||||
|
||||
} |
||||
} |
||||
Loading…
Reference in new issue