about summary refs log tree commit diff
path: root/app/workers/post_status_worker.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/workers/post_status_worker.rb')
-rw-r--r--app/workers/post_status_worker.rb43
1 files changed, 43 insertions, 0 deletions
diff --git a/app/workers/post_status_worker.rb b/app/workers/post_status_worker.rb
new file mode 100644
index 000000000..e9b73b8bc
--- /dev/null
+++ b/app/workers/post_status_worker.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+class PostStatusWorker
+  include Sidekiq::Worker
+
+  sidekiq_options unique: :until_executed
+
+  def perform(status_id, options = {})
+    status = Status.find(status_id)
+    return false if status.destroyed?
+
+    if options[:visibility]
+      status.visibility = options[:visibility]
+      status.save!
+    end
+
+    process_mentions_service.call(status) unless options[:nomentions]
+
+    LinkCrawlWorker.perform_async(status.id) unless options[:nocrawl] || status.spoiler_text?
+    DistributionWorker.perform_async(status.id) unless options[:distribute] == false
+
+    unless status.local_only? || options[:distribute] == false || options[:federate] == false
+      ActivityPub::DistributionWorker.perform_async(status.id)
+    end
+
+    PollExpirationNotifyWorker.perform_at(status.poll.expires_at, status.poll.id) if status.poll
+
+    status.delete_after = options[:delete_after] if options[:delete_after]
+
+    return true if !status.reply? || status.account.id == status.in_reply_to_account_id
+    ActivityTracker.increment('activity:interactions')
+    return if status.account.following?(status.in_reply_to_account_id)
+    PotentialFriendshipTracker.record(status.account.id, status.in_reply_to_account_id, :reply)
+
+    true
+  rescue ActiveRecord::RecordNotFound, ActiveRecord::RecordInvalid
+    true
+  end
+
+  def process_mentions_service
+    ProcessMentionsService.new
+  end
+end