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.
219 lines
6.2 KiB
219 lines
6.2 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"math/rand" |
|
"sync" |
|
"time" |
|
|
|
dm2rpc "go-common/app/interface/main/dm2/rpc/client" |
|
tagrpc "go-common/app/interface/main/tag/rpc/client" |
|
"go-common/app/interface/main/web/conf" |
|
"go-common/app/interface/main/web/dao" |
|
"go-common/app/interface/main/web/model" |
|
artrpc "go-common/app/interface/openplatform/article/rpc/client" |
|
accclient "go-common/app/service/main/account/api" |
|
arcclient "go-common/app/service/main/archive/api" |
|
arcrpc "go-common/app/service/main/archive/api/gorpc" |
|
brdrpc "go-common/app/service/main/broadcast/api/grpc/v1" |
|
coinclient "go-common/app/service/main/coin/api" |
|
couprpc "go-common/app/service/main/coupon/rpc/client" |
|
dyrpc "go-common/app/service/main/dynamic/rpc/client" |
|
favrpc "go-common/app/service/main/favorite/api/gorpc" |
|
locrpc "go-common/app/service/main/location/rpc/client" |
|
relrpc "go-common/app/service/main/relation/rpc/client" |
|
resrpc "go-common/app/service/main/resource/rpc/client" |
|
shareclient "go-common/app/service/main/share/api" |
|
thumbrpc "go-common/app/service/main/thumbup/rpc/client" |
|
ugcclient "go-common/app/service/main/ugcpay/api/grpc/v1" |
|
"go-common/library/log" |
|
"go-common/library/log/anticheat" |
|
"go-common/library/sync/pipeline/fanout" |
|
) |
|
|
|
// Service service |
|
type Service struct { |
|
c *conf.Config |
|
dao *dao.Dao |
|
// rpc |
|
arc *arcrpc.Service2 |
|
dy *dyrpc.Service |
|
tag *tagrpc.Service |
|
loc *locrpc.Service |
|
art *artrpc.Service |
|
res *resrpc.Service |
|
relation *relrpc.Service |
|
thumbup *thumbrpc.Service |
|
coupon *couprpc.Service |
|
dm2 *dm2rpc.Service |
|
fav *favrpc.Service |
|
// chans |
|
rids map[int32]struct{} |
|
// cache proc |
|
cache *fanout.Fanout |
|
regionCount map[int16]int |
|
onlineArcs []*model.OnlineArc |
|
allArchivesCount, playOnline, webOnline int64 |
|
// elec show typeids |
|
elecShowTypeIds map[int32]struct{} |
|
// no related data aids |
|
noRelAids map[int64]struct{} |
|
// rand source |
|
r *rand.Rand |
|
indexIcon *model.IndexIcon |
|
// infoc2 |
|
CheatInfoc *anticheat.AntiCheat |
|
// TypeNames |
|
typeNames map[int32]*arcclient.Tp |
|
// Broadcast grpc client |
|
broadcastClient brdrpc.ZergClient |
|
coinClient coinclient.CoinClient |
|
arcClient arcclient.ArchiveClient |
|
accClient accclient.AccountClient |
|
shareClient shareclient.ShareClient |
|
ugcPayClient ugcclient.UGCPayClient |
|
// searchEggs |
|
searchEggs map[int64]*model.SearchEggRes |
|
// bnj |
|
bnj2019View *model.Bnj2019View |
|
BnjElecInfo *model.ElecShow |
|
bnj2019List []*model.Bnj2019Related |
|
bnj2019LiveArc *arcclient.ArcReply |
|
bnjGrayUids map[int64]struct{} |
|
specialMids map[int64]struct{} |
|
} |
|
|
|
// New new |
|
func New(c *conf.Config) *Service { |
|
s := &Service{ |
|
c: c, |
|
dao: dao.New(c), |
|
arc: arcrpc.New2(c.ArchiveRPC), |
|
dy: dyrpc.New(c.DynamicRPC), |
|
tag: tagrpc.New2(c.TagRPC), |
|
loc: locrpc.New(c.LocationRPC), |
|
art: artrpc.New(c.ArticleRPC), |
|
res: resrpc.New(c.ResourceRPC), |
|
relation: relrpc.New(c.RelationRPC), |
|
thumbup: thumbrpc.New(c.ThumbupRPC), |
|
coupon: couprpc.New(c.CouponRPC), |
|
dm2: dm2rpc.New(c.Dm2RPC), |
|
fav: favrpc.New2(c.FavRPC), |
|
cache: fanout.New("cache"), |
|
regionCount: make(map[int16]int), |
|
r: rand.New(rand.NewSource(time.Now().Unix())), |
|
specialMids: map[int64]struct{}{}, |
|
} |
|
var err error |
|
if s.broadcastClient, err = brdrpc.NewClient(c.BroadcastClient); err != nil { |
|
panic(err) |
|
} |
|
if s.coinClient, err = coinclient.NewClient(c.CoinClient); err != nil { |
|
panic(err) |
|
} |
|
if s.arcClient, err = arcclient.NewClient(c.ArcClient); err != nil { |
|
panic(err) |
|
} |
|
if s.accClient, err = accclient.NewClient(c.AccClient); err != nil { |
|
panic(err) |
|
} |
|
if s.shareClient, err = shareclient.NewClient(c.ShareClient); err != nil { |
|
panic(err) |
|
} |
|
if s.ugcPayClient, err = ugcclient.NewClient(c.UGCClient); err != nil { |
|
panic(err) |
|
} |
|
s.initRules() |
|
go s.newCountproc() |
|
go s.onlineCountproc() |
|
go s.onlineListproc() |
|
go s.indexIconproc() |
|
go s.typeNameproc() |
|
go s.searchEggproc() |
|
go s.bnj2019proc() |
|
go s.loadManager() |
|
// init infoc |
|
if c.Infoc2 != nil { |
|
s.CheatInfoc = anticheat.New(c.Infoc2) |
|
} |
|
return s |
|
} |
|
|
|
func (s *Service) initRules() { |
|
tmpRids := make(map[int32]struct{}, len(s.c.Rule.Rids)) |
|
for _, v := range s.c.Rule.Rids { |
|
tmpRids[v] = struct{}{} |
|
} |
|
s.rids = tmpRids |
|
tmpElec := make(map[int32]struct{}, len(s.c.Rule.ElecShowTypeIDs)) |
|
for _, id := range s.c.Rule.ElecShowTypeIDs { |
|
tmpElec[id] = struct{}{} |
|
} |
|
s.elecShowTypeIds = tmpElec |
|
tmpNoRel := make(map[int64]struct{}, len(s.c.Rule.NoRelAids)) |
|
for _, id := range s.c.Rule.NoRelAids { |
|
tmpNoRel[id] = struct{}{} |
|
} |
|
s.noRelAids = tmpNoRel |
|
} |
|
|
|
func (s *Service) typeNameproc() { |
|
for { |
|
if typesReply, err := s.arcClient.Types(context.Background(), &arcclient.NoArgRequest{}); err != nil { |
|
log.Error("s.arc.Types2 error(%v)", err) |
|
time.Sleep(time.Second) |
|
continue |
|
} else { |
|
s.typeNames = typesReply.Types |
|
} |
|
time.Sleep(time.Duration(s.c.WEB.PullOnlineInterval)) |
|
} |
|
} |
|
|
|
func (s *Service) searchEggproc() { |
|
var mutex = sync.Mutex{} |
|
for { |
|
if eggs, err := s.dao.SearchEgg(context.Background()); err != nil { |
|
log.Error("s.dao.SearchEgg error(%v)", err) |
|
time.Sleep(5 * time.Second) |
|
continue |
|
} else { |
|
data := make(map[int64]*model.SearchEggRes, len(eggs)) |
|
for _, v := range eggs { |
|
if source, ok := v.Plat[_searchEggWebPlat]; ok { |
|
for _, egg := range source { |
|
if _, isSet := data[egg.EggID]; !isSet { |
|
data[egg.EggID] = &model.SearchEggRes{ |
|
EggID: egg.EggID, |
|
ShowCount: v.ShowCount, |
|
} |
|
} |
|
source := &model.SearchEggSource{URL: egg.URL, MD5: egg.MD5, Size: egg.Size} |
|
data[egg.EggID].Source = append(data[egg.EggID].Source, source) |
|
} |
|
} |
|
} |
|
mutex.Lock() |
|
s.searchEggs = data |
|
mutex.Unlock() |
|
} |
|
time.Sleep(time.Duration(s.c.WEB.SearchEggInterval)) |
|
} |
|
} |
|
|
|
// Ping check connection success. |
|
func (s *Service) Ping(c context.Context) (err error) { |
|
err = s.dao.Ping(c) |
|
return |
|
} |
|
|
|
// Close close resource. |
|
func (s *Service) Close() { |
|
s.dao.Close() |
|
} |
|
|
|
func archivesArgLog(name string, aids []int64) { |
|
if aidLen := len(aids); aidLen >= 50 { |
|
log.Info("s.arc.Archives3 func(%s) len(%d), arg(%v)", name, aidLen, aids) |
|
} |
|
}
|
|
|