123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- package account
- import (
- "context"
- "go-common/library/log"
- "go-common/library/net/metadata"
- "go-common/library/sync/errgroup"
- "time"
- accmdl "go-common/app/interface/main/creative/model/account"
- account "go-common/app/service/main/account/model"
- "go-common/library/ecode"
- xtime "go-common/library/time"
- "sync"
- )
- const creatorMID = 37090048
- // MyInfo get use level.
- func (s *Service) MyInfo(c context.Context, mid int64, ip string, now time.Time) (m *accmdl.MyInfo, err error) {
- var (
- idCkCode = 0
- res *account.Profile
- )
- // init myinfo
- m = &accmdl.MyInfo{
- Mid: mid,
- Level: 1,
- Activated: true,
- Deftime: xtime.Time(now.Add(time.Duration(14400) * time.Second).Unix()),
- DeftimeEnd: xtime.Time(now.Add(time.Duration(15*24) * time.Hour).Unix()),
- DeftimeMsg: ecode.String(ecode.VideoupDelayTimeErr.Error()).Message(),
- IdentifyInfo: &accmdl.IdentifyInfo{
- Code: idCkCode,
- Msg: accmdl.IdentifyEnum[idCkCode],
- },
- UploadSize: map[string]bool{
- "4-8": false,
- "8-16": false,
- },
- DmSubtitle: true,
- }
- if res, err = s.acc.Profile(c, mid, ip); err != nil {
- log.Error("s.acc.Profile (%d) error(%v)", mid, err)
- return
- }
- if res == nil {
- err = ecode.NothingFound
- return
- }
- if res.Silence == 1 {
- m.Banned = true
- }
- if res.EmailStatus == 1 || res.TelStatus == 1 {
- m.Activated = true
- }
- m.Name = res.Name
- m.Face = res.Face
- m.Level = int(res.Level)
- if _, ok := s.exemptIDCheckUps[mid]; ok {
- log.Info("s.exemptIDCheckUps (%d) info(%v)", mid, s.exemptIDCheckUps)
- idCkCode = 0
- } else {
- idCkCode, _ = s.acc.IdentifyInfo(c, mid, 0, ip)
- }
- m.IdentifyInfo.Code = idCkCode
- m.IdentifyInfo.Msg = accmdl.IdentifyEnum[idCkCode] // NOTE: exist check
- m = s.ignoreLevelUpAndActivated(m, mid, s.exemptZeroLevelAndAnswerUps)
- if _, ok := s.uploadTopSizeUps[mid]; ok {
- m.UploadSize["4-8"] = true
- m.UploadSize["8-16"] = true
- }
- return
- }
- // type为12的白名单人员,免账号激活,免账号升级到1级
- func (s *Service) ignoreLevelUpAndActivated(m *accmdl.MyInfo, mid int64, exemptZeroLevelAndAnswerUps map[int64]int64) *accmdl.MyInfo {
- if len(exemptZeroLevelAndAnswerUps) > 0 {
- _, ok := exemptZeroLevelAndAnswerUps[mid]
- if ok && (m.Level < 1 || !m.Activated) {
- m.Activated = true
- m.Level = 1
- }
- }
- return m
- }
- // UpInfo get video article pic blink up infos.
- func (s *Service) UpInfo(c context.Context, mid int64, ip string) (v *accmdl.UpInfo, err error) {
- cache := true
- if v, err = s.acc.UpInfoCache(c, mid); err != nil {
- s.pCacheMiss.Incr("upinfo_cache")
- err = nil
- cache = false
- } else if v != nil {
- s.pCacheHit.Incr("upinfo_cache")
- return
- }
- s.pCacheMiss.Incr("upinfo_cache")
- var (
- g = &errgroup.Group{}
- ctx = context.TODO()
- )
- v = &accmdl.UpInfo{
- Archive: accmdl.NotUp,
- Article: accmdl.NotUp,
- Pic: accmdl.NotUp,
- Blink: accmdl.NotUp,
- }
- g.Go(func() error {
- blikCnt, _ := s.acc.Blink(ctx, mid, ip)
- if blikCnt > 0 {
- v.Blink = accmdl.IsUp
- }
- return nil
- })
- g.Go(func() error {
- picCnt, _ := s.acc.Pic(c, mid, ip)
- if picCnt > 0 {
- v.Pic = accmdl.IsUp
- }
- return nil
- })
- g.Go(func() error {
- arcCnt, _ := s.archive.UpCount(c, mid)
- if arcCnt > 0 {
- v.Archive = accmdl.IsUp
- }
- return nil
- })
- g.Go(func() error {
- isAuthor, _ := s.article.IsAuthor(c, mid, ip)
- if isAuthor {
- v.Article = accmdl.IsUp
- }
- return nil
- })
- g.Wait()
- if cache {
- s.addCache(func() {
- s.acc.AddUpInfoCache(context.Background(), mid, v)
- })
- }
- return
- }
- // RecFollows 推荐关注
- func (s *Service) RecFollows(c context.Context, mid int64) (fs []*accmdl.Friend, err error) {
- var (
- fsMids = []int64{creatorMID}
- shouldFollowMids = []int64{}
- infos = make(map[int64]*account.Info)
- )
- ip := metadata.String(c, metadata.RemoteIP)
- if shouldFollowMids, err = s.acc.ShouldFollow(c, mid, fsMids, ip); err != nil {
- log.Error("s.acc.ShouldFollow mid(%d)|ip(%s)|error(%v)", mid, ip, err)
- return
- }
- if len(shouldFollowMids) > 0 {
- if infos, err = s.acc.Infos(c, shouldFollowMids, ip); err != nil {
- log.Error("s.acc.Infos mid(%d)|ip(%s)|shouldFollowMids(%+v)|error(%v)", mid, ip, shouldFollowMids, err)
- return
- }
- for mid, info := range infos {
- f := &accmdl.Friend{
- Mid: mid,
- Sign: info.Sign,
- Face: info.Face,
- Name: info.Name,
- }
- if mid == creatorMID {
- f.Comment = "关注创作中心,获取更多创作情报"
- f.ShouldFollow = 0
- }
- fs = append(fs, f)
- }
- }
- return
- }
- // Infos 获取多个UP主的信息
- func (s *Service) Infos(c context.Context, mids []int64, ip string) (res map[int64]*account.Info, err error) {
- return s.acc.Infos(c, mids, ip)
- }
- // Relations 批量获取mid与其它用户的关系
- func (s *Service) Relations(c context.Context, mid int64, fids []int64, ip string) (res map[int64]int, err error) {
- return s.acc.Relations(c, mid, fids, ip)
- }
- // FRelations 获取用户与mid的关系(Relations的反向)
- func (s *Service) FRelations(c context.Context, mid int64, fids []int64, ip string) (res map[int64]int, err error) {
- var (
- g errgroup.Group
- sm sync.RWMutex
- )
- res = make(map[int64]int)
- for _, v := range fids {
- g.Go(func() error {
- var r map[int64]int
- if r, err = s.acc.Relations(c, v, []int64{mid}, ip); err != nil {
- return err
- }
- sm.Lock()
- res[v] = r[mid]
- sm.Unlock()
- return nil
- })
- }
- if err = g.Wait(); err != nil {
- log.Error("s.FRelations(%d,%v) error(%v)", mid, fids, err)
- }
- return
- }
- // Cards 批量获取用户的Card
- func (s *Service) Cards(c context.Context, mids []int64, ip string) (cards map[int64]*account.Card, err error) {
- return s.acc.Cards(c, mids, ip)
- }
|