You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
211 lines
5.2 KiB
211 lines
5.2 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
"strconv" |
|
"time" |
|
|
|
"go-common/app/interface/main/dm2/model" |
|
"go-common/library/database/elastic" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
xtime "go-common/library/time" |
|
) |
|
|
|
const ( |
|
_dmRecentLimit = 1000 |
|
|
|
_dateTimeFormart = "2006-01-02 15:04:05" |
|
) |
|
|
|
// DMUpRecent recent dm of upper. |
|
func (s *Service) DMUpRecent(c context.Context, mid, pn, ps int64) (res *model.DmRecentResponse, err error) { |
|
var ( |
|
mids, aids []int64 |
|
aidmap = make(map[int64]struct{}) |
|
midMap = make(map[int64]struct{}) |
|
searchResult *model.SearchRecentDMResult |
|
) |
|
if ps < 0 || pn < 1 { |
|
err = ecode.RequestErr |
|
return |
|
} |
|
if (pn-1)*ps >= _dmRecentLimit { |
|
return |
|
} |
|
searchParam := &model.SearchRecentDMParam{ |
|
Type: model.SubTypeVideo, |
|
UpMid: mid, |
|
States: []int32{model.StateNormal, model.StateHide, model.StateMonitorAfter}, |
|
Ps: int(ps), |
|
Pn: int(pn), |
|
Field: "ctime", |
|
Sort: elastic.OrderDesc, |
|
} |
|
searchResult, err = s.dao.SearhcDmRecent(c, searchParam) |
|
if err != nil || searchResult == nil || len(searchResult.Result) == 0 || searchResult.Page == nil { |
|
return |
|
} |
|
for _, item := range searchResult.Result { |
|
if _, ok := aidmap[item.Aid]; !ok { |
|
aids = append(aids, item.Aid) |
|
aidmap[item.Aid] = struct{}{} |
|
} |
|
if _, ok := midMap[item.Mid]; !ok { |
|
mids = append(mids, item.Mid) |
|
midMap[item.Mid] = struct{}{} |
|
} |
|
} |
|
arcMap, err := s.archiveInfos(c, aids) |
|
if err != nil { |
|
return |
|
} |
|
infoMap, err := s.accountInfos(c, mids) |
|
if err != nil { |
|
return |
|
} |
|
memebers := make([]*model.DMMember, 0, len(searchResult.Result)) |
|
for _, item := range searchResult.Result { |
|
member := &model.DMMember{ |
|
ID: item.ID, |
|
IDStr: strconv.FormatInt(item.ID, 10), |
|
Type: item.Type, |
|
Aid: item.Aid, |
|
Oid: item.Oid, |
|
Mid: item.Mid, |
|
MidHash: model.Hash(item.Mid, 0), |
|
Pool: item.Pool, |
|
State: item.State, |
|
Attrs: model.DMAttrNtoA(item.Attr), |
|
Msg: item.Msg, |
|
Mode: item.Mode, |
|
Color: fmt.Sprintf("%06x", item.Color), |
|
Progress: item.Progress, |
|
FontSize: item.FontSize, |
|
} |
|
if ctime, err := time.ParseInLocation(_dateTimeFormart, item.Ctime, time.Now().Location()); err == nil { |
|
member.Ctime = xtime.Time(ctime.Unix()) |
|
} |
|
if arc, ok := arcMap[item.Aid]; ok { |
|
member.Title = arc.Title |
|
} |
|
if info, ok := infoMap[item.Mid]; ok { |
|
member.Uname = info.Name |
|
} |
|
memebers = append(memebers, member) |
|
} |
|
res = &model.DmRecentResponse{ |
|
Data: memebers, |
|
Page: searchResult.Page, |
|
} |
|
if res.Page.Total > _dmRecentLimit { |
|
res.Page.Total = _dmRecentLimit |
|
} |
|
return |
|
} |
|
|
|
// DMUpSearch danmu list from search. |
|
func (s *Service) DMUpSearch(c context.Context, mid int64, p *model.SearchDMParams) (res *model.SearchDMResult, err error) { |
|
var ( |
|
mids, dmids []int64 |
|
) |
|
sub, err := s.subject(c, p.Type, p.Oid) |
|
if err != nil { |
|
return |
|
} |
|
if sub.Mid != mid { |
|
err = ecode.AccessDenied |
|
return |
|
} |
|
res = &model.SearchDMResult{} |
|
srchData, err := s.dao.SearchDM(c, p) |
|
if err != nil || srchData == nil { |
|
return |
|
} |
|
for _, v := range srchData.Result { |
|
dmids = append(dmids, v.ID) |
|
} |
|
dms, err := s.dmList(c, p.Type, p.Oid, dmids) |
|
if err != nil { |
|
log.Error("s.dms(%d,%v) error(%v)", p.Oid, dmids, err) |
|
return |
|
} |
|
for _, dm := range dms { |
|
mids = append(mids, dm.Mid) |
|
} |
|
infoMap, err := s.accountInfos(c, mids) |
|
if err != nil { |
|
return |
|
} |
|
for _, dm := range dms { |
|
var msg string |
|
if dm.Content != nil { |
|
msg = dm.Content.Msg |
|
} else { |
|
continue |
|
} |
|
if dm.ContentSpe != nil { |
|
msg = dm.ContentSpe.Msg |
|
} |
|
item := &model.DMMember{ |
|
ID: dm.ID, |
|
IDStr: strconv.FormatInt(dm.ID, 10), |
|
Type: dm.Type, |
|
Aid: sub.Pid, |
|
Oid: dm.Oid, |
|
Mid: dm.Mid, |
|
MidHash: model.Hash(dm.Mid, 0), |
|
Pool: dm.Pool, |
|
State: dm.State, |
|
Attrs: dm.AttrNtoA(), |
|
Msg: msg, |
|
Ctime: dm.Ctime, |
|
Mode: dm.Content.Mode, |
|
Color: fmt.Sprintf("%06x", dm.Content.Color), |
|
Progress: dm.Progress, |
|
FontSize: dm.Content.FontSize, |
|
} |
|
if info, ok := infoMap[dm.Mid]; ok { |
|
item.Uname = info.Name |
|
} |
|
res.Result = append(res.Result, item) |
|
} |
|
res.Page.Num = srchData.Page.Num |
|
res.Page.Size = srchData.Page.Size |
|
res.Page.Total = srchData.Page.Total |
|
return |
|
} |
|
|
|
// UptSearchDMState update dm search state |
|
func (s *Service) UptSearchDMState(c context.Context, dmids []int64, oid int64, state, tp int32) (err error) { |
|
if err = s.dao.UptSearchDMState(c, dmids, oid, state, tp); err != nil { |
|
return |
|
} |
|
if err = s.dao.UptSearchRecentState(c, dmids, oid, state, tp); err != nil { |
|
return |
|
} |
|
return |
|
} |
|
|
|
// UptSearchDMPool update dm search pool |
|
func (s *Service) UptSearchDMPool(c context.Context, dmids []int64, oid int64, pool, tp int32) (err error) { |
|
if err = s.dao.UptSearchDMPool(c, dmids, oid, pool, tp); err != nil { |
|
return |
|
} |
|
if err = s.dao.UptSearchRecentPool(c, dmids, oid, pool, tp); err != nil { |
|
return |
|
} |
|
return |
|
} |
|
|
|
// UptSearchDMAttr update dm search attr |
|
func (s *Service) UptSearchDMAttr(c context.Context, dmids []int64, oid int64, attr, tp int32) (err error) { |
|
if err = s.dao.UptSearchDMAttr(c, dmids, oid, attr, tp); err != nil { |
|
return |
|
} |
|
if err = s.dao.UptSearchRecentAttr(c, dmids, oid, attr, tp); err != nil { |
|
return |
|
} |
|
return |
|
}
|
|
|