199 lines
5.8 KiB
Go
199 lines
5.8 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"time"
|
|
|
|
"go-common/app/job/main/credit/model"
|
|
"go-common/app/service/main/archive/model/archive"
|
|
"go-common/library/log"
|
|
)
|
|
|
|
func (s *Service) replyAllConsumer() {
|
|
defer s.wg.Done()
|
|
var (
|
|
msgs = s.replyAllSub.Messages()
|
|
err error
|
|
c = context.TODO()
|
|
)
|
|
for {
|
|
msg, ok := <-msgs
|
|
if !ok {
|
|
log.Error("s.replyAllSub.Message closed")
|
|
return
|
|
}
|
|
msg.Commit()
|
|
m := &model.Reply{}
|
|
if err = json.Unmarshal(msg.Value, m); err != nil {
|
|
log.Error("json.Unmarshal(%v) error(%v)", string(msg.Value), err)
|
|
continue
|
|
}
|
|
switch m.Action {
|
|
case model.RouteReplyReport:
|
|
err = s.addReplyReport(c, m)
|
|
default:
|
|
log.Warn("replyAllConsumer unknown message action(%s)", m.Action)
|
|
}
|
|
if err != nil {
|
|
log.Error("replyMessage key(%s) value(%s) partition(%d) offset(%d) commit error(%v)", msg.Key, msg.Value, msg.Partition, msg.Offset, err)
|
|
continue
|
|
}
|
|
log.Info("replyMessage key(%s) value(%s) partition(%d) offset(%d) commit", msg.Key, msg.Value, msg.Partition, msg.Offset)
|
|
}
|
|
}
|
|
|
|
func (s *Service) addReplyReport(c context.Context, m *model.Reply) (err error) {
|
|
if m.Reply == nil || m.Subject == nil || m.Report == nil {
|
|
log.Warn("reply content(%+v) empty!", m)
|
|
return
|
|
}
|
|
if m.Report.State == model.ReportStateAddJuge {
|
|
log.Warn("rpid(%d) state(%d) is in juge", m.Report.RPID, m.Report.State)
|
|
return
|
|
}
|
|
if m.Report.Type != model.SubTypeArchive {
|
|
log.Warn("m.Report.Type(%d) model.SubTypeArchive(%d)", m.Report.Type, model.SubTypeArchive)
|
|
return
|
|
}
|
|
var ca *model.AutoCaseConf
|
|
if ca, err = s.dao.AutoCaseConf(c, model.OriginReply); err != nil {
|
|
log.Error("s.dao.AutoCaseConf(%d) error(%v)", model.OriginReply, err)
|
|
return
|
|
}
|
|
if ca == nil {
|
|
log.Warn("otype(%d) auto acse conf is not set !", model.OriginReply)
|
|
return
|
|
}
|
|
replyReportReason := model.BlockedReasonTypeByReply(m.Report.Reason)
|
|
if _, ok := ca.Reasons[replyReportReason]; !ok {
|
|
log.Warn("m.Report.Reason(%d) not int ca.Reasons(%+v)", m.Report.Reason, ca.Reasons)
|
|
return
|
|
}
|
|
if m.Report.Score < ca.ReportScore {
|
|
log.Warn("m.Report.Score(%d) ca.ReportScore(%d)", m.Report.Score, ca.ReportScore)
|
|
return
|
|
}
|
|
if m.Reply.Like > int64(ca.Likes) {
|
|
log.Warn("m.Reply.Like(%d) ca.Likes(%d)", m.Reply.Like, ca.Likes)
|
|
return
|
|
}
|
|
var disCount, total int64
|
|
if disCount, err = s.dao.CountCaseMID(c, m.Reply.MID, model.OriginReply); err != nil {
|
|
log.Error("s.dao.CountBlocked(%d) err(%v)", m.Reply.MID, err)
|
|
return
|
|
}
|
|
if disCount > 0 {
|
|
log.Warn("rpid(%d) mid(%d) report in 24 hours", m.Report.RPID, m.Reply.MID)
|
|
return
|
|
}
|
|
if total, err = s.dao.CountBlocked(c, m.Reply.MID, time.Now().AddDate(-1, 0, 0)); err != nil {
|
|
log.Error("s.dao.CountBlocked(%d) err(%v)", m.Reply.MID, err)
|
|
return
|
|
}
|
|
punishResult, blockedDay := model.PunishResultDays(total)
|
|
mc := &model.Case{
|
|
Mid: m.Reply.MID,
|
|
Status: model.CaseStatusGrantStop,
|
|
RelationID: fmt.Sprintf("%d-%d-%d", m.Report.RPID, m.Report.Type, m.Report.OID),
|
|
PunishResult: punishResult,
|
|
BlockedDay: blockedDay,
|
|
OPID: model.AutoOPID,
|
|
BCtime: m.Reply.CTime,
|
|
}
|
|
mc.Origin = model.Origin{
|
|
OriginTitle: s.replyOriginTitle(c, m.Report.OID, m.Report.Type),
|
|
OriginContent: m.Reply.Content.Message,
|
|
OriginType: int64(model.OriginReply),
|
|
OriginURL: s.replyOriginURL(m.Report.RPID, m.Report.OID, m.Report.Type),
|
|
ReasonType: int64(replyReportReason),
|
|
}
|
|
var count int64
|
|
if count, err = s.dao.CaseRelationIDCount(c, model.OriginReply, mc.RelationID); err != nil {
|
|
log.Error("ss.dao.CaseRelationIDCount(%d,%s) err(%v)", model.OriginReply, mc.RelationID, err)
|
|
return
|
|
}
|
|
if count > 0 {
|
|
log.Warn("rpid(%d) state(%d) is alreadly juge", m.Report.RPID, m.Report.State)
|
|
return
|
|
}
|
|
var need bool
|
|
if need, err = s.dao.CheckFilter(c, "credit", m.Reply.Content.Message, ""); err != nil {
|
|
log.Error("s.dao.CheckFilter(%s,%s) error(%v)", "credit", m.Reply.Content.Message, err)
|
|
return
|
|
}
|
|
if need {
|
|
log.Warn("reply(%d) message(%s) is filter", m.Report.RPID, m.Reply.Content.Message)
|
|
return
|
|
}
|
|
if err = s.dao.AddBlockedCase(c, mc); err != nil {
|
|
log.Error("s.dao.AddBlockedCase(%+v) err(%v)", mc, err)
|
|
return
|
|
}
|
|
s.dao.UpReplyState(c, m.Report.OID, m.Report.RPID, m.Report.Type, model.ReportStateAddJuge)
|
|
s.dao.UpAppealState(c, model.AppealBusinessID, m.Report.OID, m.Report.RPID)
|
|
return
|
|
}
|
|
|
|
func (s *Service) replyOriginTitle(c context.Context, oid int64, oType int8) (title string) {
|
|
switch oType {
|
|
case model.SubTypeArchive:
|
|
arg := &archive.ArgAid2{Aid: oid}
|
|
arc, err := s.arcRPC.Archive3(c, arg)
|
|
if err != nil {
|
|
log.Error("s.arcRPC.Archive3(%v) error(%v)", arg, err)
|
|
return
|
|
}
|
|
title = arc.Title
|
|
return
|
|
}
|
|
return
|
|
}
|
|
|
|
func (s *Service) replyOriginURL(rpid, oid int64, oType int8) string {
|
|
switch oType {
|
|
case model.SubTypeArchive:
|
|
return fmt.Sprintf(model.ReplyOriginURL, oid, rpid)
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// RegReply regist reply subject.
|
|
func (s *Service) RegReply(c context.Context, table string, nwMsg []byte, oldMsg []byte) (err error) {
|
|
var (
|
|
replyType int8
|
|
replyID int64
|
|
)
|
|
switch table {
|
|
case _blockedCaseTable:
|
|
mr := &model.Case{}
|
|
if err = json.Unmarshal(nwMsg, mr); err != nil {
|
|
log.Error("json.Unmarshal(%s) error(%v)", string(nwMsg), err)
|
|
return
|
|
}
|
|
replyType = model.ReplyCase
|
|
replyID = mr.ID
|
|
case _blockedInfoTable:
|
|
mr := &model.BlockedInfo{}
|
|
if err = json.Unmarshal(nwMsg, mr); err != nil {
|
|
log.Error("json.Unmarshal(%s) error(%v)", string(nwMsg), err)
|
|
return
|
|
}
|
|
replyType = model.ReplyBlocked
|
|
replyID = mr.ID
|
|
case _blockedPublishTable:
|
|
mr := &model.Publish{}
|
|
if err = json.Unmarshal(nwMsg, mr); err != nil {
|
|
log.Error("json.Unmarshal(%s) error(%v)", string(nwMsg), err)
|
|
return
|
|
}
|
|
if mr.PStatus != model.PublishOpen {
|
|
return
|
|
}
|
|
replyType = model.ReplyPublish
|
|
replyID = mr.ID
|
|
}
|
|
return s.dao.RegReply(c, replyID, replyType)
|
|
}
|