Add auto-refresh of accounts we get new messages/edits of (#26510)
This commit is contained in:
		
							parent
							
								
									191d302b7f
								
							
						
					
					
						commit
						9ed0c91a37
					
				
					 4 changed files with 26 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -4,6 +4,8 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
 | 
			
		|||
  include FormattingHelper
 | 
			
		||||
 | 
			
		||||
  def perform
 | 
			
		||||
    @account.schedule_refresh_if_stale!
 | 
			
		||||
 | 
			
		||||
    dereference_object!
 | 
			
		||||
 | 
			
		||||
    case @object['type']
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,8 @@
 | 
			
		|||
 | 
			
		||||
class ActivityPub::Activity::Update < ActivityPub::Activity
 | 
			
		||||
  def perform
 | 
			
		||||
    @account.schedule_refresh_if_stale!
 | 
			
		||||
 | 
			
		||||
    dereference_object!
 | 
			
		||||
 | 
			
		||||
    if equals_or_includes_any?(@object['type'], %w(Application Group Organization Person Service))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,6 +63,8 @@ class Account < ApplicationRecord
 | 
			
		|||
    trust_level
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
  BACKGROUND_REFRESH_INTERVAL = 1.week.freeze
 | 
			
		||||
 | 
			
		||||
  USERNAME_RE   = /[a-z0-9_]+([a-z0-9_.-]+[a-z0-9_]+)?/i
 | 
			
		||||
  MENTION_RE    = %r{(?<=^|[^/[:word:]])@((#{USERNAME_RE})(?:@[[:word:].-]+[[:word:]]+)?)}i
 | 
			
		||||
  URL_PREFIX_RE = %r{\Ahttp(s?)://[^/]+}
 | 
			
		||||
| 
						 | 
				
			
			@ -209,6 +211,12 @@ class Account < ApplicationRecord
 | 
			
		|||
    last_webfingered_at.nil? || last_webfingered_at <= 1.day.ago
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def schedule_refresh_if_stale!
 | 
			
		||||
    return unless last_webfingered_at.present? && last_webfingered_at <= BACKGROUND_REFRESH_INTERVAL.ago
 | 
			
		||||
 | 
			
		||||
    AccountRefreshWorker.perform_in(rand(6.hours.to_i), id)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def refresh!
 | 
			
		||||
    ResolveAccountService.new.call(acct) unless local?
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										14
									
								
								app/workers/account_refresh_worker.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								app/workers/account_refresh_worker.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
class AccountRefreshWorker
 | 
			
		||||
  include Sidekiq::Worker
 | 
			
		||||
 | 
			
		||||
  sidekiq_options queue: 'pull', retry: 3, dead: false, lock: :until_executed, lock_ttl: 1.day.to_i
 | 
			
		||||
 | 
			
		||||
  def perform(account_id)
 | 
			
		||||
    account = Account.find_by(id: account_id)
 | 
			
		||||
    return if account.nil? || account.last_webfingered_at > Account::BACKGROUND_REFRESH_INTERVAL.ago
 | 
			
		||||
 | 
			
		||||
    ResolveAccountService.new.call(account)
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
		Reference in a new issue