mirror of
https://github.com/discourse/discourse.git
synced 2026-09-05 04:40:41 -05:00
FEATURE: Watched Words: when posts contain words, do one of flag, require approval, censor, or block
This commit is contained in:
+18
-5
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user