about summary refs log tree commit diff
path: root/app/lib/command_tag/command
diff options
context:
space:
mode:
authorFire Demon <firedemon@creature.cafe>2020-11-19 12:10:36 -0600
committerFire Demon <firedemon@creature.cafe>2020-11-19 12:10:36 -0600
commitdd3cea4ef6fc759543c6457e419c31dc7df6140a (patch)
tree88c151942418e2d686e7637c92e9c1c63f327e15 /app/lib/command_tag/command
parent930f7145374adb79e92e9bdfcbc0d0044690b6c8 (diff)
More robust loading of command interpreter modules
Diffstat (limited to 'app/lib/command_tag/command')
-rw-r--r--app/lib/command_tag/command/account_tools.rb37
-rw-r--r--app/lib/command_tag/command/footer_tools.rb50
-rw-r--r--app/lib/command_tag/command/hello_world.rb11
-rw-r--r--app/lib/command_tag/command/parent_status_tools.rb80
-rw-r--r--app/lib/command_tag/command/status_tools.rb239
-rw-r--r--app/lib/command_tag/command/text_tools.rb89
-rw-r--r--app/lib/command_tag/command/variables.rb40
7 files changed, 0 insertions, 546 deletions
diff --git a/app/lib/command_tag/command/account_tools.rb b/app/lib/command_tag/command/account_tools.rb
deleted file mode 100644
index ac38f19a1..000000000
--- a/app/lib/command_tag/command/account_tools.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-# frozen_string_literal: true
-module CommandTag::Command::AccountTools
-  def handle_account_at_start(args)
-    return if args[0].blank?
-
-    case args[0].downcase
-    when 'set'
-      handle_account_set(args[1..-1])
-    end
-  end
-
-  alias handle_acct_at_start handle_account_at_start
-
-  private
-
-  def handle_account_set(args)
-    return if args[0].blank?
-
-    case args[0].downcase
-    when 'v', 'p', 'visibility', 'privacy', 'default-visibility', 'default-privacy'
-      args[1] = read_visibility_from(args[1])
-      return if args[1].blank?
-
-      if args[2].blank?
-        @account.user.settings.default_privacy = args[1]
-      elsif args[1] == 'public'
-        domains = args[2..-1].map { |domain| normalize_domain(domain) unless domain == '*' }.uniq.compact
-        @account.domain_permissions.where(domain: domains, sticky: false).destroy_all if domains.present?
-      elsif args[1] != 'cc'
-        args[2..-1].flat_map(&:split).uniq.each do |domain|
-          domain = normalize_domain(domain) unless domain == '*'
-          @account.domain_permissions.create_or_update(domain: domain, visibility: args[1]) if domain.present?
-        end
-      end
-    end
-  end
-end
diff --git a/app/lib/command_tag/command/footer_tools.rb b/app/lib/command_tag/command/footer_tools.rb
deleted file mode 100644
index 73e2f05bd..000000000
--- a/app/lib/command_tag/command/footer_tools.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-# frozen_string_literal: true
-module CommandTag::Command::FooterTools
-  def handle_999_footertools_startup
-    @status.footer = var('persist:footer:default')[0]
-  end
-
-  def handle_footer_before_save(args)
-    return if args.blank?
-
-    name = normalize(args.shift)
-    return (@status.footer = nil) if read_falsy_from(name)
-
-    var_name = "persist:footer:#{name}"
-    return @status.footer = var(var_name)[0] if args.blank?
-
-    if read_falsy_from(normalize(args[0]))
-      @status.footer = nil if ['default', var(var_name)[0]].include?(name)
-      @vars.delete(var_name)
-      return
-    end
-
-    if name == 'default'
-      name = normalize(args.shift)
-      var_name = "persist:footer:#{name}"
-      @vars[var_name] = [args.join(' ').strip] if args.present?
-      @vars['persist:footer:default'] = var(var_name)
-    elsif %w(default DEFAULT).include?(args[0])
-      @vars['persist:footer:default'] = var(var_name)
-    else
-      @vars[var_name] = [args.join(' ').strip]
-    end
-
-    @status.footer = var(var_name)[0]
-  end
-
-  # Monsterfork v1 familiarity.
-  def handle_i_before_save(args)
-    return if args.blank?
-
-    handle_footer_before_save(args[1..-1]) if %w(am are).include?(normalize(args[0]))
-  end
-
-  alias handle_we_before_save           handle_i_before_save
-  alias handle_signature_before_save    handle_footer_before_save
-  alias handle_signed_before_save       handle_footer_before_save
-  alias handle_sign_before_save         handle_footer_before_save
-  alias handle_sig_before_save          handle_footer_before_save
-  alias handle_am_before_save           handle_footer_before_save
-  alias handle_are_before_save          handle_footer_before_save
-end
diff --git a/app/lib/command_tag/command/hello_world.rb b/app/lib/command_tag/command/hello_world.rb
deleted file mode 100644
index ab10b495b..000000000
--- a/app/lib/command_tag/command/hello_world.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# frozen_string_literal: true
-
-module CommandTag::Command::HelloWorld
-  def handle_helloworld_startup
-    @vars['hello_world'] = ['Hello, world!']
-  end
-
-  def handle_hello_world_with_return(_)
-    'Hello, world!'
-  end
-end
diff --git a/app/lib/command_tag/command/parent_status_tools.rb b/app/lib/command_tag/command/parent_status_tools.rb
deleted file mode 100644
index 2fdee2fb8..000000000
--- a/app/lib/command_tag/command/parent_status_tools.rb
+++ /dev/null
@@ -1,80 +0,0 @@
-# frozen_string_literal: true
-module CommandTag::Command::ParentStatusTools
-  def handle_publish_once_at_end(_)
-    is_blank = status_text_blank?
-    return PublishStatusService.new.call(@status) if @parent.blank? || !is_blank
-    return unless is_blank && author_of_parent? && !@parent.published?
-
-    PublishStatusService.new.call(@parent)
-  end
-
-  alias handle_publish_post_once_at_end                   handle_publish_once_at_end
-  alias handle_publish_roar_once_at_end                   handle_publish_once_at_end
-  alias handle_publish_toot_once_at_end                   handle_publish_once_at_end
-
-  def handle_edit_once_before_save(_)
-    return unless author_of_parent?
-
-    params = @parent.slice(*UpdateStatusService::ALLOWED_ATTRIBUTES).with_indifferent_access.compact
-    params[:text] = @text
-    UpdateStatusService.new.call(@parent, params)
-    destroy_status!
-  end
-
-  alias handle_edit_post_once_before_save                 handle_edit_once_before_save
-  alias handle_edit_roar_once_before_save                 handle_edit_once_before_save
-  alias handle_edit_toot_once_before_save                 handle_edit_once_before_save
-  alias handle_edit_parent_once_before_save               handle_edit_once_before_save
-
-  def handle_mute_once_at_end(_)
-    return if author_of_parent?
-
-    MuteStatusService.new.call(@account, @parent)
-  end
-
-  alias handle_mute_post_once_at_end                      handle_mute_once_at_end
-  alias handle_mute_roar_once_at_end                      handle_mute_once_at_end
-  alias handle_mute_toot_once_at_end                      handle_mute_once_at_end
-  alias handle_mute_parent_once_at_end                    handle_mute_once_at_end
-  alias handle_hide_once_at_end                           handle_mute_once_at_end
-  alias handle_hide_post_once_at_end                      handle_mute_once_at_end
-  alias handle_hide_roar_once_at_end                      handle_mute_once_at_end
-  alias handle_hide_toot_once_at_end                      handle_mute_once_at_end
-  alias handle_hide_parent_once_at_end                    handle_mute_once_at_end
-
-  def handle_unmute_once_at_end(_)
-    return if author_of_parent?
-
-    @account.unmute_status!(@parent)
-  end
-
-  alias handle_unmute_post_once_at_end                    handle_unmute_once_at_end
-  alias handle_unmute_roar_once_at_end                    handle_unmute_once_at_end
-  alias handle_unmute_toot_once_at_end                    handle_unmute_once_at_end
-  alias handle_unmute_parent_once_at_end                  handle_unmute_once_at_end
-  alias handle_unhide_once_at_end                         handle_unmute_once_at_end
-  alias handle_unhide_post_once_at_end                    handle_unmute_once_at_end
-  alias handle_unhide_roar_once_at_end                    handle_unmute_once_at_end
-  alias handle_unhide_toot_once_at_end                    handle_unmute_once_at_end
-  alias handle_unhide_parent_once_at_end                  handle_unmute_once_at_end
-
-  def handle_mute_thread_once_at_end(_)
-    return if author_of_parent?
-
-    MuteConversationService.new.call(@account, @conversation)
-  end
-
-  alias handle_mute_conversation_once_at_end              handle_mute_thread_once_at_end
-  alias handle_hide_thread_once_at_end                    handle_mute_thread_once_at_end
-  alias handle_hide_conversation_once_at_end              handle_mute_thread_once_at_end
-
-  def handle_unmute_thread_once_at_end(_)
-    return if author_of_parent? || @conversation.blank?
-
-    @account.unmute_conversation!(@conversation)
-  end
-
-  alias handle_unmute_conversation_once_at_end            handle_unmute_thread_once_at_end
-  alias handle_unhide_thread_once_at_end                  handle_unmute_thread_once_at_end
-  alias handle_unhide_conversation_once_at_end            handle_unmute_thread_once_at_end
-end
diff --git a/app/lib/command_tag/command/status_tools.rb b/app/lib/command_tag/command/status_tools.rb
deleted file mode 100644
index b2ddca422..000000000
--- a/app/lib/command_tag/command/status_tools.rb
+++ /dev/null
@@ -1,239 +0,0 @@
-# frozen_string_literal: true
-module CommandTag::Command::StatusTools
-  def handle_boost_once_at_start(args)
-    return unless @parent.present? && StatusPolicy.new(@account, @parent).reblog?
-
-    status = ReblogService.new.call(
-      @account, @parent,
-      visibility: @status.visibility,
-      spoiler_text: args.join(' ').presence || @status.spoiler_text
-    )
-  end
-
-  alias handle_reblog_at_start handle_boost_once_at_start
-  alias handle_rb_at_start handle_boost_once_at_start
-  alias handle_rt_at_start handle_boost_once_at_start
-
-  def handle_article_before_save(args)
-    return unless author_of_status? && args.present?
-
-    case args.shift.downcase
-    when 'title', 'name', 't'
-      status.title = args.join(' ')
-    when 'summary', 'abstract', 'cw', 'cn', 's', 'a'
-      @status.title = @status.spoiler_text if @status.title.blank?
-      @status.spoiler_text = args.join(' ')
-    end
-  end
-
-  def handle_title_before_save(args)
-    args.unshift('title')
-    handle_article_before_save(args)
-  end
-
-  def handle_summary_before_save(args)
-    args.unshift('summary')
-    handle_article_before_save(args)
-  end
-
-  alias handle_abstract_before_save handle_summary_before_save
-
-  def handle_visibility_before_save(args)
-    return unless author_of_status? && args[0].present?
-
-    args[0] = read_visibility_from(args[0])
-    return if args[0].blank?
-
-    if args[1].blank?
-      @status.visibility = args[0].to_sym
-    elsif args[0] == @status.visibility.to_s
-      domains = args[1..-1].map { |domain| normalize_domain(domain) unless domain == '*' }.uniq.compact
-      @status.domain_permissions.where(domain: domains).destroy_all if domains.present?
-    elsif args[0] == 'cc'
-      expect_list = false
-      args[1..-1].uniq.each do |target|
-        if expect_list
-          expect_list = false
-          address_to_list(target)
-        elsif %w(list list:).include?(target.downcase)
-          expect_list = true
-        else
-          mention(resolve_mention(target))
-        end
-      end
-    elsif args[0] == 'community'
-      @status.visibility = :public
-      @status.domain_permissions.create_or_update(domain: '*', visibility: :unlisted)
-    else
-      args[1..-1].flat_map(&:split).uniq.each do |domain|
-        domain = normalize_domain(domain) unless domain == '*'
-        @status.domain_permissions.create_or_update(domain: domain, visibility: args[0]) if domain.present?
-      end
-    end
-  end
-
-  alias handle_v_before_save                      handle_visibility_before_save
-  alias handle_p_before_save                      handle_visibility_before_save
-  alias handle_privacy_before_save                handle_visibility_before_save
-
-  def handle_local_only_before_save(args)
-    @status.local_only = args.present? ? read_boolean_from(args[0]) : true
-    @status.originally_local_only = @status.local_only?
-  end
-
-  def handle_federate_before_save(args)
-    @status.local_only = args.present? ? !read_boolean_from(args[0]) : false
-    @status.originally_local_only = @status.local_only?
-  end
-
-  def handle_notify_before_save(args)
-    return if args[0].blank?
-
-    @status.notify = read_boolean_from(args[0])
-  end
-
-  alias handle_notice_before_save handle_notify_before_save
-
-  def handle_tags_before_save(args)
-    return if args.blank?
-
-    cmd = args.shift.downcase
-    args.select! { |tag| tag =~ /\A(#{Tag::HASHTAG_NAME_RE})\z/i }
-
-    case cmd
-    when 'add', 'a', '+'
-      ProcessHashtagsService.new.call(@status, args)
-    when 'del', 'remove', 'rm', 'r', 'd', '-'
-      RemoveHashtagsService.new.call(@status, args)
-    end
-  end
-
-  def handle_tag_before_save(args)
-    args.unshift('add')
-    handle_tags_before_save(args)
-  end
-
-  def handle_untag_before_save(args)
-    args.unshift('del')
-    handle_tags_before_save(args)
-  end
-
-  def handle_delete_before_save(args)
-    unless args
-      RemovalWorker.perform_async(@parent.id, immediate: true) if author_of_parent? && status_text_blank?
-      return
-    end
-
-    args.flat_map(&:split).uniq.each do |id|
-      if id.match?(/\A\d+\z/)
-        object = @account.statuses.find_by(id: id)
-      elsif id.start_with?('https://')
-        begin
-          object = ActivityPub::TagManager.instance.uri_to_resource(id, Status)
-          if object.blank? && ActivityPub::TagManager.instance.local_uri?(id)
-            id = Addressable::URI.parse(id)&.normalized_path&.sub(/\A.*\/([^\/]*)\/*/, '\1')
-            next unless id.present? && id.match?(/\A\d+\z/)
-
-            object = find_status_or_create_stub(id)
-          end
-        rescue Addressable::URI::InvalidURIError
-          next
-        end
-      end
-
-      next if object.blank? || object.account_id != @account.id
-
-      RemovalWorker.perform_async(object.id, immediate: true, unpublished: true)
-    end
-  end
-
-  alias handle_destroy_before_save handle_delete_before_save
-  alias handle_redraft_before_save handle_delete_before_save
-
-  def handle_expires_before_save(args)
-    return if args.blank?
-
-    @status.expires_at = Time.now.utc + to_datetime(args)
-  end
-
-  alias handle_expires_in_before_save handle_expires_before_save
-  alias handle_delete_in_before_save handle_expires_before_save
-  alias handle_unpublish_in_before_save handle_expires_before_save
-
-  def handle_publish_before_save(args)
-    return if args.blank?
-
-    @status.published = false
-    @status.publish_at = Time.now.utc + to_datetime(args)
-  end
-
-  alias handle_publish_in_before_save handle_publish_before_save
-
-  private
-
-  def resolve_mention(mention_text)
-    return unless (match = mention_text.match(Account::MENTION_RE))
-
-    username, domain  = match[1].split('@')
-    domain            = begin
-                          if TagManager.instance.local_domain?(domain)
-                            nil
-                          else
-                            TagManager.instance.normalize_domain(domain)
-                          end
-                        end
-
-    Account.find_remote(username, domain)
-  end
-
-  def mention(target_account)
-    return if target_account.blank? || target_account.mentions.where(status: @status).exists?
-
-    target_account.mentions.create(status: @status, silent: true)
-  end
-
-  def address_to_list(list_name)
-    return if list_name.blank?
-
-    list_accounts = ListAccount.joins(:list).where(lists: { account: @account }).where('LOWER(lists.title) = ?', list_name.mb_chars.downcase).includes(:account).map(&:account)
-    list_accounts.each { |target_account| mention(target_account) }
-  end
-
-  def find_status_or_create_stub(id)
-    status_params = {
-      id: id,
-      account: @account,
-      text: '(Deleted)',
-      local: true,
-      visibility: :public,
-      local_only: false,
-      published: false,
-    }
-    Status.where(id: id).first_or_create(status_params)
-  end
-
-  def to_datetime(args)
-    total = 0.seconds
-    args.reject { |arg| arg.blank? || %w(in at , and).include?(arg) }.in_groups_of(2) { |i, unit| total += to_duration(i.to_i, unit) }
-    total
-  end
-
-  def to_duration(amount, unit)
-    case unit
-    when nil, 's', 'sec', 'secs', 'second', 'seconds'
-      amount.seconds
-    when 'm', 'min', 'mins', 'minute', 'minutes'
-      amount.minutes
-    when 'h', 'hr', 'hrs', 'hour', 'hours'
-      amount.hours
-    when 'd', 'day', 'days'
-      amount.days
-    when 'w', 'wk', 'wks', 'week', 'weeks'
-      amount.weeks
-    when 'mo', 'mos', 'mn', 'mns', 'month', 'months'
-      amount.months
-    when 'y', 'yr', 'yrs', 'year', 'years'
-      amount.years
-    end
-  end
-end
diff --git a/app/lib/command_tag/command/text_tools.rb b/app/lib/command_tag/command/text_tools.rb
deleted file mode 100644
index 6b37b66b7..000000000
--- a/app/lib/command_tag/command/text_tools.rb
+++ /dev/null
@@ -1,89 +0,0 @@
-# frozen_string_literal: true
-
-module CommandTag::Command::TextTools
-  def handle_code_at_start(args)
-    return if args.count < 2
-
-    name = normalize(args[0])
-    value = args.last.presence || ''
-    @vars[name] = case @status.content_type
-                  when 'text/markdown'
-                    ["```\n#{value}\n```"]
-                  when 'text/html'
-                    ["<pre><code>#{html_encode(value).gsub("\n", '<br/>')}</code></pre>"]
-                  else
-                    ["----------\n#{value}\n----------"]
-                  end
-  end
-
-  def handle_code_with_return(args)
-    return if args.count > 1
-
-    value = args.last.presence || ''
-    case @status.content_type
-    when 'text/markdown'
-      ["```\n#{value}\n```"]
-    when 'text/html'
-      ["<pre><code>#{html_encode(value).gsub("\n", '<br/>')}</code></pre>"]
-    else
-      ["----------\n#{value}\n----------"]
-    end
-  end
-
-  def handle_prepend_before_save(args)
-    args.each { |arg| @text = "#{arg}\n#{text}" }
-  end
-
-  def handle_append_before_save(args)
-    args.each { |arg| @text << "\n#{arg}" }
-  end
-
-  def handle_replace_before_save(args)
-    @text.gsub!(args[0], args[1] || '')
-  end
-
-  alias handle_sub_before_save handle_replace_before_save
-
-  def handle_regex_replace_before_save(args)
-    flags     = normalize(args[2])
-    re_opts   = (flags.include?('i') ? Regexp::IGNORECASE : 0)
-    re_opts  |= (flags.include?('x') ? Regexp::EXTENDED : 0)
-    re_opts  |= (flags.include?('m') ? Regexp::MULTILINE : 0)
-
-    @text.gsub!(Regexp.new(args[0], re_opts), args[1] || '')
-  end
-
-  alias handle_resub_before_save handle_replace_before_save
-  alias handle_regex_sub_before_save handle_replace_before_save
-
-  def handle_keysmash_with_return(args)
-    keyboard = [
-      'asdf', 'jkl;',
-      'gh', "'",
-      'we', 'io',
-      'r', 'u',
-      'cv', 'nm',
-      't', 'x', ',',
-      'q', 'z',
-      'y', 'b',
-      'p', '.',
-      '[', ']'
-    ]
-
-    min_size = [[5, args[1].to_i].max, 100].min
-    max_size = [args[0].to_i, 100].min
-    max_size = 33 unless max_size.positive?
-
-    min_size, max_size = [max_size, min_size] if min_size > max_size
-
-    chunk = rand(min_size..max_size).times.map do
-      keyboard[(keyboard.size * (rand**3)).floor].split('').sample
-    end
-
-    chunk.join
-  end
-
-  def transform_keysmash_template_return(_, args)
-    handle_keysmash_with_return([args[0], args[2]])
-  end
-end
diff --git a/app/lib/command_tag/command/variables.rb b/app/lib/command_tag/command/variables.rb
deleted file mode 100644
index 6ba32ea41..000000000
--- a/app/lib/command_tag/command/variables.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# frozen_string_literal: true
-
-module CommandTag::Command::Variables
-  def handle_000_variables_startup
-    @vars.merge!(persistent_vars_from(@account.metadata.fields)) if @account.metadata.present?
-  end
-
-  def handle_999_variables_shutdown
-    @account.metadata.update!(fields: nonpersistent_vars_from(@account.metadata.fields).merge(persistent_vars_from(@vars)))
-  end
-
-  def handle_set_at_start(args)
-    return if args.blank?
-
-    args[0] = normalize(args[0])
-
-    case args.count
-    when 1
-      @vars.delete(args[0])
-    else
-      @vars[args[0]] = args[1..-1]
-    end
-  end
-
-  def do_unset_at_start(args)
-    args.each do |arg|
-      @vars.delete(normalize(arg))
-    end
-  end
-
-  private
-
-  def persistent_vars_from(vars)
-    vars.select { |key, value| key.start_with?('persist:') && value.present? && value.is_a?(Array) }
-  end
-
-  def nonpersistent_vars_from(vars)
-    vars.reject { |key, value| key.start_with?('persist:') || value.blank? }
-  end
-end