mirror of
https://github.com/discourse/discourse.git
synced 2024-12-01 08:43:43 +08:00
78ddc82952
There was a situation where if: * There were new flags to review that met the visibility threshold AND * There were old flags that *didn't* meet the threshold THEN a pending flags notification would be sent out. This fixes that case. Staff should not be notified of flags if they do not meet the threshold and are old.
73 lines
2.0 KiB
Ruby
73 lines
2.0 KiB
Ruby
require_dependency 'flag_query'
|
|
|
|
module Jobs
|
|
|
|
class PendingFlagsReminder < Jobs::Scheduled
|
|
|
|
every 1.hour
|
|
|
|
def execute(args)
|
|
if SiteSetting.notify_about_flags_after > 0
|
|
flagged_posts_count = PostAction.flagged_posts_count
|
|
return unless flagged_posts_count > 0
|
|
|
|
flag_ids = pending_flag_ids
|
|
if flag_ids.size > 0 && last_notified_id.to_i < flag_ids.max
|
|
|
|
usernames = active_moderator_usernames
|
|
mentions = usernames.size > 0 ? "@#{usernames.join(', @')} " : ""
|
|
|
|
PostCreator.create(
|
|
Discourse.system_user,
|
|
target_group_names: Group[:moderators].name,
|
|
archetype: Archetype.private_message,
|
|
subtype: TopicSubtype.system_message,
|
|
title: I18n.t('flags_reminder.subject_template', count: flagged_posts_count),
|
|
raw: mentions + I18n.t('flags_reminder.flags_were_submitted', count: SiteSetting.notify_about_flags_after, base_path: Discourse.base_path)
|
|
)
|
|
|
|
self.last_notified_id = flag_ids.max
|
|
end
|
|
end
|
|
end
|
|
|
|
def pending_flag_ids
|
|
by_post = {}
|
|
|
|
FlagQuery.flagged_post_actions(filter: 'active')
|
|
.where('post_actions.created_at < ?', SiteSetting.notify_about_flags_after.to_i.hours.ago)
|
|
.pluck(:post_id, :id)
|
|
.each do |row|
|
|
|
|
by_post[row[0]] ||= []
|
|
by_post[row[0]] << row[1]
|
|
end
|
|
|
|
by_post.delete_if { |post_id, flags| flags.size < SiteSetting.min_flags_staff_visibility }
|
|
by_post.values.flatten.uniq
|
|
end
|
|
|
|
def last_notified_id
|
|
$redis.get(self.class.last_notified_key)&.to_i
|
|
end
|
|
|
|
def last_notified_id=(arg)
|
|
$redis.set(self.class.last_notified_key, arg)
|
|
end
|
|
|
|
def self.last_notified_key
|
|
"last_notified_pending_flag_id".freeze
|
|
end
|
|
|
|
def active_moderator_usernames
|
|
User.where(moderator: true)
|
|
.human_users
|
|
.order('last_seen_at DESC')
|
|
.limit(3)
|
|
.pluck(:username)
|
|
end
|
|
|
|
end
|
|
|
|
end
|