Accept the same payload in multiple inboxes and deliver (#9150)
This commit is contained in:
		
							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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user