option :concurrency, type: :numeric, default: 5, aliases: [:c]
option :dry_run, type: :boolean
- desc 'cull', 'Remove remote accounts that no longer exist'
+ desc 'cull [DOMAIN...]', 'Remove remote accounts that no longer exist'
long_desc <<-LONG_DESC
Query every single remote account in the database to determine
if it still exists on the origin server, and if it doesn't,
Accounts that have had confirmed activity within the last week
are excluded from the checks.
LONG_DESC
- def cull
+ def cull(*domains)
skip_threshold = 7.days.ago
dry_run = options[:dry_run] ? ' (DRY RUN)' : ''
skip_domains = Concurrent::Set.new
- processed, culled = parallelize_with_progress(Account.remote.where(protocol: :activitypub).partitioned) do |account|
+ query = Account.remote.where(protocol: :activitypub)
+ query = query.where(domain: domains) unless domains.empty?
+
+ processed, culled = parallelize_with_progress(query.partitioned) do |account|
next if account.updated_at >= skip_threshold || (account.last_webfingered_at.present? && account.last_webfingered_at >= skip_threshold) || skip_domains.include?(account.domain)
code = 0