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.
196 lines
5.4 KiB
196 lines
5.4 KiB
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 |
|
}
|
|
|