go-common/app/interface/main/push/service/callback.go

180 lines
4.5 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
package service
import (
"context"
"errors"
"strconv"
"strings"
"time"
"go-common/app/interface/main/push/dao"
"go-common/app/service/main/push/dao/huawei"
"go-common/app/service/main/push/dao/jpush"
"go-common/app/service/main/push/dao/mi"
"go-common/app/service/main/push/dao/oppo"
pushmdl "go-common/app/service/main/push/model"
"go-common/library/log"
)
func (s *Service) callbackproc() {
defer s.waiter.Done()
var data []*pushmdl.Callback
for {
v, ok := <-s.callbackCh
if !ok {
log.Info("callbackCh has been closed.")
if len(data) > 0 {
s.sendCallback(data)
}
return
}
data = append(data, v)
if len(data) >= s.c.Push.CallbackSize {
s.sendCallback(data)
data = []*pushmdl.Callback{}
}
}
}
func (s *Service) sendCallback(v []*pushmdl.Callback) (err error) {
for i := 0; i < 3; i++ {
if err = s.dao.PubCallback(context.TODO(), v); err == nil {
break
}
time.Sleep(20 * time.Millisecond)
}
return
}
func (s *Service) addCallbackChan(cb *pushmdl.Callback) (err error) {
if s.closed {
log.Warn("addCallbackChan, channel is closed")
return
}
select {
case s.callbackCh <- cb:
default:
err = errors.New("callbackCh full")
log.Error("callbackCh full. data(%+v)", cb)
dao.PromError("callbackCh full")
}
return
}
// CallbackXiaomiRegid xiaomi regid callback.
func (s *Service) CallbackXiaomiRegid(c context.Context, cb *mi.RegidCallback) (err error) {
// 小米token注册回调暂时没用
log.Info("s.CallbackXiaomiRegid(%+v)", cb)
return
}
// CallbackHuawei huawei callback.
func (s *Service) CallbackHuawei(c context.Context, hcb *huawei.Callback) (err error) {
for _, v := range hcb.Statuses {
log.Info("huawei callback task(%s) token(%s)", v.BiTag, v.Token)
appid, _ := strconv.ParseInt(v.AppID, 10, 64)
cb := &pushmdl.Callback{
Task: v.BiTag,
APP: appid,
Platform: pushmdl.PlatformHuawei,
Pid: pushmdl.MobiAndroid,
Token: v.Token,
Extra: &pushmdl.CallbackExtra{Status: v.Status},
}
s.addCallbackChan(cb)
}
return
}
// CallbackXiaomi xiaomi callback.
func (s *Service) CallbackXiaomi(c context.Context, m map[string]*mi.Callback) (err error) {
for _, v := range m {
log.Info("callback xiaomi task(%s)", v.Jobkey)
barStatus := mi.CallbackBarStatusEnable
if v.BarStatus == mi.CallbackBarStatusDisableStr {
barStatus = mi.CallbackBarStatusDisable
} else if v.BarStatus == mi.CallbackBarStatusUnknownStr {
barStatus = mi.CallbackBarStatusUnknown
}
sp := strings.Split(v.Targets, ",")
appid, _ := strconv.ParseInt(v.Param, 10, 64)
for _, t := range sp {
if t == "" {
continue
}
cb := &pushmdl.Callback{
Task: v.Jobkey,
APP: appid,
Platform: pushmdl.PlatformXiaomi,
Pid: pushmdl.MobiAndroid,
Token: t,
Extra: &pushmdl.CallbackExtra{Status: barStatus},
}
log.Info("xiaomi callback task(%s) token(%s)", v.Jobkey, t)
s.addCallbackChan(cb)
}
}
return
}
// CallbackOppo oppo callback.
func (s *Service) CallbackOppo(c context.Context, task string, cbs []*oppo.Callback) (err error) {
for _, v := range cbs {
for _, t := range strings.Split(v.Tokens, ",") {
log.Info("oppo callback task(%s) token(%s)", task, t)
cb := &pushmdl.Callback{
Task: task,
Platform: pushmdl.PlatformOppo,
Pid: pushmdl.MobiAndroid,
Token: t,
}
s.addCallbackChan(cb)
}
}
return
}
// CallbackJpush jpush callback batch.
func (s *Service) CallbackJpush(c context.Context, cbs []*jpush.CallbackReply) (err error) {
for _, cb := range cbs {
var (
task string
appid int64
)
if cb.Params != nil {
task = cb.Params["task"]
appid, _ = strconv.ParseInt(cb.Params["appid"], 10, 64)
}
log.Info("jpush callback task(%s) token(%s) channel(%d)", task, cb.Token, cb.Channel)
status := jpush.StatusSwitchOn
if !cb.Switch {
status = jpush.StatusSwitchOff
}
s.addCallbackChan(&pushmdl.Callback{
Task: task,
APP: appid,
Platform: pushmdl.PlatformJpush,
Pid: pushmdl.MobiAndroid,
Token: cb.Token,
Extra: &pushmdl.CallbackExtra{Status: status, Channel: cb.Channel},
})
}
return
}
// CallbackIOS ios arrived callback.
func (s *Service) CallbackIOS(c context.Context, task, token string, pid int) (err error) {
cb := &pushmdl.Callback{
Task: task,
Pid: pid,
Token: token,
}
err = s.addCallbackChan(cb)
return
}
// CallbackClick click callback.
func (s *Service) CallbackClick(c context.Context, cb *pushmdl.Callback) error {
return s.addCallbackChan(cb)
}