Bläddra i källkod

签到、排行榜、邀请裂变功能开发

Administrator 8 månader sedan
förälder
incheckning
ab19d28ebb

+ 2 - 1
game/config/data/discreteRuleConfig.json

@@ -10,5 +10,6 @@
 		{"ID":9,"Reward":null,"Condition":"7"},
 		{"ID":10,"Reward":null,"Condition":"1"},
 		{"ID":11,"Reward":null,"Condition":"1"},
-		{"ID":12,"Reward":null,"Condition":"4,6"}	
+		{"ID":12,"Reward":null,"Condition":"4,6"},
+		{"ID":13,"Reward":null,"Condition":"0.1,500"}
 ]

+ 1 - 1
game/config/data/rankConfig.json

@@ -1,6 +1,6 @@
 [
 		{"ID":1,"Enable":1,"Type":1,"Source":1,"ShowTotal":100,"Reward":null,"IsBot":1,"StartTime":"","EndTime":"","ShowTime":""},
-		{"ID":2,"Enable":1,"Type":1,"Source":2,"ShowTotal":100,"Reward":null,"IsBot":1,"StartTime":"","EndTime":"","ShowTime":""},
+		{"ID":2,"Enable":1,"Type":1,"Source":2,"ShowTotal":500,"Reward":null,"IsBot":1,"StartTime":"","EndTime":"","ShowTime":""},
 		{"ID":3,"Enable":0,"Type":2,"Source":2,"ShowTotal":1000,"Reward":[{"itemBaseType":4,"itemID":3,"amount":500000000000}],"IsBot":1,"StartTime":"","EndTime":"","ShowTime":""},
 		{"ID":4,"Enable":1,"Type":1,"Source":3,"ShowTotal":100,"Reward":null,"IsBot":1,"StartTime":"","EndTime":"","ShowTime":""}	
 ]

+ 31 - 8
game/config/data/weeklySignInConfig.json

@@ -1,9 +1,32 @@
 [
-		{"ID":0,"Reward":null},
-		{"ID":1,"Reward":null},
-		{"ID":2,"Reward":null},
-		{"ID":3,"Reward":null},
-		{"ID":4,"Reward":null},
-		{"ID":5,"Reward":null},
-		{"ID":6,"Reward":null}	
-]
+  {"ID":0,"Reward":[{"itemBaseType":1,"itemID":5,"amount":5000}]},
+  {"ID":1,"Reward":[{"itemBaseType":1,"itemID":5,"amount":50000}]},
+  {"ID":2,"Reward":[{"itemBaseType":1,"itemID":5,"amount":200000}]},
+  {"ID":3,"Reward":[{"itemBaseType":1,"itemID":5,"amount":500000}]},
+  {"ID":4,"Reward":[{"itemBaseType":1,"itemID":5,"amount":1000000}]},
+  {"ID":5,"Reward":[{"itemBaseType":1,"itemID":5,"amount":2000000}]},
+  {"ID":6,"Reward":[{"itemBaseType":1,"itemID":5,"amount":3000000}]},
+  {"ID":7,"Reward":[{"itemBaseType":1,"itemID":5,"amount":4000000}]},
+  {"ID":8,"Reward":[{"itemBaseType":1,"itemID":5,"amount":5000000}]},
+  {"ID":9,"Reward":[{"itemBaseType":1,"itemID":5,"amount":5500000}]},
+  {"ID":10,"Reward":[{"itemBaseType":1,"itemID":5,"amount":6000000}]},
+  {"ID":11,"Reward":[{"itemBaseType":1,"itemID":5,"amount":8000000}]},
+  {"ID":12,"Reward":[{"itemBaseType":1,"itemID":5,"amount":10000000}]},
+  {"ID":13,"Reward":[{"itemBaseType":1,"itemID":5,"amount":15000000}]},
+  {"ID":14,"Reward":[{"itemBaseType":1,"itemID":5,"amount":30000000}]},
+  {"ID":15,"Reward":[{"itemBaseType":1,"itemID":5,"amount":35000000}]},
+  {"ID":16,"Reward":[{"itemBaseType":1,"itemID":5,"amount":40000000}]},
+  {"ID":17,"Reward":[{"itemBaseType":1,"itemID":5,"amount":50000000}]},
+  {"ID":18,"Reward":[{"itemBaseType":1,"itemID":5,"amount":60000000}]},
+  {"ID":19,"Reward":[{"itemBaseType":1,"itemID":5,"amount":100000000}]},
+  {"ID":20,"Reward":[{"itemBaseType":1,"itemID":5,"amount":130000000}]},
+  {"ID":21,"Reward":[{"itemBaseType":1,"itemID":5,"amount":140000000}]},
+  {"ID":22,"Reward":[{"itemBaseType":1,"itemID":5,"amount":150000000}]},
+  {"ID":23,"Reward":[{"itemBaseType":1,"itemID":5,"amount":200000000}]},
+  {"ID":24,"Reward":[{"itemBaseType":1,"itemID":5,"amount":220000000}]},
+  {"ID":25,"Reward":[{"itemBaseType":1,"itemID":5,"amount":250000000}]},
+  {"ID":26,"Reward":[{"itemBaseType":1,"itemID":5,"amount":300000000}]},
+  {"ID":27,"Reward":[{"itemBaseType":1,"itemID":5,"amount":350000000}]},
+  {"ID":28,"Reward":[{"itemBaseType":1,"itemID":5,"amount":400000000}]},
+  {"ID":29,"Reward":[{"itemBaseType":1,"itemID":5,"amount":500000000}]}
+]

