FEATURE: Watched Words: when posts contain words, do one of flag, require approval, censor, or block

This commit is contained in:
Neil Lalonde
2017-07-26 11:01:09 -04:00
parent 9d774a951a
commit 24cb950432
49 changed files with 1096 additions and 37 deletions
+18 -5
View File
@@ -1,6 +1,7 @@
require_dependency 'post_creator'
require_dependency 'new_post_result'
require_dependency 'post_enqueuer'
require_dependency 'word_watcher'
# Determines what actions should be taken with new posts.
#
@@ -66,21 +67,25 @@ class NewPostManager
end
def self.user_needs_approval?(manager)
def self.exempt_user?(user)
user.staff? || user.staged
end
def self.post_needs_approval?(manager)
user = manager.user
return false if user.staff? || user.staged
return false if exempt_user?(user)
(user.trust_level <= TrustLevel.levels[:basic] && user.post_count < SiteSetting.approve_post_count) ||
(user.trust_level < SiteSetting.approve_unless_trust_level.to_i) ||
(manager.args[:title].present? && user.trust_level < SiteSetting.approve_new_topics_unless_trust_level.to_i) ||
is_fast_typer?(manager) ||
matches_auto_block_regex?(manager)
matches_auto_block_regex?(manager) ||
WordWatcher.new("#{manager.args[:title]} #{manager.args[:raw]}").requires_approval?
end
def self.default_handler(manager)
if user_needs_approval?(manager)
if post_needs_approval?(manager)
validator = Validators::PostValidator.new
post = Post.new(raw: manager.args[:raw])
post.user = manager.user
@@ -118,6 +123,7 @@ class NewPostManager
SiteSetting.approve_post_count > 0 ||
SiteSetting.approve_unless_trust_level.to_i > 0 ||
SiteSetting.approve_new_topics_unless_trust_level.to_i > 0 ||
WordWatcher.words_for_action_exists?(:require_approval) ||
handlers.size > 1
end
@@ -127,8 +133,15 @@ class NewPostManager
end
def perform
if !self.class.exempt_user?(@user) && WordWatcher.new("#{@args[:title]} #{@args[:raw]}").should_block?
result = NewPostResult.new(:created_post, false)
result.errors[:base] << I18n.t('contains_blocked_words')
return result
end
# We never queue private messages
return perform_create_post if @args[:archetype] == Archetype.private_message
if args[:topic_id] && Topic.where(id: args[:topic_id], archetype: Archetype.private_message).exists?
return perform_create_post
end