service.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. package view
  2. import (
  3. "context"
  4. "time"
  5. "go-common/app/interface/main/app-intl/conf"
  6. "go-common/app/interface/main/app-intl/model/region"
  7. accdao "go-common/app/interface/main/app-intl/dao/account"
  8. arcdao "go-common/app/interface/main/app-intl/dao/archive"
  9. assdao "go-common/app/interface/main/app-intl/dao/assist"
  10. audiodao "go-common/app/interface/main/app-intl/dao/audio"
  11. bandao "go-common/app/interface/main/app-intl/dao/bangumi"
  12. coindao "go-common/app/interface/main/app-intl/dao/coin"
  13. // creativedao "go-common/app/interface/main/app-intl/dao/creative"
  14. dmdao "go-common/app/interface/main/app-intl/dao/dm"
  15. favdao "go-common/app/interface/main/app-intl/dao/favorite"
  16. managerdao "go-common/app/interface/main/app-intl/dao/manager"
  17. rgndao "go-common/app/interface/main/app-intl/dao/region"
  18. reldao "go-common/app/interface/main/app-intl/dao/relation"
  19. rscdao "go-common/app/interface/main/app-intl/dao/resource"
  20. tagdao "go-common/app/interface/main/app-intl/dao/tag"
  21. thumbupdao "go-common/app/interface/main/app-intl/dao/thumbup"
  22. locdao "go-common/app/interface/main/app-intl/dao/location"
  23. vipdao "go-common/app/interface/main/app-intl/dao/vip"
  24. "go-common/app/interface/main/app-intl/model"
  25. "go-common/app/interface/main/app-intl/model/manager"
  26. "go-common/app/interface/main/app-intl/model/view"
  27. "go-common/library/log"
  28. "go-common/library/stat/prom"
  29. )
  30. // Service is view service
  31. type Service struct {
  32. c *conf.Config
  33. pHit *prom.Prom
  34. pMiss *prom.Prom
  35. prom *prom.Prom
  36. // dao
  37. accDao *accdao.Dao
  38. arcDao *arcdao.Dao
  39. tagDao *tagdao.Dao
  40. favDao *favdao.Dao
  41. banDao *bandao.Dao
  42. rgnDao *rgndao.Dao
  43. assDao *assdao.Dao
  44. audioDao *audiodao.Dao
  45. thumbupDao *thumbupdao.Dao
  46. rscDao *rscdao.Dao
  47. relDao *reldao.Dao
  48. coinDao *coindao.Dao
  49. vipDao *vipdao.Dao
  50. mngDao *managerdao.Dao
  51. dmDao *dmdao.Dao
  52. locDao *locdao.Dao
  53. // creativeDao *creativedao.Dao
  54. // tick
  55. tick time.Duration
  56. // region
  57. region map[int8]map[int16]*region.Region
  58. // chan
  59. inCh chan interface{}
  60. // vip active cache
  61. vipActiveCache map[int]string
  62. vipTick time.Duration
  63. // mamager cache
  64. RelateCache []*manager.Relate
  65. // player icon
  66. playerIcon *view.PlayerIcon
  67. // view relate game from AI
  68. RelateGameCache map[int64]int64
  69. }
  70. // New new archive
  71. func New(c *conf.Config) (s *Service) {
  72. s = &Service{
  73. c: c,
  74. pHit: prom.CacheHit,
  75. pMiss: prom.CacheMiss,
  76. prom: prom.BusinessInfoCount,
  77. // dao
  78. accDao: accdao.New(c),
  79. arcDao: arcdao.New(c),
  80. tagDao: tagdao.New(c),
  81. favDao: favdao.New(c),
  82. banDao: bandao.New(c),
  83. rgnDao: rgndao.New(c),
  84. assDao: assdao.New(c),
  85. relDao: reldao.New(c),
  86. coinDao: coindao.New(c),
  87. audioDao: audiodao.New(c),
  88. thumbupDao: thumbupdao.New(c),
  89. rscDao: rscdao.New(c),
  90. vipDao: vipdao.New(c),
  91. mngDao: managerdao.New(c),
  92. dmDao: dmdao.New(c),
  93. locDao: locdao.New(c),
  94. // tick
  95. tick: time.Duration(c.Tick),
  96. // region
  97. region: map[int8]map[int16]*region.Region{},
  98. // chan
  99. inCh: make(chan interface{}, 1024),
  100. // vip
  101. vipActiveCache: make(map[int]string),
  102. vipTick: time.Duration(c.View.VipTick),
  103. // manager
  104. RelateCache: []*manager.Relate{},
  105. // player icon
  106. playerIcon: &view.PlayerIcon{},
  107. }
  108. // load data
  109. s.loadRegion()
  110. s.loadPlayerIcon()
  111. s.loadVIPActive()
  112. s.loadManager()
  113. go s.infocproc()
  114. go s.tickproc()
  115. go s.vipproc()
  116. return
  117. }
  118. // Ping is dao ping.
  119. func (s *Service) Ping(c context.Context) (err error) {
  120. return s.arcDao.Ping(c)
  121. }
  122. // tickproc tick load cache.
  123. func (s *Service) tickproc() {
  124. for {
  125. time.Sleep(s.tick)
  126. s.loadPlayerIcon()
  127. s.loadManager()
  128. }
  129. }
  130. // vipproc tick load vip cache.
  131. func (s *Service) vipproc() {
  132. for {
  133. time.Sleep(s.vipTick)
  134. s.loadVIPActive()
  135. }
  136. }
  137. // loadVIPActive tick load vip active cache.
  138. func (s *Service) loadVIPActive() {
  139. var (
  140. va map[int]string
  141. err error
  142. )
  143. va = make(map[int]string)
  144. if va[view.VIPActiveView], err = s.vipDao.VIPActive(context.TODO(), view.VIPActiveView); err != nil {
  145. log.Error("s.vipDao.VIPActinve(%d) error(%v)", view.VIPActiveView, err)
  146. return
  147. }
  148. s.vipActiveCache = va
  149. log.Info("load vip active success")
  150. }
  151. // loadRegion is.
  152. func (s *Service) loadRegion() {
  153. res, err := s.rgnDao.Seconds(context.TODO())
  154. if err != nil {
  155. log.Error("%+v", err)
  156. return
  157. }
  158. s.region = res
  159. }
  160. // loadManager is.
  161. func (s *Service) loadManager() {
  162. r, err := s.mngDao.Relate(context.TODO())
  163. if err != nil {
  164. log.Error("%+v", err)
  165. return
  166. }
  167. s.RelateCache = r
  168. }
  169. // loadPlayerIcon is.
  170. func (s *Service) loadPlayerIcon() {
  171. res, err := s.rscDao.PlayerIcon(context.TODO())
  172. if err != nil {
  173. log.Error("%+v", err)
  174. return
  175. }
  176. if res != nil {
  177. s.playerIcon = &view.PlayerIcon{URL1: res.URL1, Hash1: res.Hash1, URL2: res.URL2, Hash2: res.Hash2, CTime: res.CTime}
  178. } else {
  179. s.playerIcon = nil
  180. }
  181. }
  182. // relateCache is.
  183. func (s *Service) relateCache(c context.Context, plat int8, build int, now time.Time, aid int64, tids []int64, rid int32) (relate *manager.Relate) {
  184. rs := s.RelateCache
  185. rls := make([]*manager.Relate, 0, len(rs))
  186. if len(rs) != 0 {
  187. LOOP:
  188. for _, r := range rs {
  189. if vs, ok := r.Versions[plat]; ok {
  190. for _, v := range vs {
  191. if model.InvalidBuild(build, v.Build, v.Condition) {
  192. continue LOOP
  193. }
  194. }
  195. if (r.STime == 0 || now.After(r.STime.Time())) && (r.ETime == 0 || now.Before(r.ETime.Time())) {
  196. rls = append(rls, r)
  197. }
  198. }
  199. }
  200. }
  201. for _, r := range rls {
  202. if _, ok := r.Aids[aid]; ok {
  203. relate = r
  204. break
  205. }
  206. if len(tids) != 0 {
  207. for _, tid := range tids {
  208. if _, ok := r.Tids[tid]; ok {
  209. relate = r
  210. break
  211. }
  212. }
  213. }
  214. if _, ok := r.Rids[int64(rid)]; ok {
  215. relate = r
  216. break
  217. }
  218. }
  219. return
  220. }