bilibili-backup/app/service/main/push/dao/client.go

197 lines
5.4 KiB
Go
Raw Normal View History

2019-04-22 10:59:20 +08:00
package dao
import (
"context"
"crypto/tls"
"errors"
"time"
"go-common/app/service/main/push/dao/apns2"
"go-common/app/service/main/push/dao/fcm"
"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"
"go-common/app/service/main/push/model"
"go-common/library/conf/env"
"go-common/library/log"
)
var errNoClinets = errors.New("no clients")
func (d *Dao) loadClients() {
var cnt int
for cnt < 3 {
auths, err := d.auths(context.Background())
if err != nil {
log.Error("d.auths() error(%v)", err)
time.Sleep(time.Second)
cnt++
continue
}
if len(auths) == 0 {
return
}
for _, a := range auths {
log.Info("new push client. app(%d) platform(%d)", a.APPID, a.PlatformID)
i := fmtRoundIndex(a.APPID, a.PlatformID)
d.clientsIndex[i] = new(uint32)
switch a.PlatformID {
case model.PlatformIPhone:
d.clientsIPhone[a.APPID] = d.newApnsClients(model.PlatformIPhone, a.Value, a.Key, a.BundleID)
d.clientsLen[i] = len(d.clientsIPhone[a.APPID])
case model.PlatformIPad:
d.clientsIPad[a.APPID] = d.newApnsClients(model.PlatformIPad, a.Value, a.Key, a.BundleID)
d.clientsLen[i] = len(d.clientsIPad[a.APPID])
case model.PlatformHuawei:
cs := d.newHuaweiClients(a.APPID, a.BundleID)
if len(cs) > 0 {
d.clientsHuawei[a.APPID] = cs
d.clientsLen[i] = len(d.clientsHuawei)
}
case model.PlatformOppo:
cs := d.newOppoClients(a.APPID, a.BundleID)
if len(cs) > 0 {
d.clientsOppo[a.APPID] = cs
d.clientsLen[i] = len(d.clientsOppo)
}
case model.PlatformXiaomi:
d.clientsMi[a.APPID] = d.newMiClients(a.Key, a.Value)
d.clientsLen[i] = len(d.clientsMi[a.APPID])
d.clientMiByMids[a.APPID] = d.newMiClientByMids(a.Key, a.Value)
case model.PlatformJpush:
d.clientsJpush[a.APPID] = d.newJpushClients(a.Key, a.Value)
d.clientsLen[i] = len(d.clientsJpush[a.APPID])
case model.PlatformFCM:
d.clientsFCM[a.APPID] = d.newFcmClients(a.Key)
d.clientsLen[i] = len(d.clientsFCM[a.APPID])
default:
log.Warn("unknown platform (%+v)", a)
}
}
return
}
}
func (d *Dao) newMiClients(pkg, auth string) (cs []*mi.Client) {
for i := 0; i < d.c.Android.PoolSize; i++ {
c := mi.NewClient(pkg, auth, time.Duration(d.c.Android.Timeout))
if env.DeployEnv == env.DeployEnvDev {
c.SetDevelopmentURL(mi.RegURL)
} else {
if d.c.Android.MiUseVip == model.SwitchOn {
c.SetVipURL(mi.RegURL)
} else {
c.SetProductionURL(mi.RegURL)
}
}
cs = append(cs, c)
}
return
}
func (d *Dao) newMiClientByMids(pkg, auth string) (c *mi.Client) {
c = mi.NewClient(pkg, auth, time.Duration(d.c.Android.Timeout))
if env.DeployEnv == env.DeployEnvDev {
c.SetDevelopmentURL(mi.AccountURL)
} else {
if d.c.Android.MiUseVip == model.SwitchOn {
c.SetVipURL(mi.RegURL)
} else {
c.SetProductionURL(mi.RegURL)
}
}
return
}
func (d *Dao) newApnsClients(platform int, cert, key, bundleID string) (res []*apns2.Client) {
var (
err error
certificate tls.Certificate
)
if certificate, err = tls.X509KeyPair([]byte(cert), []byte(key)); err != nil {
log.Error("tls.X509KeyPair(%s,%s) error(%v)", cert, key, err)
PromError("client:加载证书")
return
}
poolSize := d.c.Apns.PoolSize
if platform == model.PlatformIPad {
poolSize /= 5 // iPad量少只有iPhone的不到20%
}
for i := 0; i < poolSize; i++ {
var c *apns2.Client
if env.DeployEnv == env.DeployEnvDev {
if d.c.Apns.Proxy == model.SwitchOn {
c = apns2.NewClientWithProxy(certificate, time.Duration(d.c.Apns.Timeout), d.c.Apns.ProxySocket).Development()
} else {
c = apns2.NewClient(certificate, time.Duration(d.c.Apns.Timeout)).Development()
}
} else {
if d.c.Apns.Proxy == model.SwitchOn {
c = apns2.NewClientWithProxy(certificate, time.Duration(d.c.Apns.Timeout), d.c.Apns.ProxySocket).Production()
} else {
c = apns2.NewClient(certificate, time.Duration(d.c.Apns.Timeout)).Production()
}
}
c.BoundID = bundleID
res = append(res, c)
}
return
}
func (d *Dao) newHuaweiClients(appid int64, pkg string) (cs []*huawei.Client) {
retry := _retry
for retry > 0 {
if d.huaweiAuth[appid] != nil {
break
}
retry--
log.Info("retry huawei auth (%d)", retry)
time.Sleep(3 * time.Second)
}
if d.huaweiAuth[appid] == nil {
log.Error("no huawei auth app(%d)", appid)
return
}
for i := 0; i < d.c.Android.PoolSize; i++ {
c := huawei.NewClient(pkg, d.huaweiAuth[appid], time.Duration(d.c.Android.Timeout))
cs = append(cs, c)
}
return
}
func (d *Dao) newOppoClients(appid int64, activity string) (cs []*oppo.Client) {
retry := _retry
for retry > 0 {
if d.oppoAuth[appid] != nil {
break
}
retry--
log.Info("retry oppo auth (%d)", retry)
time.Sleep(3 * time.Second)
}
if d.oppoAuth[appid] == nil {
log.Error("no oppo auth app(%d)", appid)
return
}
for i := 0; i < d.c.Android.PoolSize; i++ {
c := oppo.NewClient(d.oppoAuth[appid], activity, time.Duration(d.c.Android.Timeout))
cs = append(cs, c)
}
return
}
func (d *Dao) newJpushClients(appKey, secret string) (cs []*jpush.Client) {
for i := 0; i < d.c.Android.PoolSize; i++ {
cs = append(cs, jpush.NewClient(appKey, secret, time.Duration(d.c.Android.Timeout)))
}
return
}
func (d *Dao) newFcmClients(key string) (cs []*fcm.Client) {
for i := 0; i < d.c.Android.PoolSize; i++ {
cs = append(cs, fcm.NewClient(key, time.Duration(d.c.Android.Timeout)))
}
return
}