mirror of
https://github.com/discourse/discourse.git
synced 2024-12-02 21:55:44 +08:00
73 lines
2.5 KiB
Ruby
73 lines
2.5 KiB
Ruby
|
# frozen_string_literal: true
|
|||
|
|
|||
|
DiscourseAutomation::Scriptable.add(DiscourseAutomation::Scripts::GIFT_EXCHANGE) do
|
|||
|
placeholder :year
|
|||
|
placeholder :giftee_username
|
|||
|
placeholder :gifter_username
|
|||
|
|
|||
|
field :giftee_assignment_messages, component: :pms, accepts_placeholders: true, required: true
|
|||
|
field :gift_exchangers_group, component: :group, required: true
|
|||
|
|
|||
|
version 17
|
|||
|
|
|||
|
triggerables %i[point_in_time]
|
|||
|
|
|||
|
script do |_, fields, automation|
|
|||
|
now = Time.zone.now
|
|||
|
group_id = fields.dig("gift_exchangers_group", "value")
|
|||
|
|
|||
|
unless group = Group.find_by(id: group_id)
|
|||
|
Rails.logger.warn "[discourse-automation] Couldn’t find group with id #{group_id}"
|
|||
|
next
|
|||
|
end
|
|||
|
|
|||
|
cf_name = "#{group.name}-gifts-were-exchanged-#{automation.id}-#{version}-#{now.year}"
|
|||
|
if group.custom_fields[cf_name].present?
|
|||
|
Rails.logger.warn "[discourse-automation] Gift exchange script has already been run on #{cf_name} this year #{now.year} for this script version #{version}"
|
|||
|
next
|
|||
|
end
|
|||
|
|
|||
|
usernames = group.users.pluck(:username)
|
|||
|
|
|||
|
if usernames.size < 3
|
|||
|
Rails.logger.warn "[discourse-automation] Gift exchange needs at least 3 users in a group"
|
|||
|
next
|
|||
|
end
|
|||
|
|
|||
|
usernames.shuffle!
|
|||
|
usernames << usernames[0]
|
|||
|
|
|||
|
# shuffle the pairs to prevent prying eyes to identify matches by looking at the timestamps of the topics
|
|||
|
pairs = usernames.each_cons(2).to_a.shuffle
|
|||
|
|
|||
|
pairs.each do |gifter, giftee|
|
|||
|
placeholders = { year: now.year.to_s, gifter_username: gifter, giftee_username: giftee }
|
|||
|
|
|||
|
Array(fields.dig("giftee_assignment_messages", "value")).each do |giftee_assignment_message|
|
|||
|
if giftee_assignment_message["title"].blank?
|
|||
|
Rails.logger.warn "[discourse-automation] Gift exchange requires a title for the PM"
|
|||
|
next
|
|||
|
end
|
|||
|
|
|||
|
if giftee_assignment_message["raw"].blank?
|
|||
|
Rails.logger.warn "[discourse-automation] Gift exchange requires a raw for the PM"
|
|||
|
next
|
|||
|
end
|
|||
|
|
|||
|
raw = utils.apply_placeholders(giftee_assignment_message["raw"], placeholders)
|
|||
|
title = utils.apply_placeholders(giftee_assignment_message["title"], placeholders)
|
|||
|
|
|||
|
utils.send_pm(
|
|||
|
{ target_usernames: Array(gifter), title: title, raw: raw },
|
|||
|
delay: giftee_assignment_message["delay"],
|
|||
|
prefers_encrypt: giftee_assignment_message["prefers_encrypt"],
|
|||
|
automation_id: automation.id,
|
|||
|
)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
group.custom_fields[cf_name] = true
|
|||
|
group.save_custom_fields
|
|||
|
end
|
|||
|
end
|