about summary refs log tree commit diff
path: root/lib/mastodon/accounts_cli.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mastodon/accounts_cli.rb')
-rw-r--r--lib/mastodon/accounts_cli.rb60
1 files changed, 60 insertions, 0 deletions
diff --git a/lib/mastodon/accounts_cli.rb b/lib/mastodon/accounts_cli.rb
index bbda244ea..24fb67991 100644
--- a/lib/mastodon/accounts_cli.rb
+++ b/lib/mastodon/accounts_cli.rb
@@ -300,6 +300,66 @@ module Mastodon
       end
     end
 
+    desc 'follow ACCT', 'Make all local accounts follow account specified by ACCT'
+    long_desc <<-LONG_DESC
+      Make all local accounts follow an account specified by ACCT. ACCT can be
+      a simple username, in case of a local user. It can also be in the format
+      username@domain, in case of a remote user.
+    LONG_DESC
+    def follow(acct)
+      target_account = ResolveAccountService.new.call(acct)
+      processed      = 0
+      failed         = 0
+
+      if target_account.nil?
+        say("Target account (#{acct}) could not be resolved", :red)
+        exit(1)
+      end
+
+      Account.local.without_suspended.find_each do |account|
+        begin
+          FollowService.new.call(account, target_account)
+          processed += 1
+          say('.', :green, false)
+        rescue StandardError
+          failed += 1
+          say('.', :red, false)
+        end
+      end
+
+      say("OK, followed target from #{processed} accounts, skipped #{failed}", :green)
+    end
+
+    desc 'unfollow ACCT', 'Make all local accounts unfollow account specified by ACCT'
+    long_desc <<-LONG_DESC
+      Make all local accounts unfollow an account specified by ACCT. ACCT can be
+      a simple username, in case of a local user. It can also be in the format
+      username@domain, in case of a remote user.
+    LONG_DESC
+    def unfollow(acct)
+      target_account = Account.find_remote(*acct.split('@'))
+      processed      = 0
+      failed         = 0
+
+      if target_account.nil?
+        say("Target account (#{acct}) was not found", :red)
+        exit(1)
+      end
+
+      target_account.followers.local.find_each do |account|
+        begin
+          UnfollowService.new.call(account, target_account)
+          processed += 1
+          say('.', :green, false)
+        rescue StandardError
+          failed += 1
+          say('.', :red, false)
+        end
+      end
+
+      say("OK, unfollowed target from #{processed} accounts, skipped #{failed}", :green)
+    end
+
     private
 
     def rotate_keys_for_account(account, delay = 0)