You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
2.8 KiB
124 lines
2.8 KiB
package service |
|
|
|
import ( |
|
"time" |
|
|
|
"go-common/library/log" |
|
) |
|
|
|
const ( |
|
_platIOS = "ios" |
|
_platAndroid = "android" |
|
_platAll = "" |
|
_vIPad = "ipad" |
|
_vIPhone = "iphone" |
|
_vAndroid = "android" |
|
_vAndroidB = "android_b" |
|
) |
|
|
|
func (s *Service) push(resIDs map[string]int64) { |
|
var ( |
|
now = time.Now().Unix() |
|
timeout = s.c.Cfg.Push.Timeout |
|
err error |
|
msg string |
|
) |
|
for resID, timeV := range resIDs { |
|
finish := false |
|
needPush := false |
|
// distinguish whether the resource is ready to push. calc finish or timeout |
|
if finish, err = s.pushDao.DiffFinish(ctx, resID); err != nil { // check whether diff cal finish |
|
continue |
|
} |
|
if now-timeV > timeout { // check whether it's already timeout |
|
needPush = true |
|
log.Info("CallPush [%v] Because of Timeout", resID) |
|
} else if finish { |
|
needPush = true |
|
log.Info("CallPush [%v] Because of DiffFinish", resID) |
|
} else { |
|
log.Info("CallPush Jump [%v]", resID) |
|
continue |
|
} |
|
// prepare api call |
|
if msg, err = s.pushDao.PushMsg(ctx, resID); err != nil { // prepare msg |
|
continue |
|
} |
|
if needPush { |
|
if err = s.pushDao.CallRefresh(ctx); err != nil { |
|
log.Error("CallPush [%d] app-resource refresh error [%v]", resID, err) |
|
continue |
|
} |
|
time.Sleep(time.Duration(s.c.Cfg.Push.Pause)) |
|
if err = s.pushDao.CallPush(ctx, s.platform(resID), msg, ""); err != nil { |
|
log.Error("CallPush [%v] Error [%v]", resID, err) |
|
continue |
|
} |
|
log.Info("CallPush [%v] Succ, Platform: %s, Delete Key", resID) |
|
if err = s.pushDao.ZRem(ctx, resID); err != nil { |
|
continue |
|
} |
|
} |
|
} |
|
} |
|
|
|
// distinguish the resource's platform info |
|
func (s *Service) platform(resID string) (platform string) { |
|
var ( |
|
err error |
|
ios, android bool |
|
mobiAPPs []string |
|
) |
|
platform = _platAll // default value |
|
if mobiAPPs, err = s.pushDao.Platform(ctx, resID); err != nil { |
|
return |
|
} |
|
for _, value := range mobiAPPs { |
|
switch value { |
|
case _vAndroid: |
|
android = true |
|
case _vAndroidB: |
|
android = true |
|
case _vIPad: |
|
ios = true |
|
case _vIPhone: |
|
ios = true |
|
default: |
|
log.Error("ResourceID %d, Limit Wrong Value %s", resID, value) |
|
} |
|
} |
|
if ios && !android { |
|
return _platIOS |
|
} |
|
if !ios && android { |
|
return _platAndroid |
|
} |
|
return // other case like all or none, just return the default value |
|
} |
|
|
|
func (s *Service) pushproc() { |
|
var ( |
|
resIDs map[string]int64 |
|
err error |
|
) |
|
defer s.waiter.Done() |
|
for { |
|
if s.daoClosed { |
|
log.Info("DB closed!") |
|
return |
|
} |
|
time.Sleep(time.Duration(s.c.Cfg.Push.Fre)) |
|
// pick to push resIDs from redis |
|
if resIDs, err = s.pushDao.ZrangeList(ctx); err != nil { |
|
log.Error("Get ToPush List Err %v", err) |
|
continue |
|
} |
|
if len(resIDs) == 0 { |
|
log.Info("No ToPush Data, Sleep") |
|
continue |
|
} |
|
// push the data |
|
log.Info("ToPush Treat Data: %d", len(resIDs)) |
|
s.push(resIDs) |
|
} |
|
}
|
|
|