auto hour earning
This commit is contained in:
parent
361d2d76bc
commit
9c5c6e5281
@ -6,9 +6,9 @@ import (
|
||||
"main/constant"
|
||||
"main/model"
|
||||
"main/mt"
|
||||
"main/service"
|
||||
"main/vo"
|
||||
"q5"
|
||||
"wheelserver/service"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
@ -52,7 +52,13 @@ func (this *UserApi) Login(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
f5.GetMsgQueue().FireEvent(constant.MSG_CREATE_USER, q5.Args{user})
|
||||
} else {
|
||||
earning := service.Chip.CalcScore(s.GetAccountId())
|
||||
if earning > 0 {
|
||||
user.AddScore(earning)
|
||||
}
|
||||
}
|
||||
|
||||
if user.NickName != s.GetNickName() {
|
||||
user.UpdateName()
|
||||
}
|
||||
@ -86,3 +92,34 @@ func (this *UserApi) Info(c *gin.Context) {
|
||||
rspObj.UserInfo.HourlyEarnings = service.Chip.GetHourEarning(user.AccountId)
|
||||
c.JSON(200, rspObj)
|
||||
}
|
||||
|
||||
func (this *UserApi) ClaimEarning(c *gin.Context) {
|
||||
s := c.MustGet(constant.SESSION_KEY).(common.Session)
|
||||
if s == nil {
|
||||
return
|
||||
}
|
||||
|
||||
rspObj := struct {
|
||||
vo.BaseVo
|
||||
Earning int32 `json:"earning"`
|
||||
Score int64 `json:"score"`
|
||||
}{}
|
||||
|
||||
rspObj.Earning = service.Chip.CalcScore(s.GetAccountId())
|
||||
if rspObj.Earning > 0 {
|
||||
user := new(model.User)
|
||||
nowTime := f5.GetApp().GetRealSeconds()
|
||||
if err, found := user.Find(s.GetAccountId(), nowTime); err != nil {
|
||||
f5.RspErr(c, 500, "server internal error")
|
||||
return
|
||||
} else if !found {
|
||||
f5.RspErr(c, 1, "server internal error")
|
||||
return
|
||||
}
|
||||
|
||||
user.AddScore(rspObj.Earning)
|
||||
rspObj.Score = user.Score
|
||||
}
|
||||
|
||||
c.JSON(200, rspObj)
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ type Chip struct {
|
||||
ItemId int32 `gorm:"column:item_id"`
|
||||
ItemNum int32 `gorm:"column:item_num"`
|
||||
ExpireTime int32 `gorm:"column:expiretime;<-:create"`
|
||||
CalcTime int32 `gorm:"column:calc_time"`
|
||||
CreateTime int32 `gorm:"column:createtime;<-:create"`
|
||||
ModifyTime int32 `gorm:"column:modifytime"`
|
||||
}
|
||||
@ -25,3 +26,11 @@ func (this *Chip) Create() error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *Chip) UpdateCalcTime() error {
|
||||
if result := f5.GetApp().GetOrmDb(constant.WHEEL_DB).Model(this).Select(
|
||||
"calc_time", "modifytime").Updates(this); result.Error != nil {
|
||||
return result.Error
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@ -6,13 +6,16 @@ import (
|
||||
"main/model"
|
||||
"main/mt"
|
||||
"q5"
|
||||
"time"
|
||||
)
|
||||
|
||||
type chip struct {
|
||||
|
||||
earningUsers *q5.ConcurrentMap[string, int64] //[accountid, loginTime]
|
||||
}
|
||||
|
||||
func (this *chip) init() {
|
||||
this.earningUsers = new(q5.ConcurrentMap[string, int64])
|
||||
go this.checkEarningLoop()
|
||||
}
|
||||
|
||||
func (this *chip) unInit() {
|
||||
@ -26,14 +29,43 @@ func (this *chip) List(accountId string) (error, []*model.Chip) {
|
||||
return result.Error, chips
|
||||
}
|
||||
|
||||
func (this *chip) CalcScore(accountId string) {
|
||||
//nowTime := f5.GetApp().GetRealSeconds()
|
||||
func (this *chip) CalcScore(accountId string) int32 {
|
||||
chips := []*model.Chip{}
|
||||
result := f5.GetApp().GetOrmDb(constant.WHEEL_DB).Table(new(model.Chip).TableName()).Where(
|
||||
"account_id = ? AND expiretime > calc_time", accountId).Find(&chips)
|
||||
"account_id = ? AND expiretime > calc_time + createtime", accountId).Find(&chips)
|
||||
if result.Error == nil {
|
||||
|
||||
var earningscore int32 = 0
|
||||
nowtime := int32(f5.GetApp().GetRealSeconds())
|
||||
for _, chipitem := range chips {
|
||||
itemcfg := mt.Table.Item.GetById(int64(chipitem.ItemId))
|
||||
if itemcfg == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
var eclapse int32 = 0
|
||||
if nowtime < chipitem.ExpireTime {
|
||||
if nowtime > chipitem.CreateTime+chipitem.CalcTime {
|
||||
eclapse = nowtime - chipitem.CreateTime - chipitem.CalcTime
|
||||
}
|
||||
} else {
|
||||
if chipitem.CalcTime < itemcfg.GetTime() {
|
||||
eclapse = itemcfg.GetTime() - chipitem.CalcTime
|
||||
}
|
||||
}
|
||||
|
||||
itemearning := (eclapse / 3600) * itemcfg.GetProduce() / (itemcfg.GetTime() / int32(60))
|
||||
if itemearning > 0 {
|
||||
earningscore += itemearning
|
||||
chipitem.CalcTime += eclapse / 3600 * 3600
|
||||
chipitem.ModifyTime = nowtime
|
||||
chipitem.UpdateCalcTime()
|
||||
}
|
||||
}
|
||||
|
||||
return earningscore
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
func (this *chip) GetHourEarning(accountId string) string {
|
||||
@ -44,7 +76,38 @@ func (this *chip) GetHourEarning(accountId string) string {
|
||||
itemcfg := mt.Table.Item.GetById(int64(chipitem.ItemId))
|
||||
earnings += itemcfg.GetProduce() / (itemcfg.GetTime() / int32(60))
|
||||
}
|
||||
|
||||
if earnings > 0 {
|
||||
this.earningUsers.Store(accountId, f5.GetApp().GetRealSeconds())
|
||||
}
|
||||
return q5.SafeToString(earnings)
|
||||
}
|
||||
return "0"
|
||||
}
|
||||
|
||||
func (this *chip) checkEarningLoop() {
|
||||
for {
|
||||
time.Sleep(time.Hour)
|
||||
nowtime := f5.GetApp().GetRealSeconds()
|
||||
deletelist := map[string]int32{}
|
||||
this.earningUsers.Range(func(accountId string, lastlogin int64) bool {
|
||||
if q5.GetDaySeconds(nowtime, 0) == q5.GetDaySeconds(lastlogin, 0) {
|
||||
user := new(model.User)
|
||||
err, found := user.Find(accountId, nowtime)
|
||||
if err == nil && found {
|
||||
userearning := this.CalcScore(accountId)
|
||||
user.AddScore(userearning)
|
||||
}
|
||||
} else {
|
||||
deletelist[accountId] = 0
|
||||
}
|
||||
|
||||
return true
|
||||
})
|
||||
|
||||
for accoutid := range deletelist {
|
||||
this.earningUsers.Delete(accoutid)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user