diff options
Diffstat (limited to 'app/lib/command_tag/command')
-rw-r--r-- | app/lib/command_tag/command/account_tools.rb | 37 | ||||
-rw-r--r-- | app/lib/command_tag/command/footer_tools.rb | 50 | ||||
-rw-r--r-- | app/lib/command_tag/command/hello_world.rb | 11 | ||||
-rw-r--r-- | app/lib/command_tag/command/parent_status_tools.rb | 80 | ||||
-rw-r--r-- | app/lib/command_tag/command/status_tools.rb | 239 | ||||
-rw-r--r-- | app/lib/command_tag/command/text_tools.rb | 89 | ||||
-rw-r--r-- | app/lib/command_tag/command/variables.rb | 40 |
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 |