189 lines
3.9 KiB
Go
189 lines
3.9 KiB
Go
package main
|
|
|
|
import (
|
|
"time"
|
|
|
|
"mongo.games.com/game/common"
|
|
"mongo.games.com/goserver/core/module"
|
|
)
|
|
|
|
var ClockMgrSington = &ClockMgr{
|
|
LastHour: -1,
|
|
LastDay: -1,
|
|
Notifying: false,
|
|
}
|
|
|
|
const (
|
|
CLOCK_EVENT_SECOND int = iota
|
|
CLOCK_EVENT_MINUTE
|
|
CLOCK_EVENT_HOUR
|
|
CLOCK_EVENT_DAY
|
|
CLOCK_EVENT_WEEK
|
|
CLOCK_EVENT_MONTH
|
|
CLOCK_EVENT_SHUTDOWN
|
|
CLOCK_EVENT_MAX
|
|
)
|
|
|
|
type ClockSinker interface {
|
|
InterestClockEvent() int
|
|
OnSecTimer()
|
|
OnMiniTimer()
|
|
OnHourTimer()
|
|
OnDayTimer()
|
|
OnWeekTimer()
|
|
OnMonthTimer()
|
|
OnShutdown()
|
|
}
|
|
|
|
type BaseClockSinker struct {
|
|
}
|
|
|
|
func (s *BaseClockSinker) InterestClockEvent() int { return (1 << CLOCK_EVENT_MAX) - 1 }
|
|
func (s *BaseClockSinker) OnSecTimer() {}
|
|
func (s *BaseClockSinker) OnMiniTimer() {}
|
|
func (s *BaseClockSinker) OnHourTimer() {}
|
|
func (s *BaseClockSinker) OnDayTimer() {}
|
|
func (s *BaseClockSinker) OnWeekTimer() {}
|
|
func (s *BaseClockSinker) OnMonthTimer() {}
|
|
func (s *BaseClockSinker) OnShutdown() {}
|
|
|
|
type ClockMgr struct {
|
|
sinkers [CLOCK_EVENT_MAX][]ClockSinker
|
|
LastTickTime time.Time
|
|
LastMonth time.Month
|
|
LastWeek int
|
|
LastDay int
|
|
LastHour int
|
|
LastMini int
|
|
LastSec int
|
|
Notifying bool
|
|
LastFiveMin int
|
|
}
|
|
|
|
func (this *ClockMgr) RegisteSinker(sinker ClockSinker) {
|
|
interest := sinker.InterestClockEvent()
|
|
for i := 0; i < CLOCK_EVENT_MAX; i++ {
|
|
if (1<<i)&interest != 0 {
|
|
found := false
|
|
ss := this.sinkers[i]
|
|
for _, s := range ss {
|
|
if s == sinker {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
if !found {
|
|
this.sinkers[i] = append(this.sinkers[i], sinker)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func (this *ClockMgr) ModuleName() string {
|
|
return "ClockMgr"
|
|
}
|
|
|
|
func (this *ClockMgr) Init() {
|
|
tNow := time.Now().Local()
|
|
this.LastTickTime = tNow
|
|
_, this.LastMonth, this.LastDay = tNow.Date()
|
|
this.LastHour, this.LastMini, this.LastSec = tNow.Hour(), tNow.Minute(), tNow.Second()
|
|
_, this.LastWeek = tNow.ISOWeek()
|
|
this.LastFiveMin = -1
|
|
}
|
|
|
|
func (this *ClockMgr) Update() {
|
|
tNow := time.Now().Local()
|
|
this.LastTickTime = tNow
|
|
sec := tNow.Second()
|
|
if sec != this.LastSec {
|
|
this.LastSec = sec
|
|
this.fireSecondEvent()
|
|
|
|
min := tNow.Minute()
|
|
if min != this.LastMini {
|
|
this.LastMini = min
|
|
this.fireMinuteEvent()
|
|
|
|
hour := tNow.Hour()
|
|
if hour != this.LastHour {
|
|
this.LastHour = hour
|
|
this.fireHourEvent()
|
|
|
|
day := tNow.Day()
|
|
if day != this.LastDay {
|
|
this.LastDay = day
|
|
this.fireDayEvent()
|
|
|
|
week := common.GetWeekStartTs(tNow.Unix())
|
|
if week != int64(this.LastWeek) {
|
|
this.LastWeek = int(week)
|
|
this.fireWeekEvent()
|
|
}
|
|
|
|
month := tNow.Month()
|
|
if month != this.LastMonth {
|
|
this.LastMonth = month
|
|
this.fireMonthEvent()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func (this *ClockMgr) Shutdown() {
|
|
this.fireShutdownEvent()
|
|
module.UnregisteModule(this)
|
|
}
|
|
|
|
func (this *ClockMgr) fireSecondEvent() {
|
|
for _, s := range this.sinkers[CLOCK_EVENT_SECOND] {
|
|
s.OnSecTimer()
|
|
}
|
|
}
|
|
|
|
func (this *ClockMgr) fireMinuteEvent() {
|
|
for _, s := range this.sinkers[CLOCK_EVENT_MINUTE] {
|
|
s.OnMiniTimer()
|
|
}
|
|
}
|
|
|
|
func (this *ClockMgr) fireHourEvent() {
|
|
for _, s := range this.sinkers[CLOCK_EVENT_HOUR] {
|
|
s.OnHourTimer()
|
|
}
|
|
}
|
|
|
|
func (this *ClockMgr) fireDayEvent() {
|
|
for _, s := range this.sinkers[CLOCK_EVENT_DAY] {
|
|
s.OnDayTimer()
|
|
}
|
|
}
|
|
|
|
func (this *ClockMgr) fireWeekEvent() {
|
|
for _, s := range this.sinkers[CLOCK_EVENT_WEEK] {
|
|
s.OnWeekTimer()
|
|
}
|
|
}
|
|
|
|
func (this *ClockMgr) fireMonthEvent() {
|
|
for _, s := range this.sinkers[CLOCK_EVENT_MONTH] {
|
|
s.OnMonthTimer()
|
|
}
|
|
}
|
|
|
|
func (this *ClockMgr) fireShutdownEvent() {
|
|
for _, s := range this.sinkers[CLOCK_EVENT_SHUTDOWN] {
|
|
s.OnShutdown()
|
|
}
|
|
}
|
|
|
|
func (this *ClockMgr) GetLast() (int, int, int, int, int, int) {
|
|
return this.LastSec, this.LastMini, this.LastHour, this.LastDay, this.LastWeek, int(this.LastMonth)
|
|
}
|
|
|
|
func init() {
|
|
module.RegisteModule(ClockMgrSington, time.Millisecond*500, 0)
|
|
}
|