125 lines
2.8 KiB
Go
125 lines
2.8 KiB
Go
|
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)
|
||
|
}
|
||
|
}
|