package signIn import ( capp "f1-game/internal/cherry_app" "f1-game/internal/code" "f1-game/internal/data" "f1-game/internal/facade" nameRoute "f1-game/internal/name/route" "f1-game/internal/sessions" "f1-game/nodes/map/internal/db" "time" ctime "github.com/cherry-game/cherry/extend/time" cproto "github.com/cherry-game/cherry/net/proto" ) const ( maxReSignInDays int32 = 1 ) func Service() *service { return &service{} } type service struct { facade.PlayerServiceBase[*db.MapPlayerTable] } func (p *service) OnLogin(playerTable *db.MapPlayerTable, session *cproto.Session) { // 刷新库ID p.refreshPoolID(playerTable) } func (p *service) OnReset(playerTable *db.MapPlayerTable, time *ctime.CherryTime, byLogin bool) { if !playerTable.Stats.IsCanReset() { return } // 检测刷新库ID p.refreshPoolID(playerTable) // 重置每日补签次数 playerTable.SignIn.ReSignInCount = 0 playerTable.Save2Queue() if !byLogin { p.ChangePush(playerTable) } } func (p *service) Push(playerTable *db.MapPlayerTable, session *cproto.Session) { resp := playerTable.SignIn.ToProto() // 获取当前签到天数 resp.CurrentSignInDays = p.GetCurrentDay(playerTable) sessions.PushWithSession(session, nameRoute.PushMapPlayer_SignIn, resp) } func (p *service) ChangePush(playerTable *db.MapPlayerTable) { session, found := sessions.GetSession(playerTable.PlayerID) if !found { return } p.Push(playerTable, session) } func (p *service) getOpenServerDays() int32 { nodeTable, found := db.GetMapNodeTable(capp.NodeID()) if !found || nodeTable.FirstStartTime <= 0 { return 1 } var ( now = ctime.Now() firstTime = ctime.NewTime(time.UnixMilli(nodeTable.FirstStartTime), false).StartOfDay() ) openDays := firstTime.DiffInDaysWithAbs(&now) openDays = openDays + 1 if openDays <= 0 { return 1 } return int32(openDays) } // 刷新签到库 func (p *service) refreshPoolID(playerTable *db.MapPlayerTable) { var ( openDays = p.getOpenServerDays() round, currentPoolID = data.SignIn.GetCurrentPoolID(openDays) ) // 当前签到轮次和库无变更 不需要更新 if round == playerTable.SignIn.Round && currentPoolID == playerTable.SignIn.PoolID { return } // 更新签到库ID&重置已签到天数 playerTable.SignIn.Round = round playerTable.SignIn.PoolID = currentPoolID playerTable.SignIn.SignInDays.Clear() playerTable.Save2Queue() } // 获取当前签到天数 func (p *service) GetCurrentDay(playerTable *db.MapPlayerTable) int32 { // 获取当前签到天数 openDays := p.getOpenServerDays() return data.SignIn.GetCurrenSignInDays(openDays) } // 检测是否可以补签 // curReSignInDay 当前补签天数 // canReSignInDays 可以补签的天数 func (p *service) CheckCanReSignIn(playerTable *db.MapPlayerTable, curReSignInDay, canReSignInDays int32) int32 { poolID := playerTable.SignIn.PoolID if poolID <= 0 { return code.IllegalArgument } list, found := data.SignIn.ListByPoolID(poolID) if !found { return code.SignInPoolNotFound } for _, row := range list { if !playerTable.SignIn.HasSignedIn(row.Days) { canReSignInDays-- if row.Days == curReSignInDay { return code.OK } // 如果满足补签天数用完,说明当前补签的天数不符合 if canReSignInDays <= 0 { return code.SignInReSignNotCan } } } return code.SignInNoMissedDays }