about summary refs log tree commit diff
path: root/lib/mastodon/feeds_cli.rb
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2018-09-14 17:42:22 +0200
committerGitHub <noreply@github.com>2018-09-14 17:42:22 +0200
commit6a3f9b7e53e4cef0b5406676d56e904a02716ee6 (patch)
treea2bffb6c09262d4fb29ac406095824635fd14172 /lib/mastodon/feeds_cli.rb
parent1d8b693d31512b25f90d63b5d879d97dba4044fe (diff)
Move more tasks to tootctl (#8675)
* Move more tasks to tootctl

- tootctl feeds build
- tootctl feeds clear
- tootctl accounts refresh

Clean up exit codes and help messages

* Move user modifying to tootctl

* Improve user modification through CLI, rename commands

add -> create
mod -> modify
del -> delete

To remove ambiguity

* Fix code style issues

* Fix not being able to unset admin/mod role
Diffstat (limited to 'lib/mastodon/feeds_cli.rb')
-rw-r--r--lib/mastodon/feeds_cli.rb81
1 files changed, 81 insertions, 0 deletions
diff --git a/lib/mastodon/feeds_cli.rb b/lib/mastodon/feeds_cli.rb
new file mode 100644
index 000000000..c3fca723e
--- /dev/null
+++ b/lib/mastodon/feeds_cli.rb
@@ -0,0 +1,81 @@
+# frozen_string_literal: true
+
+require_relative '../../config/boot'
+require_relative '../../config/environment'
+require_relative 'cli_helper'
+
+module Mastodon
+  class FeedsCLI < Thor
+    option :all, type: :boolean, default: false
+    option :background, type: :boolean, default: false
+    option :dry_run, type: :boolean, default: false
+    option :verbose, type: :boolean, default: false
+    desc 'build [USERNAME]', 'Build home and list feeds for one or all users'
+    long_desc <<-LONG_DESC
+      Build home and list feeds that are stored in Redis from the database.
+
+      With the --all option, all active users will be processed.
+      Otherwise, a single user specified by USERNAME.
+
+      With the --background option, regeneration will be queued into Sidekiq,
+      and the command will exit as soon as possible.
+
+      With the --dry-run option, no work will be done.
+
+      With the --verbose option, when accounts are processed sequentially in the
+      foreground, the IDs of the accounts will be printed.
+    LONG_DESC
+    def build(username = nil)
+      dry_run = options[:dry_run] ? '(DRY RUN)' : ''
+
+      if options[:all] || username.nil?
+        processed = 0
+        queued    = 0
+
+        User.active.select(:id, :account_id).reorder(nil).find_in_batches do |users|
+          if options[:background]
+            RegenerationWorker.push_bulk(users.map(&:account_id)) unless options[:dry_run]
+            queued += users.size
+          else
+            users.each do |user|
+              RegenerationWorker.new.perform(user.account_id) unless options[:dry_run]
+              options[:verbose] ? say(user.account_id) : say('.', :green, false)
+              processed += 1
+            end
+          end
+        end
+
+        if options[:background]
+          say("Scheduled feed regeneration for #{queued} accounts #{dry_run}", :green, true)
+        else
+          say
+          say("Regenerated feeds for #{processed} accounts #{dry_run}", :green, true)
+        end
+      elsif username.present?
+        account = Account.find_local(username)
+
+        if options[:background]
+          RegenerationWorker.perform_async(account.id) unless options[:dry_run]
+        else
+          RegenerationWorker.new.perform(account.id) unless options[:dry_run]
+        end
+
+        say("OK #{dry_run}", :green, true)
+      else
+        say('No account(s) given', :red)
+        exit(1)
+      end
+    end
+
+    desc 'clear', 'Remove all home and list feeds from Redis'
+    def clear
+      keys = Redis.current.keys('feed:*')
+
+      Redis.current.pipelined do
+        keys.each { |key| Redis.current.del(key) }
+      end
+
+      say('OK', :green)
+    end
+  end
+end