+ 2 - 1
game/game_cluster/internal/constant/constant.go

@@ -10,7 +10,8 @@ const (
 	DrawDailyKey  = "drawDaily"
 	DrawWeeklyKey = "drawWeekly"
 
-	InviteKey = "Invite"
+	InviteKey      = "Invite"
+	InviteScoreKey = "InviteScore"
 
 	PlayerDailyKey      = "PlayerDaily"
 	PlayerStatHKey      = "PlayerStat"

+ 1 - 1
game/game_cluster/internal/data/weeklySignInConfig.go

@@ -12,7 +12,7 @@ type weeklySignInConfig struct {
 }
 
 type WeeklySignInConfigRow struct {
-	ID     int          // #周签到
+	ID     int          // #周签到
 	Reward []ItemReward // 奖励
 }
 

+ 29 - 1
game/game_cluster/internal/mdb/models/player.go

@@ -158,7 +158,7 @@ func (p *Player) InitDaily() {
 func (p *Player) InitWeekly() {
 	if !mhayaTime.CreateFromTimestamp(p.WeeklyRefreshTime).IsThisWeek() {
 
-		p.SinIn.RefreshSignIn()
+		//p.SinIn.RefreshSignIn()
 		// 刷新是否有排行榜奖励
 		p.RankReward.InitRank(p.UserName, 2)
 
@@ -166,6 +166,34 @@ func (p *Player) InitWeekly() {
 	}
 }
 
+func (p *Player) InitSignIn() {
+	ret := data.WeeklySignInConfig.GetAll()
+
+	// 最近一次签到
+	last, exists := p.SinIn.Sign[p.SinIn.Num]
+	if !exists {
+		// 签到数据初始化
+		p.SinIn.RefreshSignIn()
+		return
+	}
+
+	// 将时间戳转换为 time.Time 类型
+	t := time.Unix(last.SignTime, 0)
+
+	// todo 测试代码
+	// 减去一天
+	t = t.Add(-24 * time.Hour)
+
+	// 计算第二天的开始时间(即第二天的零点)
+	nextDayStart := t.Add(24 * time.Hour).Truncate(24 * time.Hour)
+
+	if p.SinIn.Num >= len(ret)-1 && time.Now().After(nextDayStart) {
+		// 签到周期满的第二天
+		p.SinIn.RefreshSignIn()
+	}
+
+}
+
 func (p *Player) InitAchieveTask() {
 	p.AchieveTask.RefreshAchieveTask()
 }

+ 7 - 4
game/game_cluster/internal/mdb/models/signin.go

@@ -1,9 +1,11 @@
 package models
 
-import "github.com/mhaya/game/game_cluster/internal/data"
+import (
+	"github.com/mhaya/game/game_cluster/internal/data"
+)
 
 type SignInBase struct {
-	ID       int               `json:"id"  bson:"id""`       // #周签到
+	ID       int               `json:"id"  bson:"id""`       // #周签到
 	Reward   []data.ItemReward `json:"reward" bson:"reward"` // 奖励
 	IsSign   int               `json:"isSign"  bson:"isSign"`
 	SignTime int64             `json:"signTime"  bson:"signTime"`
@@ -23,7 +25,7 @@ func NewSignIn() SignIn {
 	}
 }
 
-func (si SignIn) RefreshSignIn() {
+func (si *SignIn) RefreshSignIn() {
 	ret := data.WeeklySignInConfig.GetAll()
 	for _, d := range ret {
 		si.Sign[d.ID] = &SignInBase{
@@ -32,6 +34,7 @@ func (si SignIn) RefreshSignIn() {
 			IsSign:   0,
 			SignTime: 0,
 		}
-
 	}
+
+	si.Num = 0
 }

+ 5 - 0
game/game_cluster/internal/param/param.go

@@ -174,3 +174,8 @@ type SetPwdReq struct {
 	PassWord        string `json:"password" validate:"required"`
 	ConfirmPassWord string `json:"confirmPassword" validate:"required"`
 }
+
+type InviteRatioResp struct {
+	Ratio    float64 `json:"ratio"`
+	ClaimNum int     `json:"claimNUm"`
+}

+ 7 - 2
game/game_cluster/nodes/game/module/player/actor_player.go

@@ -63,10 +63,14 @@ func (p *actorPlayer) OnInit() {
 
 	p.Remote().Register("signIn", p.signIn) // 签到
 
+	p.Remote().Register("signInList", p.signInList) // 签到列表
+
 	p.Remote().Register("rank", p.rank) // 排行榜
 
-	p.Remote().Register("invite", p.invite)             // 邀请
-	p.Remote().Register("inviteRecord", p.inviteRecord) // 邀请累计信息
+	p.Remote().Register("invite", p.invite)                       // 邀请
+	p.Remote().Register("inviteRecord", p.inviteRecord)           // 邀请累计信息
+	p.Remote().Register("inviteRewardRatio", p.inviteRewardRatio) // 邀请裂变查询
+	p.Remote().Register("inviteClaimRatio", p.inviteClaimRatio)   // 领取邀请裂变奖励
 
 	p.Remote().Register("share", p.share) // 分享
 
@@ -474,6 +478,7 @@ func (p *actorPlayer) login(req *token.Token) (*models.Player, int32) {
 	p.Player.InitDaily()
 
 	p.Player.InitWeekly()
+	p.Player.InitSignIn()
 	p.Player.InitAchieveTask()
 
 	p.updPassWordTime()

+ 45 - 0
game/game_cluster/nodes/game/module/player/invite.go

@@ -10,6 +10,8 @@ import (
 	"github.com/mhaya/game/game_cluster/internal/mdb/models"
 	"github.com/mhaya/game/game_cluster/internal/param"
 	clog "github.com/mhaya/logger"
+	"strconv"
+	"strings"
 )
 
 func (p *actorPlayer) invite(req *param.InviteReq) int32 {
@@ -104,3 +106,46 @@ func (p *actorPlayer) inviteReward(req *param.InviteReq) (*int, int32) {
 
 	return &p.Player.IsLeader, code.OK
 }
+
+// 邀请裂变奖励
+func (p *actorPlayer) inviteRewardRatio() (*param.InviteRatioResp, int32) {
+	if !p.isOnline {
+		return nil, code.PlayerNotLogin
+	}
+
+	inviteReword, _ := data.DiscreteRuleConfig.Get(13)
+	split := strings.Split(inviteReword.Condition, ",")
+	ratio, _ := strconv.ParseFloat(split[0], 64)
+	minClaim, _ := strconv.Atoi(split[1])
+
+	key := fmt.Sprintf("%v:1:%v", constant.InviteScoreKey, p.Player.UserName)
+	claimScore, _ := mdb.RDB.Get(context.Background(), key).Int()
+	if claimScore < minClaim {
+		return nil, code.OK
+	}
+
+	return &param.InviteRatioResp{
+		Ratio:    ratio,
+		ClaimNum: claimScore,
+	}, code.OK
+}
+
+// 领取邀请裂变奖励
+func (p *actorPlayer) inviteClaimRatio() int32 {
+	if !p.isOnline {
+		return code.PlayerNotLogin
+	}
+
+	key := fmt.Sprintf("%v:1:%v", constant.InviteScoreKey, p.Player.UserName)
+
+	claimScore, err := mdb.RDB.Get(context.Background(), key).Int()
+	if err != nil {
+		return code.OK
+	}
+
+	beforeNum := p.Player.Item[models.ItemScore].Num
+	p.Player.Item[models.ItemScore].Num = beforeNum + claimScore
+
+	mdb.RDB.Del(context.Background(), key)
+	return code.OK
+}

+ 25 - 8
game/game_cluster/nodes/game/module/player/signin.go

@@ -1,8 +1,8 @@
 package player
 
 import (
-	mhayaTime "github.com/mhaya/extend/time"
 	"github.com/mhaya/game/game_cluster/internal/code"
+	"github.com/mhaya/game/game_cluster/internal/mdb/models"
 	"github.com/mhaya/game/game_cluster/internal/param"
 )
 
@@ -10,14 +10,31 @@ func (p *actorPlayer) signIn() (*param.ChangeData, int32) {
 	if !p.isOnline {
 		return nil, code.PlayerNotLogin
 	}
-	if !mhayaTime.CreateFromTimestamp(p.Player.SinIn.SignDailyTime).IsToday() {
-		resp := p.Player.SignIn()
-		p.dirty = true
 
-		p.itemStat(resp.AddItem)
+	// todo 测试代码
+	resp := p.Player.SignIn()
+	p.dirty = true
 
-		return resp, code.OK
-	} else {
-		return nil, code.PlayerSignInError
+	p.itemStat(resp.AddItem)
+
+	return resp, code.OK
+
+	// todo 正式代码
+	//if !mhayaTime.CreateFromTimestamp(p.Player.SinIn.SignDailyTime).IsToday() {
+	//	resp := p.Player.SignIn()
+	//	p.dirty = true
+	//
+	//	p.itemStat(resp.AddItem)
+	//
+	//	return resp, code.OK
+	//} else {
+	//	return nil, code.PlayerSignInError
+	//}
+}
+
+func (p *actorPlayer) signInList() (*models.SignIn, int32) {
+	if !p.isOnline {
+		return nil, code.PlayerNotLogin
 	}
+	return &p.Player.SinIn, code.OK
 }

+ 18 - 0
game/game_cluster/nodes/game/module/player/stat.go

@@ -1,10 +1,16 @@
 package player
 
 import (
+	"context"
+	"fmt"
 	mhayaTime "github.com/mhaya/extend/time"
 	"github.com/mhaya/game/game_cluster/internal/constant"
 	"github.com/mhaya/game/game_cluster/internal/data"
+	"github.com/mhaya/game/game_cluster/internal/mdb"
 	"github.com/mhaya/game/game_cluster/internal/mdb/models"
+	"math"
+	"strconv"
+	"strings"
 )
 
 // loginStat 登录相关
@@ -26,10 +32,13 @@ func (p *actorPlayer) rollStat() {
 }
 
 func (p *actorPlayer) itemStat(item map[int]*data.ItemReward) {
+
 	for _, v := range item {
 		if v.ItemID == models.ItemScore {
 			models.SetRank(constant.RankSourceScore, p.Player.IsRobot, p.Player.UserName, v.Amount)
 			models.SetDailyRecord(p.Account.Platform, p.Account.Channel, models.DailyRecordTotalPoints, v.Amount)
+			// 设置邀请人的每日奖励
+			p.inviteScore(v.Amount)
 		} else if v.ItemID == models.ItemU {
 			models.SetDailyRecord(p.Account.Platform, p.Account.Channel, models.DailyRecordUProduced, v.Amount)
 		}
@@ -43,3 +52,12 @@ func (p *actorPlayer) cashOutStat(num int) {
 func (p *actorPlayer) playerStart() {
 	models.SetTotalPlayerRecord(p.Account.Platform, p.Account.Channel, p.Player.UserName, p.Player.Level)
 }
+
+func (p *actorPlayer) inviteScore(num int) {
+	scoreRatio, _ := data.DiscreteRuleConfig.Get(13)
+	split := strings.Split(scoreRatio.Condition, ",")
+	ratio, _ := strconv.ParseFloat(split[0], 64)
+	inviteScore := math.Floor(float64(num) * ratio)
+	key := fmt.Sprintf("%v:1:%v", constant.InviteScoreKey, p.Player.Pid)
+	mdb.RDB.IncrBy(context.Background(), key, int64(inviteScore))
+}

+ 5 - 0
game/game_cluster/nodes/web/controller/controller.go

@@ -69,8 +69,13 @@ func (p *Controller) Init() {
 	group.POST("/getLotteryConfig", p.getLotteryConfig)
 
 	group.POST("/signIn", p.signIn)
+	group.POST("/signInList", p.signInList)
+
 	group.POST("/rank", p.rank)
 	group.POST("/invite", p.invite)
+	group.POST("/inviteRewardRatio", p.inviteRewardRatio)
+	group.POST("/inviteClaimRatio", p.inviteClaimRatio)
+
 	group.POST("/share", p.share)
 	group.POST("/claim", p.claim)
 

+ 49 - 0
game/game_cluster/nodes/web/controller/invite.go

@@ -41,3 +41,52 @@ func (p *Controller) invite(c *mhayaGin.Context) {
 	}
 	code.RenderResult(c, code.OK)
 }
+
+func (p *Controller) inviteRewardRatio(c *mhayaGin.Context) {
+
+	token, err := p.Auth(c)
+	if code.IsFail(err) {
+		mhayaLogger.Warnf("if inviteRewardRatio token err {. params=%s", c.GetHeader(constant.Token))
+		code.RenderResult(c, code.AccountTokenValidateFail)
+		return
+	}
+
+	ctl, ok := p.GetChildActor(token.PlayerID)
+	if !ok {
+		code.RenderResult(c, code.Error)
+		return
+	}
+
+	var resp = &param.InviteRatioResp{}
+	errCode := ctl.CallWait(token.TargetPath, "inviteRewardRatio", nil, resp)
+	if code.IsFail(errCode) {
+		mhayaLogger.Warnf("[inviteRewardRatio] param = %v, errCode = %v", errCode)
+		code.RenderResult(c, errCode)
+		return
+	}
+	code.RenderResult(c, code.OK, resp)
+}
+
+func (p *Controller) inviteClaimRatio(c *mhayaGin.Context) {
+
+	token, err := p.Auth(c)
+	if code.IsFail(err) {
+		mhayaLogger.Warnf("if inviteClaimRatio token err {. params=%s", c.GetHeader(constant.Token))
+		code.RenderResult(c, code.AccountTokenValidateFail)
+		return
+	}
+
+	ctl, ok := p.GetChildActor(token.PlayerID)
+	if !ok {
+		code.RenderResult(c, code.Error)
+		return
+	}
+
+	errCode := ctl.CallWait(token.TargetPath, "inviteClaimRatio", nil, nil)
+	if code.IsFail(errCode) {
+		mhayaLogger.Warnf("[inviteClaimRatio] param = %v, errCode = %v", errCode)
+		code.RenderResult(c, errCode)
+		return
+	}
+	code.RenderResult(c, code.OK, nil)
+}

+ 24 - 0
game/game_cluster/nodes/web/controller/signin.go

@@ -4,6 +4,7 @@ import (
 	mhayaGin "github.com/mhaya/components/gin"
 	"github.com/mhaya/game/game_cluster/internal/code"
 	"github.com/mhaya/game/game_cluster/internal/constant"
+	"github.com/mhaya/game/game_cluster/internal/mdb/models"
 	"github.com/mhaya/game/game_cluster/internal/param"
 	mhayaLogger "github.com/mhaya/logger"
 )
@@ -30,3 +31,26 @@ func (p *Controller) signIn(c *mhayaGin.Context) {
 	}
 	code.RenderResult(c, code.OK, resp)
 }
+
+func (p *Controller) signInList(c *mhayaGin.Context) {
+	token, err := p.Auth(c)
+	if code.IsFail(err) {
+		mhayaLogger.Warnf("if signIn token err {. params=%s", c.GetHeader(constant.Token))
+		code.RenderResult(c, code.AccountTokenValidateFail)
+		return
+	}
+
+	resp := &models.SignIn{}
+	ctl, ok := p.GetChildActor(token.PlayerID)
+	if !ok {
+		code.RenderResult(c, code.Error)
+		return
+	}
+	errCode := ctl.CallWait(token.TargetPath, "signInList", nil, resp)
+	if code.IsFail(errCode) {
+		mhayaLogger.Warnf("[signInList] param = nil, errCode = %v", errCode)
+		code.RenderResult(c, errCode)
+		return
+	}
+	code.RenderResult(c, code.OK, resp)
+}