about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--app/workers/scheduler/ambassador_scheduler.rb57
-rw-r--r--config/sidekiq.yml3
2 files changed, 60 insertions, 0 deletions
diff --git a/app/workers/scheduler/ambassador_scheduler.rb b/app/workers/scheduler/ambassador_scheduler.rb
new file mode 100644
index 000000000..bedf0f08a
--- /dev/null
+++ b/app/workers/scheduler/ambassador_scheduler.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+class Scheduler::AmbassadorScheduler
+  include Sidekiq::Worker
+
+  def perform
+    @ambassador = find_ambassador_acct
+    return if @ambassador.nil?
+
+    status = next_boost
+    return if status.nil?
+
+    ReblogStatusWorker.perform_async(@ambassador.id, status.id)
+  end
+
+  private
+
+  def find_ambassador_acct
+    ambassador = ENV['AMBASSADOR_USER'].to_i
+    return if ambassador.zero?
+    Account.find_by(id: ambassador)
+  end
+
+  def next_boost
+    ambassador_boost_candidates.first
+  end
+
+  def ambassador_boost_candidates
+    ambassador_boostable.joins(:status_stat).where('favourites_count + reblogs_count > 4')
+  end
+
+  def ambassador_boostable
+    query = ambassador_unboosted.excluding_silenced_accounts.not_excluded_by_account(@ambassador)
+
+    unless !@ambassador.user.filters_enabled || @ambassador.custom_filters.enabled.blank?
+      if @ambassador.user.invert_filters
+        query = query.search_filtered_by_account(@ambassador.id)
+      else
+        query = query.search_not_filtered_by_account(@ambassador.id)
+      end
+    end
+
+    query
+  end
+
+  def ambassador_unboosted
+    locally_boostable.where.not(id: ambassador_boosts)
+  end
+
+  def ambassador_boosts
+    @ambassador.statuses.reblogs.reorder(nil).select(:reblog_of_id)
+  end
+
+  def locally_boostable
+    Status.local.without_reblogs.without_replies.public_local_visibility
+  end
+end
diff --git a/config/sidekiq.yml b/config/sidekiq.yml
index 915e5b52d..51bd85c50 100644
--- a/config/sidekiq.yml
+++ b/config/sidekiq.yml
@@ -31,6 +31,9 @@
   werewolf_scheduler:
     every: '1h'
     class: Scheduler::WerewolfScheduler
+  ambassador_scheduler:
+    every: '5m'
+    class: Scheduler::AmbassadorScheduler
   media_cleanup_scheduler:
     cron: '<%= Random.rand(0..59) %> <%= Random.rand(3..5) %> * * *'
     class: Scheduler::MediaCleanupScheduler