284 lines
7.9 KiB
Go
284 lines
7.9 KiB
Go
package eventhandler
|
|
|
|
import (
|
|
"bbs-go/internal/models"
|
|
"bbs-go/internal/models/constants"
|
|
"bbs-go/internal/pkg/common"
|
|
"bbs-go/internal/pkg/event"
|
|
"bbs-go/internal/pkg/msg"
|
|
"bbs-go/internal/services"
|
|
"log/slog"
|
|
"reflect"
|
|
|
|
"github.com/spf13/cast"
|
|
)
|
|
|
|
func init() {
|
|
event.RegHandler(reflect.TypeOf(event.CommentCreateEvent{}), handleCommentCreate)
|
|
}
|
|
|
|
func handleCommentCreate(i interface{}) {
|
|
e := i.(event.CommentCreateEvent)
|
|
|
|
comment := services.CommentService.Get(e.CommentId)
|
|
|
|
// 发送消息
|
|
handleMsg(comment)
|
|
}
|
|
|
|
// 处理评论消息
|
|
func handleMsg(comment *models.Comment) {
|
|
commentMsg := getCommentMsg(comment)
|
|
|
|
handleEntityMsg(comment, commentMsg)
|
|
handleQuoteMsg(comment, commentMsg)
|
|
handleReplyMsg(comment, commentMsg)
|
|
}
|
|
|
|
// 给被回复的实体对象作者发送消息
|
|
func handleEntityMsg(comment *models.Comment, commentMsg *CommentMsg) {
|
|
var (
|
|
from = comment.UserId
|
|
to = commentMsg.rootEntityUserId()
|
|
)
|
|
if from == to {
|
|
return
|
|
}
|
|
if to <= 0 {
|
|
slog.Warn("消息发送失败", slog.Any("to", to))
|
|
return
|
|
}
|
|
|
|
// 如果回复的评论作者就是帖子作者,那么只给回复作者发消息即可,这里就不再给帖子作者发消息了
|
|
if commentMsg.ParentComment != nil && commentMsg.ParentComment.UserId == to {
|
|
return
|
|
}
|
|
// 同上
|
|
if commentMsg.QuoteComment != nil && commentMsg.QuoteComment.UserId == to {
|
|
return
|
|
}
|
|
|
|
services.MessageService.SendMsg(from, to,
|
|
commentMsg.msgType(),
|
|
commentMsg.msgTitle(),
|
|
commentMsg.msgContent(),
|
|
commentMsg.msgRepliedContent(),
|
|
&msg.CommentExtraData{
|
|
EntityType: commentMsg.EntityType,
|
|
EntityId: commentMsg.EntityId,
|
|
QuoteId: comment.QuoteId,
|
|
RootEntityType: commentMsg.rootEntityType(),
|
|
RootEntityId: cast.ToString(commentMsg.rootEntityId()),
|
|
})
|
|
}
|
|
|
|
func handleReplyMsg(comment *models.Comment, commentMsg *CommentMsg) {
|
|
if commentMsg.ParentComment == nil {
|
|
return
|
|
}
|
|
|
|
var (
|
|
from = comment.UserId
|
|
to = commentMsg.ParentComment.UserId
|
|
)
|
|
|
|
if from == to {
|
|
return
|
|
}
|
|
|
|
// 如果回复的评论作者就是被引用消息的作者作者,那么只发引用消息即可
|
|
if commentMsg.QuoteComment != nil && commentMsg.QuoteComment.UserId == to {
|
|
return
|
|
}
|
|
|
|
var (
|
|
title = commentMsg.msgTitle()
|
|
content = commentMsg.msgContent()
|
|
repliedContent = common.GetSummary(commentMsg.ParentComment.ContentType, commentMsg.ParentComment.Content)
|
|
)
|
|
|
|
services.MessageService.SendMsg(from, to, msg.TypeCommentReply, title, content, repliedContent,
|
|
&msg.CommentExtraData{
|
|
EntityType: comment.EntityType,
|
|
EntityId: comment.EntityId,
|
|
QuoteId: comment.QuoteId,
|
|
RootEntityType: commentMsg.rootEntityType(),
|
|
RootEntityId: cast.ToString(commentMsg.rootEntityId()),
|
|
})
|
|
}
|
|
|
|
// handleQuoteMsg 给被引用人发送消息
|
|
func handleQuoteMsg(comment *models.Comment, commentMsg *CommentMsg) {
|
|
if commentMsg.QuoteComment == nil {
|
|
return
|
|
}
|
|
|
|
var (
|
|
from = comment.UserId
|
|
to = commentMsg.QuoteComment.UserId
|
|
title = commentMsg.msgTitle()
|
|
content = commentMsg.msgContent()
|
|
repliedContent = common.GetSummary(commentMsg.QuoteComment.ContentType, commentMsg.QuoteComment.Content)
|
|
)
|
|
|
|
if from == to {
|
|
return
|
|
}
|
|
|
|
services.MessageService.SendMsg(from, to, msg.TypeCommentReply, title, content, repliedContent,
|
|
&msg.CommentExtraData{
|
|
EntityType: comment.EntityType,
|
|
EntityId: comment.EntityId,
|
|
QuoteId: comment.QuoteId,
|
|
RootEntityType: commentMsg.rootEntityType(),
|
|
RootEntityId: cast.ToString(commentMsg.rootEntityId()),
|
|
})
|
|
}
|
|
|
|
func getCommentMsg(comment *models.Comment) *CommentMsg {
|
|
if comment.EntityType == constants.EntityTopic { // 帖子
|
|
topic := services.TopicService.Get(comment.EntityId)
|
|
if topic != nil && topic.Status == constants.StatusOk {
|
|
return &CommentMsg{
|
|
Comment: comment,
|
|
EntityType: comment.EntityType,
|
|
EntityId: comment.EntityId,
|
|
Entity: topic,
|
|
}
|
|
}
|
|
} else if comment.EntityType == constants.EntityArticle { // 文章
|
|
article := services.ArticleService.Get(comment.EntityId)
|
|
if article != nil && article.Status == constants.StatusOk {
|
|
return &CommentMsg{
|
|
Comment: comment,
|
|
EntityType: comment.EntityType,
|
|
EntityId: comment.EntityId,
|
|
Entity: article,
|
|
}
|
|
}
|
|
} else if comment.EntityType == constants.EntityComment { // 二级评论
|
|
parentComment := services.CommentService.Get(comment.EntityId)
|
|
if parentComment == nil || parentComment.Status != constants.StatusOk {
|
|
return nil
|
|
}
|
|
|
|
ret := &CommentMsg{
|
|
Comment: comment,
|
|
EntityType: parentComment.EntityType, // 二级评论时,取一级评论的
|
|
EntityId: parentComment.EntityId, // 二级评论时,取一级评论的
|
|
ParentComment: parentComment, // 一级评论
|
|
}
|
|
|
|
if parentComment.EntityType == constants.EntityTopic {
|
|
topic := services.TopicService.Get(parentComment.EntityId)
|
|
if topic != nil && topic.Status == constants.StatusOk {
|
|
ret.Entity = topic
|
|
}
|
|
} else if parentComment.EntityType == constants.EntityArticle {
|
|
article := services.ArticleService.Get(parentComment.EntityId)
|
|
if article != nil && article.Status == constants.StatusOk {
|
|
ret.Entity = article
|
|
}
|
|
} else {
|
|
return nil
|
|
}
|
|
|
|
if comment.QuoteId > 0 { // 三级评论
|
|
quoteComment := services.CommentService.Get(comment.QuoteId)
|
|
if quoteComment != nil && quoteComment.Status == constants.StatusOk {
|
|
ret.QuoteComment = quoteComment
|
|
}
|
|
}
|
|
|
|
return ret
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type CommentMsg struct {
|
|
EntityType string // 实体类型
|
|
EntityId int64 // 实体ID
|
|
Entity interface{} // 被评论实体
|
|
Comment *models.Comment // 当前评论
|
|
ParentComment *models.Comment // 上一级评论(二级评论的时候有值)
|
|
QuoteComment *models.Comment // 引用评论
|
|
}
|
|
|
|
// msgType 消息类型
|
|
func (c *CommentMsg) msgType() msg.Type {
|
|
if c.EntityType == constants.EntityTopic {
|
|
return msg.TypeTopicComment
|
|
} else if c.EntityType == constants.EntityArticle {
|
|
return msg.TypeArticleComment
|
|
} else if c.EntityType == constants.EntityComment {
|
|
return msg.TypeCommentReply
|
|
}
|
|
return msg.TypeTopicComment
|
|
}
|
|
|
|
// msgTitle 消息标题
|
|
func (c *CommentMsg) msgTitle() string {
|
|
if c.EntityType == constants.EntityTopic {
|
|
return "回复了你的话题"
|
|
} else if c.EntityType == constants.EntityArticle {
|
|
return "回复了你的文章"
|
|
} else if c.EntityType == constants.EntityComment {
|
|
return "回复了你的评论"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// msgContent 回复内容
|
|
func (c *CommentMsg) msgContent() string {
|
|
return common.GetSummary(c.Comment.ContentType, c.Comment.Content)
|
|
}
|
|
|
|
// msgRepliedContent 被回复的内容
|
|
func (c *CommentMsg) msgRepliedContent() string {
|
|
if c.EntityType == constants.EntityArticle {
|
|
article := c.Entity.(*models.Article)
|
|
return "《" + article.Title + "》"
|
|
} else if c.EntityType == constants.EntityTopic {
|
|
topic := c.Entity.(*models.Topic)
|
|
return "《" + topic.GetTitle() + "》"
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func (c *CommentMsg) rootEntityUserId() int64 {
|
|
if c.ParentComment != nil { // 二级评论
|
|
if c.ParentComment.EntityType == constants.EntityTopic {
|
|
topic := c.Entity.(*models.Topic)
|
|
return topic.UserId
|
|
} else if c.ParentComment.EntityType == constants.EntityArticle {
|
|
article := c.Entity.(*models.Article)
|
|
return article.UserId
|
|
}
|
|
} else {
|
|
if c.Comment.EntityType == constants.EntityTopic {
|
|
topic := c.Entity.(*models.Topic)
|
|
return topic.UserId
|
|
} else if c.Comment.EntityType == constants.EntityArticle {
|
|
article := c.Entity.(*models.Article)
|
|
return article.UserId
|
|
}
|
|
}
|
|
return 0
|
|
}
|
|
|
|
func (c *CommentMsg) rootEntityType() string {
|
|
if c.ParentComment != nil { // 二级评论
|
|
return c.ParentComment.EntityType
|
|
} else {
|
|
return c.Comment.EntityType
|
|
}
|
|
}
|
|
|
|
func (c *CommentMsg) rootEntityId() int64 {
|
|
if c.ParentComment != nil { // 二级评论
|
|
return c.ParentComment.EntityId
|
|
} else {
|
|
return c.Comment.EntityId
|
|
}
|
|
}
|