2024-02-25 12:15:55 -05:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2014-03-05 20:44:07 -05:00
|
|
|
class UserPromotion
|
2022-03-16 10:32:24 -04:00
|
|
|
attr_reader :user, :promoter, :new_level, :options, :old_can_approve_posts, :old_can_upload_free, :old_no_flagging, :old_replacements_beta
|
2014-03-05 20:44:07 -05:00
|
|
|
|
2014-10-28 14:05:21 -04:00
|
|
|
def initialize(user, promoter, new_level, options = {})
|
2014-03-05 20:44:07 -05:00
|
|
|
@user = user
|
|
|
|
@promoter = promoter
|
|
|
|
@new_level = new_level
|
2014-10-28 14:05:21 -04:00
|
|
|
@options = options
|
2014-03-05 20:44:07 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def promote!
|
2014-03-10 20:16:50 -04:00
|
|
|
validate
|
|
|
|
|
2015-10-28 10:35:17 -04:00
|
|
|
@old_can_approve_posts = user.can_approve_posts?
|
|
|
|
@old_can_upload_free = user.can_upload_free?
|
2018-12-11 19:41:20 -05:00
|
|
|
@old_no_flagging = user.no_flagging?
|
2022-01-30 07:33:14 -05:00
|
|
|
@old_replacements_beta = user.replacements_beta?
|
2015-10-28 10:35:17 -04:00
|
|
|
|
2014-03-05 20:44:07 -05:00
|
|
|
user.level = new_level
|
2017-02-21 15:39:45 -05:00
|
|
|
|
2022-09-26 14:20:20 -04:00
|
|
|
if options.key?(:can_approve_posts)
|
2017-02-21 15:39:45 -05:00
|
|
|
user.can_approve_posts = options[:can_approve_posts]
|
|
|
|
end
|
|
|
|
|
2022-09-26 14:20:20 -04:00
|
|
|
if options.key?(:can_upload_free)
|
2017-02-21 15:39:45 -05:00
|
|
|
user.can_upload_free = options[:can_upload_free]
|
|
|
|
end
|
2018-12-11 19:41:20 -05:00
|
|
|
|
2022-09-26 14:20:20 -04:00
|
|
|
if options.key?(:no_flagging)
|
2018-12-11 19:41:20 -05:00
|
|
|
user.no_flagging = options[:no_flagging]
|
|
|
|
end
|
2019-04-13 03:22:27 -04:00
|
|
|
|
2022-09-26 14:20:20 -04:00
|
|
|
if options.key?(:replacements_beta)
|
2022-01-30 07:33:14 -05:00
|
|
|
user.replacements_beta = options[:replacements_beta]
|
|
|
|
end
|
|
|
|
|
2017-02-14 15:46:54 -05:00
|
|
|
create_mod_actions
|
2014-03-05 20:44:07 -05:00
|
|
|
|
|
|
|
user.save
|
|
|
|
end
|
|
|
|
|
2022-01-30 07:33:14 -05:00
|
|
|
private
|
2017-02-14 15:46:54 -05:00
|
|
|
|
2022-09-26 14:20:20 -04:00
|
|
|
def flag_check(added, removed, flag, friendly_name)
|
|
|
|
user_flag = user.send("#{flag}?")
|
|
|
|
return if send("old_#{flag}") == user_flag
|
|
|
|
|
|
|
|
if user_flag
|
|
|
|
added << friendly_name
|
|
|
|
else
|
|
|
|
removed << friendly_name
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2019-04-13 03:22:27 -04:00
|
|
|
def create_mod_actions
|
|
|
|
added = []
|
|
|
|
removed = []
|
|
|
|
|
|
|
|
flag_check(added, removed, "can_approve_posts", "approve posts")
|
|
|
|
flag_check(added, removed, "can_upload_free", "unlimited upload slots")
|
|
|
|
flag_check(added, removed, "no_flagging", "flag ban")
|
2022-01-30 07:33:14 -05:00
|
|
|
flag_check(added, removed, "replacements_beta", "replacements beta")
|
2018-12-11 19:41:20 -05:00
|
|
|
|
2022-09-26 14:20:20 -04:00
|
|
|
if added.any? || removed.any?
|
|
|
|
ModAction.log(:user_flags_change, { user_id: user.id, added: added, removed: removed })
|
2018-12-11 19:41:20 -05:00
|
|
|
end
|
|
|
|
|
2018-08-25 16:25:26 -04:00
|
|
|
if user.level_changed?
|
2022-09-26 14:20:20 -04:00
|
|
|
ModAction.log(:user_level_change, { user_id: user.id, level: user.level_string, level_was: user.level_string_was })
|
2018-08-25 16:25:26 -04:00
|
|
|
end
|
2017-02-14 15:46:54 -05:00
|
|
|
end
|
2018-08-25 16:25:26 -04:00
|
|
|
|
2014-03-05 20:44:07 -05:00
|
|
|
def validate
|
2023-04-28 11:21:33 -04:00
|
|
|
raise User::PrivilegeError, "Can't demote BD staff" if user.is_bd_staff? && !promoter.is_bd_staff?
|
2023-05-23 13:39:56 -04:00
|
|
|
raise User::PrivilegeError, "Only BD staff can promote to admin" if new_level.to_i >= User::Levels::ADMIN && !promoter.is_bd_staff?
|
2014-03-05 20:44:07 -05:00
|
|
|
end
|
|
|
|
end
|