123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- package view
- import (
- "context"
- "time"
- "go-common/app/interface/main/app-intl/conf"
- "go-common/app/interface/main/app-intl/model/region"
- accdao "go-common/app/interface/main/app-intl/dao/account"
- arcdao "go-common/app/interface/main/app-intl/dao/archive"
- assdao "go-common/app/interface/main/app-intl/dao/assist"
- audiodao "go-common/app/interface/main/app-intl/dao/audio"
- bandao "go-common/app/interface/main/app-intl/dao/bangumi"
- coindao "go-common/app/interface/main/app-intl/dao/coin"
- // creativedao "go-common/app/interface/main/app-intl/dao/creative"
- dmdao "go-common/app/interface/main/app-intl/dao/dm"
- favdao "go-common/app/interface/main/app-intl/dao/favorite"
- managerdao "go-common/app/interface/main/app-intl/dao/manager"
- rgndao "go-common/app/interface/main/app-intl/dao/region"
- reldao "go-common/app/interface/main/app-intl/dao/relation"
- rscdao "go-common/app/interface/main/app-intl/dao/resource"
- tagdao "go-common/app/interface/main/app-intl/dao/tag"
- thumbupdao "go-common/app/interface/main/app-intl/dao/thumbup"
- locdao "go-common/app/interface/main/app-intl/dao/location"
- vipdao "go-common/app/interface/main/app-intl/dao/vip"
- "go-common/app/interface/main/app-intl/model"
- "go-common/app/interface/main/app-intl/model/manager"
- "go-common/app/interface/main/app-intl/model/view"
- "go-common/library/log"
- "go-common/library/stat/prom"
- )
- // Service is view service
- type Service struct {
- c *conf.Config
- pHit *prom.Prom
- pMiss *prom.Prom
- prom *prom.Prom
- // dao
- accDao *accdao.Dao
- arcDao *arcdao.Dao
- tagDao *tagdao.Dao
- favDao *favdao.Dao
- banDao *bandao.Dao
- rgnDao *rgndao.Dao
- assDao *assdao.Dao
- audioDao *audiodao.Dao
- thumbupDao *thumbupdao.Dao
- rscDao *rscdao.Dao
- relDao *reldao.Dao
- coinDao *coindao.Dao
- vipDao *vipdao.Dao
- mngDao *managerdao.Dao
- dmDao *dmdao.Dao
- locDao *locdao.Dao
- // creativeDao *creativedao.Dao
- // tick
- tick time.Duration
- // region
- region map[int8]map[int16]*region.Region
- // chan
- inCh chan interface{}
- // vip active cache
- vipActiveCache map[int]string
- vipTick time.Duration
- // mamager cache
- RelateCache []*manager.Relate
- // player icon
- playerIcon *view.PlayerIcon
- // view relate game from AI
- RelateGameCache map[int64]int64
- }
- // New new archive
- func New(c *conf.Config) (s *Service) {
- s = &Service{
- c: c,
- pHit: prom.CacheHit,
- pMiss: prom.CacheMiss,
- prom: prom.BusinessInfoCount,
- // dao
- accDao: accdao.New(c),
- arcDao: arcdao.New(c),
- tagDao: tagdao.New(c),
- favDao: favdao.New(c),
- banDao: bandao.New(c),
- rgnDao: rgndao.New(c),
- assDao: assdao.New(c),
- relDao: reldao.New(c),
- coinDao: coindao.New(c),
- audioDao: audiodao.New(c),
- thumbupDao: thumbupdao.New(c),
- rscDao: rscdao.New(c),
- vipDao: vipdao.New(c),
- mngDao: managerdao.New(c),
- dmDao: dmdao.New(c),
- locDao: locdao.New(c),
- // tick
- tick: time.Duration(c.Tick),
- // region
- region: map[int8]map[int16]*region.Region{},
- // chan
- inCh: make(chan interface{}, 1024),
- // vip
- vipActiveCache: make(map[int]string),
- vipTick: time.Duration(c.View.VipTick),
- // manager
- RelateCache: []*manager.Relate{},
- // player icon
- playerIcon: &view.PlayerIcon{},
- }
- // load data
- s.loadRegion()
- s.loadPlayerIcon()
- s.loadVIPActive()
- s.loadManager()
- go s.infocproc()
- go s.tickproc()
- go s.vipproc()
- return
- }
- // Ping is dao ping.
- func (s *Service) Ping(c context.Context) (err error) {
- return s.arcDao.Ping(c)
- }
- // tickproc tick load cache.
- func (s *Service) tickproc() {
- for {
- time.Sleep(s.tick)
- s.loadPlayerIcon()
- s.loadManager()
- }
- }
- // vipproc tick load vip cache.
- func (s *Service) vipproc() {
- for {
- time.Sleep(s.vipTick)
- s.loadVIPActive()
- }
- }
- // loadVIPActive tick load vip active cache.
- func (s *Service) loadVIPActive() {
- var (
- va map[int]string
- err error
- )
- va = make(map[int]string)
- if va[view.VIPActiveView], err = s.vipDao.VIPActive(context.TODO(), view.VIPActiveView); err != nil {
- log.Error("s.vipDao.VIPActinve(%d) error(%v)", view.VIPActiveView, err)
- return
- }
- s.vipActiveCache = va
- log.Info("load vip active success")
- }
- // loadRegion is.
- func (s *Service) loadRegion() {
- res, err := s.rgnDao.Seconds(context.TODO())
- if err != nil {
- log.Error("%+v", err)
- return
- }
- s.region = res
- }
- // loadManager is.
- func (s *Service) loadManager() {
- r, err := s.mngDao.Relate(context.TODO())
- if err != nil {
- log.Error("%+v", err)
- return
- }
- s.RelateCache = r
- }
- // loadPlayerIcon is.
- func (s *Service) loadPlayerIcon() {
- res, err := s.rscDao.PlayerIcon(context.TODO())
- if err != nil {
- log.Error("%+v", err)
- return
- }
- if res != nil {
- s.playerIcon = &view.PlayerIcon{URL1: res.URL1, Hash1: res.Hash1, URL2: res.URL2, Hash2: res.Hash2, CTime: res.CTime}
- } else {
- s.playerIcon = nil
- }
- }
- // relateCache is.
- func (s *Service) relateCache(c context.Context, plat int8, build int, now time.Time, aid int64, tids []int64, rid int32) (relate *manager.Relate) {
- rs := s.RelateCache
- rls := make([]*manager.Relate, 0, len(rs))
- if len(rs) != 0 {
- LOOP:
- for _, r := range rs {
- if vs, ok := r.Versions[plat]; ok {
- for _, v := range vs {
- if model.InvalidBuild(build, v.Build, v.Condition) {
- continue LOOP
- }
- }
- if (r.STime == 0 || now.After(r.STime.Time())) && (r.ETime == 0 || now.Before(r.ETime.Time())) {
- rls = append(rls, r)
- }
- }
- }
- }
- for _, r := range rls {
- if _, ok := r.Aids[aid]; ok {
- relate = r
- break
- }
- if len(tids) != 0 {
- for _, tid := range tids {
- if _, ok := r.Tids[tid]; ok {
- relate = r
- break
- }
- }
- }
- if _, ok := r.Rids[int64(rid)]; ok {
- relate = r
- break
- }
- }
- return
- }
|