From 08ba69b53869256098d09dacdced2b3d1c500471 Mon Sep 17 00:00:00 2001 From: Takeshi Umeda Date: Mon, 8 Apr 2019 14:46:55 +0900 Subject: [PATCH] Add `tootctl accounts reset-relationships` (#10483) * Add `tootctl accounts reset` * Rename reset to reset-relationships * Improve command description --- lib/mastodon/accounts_cli.rb | 67 ++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/lib/mastodon/accounts_cli.rb b/lib/mastodon/accounts_cli.rb index 9b25a2ef7..9dc84f1b5 100644 --- a/lib/mastodon/accounts_cli.rb +++ b/lib/mastodon/accounts_cli.rb @@ -367,6 +367,73 @@ module Mastodon 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'