Files
danbooru/app/models/moderation_report.rb
evazion 24cb920608 mod reports: include reported user and message in forum post.
Also fix it so that reports against dmails include the key in the dmail
link so that mods can view the reported dmail.
2020-02-03 04:52:12 -06:00

87 lines
2.3 KiB
Ruby

class ModerationReport < ApplicationRecord
belongs_to :model, polymorphic: true
belongs_to :creator, class_name: "User"
validates :reason, presence: true
validates :model_type, inclusion: { in: %w[Comment Dmail ForumPost User] }
validates :creator, uniqueness: { scope: [:model_type, :model_id], message: "have already reported this message." }
after_create :create_forum_post!
after_create :autoban_reported_user
scope :user, -> { where(model_type: "User") }
scope :dmail, -> { where(model_type: "Dmail") }
scope :comment, -> { where(model_type: "Comment") }
scope :forum_post, -> { where(model_type: "ForumPost") }
scope :recent, -> { where("moderation_reports.created_at >= ?", 1.week.ago) }
def self.enabled?
!Rails.env.production?
end
def forum_topic_title
"Reports requiring moderation"
end
def forum_topic_body
"This topic deals with moderation events as reported by Builders. Reports can be filed against users, comments, or forum posts."
end
def forum_topic
topic = ForumTopic.find_by_title(forum_topic_title)
if topic.nil?
CurrentUser.as_system do
topic = ForumTopic.create!(creator: User.system, title: forum_topic_title, category_id: 0, min_level: User::Levels::MODERATOR)
forum_post = ForumPost.create!(creator: User.system, body: forum_topic_body, topic: topic)
end
end
topic
end
def forum_post_message
<<~EOS
[b]Report[/b] modreport ##{id}
[b]Submitted by[/b] <@#{creator.name}>
[b]Submitted against[/b] #{model.dtext_shortlink(key: true)} by <@#{reported_user.name}>
[b]Reason[/b] #{reason}
[quote]
#{model.body}
[/quote]
EOS
end
def create_forum_post!
updater = ForumUpdater.new(forum_topic)
updater.update(forum_post_message)
end
def autoban_reported_user
if SpamDetector.is_spammer?(reported_user)
SpamDetector.ban_spammer!(reported_user)
end
end
def reported_user
case model
when Comment, ForumPost
model.creator
when Dmail
model.from
else
raise NotImplementedError
end
end
def self.visible(user = CurrentUser.user)
user.is_moderator? ? all : none
end
def self.search(params)
q = super
q = q.search_attributes(params, :model_type, :model_id, :creator_id)
q.apply_default_order(params)
end
end