From 74290d4eb3f6771ad21d9e2c1d0a76d4f76bb263 Mon Sep 17 00:00:00 2001 From: multiple creatures Date: Mon, 29 Jul 2019 14:26:41 -0500 Subject: optional delayed publishing of roars for proofreading --- app/workers/distribution_worker.rb | 4 ++-- app/workers/post_status_worker.rb | 43 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 app/workers/post_status_worker.rb (limited to 'app/workers') diff --git a/app/workers/distribution_worker.rb b/app/workers/distribution_worker.rb index 4e20ef31b..0775e30e6 100644 --- a/app/workers/distribution_worker.rb +++ b/app/workers/distribution_worker.rb @@ -3,10 +3,10 @@ class DistributionWorker include Sidekiq::Worker - def perform(status_id) + def perform(status_id, delayed = false) RedisLock.acquire(redis: Redis.current, key: "distribute:#{status_id}") do |lock| if lock.acquired? - FanOutOnWriteService.new.call(Status.find(status_id)) + FanOutOnWriteService.new.call(Status.find(status_id), delayed) else raise Mastodon::RaceConditionError end 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 -- cgit