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
+424
View File
@@ -0,0 +1,424 @@
package commentser
import (
"91porn-server/app/service/taskser"
"91porn-server/common"
"91porn-server/common/log"
"91porn-server/common/stderr"
"91porn-server/models/commod"
"91porn-server/models/v/cmtmod"
"91porn-server/models/v/dailytaskmod"
"91porn-server/models/v/locmod"
"91porn-server/models/v/messagemod"
"91porn-server/models/v/txnmod"
"91porn-server/models/v/usermod"
"91porn-server/models/v/vidmod"
"91porn-server/models/v/walletmod"
"91porn-server/web/service/chat_message_ser"
"91porn-server/web/vidhelp"
"91porn-server/web/webg"
"errors"
"fmt"
"time"
"go.mongodb.org/mongo-driver/bson/primitive"
)
// GetCommentList 后台获取评论列表
func GetCommentList(vidID string, cUID uint64, content string, isRobot, isAdvertiser *bool, status *int, page commod.Page) (data interface{}, err error) {
cList, count, err := cmtmod.CmtFindCommentsAndCount(vidID, cUID, content, isRobot, isAdvertiser, status, page)
if err != nil {
log.Error("web service comment GetCommentList FindUserByUID error", log.E(err), log.Any("vidID", vidID), log.Any("cUID", cUID), log.Any("content", content))
return
}
var cmtList []cmtmod.WebCmtRespList
var uids []uint64
for _, v := range cList {
// 获取评论的用户是否已禁言
usr, err := usermod.FindUserByUID(v.UserID)
if err != nil || usr == nil {
log.Error("web service comment GetCommentList FindUserByUID error", log.E(err), log.Any("uid", v.UserID))
continue // 避免测试服脏数据造成无数据返回
}
tmp := cmtmod.WebCmtRespList{
ID: v.ID,
ObjID: v.ObjID,
UserID: v.UserID,
LikeCount: v.LikeCount,
Content: v.Content,
Level: v.Level,
Status: v.Status,
IsDelete: v.IsDelete,
LinkStr: v.LinkStr,
IsBaned: usr.HasBanned,
IsGodComment: v.IsGodComment,
Portrait: usr.Portrait,
Name: usr.Name,
CreatedAt: v.CreatedAt,
IsRobot: v.IsRobot,
HasLocked: usr.HasLocked,
IsAdvertiser: usr.IsAdvertiser,
Image: v.Image,
}
cmtList = append(cmtList, tmp)
uids = append(uids, v.UserID)
}
if cmtList == nil {
cmtList = []cmtmod.WebCmtRespList{}
}
resp := make(map[string]interface{})
resp["list"] = cmtList
resp["total"] = count
resp["uids"] = uids
data = resp
return
}
// 后台评论管理屏蔽评论
func DeleteCommentsByID(ids []primitive.ObjectID, uid uint64, content string) (err error) {
var cmtList []cmtmod.Comment
if uid != 0 {
// 获取评论
if cmtList, err = cmtmod.GetCommentsByUID(uid); err != nil {
return
}
if err = cmtmod.DelCommentsByUID(uid); err != nil {
return
}
} else if content != "" {
if cmtList, err = cmtmod.GetCommentsByContent(content); err != nil {
return
}
if err = cmtmod.DelCommentsByContent(content); err != nil {
return
}
} else {
if ids == nil || len(ids) == 0 {
return
}
if cmtList, err = cmtmod.GetCommentsByIDS(ids); err != nil {
return
}
if err = cmtmod.DelCommentsByIDS(ids); err != nil {
return
}
}
// 评论数更新
for _, v := range cmtList {
// 视频评论数-1
_ = vidhelp.DecCommentCount(v.ObjID)
// 删除子评论
if v.Level == 1 {
var childIDS []primitive.ObjectID
// 获取子评论
childCmtList, _ := cmtmod.GetCommentsByCID(v.ObjID, v.ID)
for _, v1 := range childCmtList {
childIDS = append(childIDS, v1.ID)
// 视频评论数-1
_ = vidhelp.DecCommentCount(v1.ObjID)
}
if childIDS == nil || len(childIDS) == 0 {
continue
}
// 删除评论
_ = cmtmod.DelCommentsByIDS(childIDS)
}
// 评论数-1
if v.Level == 2 && !v.CID.IsZero() {
_ = cmtmod.CmtDecreaseCommentCountByID(v.CID)
}
}
return
}
// 后台获取评论详情
func GetCommentInfo(id primitive.ObjectID) (data interface{}, err error) {
return cmtmod.CmtFindOneByID(id)
}
// AccessComment 后台评论通过审核
func AccessComment(id primitive.ObjectID) (err error) {
cmt, err := cmtmod.CmtFindOneByID(id)
if err != nil || cmt.ID.IsZero() {
log.Error("web service comment AccessComment CmtFindOneByID error", log.E(err), log.Any("id", id))
return
}
err = cmtmod.CmtUpdateCommentStatusByID(id, 1)
if err != nil {
log.Error("web service comment GetCommentList CmtUpdateCommentStatusByID error", log.E(err), log.Any("uid", id))
return
}
// 审核通过增加评论数
err = vidmod.IncCommentCount(cmt.ObjID)
if err != nil {
log.Error("web service comment GetCommentList IncCommentCount error", log.E(err), log.Any("uid", id))
return
}
return
}
// BatchAccessComment 批量后台评论通过审核
func BatchAccessComment(ids []primitive.ObjectID, status int) (err error) {
cmt, err := cmtmod.CmtFindOneByIds(ids)
if err != nil || len(cmt) <= 0 {
log.Error("web service comment AccessComment CmtFindOneByIds error", log.E(err), log.Any("ids", ids))
return
}
err = cmtmod.PassCommentStatusByIds(ids, status)
if err != nil {
log.Error("web service BatchAccessComment PassCommentStatusByIds error", log.E(err))
return
}
return
}
// PublishComment 发表评论 统一以作者身份回复
func PublishComment(param cmtmod.PublishReqInfo) (code stderr.Code, err error) {
videoInfo, err := vidmod.GetVideoInfo(param.ObjID.Hex())
if err != nil || videoInfo.ID.IsZero() {
code = stderr.CommentErrSendFail
code.SetMsg("current video is not exist or find error")
return code, err
}
var cmtMod cmtmod.Comment
isAuthor := false
if videoInfo.PublisherID == param.ToUserID {
isAuthor = true
}
if code, cmtMod, err = getTrackInfo(videoInfo, "", isAuthor, param); code != stderr.Success || err != nil {
return code, err
}
// 保存到数据库
id, err := cmtmod.CmtInsertOne(&cmtMod)
if err != nil {
code = stderr.CommentErrSendFail
return code, err
}
if err = setGid(param.CID, param.RID, id); err != nil {
code = stderr.CommentErrSendFail
return code, err
}
// 增加评论数
incCommentCount(param.CID, param.ObjID)
// 获取该评论
return
}
// 获取相关信息
func getTrackInfo(videoInfo vidmod.VideoModel, ip string, isAuthor bool, param cmtmod.PublishReqInfo) (code stderr.Code, data cmtmod.Comment, err error) {
var cid primitive.ObjectID
var publiserID = videoInfo.PublisherID
if param.CID != "" {
if cid, err = primitive.ObjectIDFromHex(param.CID); err != nil {
code = stderr.CommentErrSendFail
return code, data, err
}
}
loc, _ := locmod.GetLocationInfoByID(videoInfo.Location)
now := time.Now()
data = cmtmod.Comment{
ObjID: param.ObjID,
CID: cid,
PublisherID: publiserID,
SortCnt: 0,
ToUserID: param.ToUserID,
Content: param.Content,
OrgContent: param.Content,
UserID: param.ToUserID,
Status: 1,
Level: param.Level,
AuthorMark: isAuthor,
IsAuthor: isAuthor,
IsDelete: false,
CommentCount: 0,
LikeCount: 0,
IPAddr: ip,
City: loc.City,
IsRobot: true,
CreatedAt: now,
}
if param.ToUserID != 0 {
if param.Level == 1 {
user, err := usermod.FindUserByUID(param.ToUserID)
if err != nil {
code = stderr.CommentErrSendFail
return code, data, err
}
data.UserID = user.UID
} else {
rCmt, err := cmtmod.CmtFindOneByID(cid)
if err != nil {
code = stderr.CommentErrSendFail
return code, data, err
}
user, err := usermod.FindUserByUID(rCmt.UserID)
if err != nil {
code = stderr.CommentErrSendFail
return code, data, err
}
data.UserID = param.ToUserID
data.ToUserID = rCmt.UserID
data.ToUserName = user.Name
}
}
if param.RID != "" {
rid, err := primitive.ObjectIDFromHex(param.RID)
if err != nil {
code = stderr.CommentErrSendFail
return code, data, err
}
rCmt, err := cmtmod.CmtFindOneByID(rid)
if err != nil {
code = stderr.CommentErrSendFail
return code, data, err
}
user, err := usermod.FindUserByUID(rCmt.UserID)
if err != nil {
code = stderr.CommentErrSendFail
return code, data, err
}
if rCmt.Level != 1 {
// 如果回复的不是1级,则需要写入rid
data.RID = rid
}
data.GID = rCmt.GID
data.AuthorMark = rCmt.AuthorMark
data.SortCnt = rCmt.SortCnt
data.Type = cmtmod.CmtTypeReply
data.PublisherID = rCmt.UserID
data.ToUserName = user.Name
data.ToUserID = rCmt.UserID
if !rCmt.CID.IsZero() {
data.CID = rCmt.CID
}
} else if param.RID == "" && !cid.IsZero() {
data.Type = cmtmod.CmtTypeComment
cCmt, err := cmtmod.CmtFindOneByID(cid)
if err != nil {
code = stderr.CommentErrSendFail
return code, data, err
}
data.PublisherID = cCmt.UserID
} else {
data.PublisherID = videoInfo.PublisherID
data.Type = cmtmod.CmtTypeVideo
}
code = stderr.Success
return
}
// 设置分组id
func setGid(cid string, rid string, id primitive.ObjectID) (err error) {
if cid != "" && rid == "" {
return cmtmod.SetGid(id)
}
return
}
// 增加评论数
func incCommentCount(cid string, objID primitive.ObjectID) {
if cid != "" {
var objCid primitive.ObjectID
objCid, err := primitive.ObjectIDFromHex(cid)
if err != nil {
return
}
// 根据cid获取评论信息
if toComment, err := cmtmod.CmtFindOneByID(objCid); err != nil || (toComment.Level != 1 && toComment.Level != 2) {
return
}
if err := cmtmod.CmtIncreaseCommentCountByID(objCid); err != nil {
return
}
}
// 增加视频评论数
if err := vidhelp.IncCommentCount(objID); err != nil {
return
}
}
// UpdateComment 后台评论设置
func UpdateComment(in *cmtmod.EditCond) (err error) {
cmt, err := cmtmod.CmtFindOneByID(in.ID)
if err != nil || cmt.ID.IsZero() {
log.Error("web service comment AccessComment CmtFindOneByID error", log.E(err), log.Any("id", in.ID))
return errors.New("comment is err or null")
}
if in.LinkStr == nil && cmt.Level != 1 && in.LikeCount == nil {
return errors.New("comment level is not 1")
}
if in.LinkStr == nil && cmt.IsAuthor && in.LikeCount == nil {
return errors.New("author not allow godComment")
}
if in.LinkStr == nil && in.IsGodComment == nil && in.LikeCount == nil {
return errors.New("update params is null")
}
// 如果设置为神评论
// 判断是否已经发送过该评论的神评论奖励(避免修改为普通评论后又修改为神评论,奖励多次发放的情况)
if in.IsGodComment != nil && *in.IsGodComment == true && !cmt.GodCommentAward {
in.GodCommentAward = true
}
err = cmtmod.Update(in.Filter(), in.Update())
if err != nil {
log.Error("web service comment GetCommentList CmtUpdateCommentStatusByID error", log.E(err), log.Any("id", in.ID))
return
}
/********************* 以下是神评相关逻辑 **********************/
// 完成任务,评论被设置为神评
if in.IsGodComment != nil && *in.IsGodComment == true {
// 完成评论被设置为神评
common.Go(func() {
err = taskser.CompleteDailyTask(nil, cmt.UserID, dailytaskmod.CommentSetGod)
if err != nil {
log.Error("web 设置神评,完成每日任务【评论被设置为神评】失败", log.E(err), log.Any("id", in.ID))
return
}
})
}
// 获取神评论奖励积分配置
if webg.Conf.GodCommentAward <= 0 {
return stderr.Success
}
// 查询出评论的帖子信息
video, err := vidmod.GetVideoByID(cmt.ObjID)
if err != nil || video == nil {
return
}
objName := fmt.Sprintf("[%v]", video.Title)
content := fmt.Sprintf("恭喜您在%v中评论获得神评,获得%v积分", objName, webg.Conf.GodCommentAward)
// 发放积分
walletInfo, err := walletmod.CreditIntegral(nil, webg.Conf.GodCommentAward, cmt.UserID)
if err != nil {
return err
}
log := &txnmod.TransactionLog{
TransNo: primitive.NewObjectID(),
UID: cmt.UserID,
Integral: webg.Conf.GodCommentAward,
ActualIntegral: float64(webg.Conf.GodCommentAward),
TranType: txnmod.GodCommentAward.Key(),
TranTypeInt: int64(txnmod.GodCommentAward),
Desc: fmt.Sprintf("%s-积分[%d个]", txnmod.GodCommentAward.Key(), webg.Conf.GodCommentAward),
RealIntegral: walletInfo.RealIntegral(),
}
txnmod.InsertTransactionLog(nil, log)
// 发放私信告诉用户获得了积分
code := chat_message_ser.AddPrivateLetter(&messagemod.SendMsg{
Sender: 100001,
Receiver: cmt.UserID,
Content: content,
MsgType: messagemod.OfficialPrivateLetterMsg,
ObjId: video.ID,
ObjName: objName,
})
return code
}