Accept the same payload in multiple inboxes and deliver (#9150)
parent
47b8d195e6
commit
be202f9377
|
@ -10,7 +10,12 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
|
||||||
RedisLock.acquire(lock_options) do |lock|
|
RedisLock.acquire(lock_options) do |lock|
|
||||||
if lock.acquired?
|
if lock.acquired?
|
||||||
@status = find_existing_status
|
@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
|
else
|
||||||
raise Mastodon::RaceConditionError
|
raise Mastodon::RaceConditionError
|
||||||
end
|
end
|
||||||
|
@ -99,6 +104,19 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
|
||||||
@params[:visibility] = :limited
|
@params[:visibility] = :limited
|
||||||
end
|
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)
|
def attach_tags(status)
|
||||||
@tags.each do |tag|
|
@tags.each do |tag|
|
||||||
status.tags << tag
|
status.tags << tag
|
||||||
|
|
|
@ -58,10 +58,8 @@ class FanOutOnWriteService < BaseService
|
||||||
def deliver_to_mentioned_followers(status)
|
def deliver_to_mentioned_followers(status)
|
||||||
Rails.logger.debug "Delivering status #{status.id} to limited followers"
|
Rails.logger.debug "Delivering status #{status.id} to limited followers"
|
||||||
|
|
||||||
status.mentions.includes(:account).each do |mention|
|
FeedInsertWorker.push_bulk(status.mentions.includes(:account).map(&:account).select { |mentioned_account| mentioned_account.local? && mentioned_account.following?(status.account) }) do |follower|
|
||||||
mentioned_account = mention.account
|
[status.id, follower.id, :home]
|
||||||
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)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue