Skip to content

Commit

Permalink
Add tootctl accounts reset-relationships (mastodon#10483)
Browse files Browse the repository at this point in the history
* Add `tootctl accounts reset`

* Rename reset to reset-relationships

* Improve command description
  • Loading branch information
noellabo authored and Gargron committed Apr 8, 2019
1 parent faaea44 commit 3dd1004
Showing 1 changed file with 67 additions and 0 deletions.
67 changes: 67 additions & 0 deletions lib/mastodon/accounts_cli.rb
Expand Up @@ -367,6 +367,73 @@ def unfollow(acct)
say("OK, unfollowed target from #{processed} accounts, skipped #{failed}", :green)
end

option :follows, type: :boolean, default: false
option :followers, type: :boolean, default: false
desc 'reset-relationships USERNAME', 'Reset all follows and/or followers for a user'
long_desc <<-LONG_DESC
Reset all follows and/or followers for a user specified by USERNAME.
With the --follows option, the command unfollows everyone that the account follows,
and then re-follows the users that would be followed by a brand new account.
With the --followers option, the command removes all followers of the account.
LONG_DESC
def reset_relationships(username)
unless options[:follows] || options[:followers]
say('Please specify either --follows or --followers, or both', :red)
exit(1)
end

account = Account.find_local(username)

if account.nil?
say('No user with such username', :red)
exit(1)
end

if options[:follows]
processed = 0
failed = 0

say("Unfollowing #{account.username}'s followees, this might take a while...")

Account.where(id: ::Follow.where(account: account).select(:target_account_id)).find_each do |target_account|
begin
UnfollowService.new.call(account, target_account)
processed += 1
say('.', :green, false)
rescue StandardError
failed += 1
say('.', :red, false)
end
end

BootstrapTimelineWorker.perform_async(account.id)

say("OK, unfollowed #{processed} followees, skipped #{failed}", :green)
end

if options[:followers]
processed = 0
failed = 0

say("Removing #{account.username}'s followers, this might take a while...")

Account.where(id: ::Follow.where(target_account: account).select(:account_id)).find_each do |target_account|
begin
UnfollowService.new.call(target_account, account)
processed += 1
say('.', :green, false)
rescue StandardError
failed += 1
say('.', :red, false)
end
end

say("OK, removed #{processed} followers, skipped #{failed}", :green)
end
end

option :number, type: :numeric, aliases: [:n]
option :all, type: :boolean
desc 'approve [USERNAME]', 'Approve pending accounts'
Expand Down

0 comments on commit 3dd1004

Please sign in to comment.