diff --git a/server/wheelserver/api/v1/user/user.go b/server/wheelserver/api/v1/user/user.go index 2bdb8a6b..33f06be8 100644 --- a/server/wheelserver/api/v1/user/user.go +++ b/server/wheelserver/api/v1/user/user.go @@ -6,9 +6,9 @@ import ( "main/constant" "main/model" "main/mt" + "main/service" "main/vo" "q5" - "wheelserver/service" "github.com/gin-gonic/gin" ) @@ -24,13 +24,13 @@ func (this *UserApi) Login(c *gin.Context) { user := new(model.User) rspObj := struct { vo.BaseVo - UserInfo vo.User `json:"user_info"` - ServerTime int32 `json:"server_time"` + UserInfo vo.User `json:"user_info"` + ServerTime int32 `json:"server_time"` }{} nowTime := f5.GetApp().GetRealSeconds() rspObj.ServerTime = int32(nowTime) err, found := user.Find(s.GetAccountId(), nowTime) - if err != nil { + if err != nil { f5.RspErr(c, 500, "server internal error") return } else if !found { @@ -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() } @@ -75,7 +81,7 @@ func (this *UserApi) Info(c *gin.Context) { UserInfo vo.User `json:"user_info"` }{} nowTime := f5.GetApp().GetRealSeconds() - if err, found := user.Find(s.GetAccountId(), nowTime); err != nil { + if err, found := user.Find(s.GetAccountId(), nowTime); err != nil { f5.RspErr(c, 500, "server internal error") return } else if !found { @@ -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) +} diff --git a/server/wheelserver/model/chip.go b/server/wheelserver/model/chip.go index 72f7125b..ecedf4e2 100644 --- a/server/wheelserver/model/chip.go +++ b/server/wheelserver/model/chip.go @@ -6,13 +6,14 @@ import ( ) type Chip struct { - Idx int64 `gorm:"column:idx;AUTO_INCREMENT;primaryKey"` - AccountId string `gorm:"column:account_id"` - ItemId int32 `gorm:"column:item_id"` - ItemNum int32 `gorm:"column:item_num"` - ExpireTime int32 `gorm:"column:expiretime;<-:create"` - CreateTime int32 `gorm:"column:createtime;<-:create"` - ModifyTime int32 `gorm:"column:modifytime"` + Idx int64 `gorm:"column:idx;AUTO_INCREMENT;primaryKey"` + AccountId string `gorm:"column:account_id"` + 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"` } func (this *Chip) TableName() string { @@ -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 +} diff --git a/server/wheelserver/service/chip.go b/server/wheelserver/service/chip.go index 0b9b3e10..e21df65b 100644 --- a/server/wheelserver/service/chip.go +++ b/server/wheelserver/service/chip.go @@ -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" + 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) + } + } + }