package commentser import ( "91porn-server/common" "91porn-server/common/log" "91porn-server/common/stderr" "91porn-server/models/cache/quicksearchdata" "91porn-server/models/commod" "91porn-server/models/v/cmtmod" "91porn-server/models/v/mediamod" "91porn-server/models/v/usermod" "91porn-server/models/v/vidmod" "fmt" "math/rand" "sync" "time" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" ) // GetParentCmtList 获取父评论列表 func GetParentCmtList(uid uint64, objID ObjectID, objType cmtmod.OType, curTime time.Time, page commod.Page) (code stderr.Code, data []cmtmod.ParentRespList, hasNext bool, err error) { user, err := usermod.FindUserByUID(uid) if err != nil { code = stderr.ErrDbQueryError return } if user == nil || user.ID.IsZero() || user.HasBanned || user.HasLocked { code = stderr.UserIsNotExists return } var publisherID uint64 if objType == cmtmod.OTypeCartoon || objType == cmtmod.OTypeDrama { media, mediaErr := mediamod.GetInfo(objID) if mediaErr != nil || media.ID.IsZero() || media.Status != 1 || media.IsDelete || (objType == cmtmod.OTypeDrama && media.MediaType != mediamod.MediaTypeDrama) { code = stderr.CommentErrGetDataFail err = mediaErr return } } else { // 获取视频作者 videoInfo, videoErr := vidmod.GetVideoInfo(objID.Hex()) if videoErr != nil { code = stderr.CommentErrGetDataFail err = videoErr return } publisherID = videoInfo.PublisherID } skip, limit := getNewPageInfo(0, int64(page.PageNumber), int64(page.PageSize)) var ( isGodList = make([]cmtmod.Comment, 0) aList = make([]cmtmod.Comment, 0) hLikeList = make([]cmtmod.Comment, 0) hReplyList = make([]cmtmod.Comment, 0) ) wg := sync.WaitGroup{} wg.Add(3) common.Go(func() { defer wg.Done() // 获神评论 isGodList, err = getIsGodCommentParentCmtList(user.IsAdvertiser, objID, curTime) if err != nil { code = stderr.CommentErrGetDataFail return } }) common.Go(func() { defer wg.Done() // 获取作者的评论 aList, err = getAuthorParentCmtList(user.IsAdvertiser, objID, publisherID, curTime) if err != nil { code = stderr.CommentErrGetDataFail return } }) common.Go(func() { defer wg.Done() // 获取热门评论(回复数) hReplyList, err = getHotReplyParentCmeList(user.UID, user.IsAdvertiser, objID, 0, 3, curTime) if err != nil { code = stderr.CommentErrGetDataFail return } noIds := []primitive.ObjectID{} for _, v := range hReplyList { noIds = append(noIds, v.ID) } // 获取热门评论(点赞数) hLikeList, err = getHotParentCmeList(user.UID, user.IsAdvertiser, noIds, objID, 0, 5, curTime) if err != nil { code = stderr.CommentErrGetDataFail return } }) wg.Wait() aList = append(isGodList, aList...) // 神评论+作者评论 aList = append(aList, hLikeList...) aList = append(aList, hReplyList...) var mList []cmtmod.Comment if len(aList) > int(page.PageNumber*page.PageSize) { mList = aList[skip : skip+limit] } else if len(aList) > int((page.PageNumber-1)*page.PageSize) && len(aList) < int(page.PageNumber*page.PageSize) { mList = aList[skip:] } var aIds []ObjectID // 作者+热评的id for _, v := range aList { aIds = append(aIds, v.ID) } if aIds == nil { aIds = []ObjectID{} } if len(mList) <= int(page.PageSize) { skip, limit = getNewPageInfo(int64(len(aList)), int64(page.PageNumber), int64(page.PageSize)) //获取普通评论 cList, err := getParentCmtList(user.IsAdvertiser, objID, aIds, skip, limit, curTime) if err != nil { code = stderr.CommentErrGetDataFail return code, data, false, err } mList = append(mList, cList...) } list, err := getParentCommentTackInfo(uid, mList) if err != nil { code = stderr.CommentErrGetDataFail return } var ids []ObjectID for _, v := range mList { ids = append(ids, v.ID) } // 获取首条子评论 data, err = getFstChildCmtOfParent(user.IsAdvertiser, objID, list, ids, uid, publisherID, curTime) if err != nil { code = stderr.CommentErrGetDataFail return } if len(data) > int(page.PageSize) { hasNext = true data = data[:page.PageSize] } code = stderr.Success return } func QuickSearch(objID string, data []cmtmod.ParentRespList) []cmtmod.ParentRespList { //获取置顶评论,走缓存 quickSearches, err := quicksearchdata.GetAllFromCache(bson.M{"enabled": true, "type": 1}) if err != nil { return data } count := len(quickSearches) if count > 0 { var ( info = make([]cmtmod.ChildRespList, 0) s = rand.Intn(count) q = quickSearches[s] ) cmts := []cmtmod.ParentRespList{ cmtmod.ParentRespList{ Info: info, ID: q.ID.Hex(), ObjID: objID, UserID: 100001, UserName: "91PORN运营", UserPortrait: "cf230705/image/cg/227/fg/1bw/a86065d7ab4cbb11ebbebaefc0ee4444.png", Content: q.Title, LinkStr: q.Link, LinkType: q.LinkType, SearchKeyword: q.SearchKeyword, Level: 1, Status: 1, City: "香港", CreatedAt: time.Now(), }} user, err := usermod.FindUserByUID(100001) if err == nil && user != nil { cmts[0].UserName = user.Name cmts[0].UserPortrait = user.Portrait } data = append(cmts, data...) } return data } // 获取作者的父评论及其数量 func getAuthorParentCmtList(isAdvertiser bool, objID ObjectID, author uint64, curTime time.Time) (data []cmtmod.Comment, err error) { return cmtmod.GetAuthorParentCmt(isAdvertiser, objID, author, curTime) } // 获取神评论及其数量 func getIsGodCommentParentCmtList(isAdvertiser bool, objID ObjectID, curTime time.Time) (data []cmtmod.Comment, err error) { return cmtmod.GetIsGodCommentParentCmt(isAdvertiser, objID, curTime) } // 获取热门评论(点赞数) func getHotParentCmeList(uid uint64, isAdvertiser bool, noIds []primitive.ObjectID, objID ObjectID, skip int64, limit int64, cutTime time.Time) (data []cmtmod.Comment, err error) { return cmtmod.GetHotParentCmtList(uid, isAdvertiser, noIds, objID, skip, limit, cutTime) } // 获取热门评论(回复数) func getHotReplyParentCmeList(uid uint64, isAdvertiser bool, objID ObjectID, skip int64, limit int64, cutTime time.Time) (data []cmtmod.Comment, err error) { return cmtmod.GetHotReplyParentCmtList(uid, isAdvertiser, objID, skip, limit, cutTime) } // 获取其余评论 func getParentCmtList(isAdvertiser bool, objID ObjectID, ids []ObjectID, skip int64, limit int64, cutTime time.Time) (data []cmtmod.Comment, err error) { // 获取作者+热评 return cmtmod.GetParentCmtList(isAdvertiser, objID, ids, skip, limit, cutTime) } // GetMyCmtList 获取我的评论列表 func GetMyCmtList(uid uint64, page commod.Page) (list []cmtmod.MyCmt, hasNext bool, err error) { skip := int64(page.Skip()) list, hasNext, err = cmtmod.GetMyCmtList(uid, skip, int64(page.PageSize)) if err != nil { log.Error(fmt.Sprintf("cmtmod.GetMyCmtList err:%v", err)) return } if len(list) == 0 { list = []cmtmod.MyCmt{} return } vids := []primitive.ObjectID{} for _, v := range list { vids = append(vids, v.ObjID) } vidList, err := vidmod.GetVideoListByIDsNoStatus(vids) if err != nil { log.Error(fmt.Sprintf("vidmod.GetVideoListByIDsNoStatus err:%v", err)) return } videoMap := make(map[primitive.ObjectID]*vidmod.VideoModel) for _, v := range vidList { videoMap[v.ID] = v } for i, v := range list { // 从map中取出video对象 vid, ok := videoMap[v.ObjID] if !ok { continue } v.VidTitle = vid.Title v.VidCover = vid.Cover list[i] = v } return }