60 lines
1.7 KiB
Ruby
60 lines
1.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
DiscourseAutomation::Scriptable.add(DiscourseAutomation::Scripts::USER_GLOBAL_NOTICE) do
|
|
field :notice, component: :message, required: true, accepts_placeholders: true
|
|
field :level,
|
|
component: :choices,
|
|
extra: {
|
|
content:
|
|
%w[success error warning info].map do |level|
|
|
{
|
|
id: level,
|
|
name: "discourse_automation.scriptables.user_global_notice.levels.#{level}",
|
|
}
|
|
end,
|
|
}
|
|
|
|
version 1
|
|
|
|
triggerables [:stalled_topic]
|
|
triggerables [:first_accepted_solution] if defined?(DiscourseSolved)
|
|
|
|
placeholder :username
|
|
|
|
script do |context, fields, automation|
|
|
placeholders = {}.merge(context["placeholders"] || {})
|
|
|
|
if context["kind"] == DiscourseAutomation::Triggers::STALLED_TOPIC
|
|
user = context["topic"].user
|
|
placeholders["username"] = user.username
|
|
elsif context["kind"] == "first_accepted_solution"
|
|
username = context["usernames"][0]
|
|
user = User.find_by(username: username)
|
|
placeholders["username"] = username
|
|
end
|
|
|
|
notice = utils.apply_placeholders(fields.dig("notice", "value") || "", placeholders)
|
|
level = fields.dig("level", "value")
|
|
|
|
begin
|
|
DiscourseAutomation::UserGlobalNotice.upsert(
|
|
{
|
|
identifier: automation.id,
|
|
notice: notice,
|
|
user_id: user.id,
|
|
level: level,
|
|
created_at: Time.now,
|
|
updated_at: Time.now,
|
|
},
|
|
unique_by: "idx_discourse_automation_user_global_notices",
|
|
)
|
|
rescue ActiveRecord::RecordNotUnique
|
|
# do nothing
|
|
end
|
|
end
|
|
|
|
on_reset do |automation|
|
|
DiscourseAutomation::UserGlobalNotice.where(identifier: automation.id).destroy_all
|
|
end
|
|
end
|