-
-
Notifications
You must be signed in to change notification settings - Fork 148
/
Copy pathservice_anti_spam.go
94 lines (77 loc) · 2.33 KB
/
service_anti_spam.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package core
import (
"fmt"
"net/url"
"github.com/artalkjs/artalk/v2/internal/anti_spam"
"github.com/artalkjs/artalk/v2/internal/entity"
)
var _ Service = (*AntiSpamService)(nil)
type AntiSpamService struct {
app *App
client *anti_spam.AntiSpam
}
func NewAntiSpamService(app *App) *AntiSpamService {
return &AntiSpamService{app: app}
}
func (s *AntiSpamService) Init() error {
s.client = anti_spam.NewAntiSpam(&anti_spam.AntiSpamConf{
ModeratorConf: s.app.Conf().Moderator,
OnBlockComment: func(commentID uint) {
comment := s.app.dao.FindComment(commentID)
if comment.IsPending {
return // no need to block again
}
// update comment status
comment.IsPending = true
s.app.dao.UpdateComment(&comment)
},
OnUpdateComment: func(commentID uint, content string) {
comment := s.app.dao.FindComment(commentID)
comment.Content = content
s.app.dao.UpdateComment(&comment)
},
})
return nil
}
func (s *AntiSpamService) Dispose() error {
s.client = nil
return nil
}
func (s *AntiSpamService) CheckAndBlock(data *AntiSpamCheckPayload) {
s.client.CheckAndBlock(s.payload2CheckerParams(data))
}
// Payload for CheckAndBlock function
type AntiSpamCheckPayload struct {
Comment *entity.Comment
ReqReferer string
ReqIP string
ReqUserAgent string
}
// Transform `AntiSpamCheckPayload` to `CheckerParams` for `anti_spam.CheckAndBlock` func call
//
// The `AntiSpamCheckPayload` struct is exposed and can be used by other modules
// The `CheckerParams` struct is used by `anti_spam.CheckAndBlock` in anti_spam module
func (s *AntiSpamService) payload2CheckerParams(payload *AntiSpamCheckPayload) *anti_spam.CheckerParams {
user := s.app.dao.FetchUserForComment(payload.Comment)
siteURL := ""
if payload.Comment.SiteName != "" {
site := s.app.dao.FindSite(payload.Comment.SiteName)
siteURL = s.app.dao.CookSite(&site).FirstUrl
}
if siteURL == "" {
// extract site url from referer
if pr, err := url.Parse(payload.ReqReferer); err == nil && pr.Scheme != "" && pr.Host != "" {
siteURL = fmt.Sprintf("%s://%s", pr.Scheme, pr.Host)
}
}
return &anti_spam.CheckerParams{
BlogURL: siteURL,
Content: payload.Comment.Content,
CommentID: payload.Comment.ID,
UserName: user.Name,
UserEmail: user.Email,
UserID: user.ID,
UserIP: payload.ReqIP,
UserAgent: payload.ReqUserAgent,
}
}