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" 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.NewMillisecond(nodeTable.FirstStartTime).StartOfDay() ) openDays := firstTime.DiffInDaysWithAbs(&now) return int32(openDays) + 1 } // 刷新签到库 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) } // 获取第一个可补签的天数 func (p *service) GetFirstMissSignInDays(playerTable *db.MapPlayerTable) (int32, int32) { poolID := playerTable.SignIn.PoolID if poolID <= 0 { return 0, code.IllegalArgument } list, found := data.SignIn.ListByPoolID(poolID) if !found { return 0, code.SignInPoolNotFound } for _, row := range list { if !playerTable.SignIn.HasSignedIn(row.Days) { return row.Days, code.OK } } return 0, code.SignInNoMissedDays }