Initial commit

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-15 13:57:10 +08:00
co-authored by Claude Opus 5
commit 8679200f41
1897 changed files with 257900 additions and 0 deletions
+251
View File
@@ -0,0 +1,251 @@
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
}