mirror of
https://github.com/discourse/discourse.git
synced 2024-12-20 12:43:47 +08:00
2c918a3161
* FEATURE: Staff can receive pending user reminders more frequently. We now express the "pending_users_reminder_delay" in minutes instead of hours so staff can have finer control over the delay. We need to keep in mind that the reminders could still take up to 20 minutes, even when using a lower value. We send them from a scheduled job. * Migrate to a new site setting for the reminders delay
67 lines
2.2 KiB
Ruby
67 lines
2.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Jobs
|
|
|
|
class PendingUsersReminder < ::Jobs::Scheduled
|
|
every 5.minutes
|
|
|
|
def execute(args)
|
|
if SiteSetting.must_approve_users && SiteSetting.pending_users_reminder_delay_minutes >= 0
|
|
query = AdminUserIndexQuery.new(query: 'pending', stats: false).find_users_query # default order is: users.created_at DESC
|
|
if SiteSetting.pending_users_reminder_delay_minutes > 0
|
|
query = query.where('users.created_at < ?', SiteSetting.pending_users_reminder_delay_minutes.minutes.ago)
|
|
end
|
|
|
|
newest_username = query.limit(1).select(:username).first&.username
|
|
|
|
return true if newest_username == previous_newest_username # already notified
|
|
|
|
count = query.count
|
|
|
|
if count > 0
|
|
target_usernames = Group[:moderators].users.map do |user|
|
|
next if user.bot?
|
|
|
|
unseen_count = user.notifications.joins(:topic)
|
|
.where("notifications.id > ?", user.seen_notification_id)
|
|
.where("notifications.read = false")
|
|
.where("topics.subtype = ?", TopicSubtype.pending_users_reminder)
|
|
.count
|
|
|
|
unseen_count == 0 ? user.username : nil
|
|
end.compact
|
|
|
|
unless target_usernames.empty?
|
|
PostCreator.create(
|
|
Discourse.system_user,
|
|
target_usernames: target_usernames,
|
|
archetype: Archetype.private_message,
|
|
subtype: TopicSubtype.pending_users_reminder,
|
|
title: I18n.t("system_messages.pending_users_reminder.subject_template", count: count),
|
|
raw: I18n.t("system_messages.pending_users_reminder.text_body_template", count: count, base_url: Discourse.base_url)
|
|
)
|
|
|
|
self.previous_newest_username = newest_username
|
|
end
|
|
end
|
|
end
|
|
|
|
true
|
|
end
|
|
|
|
def previous_newest_username
|
|
Discourse.redis.get previous_newest_username_cache_key
|
|
end
|
|
|
|
def previous_newest_username=(username)
|
|
Discourse.redis.setex previous_newest_username_cache_key, 7.days, username
|
|
end
|
|
|
|
def previous_newest_username_cache_key
|
|
"pending-users-reminder:newest-username"
|
|
end
|
|
|
|
end
|
|
|
|
end
|