1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- package service
- import (
- "context"
- "encoding/json"
- "go-common/app/job/main/dm/model"
- "go-common/library/log"
- )
- // trackDMMeta 顶弹幕逻辑 保持pool0的弹幕池只有maxlimt*2的数量
- func (s *Service) trackDMMeta(c context.Context, m *model.BinlogMsg) (err error) {
- var (
- sub *model.Subject
- nw = &model.DM{}
- )
- if err = json.Unmarshal(m.New, &nw); err != nil {
- log.Error("json.Unmarshal(%s) error(%v)", m.New, err)
- return
- }
- if sub, err = s.subject(c, model.SubTypeVideo, nw.Oid); err != nil {
- log.Error("s.subject(%d) error(%v)", nw.Oid, err)
- return
- }
- if sub == nil {
- err = errSubNotExist
- return
- }
- switch m.Action {
- case model.SyncInsert:
- if sub.Count >= sub.Maxlimit {
- if err = s.addTrimQueue(c, nw.Type, nw.Oid, sub.Maxlimit, nw); err != nil {
- log.Error("s.addTrimQueue(%v) error(%v)", nw, err)
- return err
- }
- }
- case model.SyncUpdate:
- old := &model.DM{}
- if err = json.Unmarshal(m.Old, &old); err != nil {
- log.Error("json.Unmarshal(%s) error(%v)", m.Old, err)
- return
- }
- if nw.NeedStateNormal(old) {
- nw.State = model.StateNormal
- if _, err = s.dao.UpdateDM(c, nw); err != nil {
- log.Error("dao.UpdateDM(%v) error(%v)", nw, err)
- return err
- }
- }
- if sub.Count >= sub.Maxlimit {
- dms := make([]*model.DM, 0)
- if isDelOperation(nw, old) {
- if err = s.dao.ZRemTrimCache(c, nw.Type, nw.Oid, nw.ID); err != nil {
- return
- }
- if dms, err = s.recoverDM(c, nw.Type, nw.Oid, 1); err != nil {
- log.Error("s.recoverIdx(%d) error(%v)", nw.Oid, err)
- return
- }
- }
- dms = append(dms, nw)
- if err = s.addTrimQueue(c, nw.Type, nw.Oid, sub.Maxlimit, dms...); err != nil {
- log.Error("s.addTrimQueue(%v) error(%v)", dms, err)
- return
- }
- }
- case model.SyncDelete:
- }
- return
- }
- func isDelOperation(nw, old *model.DM) bool {
- if nw.State != model.StateHide && old.NeedDisplay() && !nw.NeedDisplay() { // 弹幕从展示变为非展示状态
- return true
- }
- if nw.Pool != old.Pool && (nw.Pool == model.PoolSpecial || nw.Pool == model.PoolSubtitle) {
- return true
- }
- return false
- }
|