DEV: Make discourse_narrative_bot use Rails autoload (#26044)

Why this change?

Instead of manually loading files, we should just structure the plugin
so that it relies on Rails autoload strategy and avoid all the manual
`require_relative`s.

What does this change do?

1. Structure the plugin to use Rails autoloading convention
2. Remove onceff jobs that were added 5-6 years ago. There is no need to
   carry these jobs anymore after such a long time.
3. Move setting of `SiteSetting.discourse_narrative_bot_enabled` to
   `false` in the test environment from core into the plugin.
This commit is contained in:
Alan Guo Xiang Tan
2024-03-06 11:14:53 +08:00
committed by GitHub
parent 6b46b9ab78
commit 3491642f98
16 changed files with 116 additions and 258 deletions

View File

@ -0,0 +1,44 @@
# frozen_string_literal: true
module DiscourseNarrativeBot
class CertificatesController < ::ApplicationController
requires_plugin DiscourseNarrativeBot::PLUGIN_NAME
layout false
skip_before_action :check_xhr
requires_login
def generate
immutable_for(24.hours)
%i[date user_id].each do |key|
unless params[key]&.present?
raise Discourse::InvalidParameters.new("#{key} must be present")
end
end
if params[:user_id].to_i != current_user.id
rate_limiter = RateLimiter.new(current_user, "svg_certificate", 3, 1.minute)
else
rate_limiter = RateLimiter.new(current_user, "svg_certificate_self", 30, 10.minutes)
end
rate_limiter.performed! unless current_user.staff?
user = User.find_by(id: params[:user_id])
raise Discourse::NotFound if user.blank?
hijack do
generator = CertificateGenerator.new(user, params[:date], avatar_url(user))
svg = params[:type] == "advanced" ? generator.advanced_user_track : generator.new_user_track
respond_to { |format| format.svg { render inline: svg } }
end
end
private
def avatar_url(user)
UrlHelper.absolute(Discourse.base_path + user.avatar_template.gsub("{size}", "250"))
end
end
end

View File

@ -0,0 +1,20 @@
# frozen_string_literal: true
module Jobs
class BotInput < ::Jobs::Base
sidekiq_options queue: "critical", retry: false
def execute(args)
return unless user = User.find_by(id: args[:user_id])
I18n.with_locale(user.effective_locale) do
::DiscourseNarrativeBot::TrackSelector.new(
args[:input].to_sym,
user,
post_id: args[:post_id],
topic_id: args[:topic_id],
).select
end
end
end
end

View File

@ -0,0 +1,13 @@
# frozen_string_literal: true
module Jobs
class NarrativeInit < ::Jobs::Base
sidekiq_options queue: "critical"
def execute(args)
if user = User.find_by(id: args[:user_id])
I18n.with_locale(user.effective_locale) { args[:klass].constantize.new.input(:init, user) }
end
end
end
end

View File

@ -0,0 +1,13 @@
# frozen_string_literal: true
module Jobs
class NarrativeTimeout < ::Jobs::Base
def execute(args)
if user = User.find_by(id: args[:user_id])
I18n.with_locale(user.effective_locale) do
args[:klass].constantize.new.notify_timeout(user)
end
end
end
end
end

View File

@ -0,0 +1,28 @@
# frozen_string_literal: true
module Jobs
class SendDefaultWelcomeMessage < ::Jobs::Base
def execute(args)
if user = User.find_by(id: args[:user_id])
type = user.invited_by ? "welcome_invite" : "welcome_user"
params = SystemMessage.new(user).defaults
title = I18n.t("system_messages.#{type}.subject_template", params)
raw = I18n.t("system_messages.#{type}.text_body_template", params)
discobot_user = ::DiscourseNarrativeBot::Base.new.discobot_user
post =
PostCreator.create!(
discobot_user,
title: title,
raw: raw,
archetype: Archetype.private_message,
target_usernames: user.username,
skip_validations: true,
)
post.topic.update_status("closed", true, discobot_user)
end
end
end
end