123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198 |
- package service
- import (
- "context"
- "math/rand"
- "time"
- hisrpc "go-common/app/interface/main/history/rpc/client"
- tagrpc "go-common/app/interface/main/tag/rpc/client"
- "go-common/app/interface/openplatform/article/conf"
- "go-common/app/interface/openplatform/article/dao"
- artmdl "go-common/app/interface/openplatform/article/model"
- search "go-common/app/interface/openplatform/article/model/search"
- account "go-common/app/service/main/account/model"
- accrpc "go-common/app/service/main/account/rpc/client"
- arcrpc "go-common/app/service/main/archive/api/gorpc"
- arcmdl "go-common/app/service/main/archive/model/archive"
- coinrpc "go-common/app/service/main/coin/api/gorpc"
- favrpc "go-common/app/service/main/favorite/api/gorpc"
- filterrpc "go-common/app/service/main/filter/rpc/client"
- resrpc "go-common/app/service/main/resource/rpc/client"
- thumbuprpc "go-common/app/service/main/thumbup/rpc/client"
- xcache "go-common/library/cache"
- "go-common/library/ecode"
- "go-common/library/log"
- "go-common/library/log/anticheat"
- "go-common/library/net/rpc/warden"
- )
- const _segmentAddr = "127.0.01:6755"
- // cache proc
- var cache *xcache.Cache
- // Service service
- type Service struct {
- c *conf.Config
- dao *dao.Dao
- // rpc
- accountRPC *accrpc.Service3
- tagRPC *tagrpc.Service
- favRPC *favrpc.Service
- thumbupRPC thumbuprpc.ThumbupRPC
- arcRPC *arcrpc.Service2
- coinRPC coinrpc.RPC
- resRPC *resrpc.Service
- filterRPC *filterrpc.Service
- hisRPC *hisrpc.Service
- searchRPC search.TagboxServiceClient
- categoriesMap map[int64]*artmdl.Category
- categoriesReverseMap map[int64][]*artmdl.Category
- categoryParents map[int64][]*artmdl.Category
- primaryCategories []*artmdl.Category
- Categories artmdl.Categories
- RecommendsMap map[int64][][]*artmdl.Recommend
- RecommendsGroups map[int64]map[int64]bool
- recommendChan chan [2]int64
- recommendAids map[int64][]int64
- setting *artmdl.Setting
- activities map[int64]*artmdl.Activity
- // infoc
- logCh chan interface{}
- //banner
- bannersMap map[int8][]*artmdl.Banner
- actBannersMap map[int8][]*artmdl.Banner
- // rank
- ranksMap map[int64]bool
- sortLimitTime int64
- notices []*artmdl.Notice
- CheatInfoc *anticheat.AntiCheat
- }
- // New new
- func New(c *conf.Config) *Service {
- rand.Seed(time.Now().Unix())
- s := &Service{
- c: c,
- dao: dao.New(c),
- accountRPC: accrpc.New3(c.AccountRPC),
- tagRPC: tagrpc.New2(c.TagRPC),
- favRPC: favrpc.New2(c.FavRPC),
- arcRPC: arcrpc.New2(c.ArcRPC),
- coinRPC: coinrpc.New(c.CoinRPC),
- resRPC: resrpc.New(c.ResRPC),
- thumbupRPC: thumbuprpc.New(c.ThumbupRPC),
- filterRPC: filterrpc.New(c.FilterRPC),
- hisRPC: hisrpc.New(c.HistoryRPC),
- searchRPC: searchRPC(c.SearchRPC),
- categoriesMap: make(map[int64]*artmdl.Category),
- categoriesReverseMap: make(map[int64][]*artmdl.Category),
- categoryParents: make(map[int64][]*artmdl.Category),
- logCh: make(chan interface{}, 1024),
- recommendChan: make(chan [2]int64, 10240),
- recommendAids: make(map[int64][]int64),
- ranksMap: make(map[int64]bool),
- sortLimitTime: int64(time.Duration(c.Article.SortLimitTime) / time.Second),
- CheatInfoc: anticheat.New(c.CheatInfoc),
- RecommendsGroups: make(map[int64]map[int64]bool),
- }
- s.loadCategories()
- s.loadSettings()
- s.loadRanks()
- go s.loadCategoriesproc()
- go s.loadSettingsproc()
- go s.loadNoticeproc()
- go s.infocproc()
- go s.loadRecommendsproc()
- go s.loadBannersproc()
- go s.loadActBannersproc()
- go s.deleteRecommendproc()
- go s.loadActivityproc()
- return s
- }
- func (s *Service) loadRecommendsproc() {
- for {
- now := time.Now().Unix()
- c := context.TODO()
- if (s.RecommendsMap == nil) || (now%s.dao.UpdateRecommendsInterval == 0) {
- err := s.UpdateRecommends(c)
- if err != nil {
- dao.PromError("service:更新推荐数据")
- time.Sleep(time.Second)
- continue
- }
- if err = s.groupRecommend(c); err != nil {
- log.Error("s.groupRecommend error(%+v)", err)
- }
- }
- // 这里不是每秒钟一更新
- time.Sleep(time.Second)
- }
- }
- // Close close dao.
- func (s *Service) Close() {
- s.dao.Close()
- }
- // Ping check connection success.
- func (s *Service) Ping(c context.Context) (err error) {
- err = s.dao.Ping(c)
- return
- }
- // UserDisabled check user is disabled
- func (s *Service) UserDisabled(c context.Context, mid int64) (res bool, level int, err error) {
- arg := account.ArgMid{Mid: mid}
- card, err := s.accountRPC.Card3(c, &arg)
- if (err == ecode.UserNotExist) || (err == ecode.MemberNotExist) {
- return false, 0, nil
- }
- if err != nil {
- dao.PromError("service:用户封禁状态")
- log.Error("s.accountRPC.Card2(%+v) err: %+v", arg, err)
- return
- }
- if card.Silence == 1 {
- res = true
- }
- level = int(card.Level)
- return
- }
- func (s *Service) isUpper(c context.Context, mid int64) (res bool, err error) {
- arg := &arcmdl.ArgUpCount2{Mid: mid}
- var count int
- if count, err = s.arcRPC.UpCount2(c, arg); err != nil {
- dao.PromError("service:up主投稿")
- log.Error("s.arcRPC.UpCount2(%v) err: %+v", mid, err)
- return
- }
- if count > 0 {
- res = true
- }
- return
- }
- func (s *Service) loadActivityproc() {
- for {
- if acts, err := s.dao.Activity(context.TODO()); err == nil {
- s.activities = acts
- }
- time.Sleep(time.Minute)
- }
- }
- func init() {
- cache = xcache.New(1, 1024)
- }
- func searchRPC(cfg *warden.ClientConfig) search.TagboxServiceClient {
- cc, err := warden.NewClient(cfg).Dial(context.Background(), "discovery://default/search.tagbox")
- if err != nil {
- panic(err)
- }
- return search.NewTagboxServiceClient(cc)
- }
|