123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- package service
- import (
- "context"
- "encoding/json"
- "strconv"
- "time"
- "go-common/app/interface/main/credit/conf"
- dao "go-common/app/interface/main/credit/dao"
- model "go-common/app/interface/main/credit/model"
- accgrpc "go-common/app/service/main/account/api"
- arcrpc "go-common/app/service/main/archive/api/gorpc"
- fligrpc "go-common/app/service/main/filter/api/grpc/v1"
- memrpc "go-common/app/service/main/member/api/gorpc"
- "go-common/library/log"
- "github.com/pkg/errors"
- )
- // Service struct of service.
- type Service struct {
- dao *dao.Dao
- // rpc
- arcRPC *arcrpc.Service2
- memRPC *memrpc.Service
- // grpc
- accountClient accgrpc.AccountClient
- fliClient fligrpc.FilterClient
- // conf
- c *conf.Config
- question []*model.LabourQs
- avIDs []int64
- missch chan func()
- // announcement
- announcement *announcement
- managers map[string]int64
- tagMap map[int8]int64
- }
- type announcement struct {
- def []*model.BlockedAnnouncement
- alist map[int8][]*model.BlockedAnnouncement
- amap map[int64]*model.BlockedAnnouncement
- }
- // New create service instance and return.
- func New(c *conf.Config) (s *Service) {
- s = &Service{
- c: c,
- dao: dao.New(c),
- missch: make(chan func(), 1024000),
- arcRPC: arcrpc.New2(c.RPCClient2.Archive),
- memRPC: memrpc.New(c.RPCClient2.Member),
- tagMap: make(map[int8]int64),
- announcement: &announcement{
- def: make([]*model.BlockedAnnouncement, 0, 4),
- alist: make(map[int8][]*model.BlockedAnnouncement),
- amap: make(map[int64]*model.BlockedAnnouncement),
- },
- }
- var err error
- if s.fliClient, err = fligrpc.NewClient(c.GRPCClient.Filter); err != nil {
- panic(errors.WithMessage(err, "Failed to dial filter service"))
- }
- if s.accountClient, err = accgrpc.NewClient(c.GRPCClient.Account); err != nil {
- panic(errors.WithMessage(err, "Failed to dial account service"))
- }
- s.initTag()
- s.loadConf()
- s.loadQuestion()
- s.loadManager()
- s.LoadAnnouncement(context.TODO())
- go s.loadConfproc()
- go s.loadQuestionproc()
- go s.loadManagerproc()
- go s.loadAnnouncementproc()
- go s.cacheproc()
- return
- }
- func (s *Service) loadConfproc() {
- for {
- time.Sleep(time.Duration(s.c.Judge.ConfTimer))
- s.loadConf()
- }
- }
- func (s *Service) loadQuestionproc() {
- for {
- time.Sleep(time.Duration(s.c.Judge.ConfTimer))
- s.loadQuestion()
- }
- }
- func (s *Service) loadManagerproc() {
- for {
- time.Sleep(time.Duration(s.c.Judge.LoadManagerTime))
- s.loadManager()
- }
- }
- func (s *Service) loadAnnouncementproc() {
- for {
- time.Sleep(time.Duration(s.c.Judge.ConfTimer))
- s.LoadAnnouncement(context.TODO())
- }
- }
- func (s *Service) loadConf() {
- m, err := s.dao.LoadConf(context.TODO())
- if err != nil {
- log.Error("loadConf error(%v)", err)
- return
- }
- if s.c.Judge.CaseGiveHours, err = strconv.ParseInt(m["case_give_hours"], 10, 64); err != nil {
- log.Error("loadConf CaseGiveHours error(%v)", err)
- }
- if s.c.Judge.CaseCheckTime, err = strconv.ParseInt(m["case_check_hours"], 10, 64); err != nil {
- log.Error("loadConf CaseCheckTime error(%v)", err)
- }
- if s.c.Judge.JuryRatio, err = strconv.ParseInt(m["jury_vote_radio"], 10, 64); err != nil {
- log.Error("loadConf JuryRatio error(%v)", err)
- }
- if s.c.Judge.JudgeRadio, err = strconv.ParseInt(m["case_judge_radio"], 10, 64); err != nil {
- log.Error("loadConf JudgeRadio error(%v)", err)
- }
- if s.c.Judge.CaseVoteMin, err = strconv.ParseInt(m["case_vote_min"], 10, 64); err != nil {
- log.Error("loadConf CaseVoteMin error(%v)", err)
- }
- if s.c.Judge.CaseObtainMax, err = strconv.ParseInt(m["case_obtain_max"], 10, 64); err != nil {
- log.Error("loadConf CaseObtainMax error(%v)", err)
- }
- if s.c.Judge.CaseVoteMax, err = strconv.ParseInt(m["case_vote_max"], 10, 64); err != nil {
- log.Error("loadConf CaseVoteMax error(%v)", err)
- }
- if s.c.Judge.JuryApplyMax, err = strconv.ParseInt(m["jury_apply_max"], 10, 64); err != nil {
- log.Error("loadConf JuryApplyMax error(%v)", err)
- }
- if s.c.Judge.CaseLoadMax, err = strconv.Atoi(m["case_load_max"]); err != nil {
- log.Error("loadConf CaseLoadMax error(%v)", err)
- }
- var caseLoadSwitch int64
- if caseLoadSwitch, err = strconv.ParseInt(m["case_load_switch"], 10, 64); err != nil {
- log.Error("loadConf CaseLoadSwitch error(%v)", err)
- }
- s.c.Judge.CaseLoadSwitch = int8(caseLoadSwitch)
- if _, ok := m["vote_num"]; !ok {
- s.c.Judge.VoteNum.RateS = 1
- s.c.Judge.VoteNum.RateA = 1
- s.c.Judge.VoteNum.RateB = 1
- s.c.Judge.VoteNum.RateC = 1
- s.c.Judge.VoteNum.RateD = 1
- return
- }
- if err = json.Unmarshal([]byte(m["vote_num"]), &s.c.Judge.VoteNum); err != nil {
- log.Error("loadConf vote_num error(%v)", err)
- }
- }
- func (s *Service) initTag() {
- s.tagMap[model.OriginReply] = s.c.TagID.Reply
- s.tagMap[model.OriginDM] = s.c.TagID.DM
- s.tagMap[model.OriginMsg] = s.c.TagID.Msg
- s.tagMap[model.OriginTag] = s.c.TagID.Tag
- s.tagMap[model.OriginMember] = s.c.TagID.Member
- s.tagMap[model.OriginArchive] = s.c.TagID.Archive
- s.tagMap[model.OriginMusic] = s.c.TagID.Music
- s.tagMap[model.OriginArticle] = s.c.TagID.Article
- s.tagMap[model.OriginSpaceTop] = s.c.TagID.SpaceTop
- }
- func (s *Service) loadManager() {
- managers, err := s.dao.Managers(context.TODO())
- if err != nil {
- log.Error("s.dao.Managers error(%v)", err)
- return
- }
- s.managers = managers
- }
- func (s *Service) loadQuestion() {
- audit, avIDs, err := s.dao.LastAuditQuestion(context.TODO())
- if err != nil {
- log.Error("s.dao.LastAuditQuestion error(%v)", err)
- return
- }
- noAudit, noAvIDs, err := s.dao.LastNoAuditQuestion(context.TODO())
- if err != nil {
- log.Error("s.dao.LastNoAuditQuestion error(%v)", err)
- return
- }
- audit = append(audit, noAudit...)
- avIDs = append(avIDs, noAvIDs...)
- s.question = audit
- s.avIDs = avIDs
- }
- // Ping check server ok.
- func (s *Service) Ping(c context.Context) (err error) {
- if err = s.dao.Ping(c); err != nil {
- return
- }
- return s.dao.Ping(c)
- }
- // Close dao.
- func (s *Service) Close() {
- s.dao.Close()
- }
- func (s *Service) addCache(f func()) {
- select {
- case s.missch <- f:
- default:
- log.Warn("cacheproc chan full")
- }
- }
- // cacheproc is a routine for executing closure.
- func (s *Service) cacheproc() {
- for {
- f := <-s.missch
- f()
- }
- }
|