RedisLock.acquire(lock_options) do |lock|
if lock.acquired?
@status = find_existing_status
- process_status if @status.nil?
+
+ if @status.nil?
+ process_status
+ elsif @options[:delivered_to_account_id].present?
+ postprocess_audience_and_deliver
+ end
else
raise Mastodon::RaceConditionError
end
@params[:visibility] = :limited
end
+ def postprocess_audience_and_deliver
+ return if @status.mentions.find_by(account_id: @options[:delivered_to_account_id])
+
+ delivered_to_account = Account.find(@options[:delivered_to_account_id])
+
+ @status.mentions.create(account: delivered_to_account, silent: true)
+ @status.update(visibility: :limited) if @status.direct_visibility?
+
+ return unless delivered_to_account.following?(@account)
+
+ FeedInsertWorker.perform_async(@status.id, delivered_to_account.id, :home)
+ end
+
def attach_tags(status)
@tags.each do |tag|
status.tags << tag
def deliver_to_mentioned_followers(status)
Rails.logger.debug "Delivering status #{status.id} to limited followers"
- status.mentions.includes(:account).each do |mention|
- mentioned_account = mention.account
- next if !mentioned_account.local? || !mentioned_account.following?(status.account) || FeedManager.instance.filter?(:home, status, mention.account_id)
- FeedManager.instance.push_to_home(mentioned_account, status)
+ FeedInsertWorker.push_bulk(status.mentions.includes(:account).map(&:account).select { |mentioned_account| mentioned_account.local? && mentioned_account.following?(status.account) }) do |follower|
+ [status.id, follower.id, :home]
end
end