Class: SpamRule::AutoSilence

Inherits:
Object
  • Object
show all
Defined in:
app/services/spam_rule/auto_silence.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(user, post = nil) ⇒ AutoSilence

Returns a new instance of AutoSilence.



6
7
8
9
# File 'app/services/spam_rule/auto_silence.rb', line 6

def initialize(user, post = nil)
  @user = user
  @post = post
end

Instance Attribute Details

#group_messageObject (readonly)

Returns the value of attribute group_message.



4
5
6
# File 'app/services/spam_rule/auto_silence.rb', line 4

def group_message
  @group_message
end

Class Method Details

.prevent_posting?(user) ⇒ Boolean

Returns:

  • (Boolean)


15
16
17
# File 'app/services/spam_rule/auto_silence.rb', line 15

def self.prevent_posting?(user)
  user.blank? || user.silenced? || new(user).should_autosilence?
end

Instance Method Details

#flagged_post_idsObject



52
53
54
55
56
57
# File 'app/services/spam_rule/auto_silence.rb', line 52

def flagged_post_ids
  Post
    .where(user_id: @user.id)
    .where("spam_count > 0 OR off_topic_count > 0 OR inappropriate_count > 0")
    .pluck(:id)
end

#performObject



11
12
13
# File 'app/services/spam_rule/auto_silence.rb', line 11

def perform
  I18n.with_locale(SiteSetting.default_locale) { silence_user if should_autosilence? }
end

#should_autosilence?Boolean

Returns:

  • (Boolean)


19
20
21
22
23
24
25
26
27
# File 'app/services/spam_rule/auto_silence.rb', line 19

def should_autosilence?
  return false if @user.blank?
  return false if @user.staged?
  return false if @user.has_trust_level?(TrustLevel[1])

  SiteSetting.num_users_to_silence_new_user > 0 &&
    user_spam_stats.total_spam_score >= Reviewable.spam_score_to_silence_new_user &&
    user_spam_stats.spam_user_count >= SiteSetting.num_users_to_silence_new_user
end

#silence_userObject



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'app/services/spam_rule/auto_silence.rb', line 59

def silence_user
  Post.transaction do
    silencer =
      UserSilencer.new(
        @user,
        Discourse.system_user,
        message: :too_many_spam_flags,
        post_id: @post&.id,
      )

    if silencer.silence && SiteSetting.notify_mods_when_user_silenced
      @group_message =
        GroupMessage.create(
          Group[:moderators].name,
          :user_automatically_silenced,
          user: @user,
          limit_once_per: false,
        )
    end
  end
end

#user_spam_statsObject



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'app/services/spam_rule/auto_silence.rb', line 29

def user_spam_stats
  return @user_spam_stats if @user_spam_stats

  params = {
    user_id: @user.id,
    spam_type: PostActionType.types[:spam],
    pending: ReviewableScore.statuses[:pending],
    agreed: ReviewableScore.statuses[:agreed],
  }

  result = DB.query(<<~SQL, params)
    SELECT COALESCE(SUM(rs.score), 0) AS total_spam_score,
      COUNT(DISTINCT rs.user_id) AS spam_user_count
    FROM reviewables AS r
    INNER JOIN reviewable_scores AS rs ON rs.reviewable_id = r.id
    WHERE r.target_created_by_id = :user_id
      AND rs.reviewable_score_type = :spam_type
      AND rs.status IN (:pending, :agreed)
  SQL

  @user_spam_stats = result[0]
end