discourse/app/services/user_silencer.rb

94 lines
2.7 KiB
Ruby

# frozen_string_literal: true
class UserSilencer
attr_reader :user_history
def initialize(user, by_user = nil, opts = {})
@user, @by_user, @opts = user, by_user, opts
end
def self.silence(user, by_user = nil, opts = {})
UserSilencer.new(user, by_user, opts).silence
end
def self.unsilence(user, by_user = nil, opts = {})
UserSilencer.new(user, by_user, opts).unsilence
end
def self.was_silenced_for?(post)
return false if post.blank?
UserHistory.where(action: UserHistory.actions[:silence_user], post: post).exists?
end
def silence
hide_posts unless @opts[:keep_posts]
unless @user.silenced_till.present?
@user.silenced_till = @opts[:silenced_till] || 1000.years.from_now
if @user.save
message_type = @opts[:message] || :silenced_by_staff
details = StaffMessageFormat.new(:silence, @opts[:reason], @opts[:message_body]).format
context = "#{message_type}: #{@opts[:reason]}"
if @by_user
log_params = { context: context, details: details }
log_params[:post_id] = @opts[:post_id].to_i if @opts[:post_id]
@user_history = StaffActionLogger.new(@by_user).log_silence_user(@user, log_params)
end
silence_message_params = {}
DiscourseEvent.trigger(
:user_silenced,
user: @user,
silenced_by: @by_user,
reason: @opts[:reason],
message: @opts[:message_body],
user_history: @user_history,
post_id: @opts[:post_id],
silenced_till: @user.silenced_till,
silenced_at: DateTime.now,
silence_message_params: silence_message_params,
)
silence_message_params.merge!(post_alert_options: { skip_send_email: true })
SystemMessage.create(@user, message_type, silence_message_params)
true
end
else
false
end
end
def hide_posts
return unless @user.trust_level == TrustLevel[0]
Post
.where(user_id: @user.id)
.where("created_at > ?", 24.hours.ago)
.update_all(
[
"hidden = true, hidden_reason_id = COALESCE(hidden_reason_id, ?)",
Post.hidden_reasons[:new_user_spam_threshold_reached],
],
)
topic_ids =
Post
.where(user_id: @user.id, post_number: 1)
.where("created_at > ?", 24.hours.ago)
.pluck(:topic_id)
Topic.where(id: topic_ids).update_all(visible: false) unless topic_ids.empty?
end
def unsilence
@user.silenced_till = nil
if @user.save
DiscourseEvent.trigger(:user_unsilenced, user: @user, by_user: @by_user)
SystemMessage.create(@user, :unsilenced)
StaffActionLogger.new(@by_user).log_unsilence_user(@user) if @by_user
end
end
end