| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- package signin
- import (
- "fmt"
- "bet24.com/log"
- "bet24.com/servers/common"
- inventory "bet24.com/servers/micros/item_inventory/proto"
- item "bet24.com/servers/micros/item_inventory/proto"
- vip "bet24.com/servers/micros/userservices/proto"
- )
- type userSignin struct {
- userId int
- signinList []Signin
- continueAward []*ContinueAward
- }
- func newUserSignin(userId int) *userSignin {
- us := new(userSignin)
- us.userId = userId
- us.loadSigninInfo()
- return us
- }
- func (us *userSignin) loadSigninInfo() {
- // 从数据库读取签到信息
- //1、签到列表
- signlist := userSignList(us.userId)
- for _, v := range mgr.getSignList() {
- signTime := 0
- for _, s := range signlist {
- if v.Id == s.Id {
- signTime = s.SignTime
- break
- }
- }
- us.signinList = append(us.signinList, Signin{
- Id: v.Id,
- Award: v.Award,
- DoubleVipLevel: v.DoubleVipLevel,
- SignTime: signTime,
- })
- }
- //2、连续签到奖励
- awardlist := userContinueSignList(us.userId)
- for _, v := range mgr.getContinueAwardList() {
- status := 0
- for _, s := range awardlist {
- if v.Day == s.Day {
- status = s.Status
- break
- }
- }
- us.continueAward = append(us.continueAward, &ContinueAward{
- Day: v.Day,
- Award: v.Award,
- Status: status,
- })
- }
- us.checkFinishSequence()
- }
- // 检查是否重新开启新一轮签到
- func (us *userSignin) checkFinishSequence() {
- count := len(us.signinList)
- if count == 0 {
- return
- }
- if us.signinList[count-1].SignTime == 0 {
- return
- }
- lastSignTime := us.signinList[count-1].SignTime
- now := common.GetTimeStamp()
- if common.IsSameDay(lastSignTime, now) {
- return
- }
- // 一轮结束,连续签到也清零
- us.signinList = mgr.getSignList()
- us.continueAward = mgr.getContinueAwardList()
- go us.updateSigninAll()
- go us.updateContinueAwardAll()
- }
- // 签到
- func (us *userSignin) signin() (bool, []item.ItemPack) {
- var items []item.ItemPack
- if len(us.signinList) == 0 {
- return false, items
- }
- signin := us.getCurrentSignin()
- if signin == nil {
- return false, items
- }
- signin.SignTime = common.GetTimeStamp()
- us.checkContinue()
- us.sendAward(signin.Award, fmt.Sprintf("签到ID:[%d]", signin.Id))
- items = append(items, signin.Award...)
- vipLevel := 0
- userVip := vip.GetUserVipInfo(us.userId)
- if userVip != nil && userVip.IsVip() {
- vipLevel = userVip.Level
- }
- if vipLevel >= signin.DoubleVipLevel && signin.DoubleVipLevel > 0 {
- us.sendAward(signin.Award, fmt.Sprintf("签到ID:[%d] vip doubled", signin.Id))
- items = append(items, signin.Award...)
- }
- us.updateSignin(signin.Id, signin.SignTime)
- return true, items
- }
- // 领取连续签到奖励
- func (us *userSignin) giftContinueAward(day int) (bool, []item.ItemPack) {
- var items []item.ItemPack
- if len(us.continueAward) <= 0 {
- return false, items
- }
- for _, v := range us.continueAward {
- if v.Day != day {
- continue
- }
- if v.Status != status_completed {
- return false, nil
- }
- // 设置为领取状态
- v.Status = status_received
- us.updateContinueAward(v.Day, v.Status)
- // 发放奖励
- us.sendAward(v.Award, fmt.Sprintf("连续签到[%d]天", v.Day))
- return true, v.Award
- }
- return false, nil
- }
- func (us *userSignin) calContinueDay() int {
- ret := 0
- count := len(us.signinList)
- lastSignTime := 0
- for i := count - 1; i >= 0; i-- {
- if us.signinList[i].SignTime == 0 {
- continue
- }
- if lastSignTime == 0 {
- lastSignTime = us.signinList[i].SignTime
- ret = 1
- continue
- }
- if !common.IsContinueDay(lastSignTime, us.signinList[i].SignTime) {
- return ret
- }
- ret++
- }
- return ret
- }
- func (us *userSignin) getLastSignTime() int {
- count := len(us.signinList)
- for i := count - 1; i >= 0; i-- {
- if us.signinList[i].SignTime != 0 {
- return us.signinList[i].SignTime
- }
- }
- return 0
- }
- func (us *userSignin) getCurrentSignin() *Signin {
- count := len(us.signinList)
- lastSignTime := 0
- lastSignIndex := -1
- for i := count - 1; i >= 0; i-- {
- if us.signinList[i].SignTime != 0 {
- lastSignIndex = i
- lastSignTime = us.signinList[i].SignTime
- break
- }
- }
- if lastSignIndex == count-1 {
- log.Debug("userSignin.getCurrentSignin [%d] sequence has done", us.userId)
- return nil
- }
- // 当日已签到?
- if lastSignTime > 0 {
- now := common.GetTimeStamp()
- if common.IsSameDay(lastSignTime, now) {
- log.Debug("userSignin.signin [%d] has signed today", us.userId)
- return nil
- }
- }
- return &us.signinList[lastSignIndex+1]
- }
- func (us *userSignin) getContinueDay() int {
- continueDay := 1
- count := len(us.signinList)
- if count == 0 {
- return continueDay
- }
- now := common.GetTimeStamp()
- lastSignTime := 0
- for i := count - 1; i > 0; i-- {
- if us.signinList[i].SignTime == 0 {
- continue
- }
- if lastSignTime == 0 {
- lastSignTime = us.signinList[i].SignTime
- // 是否当天或者第二天
- if !common.IsSameDay(lastSignTime, now) && !common.IsContinueDay(lastSignTime, now) {
- return 0
- }
- }
- if common.IsContinueDay(us.signinList[i].SignTime, us.signinList[i-1].SignTime) {
- continueDay++
- } else {
- break
- }
- }
- if lastSignTime == 0 {
- lastSignTime = us.signinList[0].SignTime
- }
- if lastSignTime == 0 {
- continueDay = 0
- }
- return continueDay
- }
- // 当日已签到,检查是否触发连续签到
- func (us *userSignin) checkContinue() {
- if len(us.continueAward) == 0 {
- return
- }
- continueDay := us.getContinueDay()
- for _, v := range us.continueAward {
- if v.Status != status_idle {
- continue
- }
- if continueDay < v.Day {
- continue
- }
- //完成
- v.Status = status_completed
- us.updateContinueAward(v.Day, v.Status)
- }
- return
- }
- func (us *userSignin) sendAward(items []item.ItemPack, desc string) {
- inventory.AddItems(us.userId, items, desc, common.LOGTYPE_SEND_SIGN)
- }
- func (us *userSignin) updateSigninAll() {
- for _, v := range us.signinList {
- us.updateSignin(v.Id, v.SignTime)
- }
- }
- func (us *userSignin) updateSignin(id, signTime int) {
- updateUserSign(us.userId, id, signTime)
- }
- func (us *userSignin) updateContinueAwardAll() {
- for _, v := range us.continueAward {
- us.updateContinueAward(v.Day, status_idle)
- }
- }
- func (us *userSignin) updateContinueAward(day, status int) {
- updateUserSignContinue(us.userId, day, status)
- }
- func (us *userSignin) getSigninInfo() *SigninInfo {
- signin := us.getCurrentSignin()
- return &SigninInfo{
- SigninTable: us.signinList,
- Continue: us.continueAward,
- Signable: signin != nil,
- ContinueDay: us.getContinueDay(),
- }
- }
- func (us *userSignin) checkSignTip() bool {
- sign := us.getCurrentSignin()
- return sign != nil
- }
|