Implement tootctl accounts prune (#18397)
* Implement tootctl accounts prune * Optimise query Co-authored-by: Claire <claire.github-309c@sitedethib.com>pull/19411/head
parent
507e1d22f5
commit
0e8f8a1a1c
|
@ -553,6 +553,43 @@ module Mastodon
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
option :concurrency, type: :numeric, default: 5, aliases: [:c]
|
||||||
|
option :dry_run, type: :boolean
|
||||||
|
desc 'prune', 'Prune remote accounts that never interacted with local users'
|
||||||
|
long_desc <<-LONG_DESC
|
||||||
|
Prune remote account that
|
||||||
|
- follows no local accounts
|
||||||
|
- is not followed by any local accounts
|
||||||
|
- has no statuses on local
|
||||||
|
- has not been mentioned
|
||||||
|
- has not been favourited local posts
|
||||||
|
- not muted/blocked by us
|
||||||
|
LONG_DESC
|
||||||
|
def prune
|
||||||
|
dry_run = options[:dry_run] ? ' (dry run)' : ''
|
||||||
|
|
||||||
|
query = Account.remote.where.not(actor_type: %i(Application Service))
|
||||||
|
query = query.where('NOT EXISTS (SELECT 1 FROM mentions WHERE account_id = accounts.id)')
|
||||||
|
query = query.where('NOT EXISTS (SELECT 1 FROM favourites WHERE account_id = accounts.id)')
|
||||||
|
query = query.where('NOT EXISTS (SELECT 1 FROM statuses WHERE account_id = accounts.id)')
|
||||||
|
query = query.where('NOT EXISTS (SELECT 1 FROM follows WHERE account_id = accounts.id OR target_account_id = accounts.id)')
|
||||||
|
query = query.where('NOT EXISTS (SELECT 1 FROM blocks WHERE account_id = accounts.id OR target_account_id = accounts.id)')
|
||||||
|
query = query.where('NOT EXISTS (SELECT 1 FROM mutes WHERE target_account_id = accounts.id)')
|
||||||
|
query = query.where('NOT EXISTS (SELECT 1 FROM reports WHERE target_account_id = accounts.id)')
|
||||||
|
query = query.where('NOT EXISTS (SELECT 1 FROM follow_requests WHERE account_id = accounts.id OR target_account_id = accounts.id)')
|
||||||
|
|
||||||
|
_, deleted = parallelize_with_progress(query) do |account|
|
||||||
|
next if account.bot? || account.group?
|
||||||
|
next if account.suspended?
|
||||||
|
next if account.silenced?
|
||||||
|
|
||||||
|
account.destroy unless options[:dry_run]
|
||||||
|
1
|
||||||
|
end
|
||||||
|
|
||||||
|
say("OK, pruned #{deleted} accounts#{dry_run}", :green)
|
||||||
|
end
|
||||||
|
|
||||||
option :force, type: :boolean
|
option :force, type: :boolean
|
||||||
option :replay, type: :boolean
|
option :replay, type: :boolean
|
||||||
option :target
|
option :target
|
||||||
|
|
Loading…
Reference in New Issue