-
Notifications
You must be signed in to change notification settings - Fork 420
/
discussion_spam_check_job.rb
66 lines (53 loc) · 2.71 KB
/
discussion_spam_check_job.rb
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
class DiscussionSpamCheckJob < ApplicationJob
queue_as :low
def perform(discussion, ip, user_agent, referrer)
return if discussion.soft_deleted?
return if pattern_check(discussion)
return if repeat_check(discussion)
check_with_akismet(discussion, ip, user_agent, referrer)
end
def pattern_check(discussion)
return unless CommentSpamCheckJob.text_is_spammy?(discussion.first_comment.text)
discussion.update(review_reason: Discussion::REVIEW_REASON_RAINMAN)
Report.create!(item: discussion, auto_reporter: 'rainman', reason: Report::REASON_SPAM)
end
def repeat_check(discussion)
previous_comment = CommentSpamCheckJob.find_previous_comment(discussion.first_comment)
if previous_comment
previous_discussion = previous_comment.discussion
previous_report = previous_discussion.reports.upheld.take || previous_comment.reports.upheld.take
return Report.create!(item: discussion, auto_reporter: 'rainman', reason: previous_report&.reason || Report::REASON_SPAM, explanation: "Repost of#{' deleted' if previous_discussion.soft_deleted?} comment: #{previous_comment.url}. #{"Previous report: #{previous_report.url}" if previous_report}")
end
previous_comment = CommentSpamCheckJob.find_previous_comment_with_link(discussion.first_comment)
if previous_comment
previous_discussion = previous_comment.discussion
previous_report = previous_discussion.reports.upheld.take || previous_comment.reports.upheld.take
return Report.create!(item: discussion, auto_reporter: 'rainman', reason: previous_report&.reason || Report::REASON_SPAM, explanation: "Repost of#{' deleted' if previous_discussion.soft_deleted?} comment with same link: #{previous_comment.url}. #{"Previous report: #{previous_report.url}" if previous_report}")
end
nil
end
def check_with_akismet(discussion, ip, user_agent, referrer)
return unless Akismet.api_key
akismet_params = [
ip,
user_agent,
{
referrer:,
post_url: discussion.url,
post_modified_at: discussion.updated_at,
type: 'forum-post',
text: discussion.first_comment.text,
created_at: discussion.created_at,
author: discussion.poster&.name,
author_email: discussion.poster&.email,
languages: Rails.application.config.available_locales.keys,
env: {},
},
]
is_spam, is_blatant = Akismet.check(*akismet_params)
AkismetSubmission.create!(item: discussion, akismet_params:, result_spam: is_spam, result_blatant: is_blatant)
return unless is_spam
Report.create!(item: discussion, auto_reporter: 'akismet', reason: Report::REASON_SPAM)
discussion.update(review_reason: Discussion::REVIEW_REASON_AKISMET)
end
end