package commentser import ( "91porn-server/app/service/messageser" "91porn-server/app/service/taskser" "91porn-server/common" "91porn-server/common/log" "91porn-server/common/stderr" "91porn-server/common/truthutil" "91porn-server/middleware/ua" "91porn-server/models/commod" "91porn-server/models/v/cmtmod" "91porn-server/models/v/dailytaskmod" "91porn-server/models/v/mediamod" "91porn-server/models/v/messagemod" "91porn-server/models/v/usermod" "91porn-server/models/v/vidmod" "errors" "fmt" "time" "unicode/utf8" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" ) // GetVideoTotalComments 获取视频的评论数 func GetVideoTotalComments(objID primitive.ObjectID) (code stderr.Code, data int64, err error) { return GetTotalComments(objID, cmtmod.OTypeVideo) } func GetTotalComments(objID primitive.ObjectID, objType cmtmod.OType) (code stderr.Code, data int64, err error) { if objType == "" { objType = cmtmod.OTypeVideo } params := bson.M{ "objID": objID, "objType": objType, "level": 1, "status": 1, "isDelete": false, "isAdvertiser": bson.M{"$in": []any{nil, false}}, } data, err = cmtmod.GetCount(params) if err != nil { code = stderr.ErrNetWorkBusy return code, 0, err } code = stderr.Success return code, data, err } // 获取二级评论列表 func GetSndCommentsList(uid uint64, objID primitive.ObjectID, cid primitive.ObjectID, fstID primitive.ObjectID, curTime time.Time, page commod.Page) (code stderr.Code, data []cmtmod.ChildRespList, err error) { // 获取评论信息 stdQuery := commod.StdQuery{Page: &commod.PageBy{Num: page.PageNumber, Size: page.PageSize, CheckNext: true}, Order: &[]commod.OrderBy{}} modList, err := cmtmod.CmtFindSecondLevelComments(objID, cid, fstID, curTime, stdQuery) if err != nil { code = stderr.ErrNetWorkBusy log.Error("app service comment GetSndCommentsList CmtFindSecondLevelComments err", log.E(err)) return } // 空值直接返回 if modList == nil || len(modList) <= 0 { code = stderr.Success data = []cmtmod.ChildRespList{} return } // 获取评论附加信息 cList, err := getChildCommentTackInfo(uid, modList) if err != nil { code = stderr.ErrNetWorkBusy log.Error("app service comment GetSndCommentsList getSndCommentTackInfo err", log.E(err)) return } code = stderr.Success data = cList return } // PublishComment 发表评论 func PublishComment(uid uint64, ua ua.UA, ip string, param cmtmod.PublishReqInfo) (code stderr.Code, data interface{}, err error) { // 获取用户状态 var user, publisher *usermod.User if code, user, err = checkUserStatus(uid); err != nil || code != stderr.Success || user == nil { return code, data, err } // 评论限制 if isCan, err := canPublishComment(uid); err != nil { code = stderr.CommentErrSendFail return code, data, err } else if !isCan { code = stderr.CommentPublishTooFrequent return code, data, err } //检测评论是否包含网址,包含网址则发布不予处理 if uid > 200000 && !truthutil.CheckIsValid(param.Content, 1) { log.Warn("comment send CheckIsValid fail", log.Any("uid", uid), log.Any("content", param.Content)) return stderr.Success, stderr.Success.Msg(), nil } // 校验视频是否通过审核 var videoInfo vidmod.VideoModel var mediaInfo mediamod.Media var isAuthor bool var isOneself bool if param.ObjType == "" || param.ObjType == cmtmod.OTypeVideo { if code, videoInfo, err = checkVideoStatus(param.ObjID.Hex()); err != nil || code != stderr.Success || videoInfo.ID.IsZero() { return code, data, err } // 获取视频作者信息 if publisher, err = usermod.FindUserByUID(videoInfo.PublisherID); err != nil { log.Error("获取评论视频作者信息", log.Any("uid", uid), log.Any("ip", ip), log.Any("param", param), log.E(err)) return stderr.CommentErrSendFail, nil, err } if publisher == nil || publisher.ID.IsZero() { return stderr.UserIsNotExists, nil, err } if uid == videoInfo.PublisherID { isAuthor = true } } if param.ObjType == cmtmod.OTypeCartoon || param.ObjType == cmtmod.OTypeDrama { mediaInfo, err = mediamod.GetInfo(param.ObjID) if err != nil || mediaInfo.ID.IsZero() || mediaInfo.IsDelete || mediaInfo.Status != 1 { return stderr.CommentErrVideoIsInvalid, nil, err } if param.ObjType == cmtmod.OTypeDrama && mediaInfo.MediaType != mediamod.MediaTypeDrama { return stderr.CommentErrVideoIsInvalid, nil, errors.New("invalid drama") } } var cmtMod cmtmod.Comment if code, cmtMod, err = getTrackInfo(uid, videoInfo.PublisherID, isAuthor, ip, param, cmtmod.CmtTypeVideo); code != stderr.Success || err != nil { return code, data, err } cmtMod.IsAdvertiser = user.IsAdvertiser if !mediaInfo.ID.IsZero() { cmtMod.Title = mediaInfo.Title } var sUid uint64 if param.CID != "" { // 根据回复ID获取用户信息 oid, _ := primitive.ObjectIDFromHex(param.CID) cmt, err := cmtmod.CmtFindOneByID(oid) if err != nil { code = stderr.ErrDbQueryError return code, data, err } // 校验是否是回复自己的评论 if cmt.UserID != uid { sUid = cmt.UserID } if cmt.UserID == uid { isOneself = true } } // 保存到数据库 id, err := cmtmod.CmtInsertOne(&cmtMod) fmt.Println(id.Hex()) if err != nil { code = stderr.CommentErrSendFail return code, data, err } if err = setGid(param.CID, param.RID, id); err != nil { code = stderr.CommentErrSendFail return code, data, err } // 推荐互动不按用户/账号身份过滤;运营后台直接配置的 fake* 展示值 // 不经过该真实评论落库链路,因此仍不会进入推荐累计分。 if param.ObjType == "" || param.ObjType == cmtmod.OTypeVideo { if incErr := vidmod.IncrementRecommendInteraction(param.ObjID, vidmod.RecommendInteractionComment); incErr != nil { // 评论已落库,推荐累计失败只记录,不能向客户端返回发布失败。 log.Error("increment recommend comment failed", log.E(incErr), log.Any("objID", param.ObjID)) } } if param.ObjType == cmtmod.OTypeDrama { if incErr := mediamod.IncrCommentCountByID(param.ObjID, 1); incErr != nil { log.Error("increment drama comment count failed", log.E(incErr), log.Any("objID", param.ObjID)) } } // 增加评论数(审核只统计已审核通过的评论) //if code, err = incCommentCount(param.CID, param.ObjType, param.ObjID); code != stderr.Success || err != nil { // return code, data, err //} //存动态 common.Go(func() { if param.Content != "" && utf8.RuneCountInString(param.Content) >= 10 { _ = taskser.CompleteDailyTask(nil, uid, dailytaskmod.DailyComment) } if !isAuthor && videoInfo.Title != "" { dynamicContent := fmt.Sprintf("%s 于 %s 评论了你的作品", user.Name, time.Now().Format("15:04:05")) messageser.PublicAddMsg(messagemod.PublicAddMsg{ SendUid: uid, TakeUid: videoInfo.PublisherID, MsgType: messagemod.CommentMsg, ObjId: videoInfo.ID, ObjName: videoInfo.Title, ObjCover: videoInfo.Cover, Content: dynamicContent, //param.Content, }) } if !isOneself && videoInfo.Title != "" && param.CID != "" && sUid != 0 { dynamicContent := fmt.Sprintf("%s 于 %s 回复了你的评论", user.Name, time.Now().Format("15:04:05")) messageser.PublicAddMsg(messagemod.PublicAddMsg{ SendUid: uid, TakeUid: sUid, MsgType: messagemod.ReplyCommentMsg, ObjId: videoInfo.ID, ObjName: videoInfo.Title, ObjCover: videoInfo.Cover, Content: dynamicContent, //param.Content, }) } }) //if (user.VipLevel == 0 || user.VipExpireDate.Before(now)) && !user.GetSuperUser(now) { // if err = appg.Redis.Set(redisconst.CommentCacheKey(uid), data, 1*time.Minute); err != nil { // log.Warn(fmt.Sprintf("用户ID:%d;IP:%s;保存缓存数据异常:%v", uid, ip, err)) // } //} // 获取该评论 return getRespInfoAfterPublish(uid, id, param.Level) } //func DailyComment(uid uint64) { // key := redisconst.DailyTaskCacheKey(uid, dailytaskmod.DailyComment, timeutil.BeginOfToday()) // if appg.Redis.Exists(key) { // return // } // tasks, err := dailytaskmod.GetUserDailyTaskByType(nil, dailytaskmod.DailyComment) // if err != nil { // return // } // // if tasks == nil || tasks.ID.IsZero() { // return // } // // // 获取任务记录 // today := timeutil.BeginningOfDay(time.Now()) // item, err := taskrecordmod.GetUserRecordByTime(uid, tasks.ID, today) // if item == nil || item.ID.IsZero() { // now := time.Now() // // 更新今日登录记录 // filter := bson.M{"uid": uid, "recordTime": today, "taskId": tasks.ID} // cond := bson.M{ // "uid": uid, // "recordTime": today, // "taskId": tasks.ID, // "type": taskrecordmod.DailyTask, // "taskType": taskrecordmod.DailyComment, // "status": taskrecordmod.UnReceived, // "count": 1, // "updateTime": now, // "createTime": now, // } // if err := taskrecordmod.InsertTask(nil, filter, cond); err != nil { // return // } // } // // 判断每日评论只可三次 // if item != nil && !item.ID.IsZero() && item.Count < 3 { // filter := bson.M{"uid": uid, "recordTime": today, "taskId": tasks.ID} // if err := taskrecordmod.CurrentCountUpdate(nil, filter); err != nil { // return // } // } // // 每日超过三次评论放入缓存 // if item != nil && !item.ID.IsZero() && item.Count > 2 { // err = appg.Redis.Set(key, "_", time.Hour*24) // if err != nil { // return // } // } // return //} // NoVidPublishComment 非视频帖子发表评论 func NoVidPublishComment(uid uint64, ip, cmtType string, param cmtmod.PublishReqInfo) (code stderr.Code, data interface{}, err error) { var publisherID uint64 // 获取用户状态 var user *usermod.User if code, user, err = checkUserStatus(uid); err != nil || code != stderr.Success || user == nil { return code, data, err } // 评论限制 if isCan, err := canPublishComment(uid); err != nil { code = stderr.CommentErrSendFail return code, data, err } else if !isCan { code = stderr.CommentPublishTooFrequent return code, data, err } //检测评论是否包含网址,包含网址则发布不予处理 if uid > 200000 && !truthutil.CheckIsValid(param.Content, 1) { log.Warn("comment send CheckIsValid fail", log.Any("uid", uid), log.Any("content", param.Content)) return stderr.Success, stderr.Success.Msg(), nil } var isAuthor bool if uid == publisherID { isAuthor = true } var cmtMod cmtmod.Comment if code, cmtMod, err = getTrackInfo(uid, publisherID, isAuthor, ip, param, cmtmod.CmtNoVideo); code != stderr.Success || err != nil { return code, data, err } cmtMod.IsAdvertiser = user.IsAdvertiser // 保存到数据库 id, err := cmtmod.CmtInsertOne(&cmtMod) if err != nil { code = stderr.CommentErrSendFail return code, data, err } if err = setGid(param.CID, param.RID, id); err != nil { code = stderr.CommentErrSendFail return code, data, err } common.Go(func() { // 增加评论数 if param.Level == 2 { _id, err := primitive.ObjectIDFromHex(param.CID) if err != nil { log.Warn("NoVidPublishComment primitive.ObjectIDFromHex err,", log.Any("CID", param.CID), log.Any("ToUserID", param.ToUserID)) } if err = cmtmod.CmtIncreaseCommentCountByID(_id); err != nil { log.Warn("NoVidPublishComment cmtmod.CmtIncreaseCommentCountByID err,", log.Any("err", err.Error()), log.Any("CID", param.CID), log.Any("ToUserID", param.ToUserID)) } } }) //存动态 //common.Go(func() { // if objName != "" { //messageser.PublicAddMsg(messagemod.PublicAddMsg{ // SendUid: uid, // TakeUid: publisherID, // MsgType: messagemod.DesireMsg, // ObjId: objID, // ObjName: objName, //}) // } //}) // 获取该评论 return getRespInfoAfterPublish(uid, id, param.Level) }