Files
danbooru/app/logical/approver_pruner.rb
2022-10-21 20:52:31 +02:00

59 lines
2.6 KiB
Ruby

# frozen_string_literal: true
# Demote all approvers who haven't approved at least 30 posts in the last 45
# days. Moderators and recently promoted approvers are exempt. Runs as a monthly
# maintenance task. Approvers who are facing demotion are sent a weekly warning
# dmail first.
#
# @see DanbooruMaintenance#monthly
module ApproverPruner
module_function
APPROVAL_PERIOD = 45.days
MINIMUM_APPROVALS = 30
# Get the list of inactive approvers.
# @return [Array<User>] the list of inactive approvers
def inactive_approvers
recently_promoted_approvers = UserFeedback.where("created_at >= ?", APPROVAL_PERIOD.ago).where_like(:body, "*You gained the ability to approve posts*").pluck(:user_id) # XXX remove in two months
recently_promoted_approvers += UserFeedback.where("created_at >= ?", APPROVAL_PERIOD.ago).where_like(:body, "*You have been promoted to an Approver*").pluck(:user_id)
approvers = User.where(level: User::Levels::APPROVER).where.not(id: recently_promoted_approvers)
approvers.select do |approver|
approver.post_approvals.where("created_at >= ?", APPROVAL_PERIOD.ago).count < MINIMUM_APPROVALS
end
end
# Demote all inactive approvers
def prune!
inactive_approvers.each do |user|
CurrentUser.scoped(User.system) do
user.update!(level: User::Levels::CONTRIBUTOR)
user.feedback.create(category: "neutral", body: "Lost approval privileges", creator: User.system)
Dmail.create_automated(
to_id: user.id,
title: "Approver inactivity",
body: "You've approved fewer than #{MINIMUM_APPROVALS} posts in the past #{APPROVAL_PERIOD.inspect}. In order to make sure the list of active approvers is up-to-date, you have lost your approval privileges. If you wish to dispute this, you can message an admin to have your permission reinstated."
)
end
end
end
# Send a warning dmail to approvers who are pending demotion.
def dmail_inactive_approvers!
days_until_next_month = (Date.current.next_month.beginning_of_month - Date.current).to_i
return unless days_until_next_month <= 21
inactive_approvers.each do |user|
Dmail.create_automated(to: user, title: "You will lose approval privileges soon", body: <<~BODY)
You've approved fewer than #{MINIMUM_APPROVALS} posts in the past
#{APPROVAL_PERIOD.inspect}. You will lose your approval privileges in
#{days_until_next_month} #{"day".pluralize(days_until_next_month)}
unless you have approved at least #{MINIMUM_APPROVALS} posts by the end
of the month.
BODY
end
end
end