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
+276
View File
@@ -0,0 +1,276 @@
package commentser
import (
"91porn-server/app/appg"
"91porn-server/app/service/vidhelpser"
"91porn-server/common/constant"
"91porn-server/common/constant/redisconst"
"91porn-server/common/log"
"91porn-server/common/stderr"
"91porn-server/models/v/aiplazamod"
"91porn-server/models/v/cmtmod"
"91porn-server/models/v/mediamod"
"91porn-server/models/v/usermod"
"91porn-server/models/v/vidmod"
"time"
"unicode"
"go.mongodb.org/mongo-driver/bson/primitive"
)
// 发布评论后获取返回结果
func getRespInfoAfterPublish(uid uint64, id ObjectID, level int) (code stderr.Code, data interface{}, err error) {
var cmt cmtmod.Comment
if cmt, err = cmtmod.CmtFindOneByID(id); err != nil {
code = stderr.CommentErrGetDataFail
return
}
if level == 1 {
var info []cmtmod.ParentRespList
if info, err = getParentCommentTackInfo(uid, []cmtmod.Comment{cmt}); err != nil {
code = stderr.CommentErrSendFail
return
}
data = info[0]
} else {
var info []cmtmod.ChildRespList
info, err = getChildCommentTackInfo(uid, []cmtmod.Comment{cmt})
if code = stderr.CommentErrSendFail; err != nil {
return
}
data = info[0]
}
code = stderr.Success
return
}
// 检查用户状态
func checkUserStatus(uid uint64) (code stderr.Code, data *usermod.User, err error) {
// 获取用户状态
data, err = usermod.FindUserByUID(uid)
if err != nil || data == nil {
code = stderr.CommentUserInfoErr
return code, data, err
}
if data.HasBanned {
code = stderr.CommentUserHasBanned
return
}
if data.BannedTime.After(time.Now()) {
code = stderr.CommentUserHasBanned
return
}
// if data.Mobile == "" {
// code = stderr.CommentUserNotBind
// return code, data, nil
// }
code = stderr.Success
return
}
// 检查视频状态
func checkVideoStatus(videoID string) (code stderr.Code, videoInfo vidmod.VideoModel, err error) {
videoInfo, err = vidmod.GetVideoInfo(videoID)
if err != nil {
code = stderr.CommentVideoInfoErr
return code, videoInfo, err
}
if videoInfo.ID.IsZero() {
code = stderr.CommentErrVideoIsInvalid
return code, videoInfo, err
}
// 视频未通过审核/未审核
if videoInfo.Status != 1 && videoInfo.Status != 3 {
code = stderr.CommentErrVideoIsInvalid
return code, videoInfo, err
}
code = stderr.Success
return code, videoInfo, err
}
// 获取相关信息
func getTrackInfo(uid uint64, publisher uint64, isAuthor bool, ip string, param cmtmod.PublishReqInfo, cmtType cmtmod.CmtType) (code stderr.Code, data cmtmod.Comment, err error) {
//var waitGroup sync.WaitGroup
var city = "-"
//var replacedContent string
var replacedContent = param.Content
var cid ObjectID
var err1 error
if param.CID != "" {
if cid, err = primitive.ObjectIDFromHex(param.CID); err != nil {
code = stderr.CommentErrSendFail
return code, data, err
}
}
//waitGroup.Add(1)
//// 过滤评论
//common.Go(func() {
// defer waitGroup.Done()
// replacedContent, err1 = filterser.TextFilter(param.Content)
//})
// 获取城市城市
// common.Go(func() {
// defer waitGroup.Done()
// city = vidhelpser.GetLocationByIP(ip)
// })
//waitGroup.Wait()
if err = err1; err1 != nil {
code = stderr.CommentErrSendFail
return
}
isRobot := false
if uid < constant.RobotUIDLimit {
isRobot = true
}
now := time.Now()
data = cmtmod.Comment{
ObjType: param.ObjType,
ObjID: param.ObjID,
CID: cid,
PublisherID: publisher,
UserID: uid,
SortCnt: 0,
ToUserID: param.ToUserID,
Content: replacedContent,
OrgContent: param.Content,
Image: param.Image,
Status: 2,
Level: param.Level,
AuthorMark: isAuthor,
IsAuthor: isAuthor,
IsDelete: false,
CommentCount: 0,
LikeCount: 0,
IPAddr: ip,
City: city,
IsRobot: isRobot,
QuoteType: param.QuoteType,
QuoteID: param.QuoteID,
QuoteImg: param.QuoteImg,
QuoteTitle: param.QuoteTitle,
CreatedAt: now,
}
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
}
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
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 = publisher
data.Type = cmtType
}
code = stderr.Success
return
}
// 设置分组id
func setGid(cid string, rid string, id ObjectID) (err error) {
if cid != "" && rid == "" {
return cmtmod.SetGid(id)
}
return
}
// 增加评论数
func incCommentCount(cid string, oType cmtmod.OType, objID ObjectID) (code stderr.Code, err error) {
if cid != "" {
var objCid ObjectID
if objCid, err = primitive.ObjectIDFromHex(cid); err != nil {
code = stderr.CommentErrSendFail
return code, err
}
// 根据cid获取评论信息
if toComment, err := cmtmod.CmtFindOneByID(objCid); err != nil || (toComment.Level != 1 && toComment.Level != 2) {
code = stderr.CommentErrSendFail
log.Error("app service comment CmtFindOneByID err", log.E(err), log.Any("toComment level", toComment.Level))
return code, err
}
if err = cmtmod.CmtIncreaseCommentCountByID(objCid); err != nil {
code = stderr.CommentErrIncCountFailed
return code, err
}
}
if oType == cmtmod.OTypeCartoon || oType == cmtmod.OTypeDrama {
if err = mediamod.IncrCommentCountByID(objID, 1); err != nil {
code = stderr.CommentErrIncCountFailed
return
}
} else if oType == cmtmod.OTypeAiPlaza {
aiplazamod.IncCommentCount(objID)
} else {
// 增加视频评论数
if err = vidhelpser.IncCommentCount(objID); err != nil {
code = stderr.CommentErrIncCountFailed
return
}
}
code = stderr.Success
return
}
// 检查是否为vip,非vip用户只能发表5个字
func checkVip(vipLevel int, content string) stderr.Code {
var charCnt int
for _, v := range content {
if unicode.Is(unicode.Scripts["Han"], v) {
charCnt++
} else {
charCnt++
}
if charCnt > 5 {
break
}
}
if vipLevel == 0 && charCnt > 5 {
return stderr.CommentNotVip
}
return stderr.Success
}
func CheckCountLimit(uid uint64) stderr.Code {
var key = redisconst.AutoBlockKey(constant.BlockComment, uid)
cnt := appg.Redis.Incr(key)
if cnt == 1 {
_, _ = appg.Redis.ExpireKey(key, 12*time.Hour)
}
if cnt > appg.Conf.CmtLimit.CommentCount {
err := usermod.UpdateById(nil, uid, time.Now().Add(12*time.Hour))
if err != nil {
return stderr.ErrDbUpdateError
}
return stderr.CommentCountOverLimit
}
return stderr.Success
}