Autofix Rubocop Style/RedundantBegin (#23703)
This commit is contained in:
		@@ -2958,79 +2958,6 @@ Style/RedundantArgument:
 | 
			
		||||
    - 'app/helpers/application_helper.rb'
 | 
			
		||||
    - 'lib/tasks/emojis.rake'
 | 
			
		||||
 | 
			
		||||
# Offense count: 83
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
Style/RedundantBegin:
 | 
			
		||||
  Exclude:
 | 
			
		||||
    - 'app/controllers/admin/dashboard_controller.rb'
 | 
			
		||||
    - 'app/controllers/api/v1/announcements_controller.rb'
 | 
			
		||||
    - 'app/controllers/api/v1/trends/links_controller.rb'
 | 
			
		||||
    - 'app/controllers/api/v1/trends/statuses_controller.rb'
 | 
			
		||||
    - 'app/controllers/api/v1/trends/tags_controller.rb'
 | 
			
		||||
    - 'app/controllers/concerns/rate_limit_headers.rb'
 | 
			
		||||
    - 'app/controllers/concerns/two_factor_authentication_concern.rb'
 | 
			
		||||
    - 'app/helpers/admin/dashboard_helper.rb'
 | 
			
		||||
    - 'app/helpers/admin/trends/statuses_helper.rb'
 | 
			
		||||
    - 'app/helpers/branding_helper.rb'
 | 
			
		||||
    - 'app/helpers/domain_control_helper.rb'
 | 
			
		||||
    - 'app/helpers/formatting_helper.rb'
 | 
			
		||||
    - 'app/helpers/instance_helper.rb'
 | 
			
		||||
    - 'app/helpers/jsonld_helper.rb'
 | 
			
		||||
    - 'app/lib/activity_tracker.rb'
 | 
			
		||||
    - 'app/lib/activitypub/activity/create.rb'
 | 
			
		||||
    - 'app/lib/activitypub/forwarder.rb'
 | 
			
		||||
    - 'app/lib/admin/metrics/dimension/software_versions_dimension.rb'
 | 
			
		||||
    - 'app/lib/admin/metrics/dimension/space_usage_dimension.rb'
 | 
			
		||||
    - 'app/lib/extractor.rb'
 | 
			
		||||
    - 'app/lib/importer/statuses_index_importer.rb'
 | 
			
		||||
    - 'app/lib/link_details_extractor.rb'
 | 
			
		||||
    - 'app/lib/request.rb'
 | 
			
		||||
    - 'app/models/account.rb'
 | 
			
		||||
    - 'app/models/account/field.rb'
 | 
			
		||||
    - 'app/models/admin/account_action.rb'
 | 
			
		||||
    - 'app/models/announcement.rb'
 | 
			
		||||
    - 'app/models/concerns/account_merging.rb'
 | 
			
		||||
    - 'app/models/concerns/pam_authenticable.rb'
 | 
			
		||||
    - 'app/models/email_domain_block.rb'
 | 
			
		||||
    - 'app/models/form/admin_settings.rb'
 | 
			
		||||
    - 'app/models/form/custom_emoji_batch.rb'
 | 
			
		||||
    - 'app/models/notification.rb'
 | 
			
		||||
    - 'app/models/remote_follow.rb'
 | 
			
		||||
    - 'app/models/status.rb'
 | 
			
		||||
    - 'app/models/status_edit.rb'
 | 
			
		||||
    - 'app/models/trends/links.rb'
 | 
			
		||||
    - 'app/models/trends/statuses.rb'
 | 
			
		||||
    - 'app/models/trends/tag_filter.rb'
 | 
			
		||||
    - 'app/models/trends/tags.rb'
 | 
			
		||||
    - 'app/models/web/push_subscription.rb'
 | 
			
		||||
    - 'app/presenters/tag_relationships_presenter.rb'
 | 
			
		||||
    - 'app/services/account_search_service.rb'
 | 
			
		||||
    - 'app/services/activitypub/fetch_featured_tags_collection_service.rb'
 | 
			
		||||
    - 'app/services/activitypub/fetch_remote_status_service.rb'
 | 
			
		||||
    - 'app/services/fetch_link_card_service.rb'
 | 
			
		||||
    - 'app/services/process_mentions_service.rb'
 | 
			
		||||
    - 'app/services/reblog_service.rb'
 | 
			
		||||
    - 'app/services/resolve_account_service.rb'
 | 
			
		||||
    - 'app/validators/domain_validator.rb'
 | 
			
		||||
    - 'app/validators/existing_username_validator.rb'
 | 
			
		||||
    - 'app/validators/import_validator.rb'
 | 
			
		||||
    - 'app/workers/backup_worker.rb'
 | 
			
		||||
    - 'app/workers/post_process_media_worker.rb'
 | 
			
		||||
    - 'app/workers/scheduler/follow_recommendations_scheduler.rb'
 | 
			
		||||
    - 'db/migrate/20180528141303_fix_accounts_unique_index.rb'
 | 
			
		||||
    - 'db/migrate/20180812173710_copy_status_stats.rb'
 | 
			
		||||
    - 'db/migrate/20181116173541_copy_account_stats.rb'
 | 
			
		||||
    - 'lib/mastodon/accounts_cli.rb'
 | 
			
		||||
    - 'lib/mastodon/cli_helper.rb'
 | 
			
		||||
    - 'lib/mastodon/ip_blocks_cli.rb'
 | 
			
		||||
    - 'lib/mastodon/maintenance_cli.rb'
 | 
			
		||||
    - 'lib/mastodon/media_cli.rb'
 | 
			
		||||
    - 'lib/mastodon/search_cli.rb'
 | 
			
		||||
    - 'lib/mastodon/upgrade_cli.rb'
 | 
			
		||||
    - 'lib/paperclip/color_extractor.rb'
 | 
			
		||||
    - 'lib/sanitize_ext/sanitize_config.rb'
 | 
			
		||||
    - 'lib/tasks/db.rake'
 | 
			
		||||
 | 
			
		||||
# Offense count: 16
 | 
			
		||||
# This cop supports safe autocorrection (--autocorrect).
 | 
			
		||||
Style/RedundantRegexpCharacterClass:
 | 
			
		||||
 
 | 
			
		||||
@@ -18,13 +18,11 @@ module Admin
 | 
			
		||||
    private
 | 
			
		||||
 | 
			
		||||
    def redis_info
 | 
			
		||||
      @redis_info ||= begin
 | 
			
		||||
        if redis.is_a?(Redis::Namespace)
 | 
			
		||||
          redis.redis.info
 | 
			
		||||
        else
 | 
			
		||||
          redis.info
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      @redis_info ||= if redis.is_a?(Redis::Namespace)
 | 
			
		||||
                        redis.redis.info
 | 
			
		||||
                      else
 | 
			
		||||
                        redis.info
 | 
			
		||||
                      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -18,9 +18,7 @@ class Api::V1::AnnouncementsController < Api::BaseController
 | 
			
		||||
  private
 | 
			
		||||
 | 
			
		||||
  def set_announcements
 | 
			
		||||
    @announcements = begin
 | 
			
		||||
      Announcement.published.chronological
 | 
			
		||||
    end
 | 
			
		||||
    @announcements = Announcement.published.chronological
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def set_announcement
 | 
			
		||||
 
 | 
			
		||||
@@ -18,13 +18,11 @@ class Api::V1::Trends::LinksController < Api::BaseController
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def set_links
 | 
			
		||||
    @links = begin
 | 
			
		||||
      if enabled?
 | 
			
		||||
        links_from_trends.offset(offset_param).limit(limit_param(DEFAULT_LINKS_LIMIT))
 | 
			
		||||
      else
 | 
			
		||||
        []
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    @links = if enabled?
 | 
			
		||||
               links_from_trends.offset(offset_param).limit(limit_param(DEFAULT_LINKS_LIMIT))
 | 
			
		||||
             else
 | 
			
		||||
               []
 | 
			
		||||
             end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def links_from_trends
 | 
			
		||||
 
 | 
			
		||||
@@ -16,13 +16,11 @@ class Api::V1::Trends::StatusesController < Api::BaseController
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def set_statuses
 | 
			
		||||
    @statuses = begin
 | 
			
		||||
      if enabled?
 | 
			
		||||
        cache_collection(statuses_from_trends.offset(offset_param).limit(limit_param(DEFAULT_STATUSES_LIMIT)), Status)
 | 
			
		||||
      else
 | 
			
		||||
        []
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    @statuses = if enabled?
 | 
			
		||||
                  cache_collection(statuses_from_trends.offset(offset_param).limit(limit_param(DEFAULT_STATUSES_LIMIT)), Status)
 | 
			
		||||
                else
 | 
			
		||||
                  []
 | 
			
		||||
                end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def statuses_from_trends
 | 
			
		||||
 
 | 
			
		||||
@@ -18,13 +18,11 @@ class Api::V1::Trends::TagsController < Api::BaseController
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def set_tags
 | 
			
		||||
    @tags = begin
 | 
			
		||||
      if enabled?
 | 
			
		||||
        tags_from_trends.offset(offset_param).limit(limit_param(DEFAULT_TAGS_LIMIT))
 | 
			
		||||
      else
 | 
			
		||||
        []
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    @tags = if enabled?
 | 
			
		||||
              tags_from_trends.offset(offset_param).limit(limit_param(DEFAULT_TAGS_LIMIT))
 | 
			
		||||
            else
 | 
			
		||||
              []
 | 
			
		||||
            end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def tags_from_trends
 | 
			
		||||
 
 | 
			
		||||
@@ -6,13 +6,11 @@ module RateLimitHeaders
 | 
			
		||||
  class_methods do
 | 
			
		||||
    def override_rate_limit_headers(method_name, options = {})
 | 
			
		||||
      around_action(only: method_name, if: :current_account) do |_controller, block|
 | 
			
		||||
        begin
 | 
			
		||||
          block.call
 | 
			
		||||
        ensure
 | 
			
		||||
          rate_limiter = RateLimiter.new(current_account, options)
 | 
			
		||||
          rate_limit_headers = rate_limiter.to_headers
 | 
			
		||||
          response.headers.merge!(rate_limit_headers) unless response.headers['X-RateLimit-Remaining'].present? && rate_limit_headers['X-RateLimit-Remaining'].to_i > response.headers['X-RateLimit-Remaining'].to_i
 | 
			
		||||
        end
 | 
			
		||||
        block.call
 | 
			
		||||
      ensure
 | 
			
		||||
        rate_limiter = RateLimiter.new(current_account, options)
 | 
			
		||||
        rate_limit_headers = rate_limiter.to_headers
 | 
			
		||||
        response.headers.merge!(rate_limit_headers) unless response.headers['X-RateLimit-Remaining'].present? && rate_limit_headers['X-RateLimit-Remaining'].to_i > response.headers['X-RateLimit-Remaining'].to_i
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -79,13 +79,11 @@ module TwoFactorAuthenticationConcern
 | 
			
		||||
 | 
			
		||||
    @body_classes     = 'lighter'
 | 
			
		||||
    @webauthn_enabled = user.webauthn_enabled?
 | 
			
		||||
    @scheme_type      = begin
 | 
			
		||||
      if user.webauthn_enabled? && user_params[:otp_attempt].blank?
 | 
			
		||||
        'webauthn'
 | 
			
		||||
      else
 | 
			
		||||
        'totp'
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    @scheme_type      = if user.webauthn_enabled? && user_params[:otp_attempt].blank?
 | 
			
		||||
                          'webauthn'
 | 
			
		||||
                        else
 | 
			
		||||
                          'totp'
 | 
			
		||||
                        end
 | 
			
		||||
 | 
			
		||||
    set_locale { render :two_factor }
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -19,19 +19,17 @@ module Admin::DashboardHelper
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def relevant_account_timestamp(account)
 | 
			
		||||
    timestamp, exact = begin
 | 
			
		||||
      if account.user_current_sign_in_at && account.user_current_sign_in_at < 24.hours.ago
 | 
			
		||||
        [account.user_current_sign_in_at, true]
 | 
			
		||||
      elsif account.user_current_sign_in_at
 | 
			
		||||
        [account.user_current_sign_in_at, false]
 | 
			
		||||
      elsif account.user_pending?
 | 
			
		||||
        [account.user_created_at, true]
 | 
			
		||||
      elsif account.last_status_at.present?
 | 
			
		||||
        [account.last_status_at, true]
 | 
			
		||||
      else
 | 
			
		||||
        [nil, false]
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    timestamp, exact = if account.user_current_sign_in_at && account.user_current_sign_in_at < 24.hours.ago
 | 
			
		||||
                         [account.user_current_sign_in_at, true]
 | 
			
		||||
                       elsif account.user_current_sign_in_at
 | 
			
		||||
                         [account.user_current_sign_in_at, false]
 | 
			
		||||
                       elsif account.user_pending?
 | 
			
		||||
                         [account.user_created_at, true]
 | 
			
		||||
                       elsif account.last_status_at.present?
 | 
			
		||||
                         [account.last_status_at, true]
 | 
			
		||||
                       else
 | 
			
		||||
                         [nil, false]
 | 
			
		||||
                       end
 | 
			
		||||
 | 
			
		||||
    return '-' if timestamp.nil?
 | 
			
		||||
    return t('generic.today') unless exact
 | 
			
		||||
 
 | 
			
		||||
@@ -2,13 +2,11 @@
 | 
			
		||||
 | 
			
		||||
module Admin::Trends::StatusesHelper
 | 
			
		||||
  def one_line_preview(status)
 | 
			
		||||
    text = begin
 | 
			
		||||
      if status.local?
 | 
			
		||||
        status.text.split("\n").first
 | 
			
		||||
      else
 | 
			
		||||
        Nokogiri::HTML(status.text).css('html > body > *').first&.text
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    text = if status.local?
 | 
			
		||||
             status.text.split("\n").first
 | 
			
		||||
           else
 | 
			
		||||
             Nokogiri::HTML(status.text).css('html > body > *').first&.text
 | 
			
		||||
           end
 | 
			
		||||
 | 
			
		||||
    return '' if text.blank?
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -23,14 +23,12 @@ module BrandingHelper
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def render_symbol(version = :icon)
 | 
			
		||||
    path = begin
 | 
			
		||||
      case version
 | 
			
		||||
      when :icon
 | 
			
		||||
        'logo-symbol-icon.svg'
 | 
			
		||||
      when :wordmark
 | 
			
		||||
        'logo-symbol-wordmark.svg'
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    path = case version
 | 
			
		||||
           when :icon
 | 
			
		||||
             'logo-symbol-icon.svg'
 | 
			
		||||
           when :wordmark
 | 
			
		||||
             'logo-symbol-wordmark.svg'
 | 
			
		||||
           end
 | 
			
		||||
 | 
			
		||||
    render(file: Rails.root.join('app', 'javascript', 'images', path)).html_safe # rubocop:disable Rails/OutputSafety
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -4,13 +4,11 @@ module DomainControlHelper
 | 
			
		||||
  def domain_not_allowed?(uri_or_domain)
 | 
			
		||||
    return if uri_or_domain.blank?
 | 
			
		||||
 | 
			
		||||
    domain = begin
 | 
			
		||||
      if uri_or_domain.include?('://')
 | 
			
		||||
        Addressable::URI.parse(uri_or_domain).host
 | 
			
		||||
      else
 | 
			
		||||
        uri_or_domain
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    domain = if uri_or_domain.include?('://')
 | 
			
		||||
               Addressable::URI.parse(uri_or_domain).host
 | 
			
		||||
             else
 | 
			
		||||
               uri_or_domain
 | 
			
		||||
             end
 | 
			
		||||
 | 
			
		||||
    if whitelist_mode?
 | 
			
		||||
      !DomainAllow.allowed?(domain)
 | 
			
		||||
 
 | 
			
		||||
@@ -21,30 +21,26 @@ module FormattingHelper
 | 
			
		||||
  def rss_status_content_format(status)
 | 
			
		||||
    html = status_content_format(status)
 | 
			
		||||
 | 
			
		||||
    before_html = begin
 | 
			
		||||
      if status.spoiler_text?
 | 
			
		||||
        tag.p do
 | 
			
		||||
          tag.strong do
 | 
			
		||||
            I18n.t('rss.content_warning', locale: available_locale_or_nil(status.language) || I18n.default_locale)
 | 
			
		||||
          end
 | 
			
		||||
    before_html = if status.spoiler_text?
 | 
			
		||||
                    tag.p do
 | 
			
		||||
                      tag.strong do
 | 
			
		||||
                        I18n.t('rss.content_warning', locale: available_locale_or_nil(status.language) || I18n.default_locale)
 | 
			
		||||
                      end
 | 
			
		||||
 | 
			
		||||
          status.spoiler_text
 | 
			
		||||
        end + tag.hr
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
                      status.spoiler_text
 | 
			
		||||
                    end + tag.hr
 | 
			
		||||
                  end
 | 
			
		||||
 | 
			
		||||
    after_html = begin
 | 
			
		||||
      if status.preloadable_poll
 | 
			
		||||
        tag.p do
 | 
			
		||||
          safe_join(
 | 
			
		||||
            status.preloadable_poll.options.map do |o|
 | 
			
		||||
              tag.send(status.preloadable_poll.multiple? ? 'checkbox' : 'radio', o, disabled: true)
 | 
			
		||||
            end,
 | 
			
		||||
            tag.br
 | 
			
		||||
          )
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    after_html = if status.preloadable_poll
 | 
			
		||||
                   tag.p do
 | 
			
		||||
                     safe_join(
 | 
			
		||||
                       status.preloadable_poll.options.map do |o|
 | 
			
		||||
                         tag.send(status.preloadable_poll.multiple? ? 'checkbox' : 'radio', o, disabled: true)
 | 
			
		||||
                       end,
 | 
			
		||||
                       tag.br
 | 
			
		||||
                     )
 | 
			
		||||
                   end
 | 
			
		||||
                 end
 | 
			
		||||
 | 
			
		||||
    prerender_custom_emojis(
 | 
			
		||||
      safe_join([before_html, html, after_html]),
 | 
			
		||||
 
 | 
			
		||||
@@ -10,13 +10,11 @@ module InstanceHelper
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def description_for_sign_up
 | 
			
		||||
    prefix = begin
 | 
			
		||||
      if @invite.present?
 | 
			
		||||
        I18n.t('auth.description.prefix_invited_by_user', name: @invite.user.account.username)
 | 
			
		||||
      else
 | 
			
		||||
        I18n.t('auth.description.prefix_sign_up')
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    prefix = if @invite.present?
 | 
			
		||||
               I18n.t('auth.description.prefix_invited_by_user', name: @invite.user.account.username)
 | 
			
		||||
             else
 | 
			
		||||
               I18n.t('auth.description.prefix_sign_up')
 | 
			
		||||
             end
 | 
			
		||||
 | 
			
		||||
    safe_join([prefix, I18n.t('auth.description.suffix')], ' ')
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -26,15 +26,13 @@ module JsonLdHelper
 | 
			
		||||
  # The url attribute can be a string, an array of strings, or an array of objects.
 | 
			
		||||
  # The objects could include a mimeType. Not-included mimeType means it's text/html.
 | 
			
		||||
  def url_to_href(value, preferred_type = nil)
 | 
			
		||||
    single_value = begin
 | 
			
		||||
      if value.is_a?(Array) && !value.first.is_a?(String)
 | 
			
		||||
        value.find { |link| preferred_type.nil? || ((link['mimeType'].presence || 'text/html') == preferred_type) }
 | 
			
		||||
      elsif value.is_a?(Array)
 | 
			
		||||
        value.first
 | 
			
		||||
      else
 | 
			
		||||
        value
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    single_value = if value.is_a?(Array) && !value.first.is_a?(String)
 | 
			
		||||
                     value.find { |link| preferred_type.nil? || ((link['mimeType'].presence || 'text/html') == preferred_type) }
 | 
			
		||||
                   elsif value.is_a?(Array)
 | 
			
		||||
                     value.first
 | 
			
		||||
                   else
 | 
			
		||||
                     value
 | 
			
		||||
                   end
 | 
			
		||||
 | 
			
		||||
    if single_value.nil? || single_value.is_a?(String)
 | 
			
		||||
      single_value
 | 
			
		||||
 
 | 
			
		||||
@@ -27,14 +27,12 @@ class ActivityTracker
 | 
			
		||||
    (start_at.to_date...end_at.to_date).map do |date|
 | 
			
		||||
      key = key_at(date.to_time(:utc))
 | 
			
		||||
 | 
			
		||||
      value = begin
 | 
			
		||||
        case @type
 | 
			
		||||
        when :basic
 | 
			
		||||
          redis.get(key).to_i
 | 
			
		||||
        when :unique
 | 
			
		||||
          redis.pfcount(key)
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      value = case @type
 | 
			
		||||
              when :basic
 | 
			
		||||
                redis.get(key).to_i
 | 
			
		||||
              when :unique
 | 
			
		||||
                redis.pfcount(key)
 | 
			
		||||
              end
 | 
			
		||||
 | 
			
		||||
      [date, value]
 | 
			
		||||
    end
 | 
			
		||||
 
 | 
			
		||||
@@ -108,26 +108,24 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
 | 
			
		||||
  def process_status_params
 | 
			
		||||
    @status_parser = ActivityPub::Parser::StatusParser.new(@json, followers_collection: @account.followers_url)
 | 
			
		||||
 | 
			
		||||
    @params = begin
 | 
			
		||||
      {
 | 
			
		||||
        uri: @status_parser.uri,
 | 
			
		||||
        url: @status_parser.url || @status_parser.uri,
 | 
			
		||||
        account: @account,
 | 
			
		||||
        text: converted_object_type? ? converted_text : (@status_parser.text || ''),
 | 
			
		||||
        language: @status_parser.language,
 | 
			
		||||
        spoiler_text: converted_object_type? ? '' : (@status_parser.spoiler_text || ''),
 | 
			
		||||
        created_at: @status_parser.created_at,
 | 
			
		||||
        edited_at: @status_parser.edited_at && @status_parser.edited_at != @status_parser.created_at ? @status_parser.edited_at : nil,
 | 
			
		||||
        override_timestamps: @options[:override_timestamps],
 | 
			
		||||
        reply: @status_parser.reply,
 | 
			
		||||
        sensitive: @account.sensitized? || @status_parser.sensitive || false,
 | 
			
		||||
        visibility: @status_parser.visibility,
 | 
			
		||||
        thread: replied_to_status,
 | 
			
		||||
        conversation: conversation_from_uri(@object['conversation']),
 | 
			
		||||
        media_attachment_ids: process_attachments.take(4).map(&:id),
 | 
			
		||||
        poll: process_poll,
 | 
			
		||||
      }
 | 
			
		||||
    end
 | 
			
		||||
    @params = {
 | 
			
		||||
      uri: @status_parser.uri,
 | 
			
		||||
      url: @status_parser.url || @status_parser.uri,
 | 
			
		||||
      account: @account,
 | 
			
		||||
      text: converted_object_type? ? converted_text : (@status_parser.text || ''),
 | 
			
		||||
      language: @status_parser.language,
 | 
			
		||||
      spoiler_text: converted_object_type? ? '' : (@status_parser.spoiler_text || ''),
 | 
			
		||||
      created_at: @status_parser.created_at,
 | 
			
		||||
      edited_at: @status_parser.edited_at && @status_parser.edited_at != @status_parser.created_at ? @status_parser.edited_at : nil,
 | 
			
		||||
      override_timestamps: @options[:override_timestamps],
 | 
			
		||||
      reply: @status_parser.reply,
 | 
			
		||||
      sensitive: @account.sensitized? || @status_parser.sensitive || false,
 | 
			
		||||
      visibility: @status_parser.visibility,
 | 
			
		||||
      thread: replied_to_status,
 | 
			
		||||
      conversation: conversation_from_uri(@object['conversation']),
 | 
			
		||||
      media_attachment_ids: process_attachments.take(4).map(&:id),
 | 
			
		||||
      poll: process_poll,
 | 
			
		||||
    }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def process_audience
 | 
			
		||||
 
 | 
			
		||||
@@ -28,13 +28,11 @@ class ActivityPub::Forwarder
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def signature_account_id
 | 
			
		||||
    @signature_account_id ||= begin
 | 
			
		||||
      if in_reply_to_local?
 | 
			
		||||
        in_reply_to.account_id
 | 
			
		||||
      else
 | 
			
		||||
        reblogged_by_account_ids.first
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    @signature_account_id ||= if in_reply_to_local?
 | 
			
		||||
                                in_reply_to.account_id
 | 
			
		||||
                              else
 | 
			
		||||
                                reblogged_by_account_ids.first
 | 
			
		||||
                              end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def inboxes
 | 
			
		||||
 
 | 
			
		||||
@@ -58,12 +58,10 @@ class Admin::Metrics::Dimension::SoftwareVersionsDimension < Admin::Metrics::Dim
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def redis_info
 | 
			
		||||
    @redis_info ||= begin
 | 
			
		||||
      if redis.is_a?(Redis::Namespace)
 | 
			
		||||
        redis.redis.info
 | 
			
		||||
      else
 | 
			
		||||
        redis.info
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    @redis_info ||= if redis.is_a?(Redis::Namespace)
 | 
			
		||||
                      redis.redis.info
 | 
			
		||||
                    else
 | 
			
		||||
                      redis.info
 | 
			
		||||
                    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -59,12 +59,10 @@ class Admin::Metrics::Dimension::SpaceUsageDimension < Admin::Metrics::Dimension
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def redis_info
 | 
			
		||||
    @redis_info ||= begin
 | 
			
		||||
      if redis.is_a?(Redis::Namespace)
 | 
			
		||||
        redis.redis.info
 | 
			
		||||
      else
 | 
			
		||||
        redis.info
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    @redis_info ||= if redis.is_a?(Redis::Namespace)
 | 
			
		||||
                      redis.redis.info
 | 
			
		||||
                    else
 | 
			
		||||
                      redis.info
 | 
			
		||||
                    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -8,12 +8,10 @@ module Extractor
 | 
			
		||||
  module_function
 | 
			
		||||
 | 
			
		||||
  def extract_entities_with_indices(text, options = {}, &block)
 | 
			
		||||
    entities = begin
 | 
			
		||||
      extract_urls_with_indices(text, options) +
 | 
			
		||||
        extract_hashtags_with_indices(text, check_url_overlap: false) +
 | 
			
		||||
        extract_mentions_or_lists_with_indices(text) +
 | 
			
		||||
        extract_extra_uris_with_indices(text)
 | 
			
		||||
    end
 | 
			
		||||
    entities = extract_urls_with_indices(text, options) +
 | 
			
		||||
               extract_hashtags_with_indices(text, check_url_overlap: false) +
 | 
			
		||||
               extract_mentions_or_lists_with_indices(text) +
 | 
			
		||||
               extract_extra_uris_with_indices(text)
 | 
			
		||||
 | 
			
		||||
    return [] if entities.empty?
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,13 +24,11 @@ class Importer::StatusesIndexImporter < Importer::BaseImporter
 | 
			
		||||
          # is called before rendering the data and we need to filter based
 | 
			
		||||
          # on the results of the filter, so this filtering happens here instead
 | 
			
		||||
          bulk.map! do |entry|
 | 
			
		||||
            new_entry = begin
 | 
			
		||||
              if entry[:index] && entry.dig(:index, :data, 'searchable_by').blank?
 | 
			
		||||
                { delete: entry[:index].except(:data) }
 | 
			
		||||
              else
 | 
			
		||||
                entry
 | 
			
		||||
              end
 | 
			
		||||
            end
 | 
			
		||||
            new_entry = if entry[:index] && entry.dig(:index, :data, 'searchable_by').blank?
 | 
			
		||||
                          { delete: entry[:index].except(:data) }
 | 
			
		||||
                        else
 | 
			
		||||
                          entry
 | 
			
		||||
                        end
 | 
			
		||||
 | 
			
		||||
            if new_entry[:index]
 | 
			
		||||
              indexed += 1
 | 
			
		||||
 
 | 
			
		||||
@@ -232,26 +232,24 @@ class LinkDetailsExtractor
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def structured_data
 | 
			
		||||
    @structured_data ||= begin
 | 
			
		||||
      # Some publications have more than one JSON-LD definition on the page,
 | 
			
		||||
      # and some of those definitions aren't valid JSON either, so we have
 | 
			
		||||
      # to loop through here until we find something that is the right type
 | 
			
		||||
      # and doesn't break
 | 
			
		||||
      document.xpath('//script[@type="application/ld+json"]').filter_map do |element|
 | 
			
		||||
        json_ld = element.content&.gsub(CDATA_JUNK_PATTERN, '')
 | 
			
		||||
    # Some publications have more than one JSON-LD definition on the page,
 | 
			
		||||
    # and some of those definitions aren't valid JSON either, so we have
 | 
			
		||||
    # to loop through here until we find something that is the right type
 | 
			
		||||
    # and doesn't break
 | 
			
		||||
    @structured_data ||= document.xpath('//script[@type="application/ld+json"]').filter_map do |element|
 | 
			
		||||
      json_ld = element.content&.gsub(CDATA_JUNK_PATTERN, '')
 | 
			
		||||
 | 
			
		||||
        next if json_ld.blank?
 | 
			
		||||
      next if json_ld.blank?
 | 
			
		||||
 | 
			
		||||
        structured_data = StructuredData.new(html_entities.decode(json_ld))
 | 
			
		||||
      structured_data = StructuredData.new(html_entities.decode(json_ld))
 | 
			
		||||
 | 
			
		||||
        next unless structured_data.valid?
 | 
			
		||||
      next unless structured_data.valid?
 | 
			
		||||
 | 
			
		||||
        structured_data
 | 
			
		||||
      rescue Oj::ParseError, EncodingError
 | 
			
		||||
        Rails.logger.debug { "Invalid JSON-LD in #{@original_url}" }
 | 
			
		||||
        next
 | 
			
		||||
      end.first
 | 
			
		||||
    end
 | 
			
		||||
      structured_data
 | 
			
		||||
    rescue Oj::ParseError, EncodingError
 | 
			
		||||
      Rails.logger.debug { "Invalid JSON-LD in #{@original_url}" }
 | 
			
		||||
      next
 | 
			
		||||
    end.first
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def document
 | 
			
		||||
 
 | 
			
		||||
@@ -215,26 +215,24 @@ class Request
 | 
			
		||||
        addr_by_socket = {}
 | 
			
		||||
 | 
			
		||||
        addresses.each do |address|
 | 
			
		||||
          begin
 | 
			
		||||
            check_private_address(address, host)
 | 
			
		||||
          check_private_address(address, host)
 | 
			
		||||
 | 
			
		||||
            sock     = ::Socket.new(address.is_a?(Resolv::IPv6) ? ::Socket::AF_INET6 : ::Socket::AF_INET, ::Socket::SOCK_STREAM, 0)
 | 
			
		||||
            sockaddr = ::Socket.pack_sockaddr_in(port, address.to_s)
 | 
			
		||||
          sock     = ::Socket.new(address.is_a?(Resolv::IPv6) ? ::Socket::AF_INET6 : ::Socket::AF_INET, ::Socket::SOCK_STREAM, 0)
 | 
			
		||||
          sockaddr = ::Socket.pack_sockaddr_in(port, address.to_s)
 | 
			
		||||
 | 
			
		||||
            sock.setsockopt(::Socket::IPPROTO_TCP, ::Socket::TCP_NODELAY, 1)
 | 
			
		||||
          sock.setsockopt(::Socket::IPPROTO_TCP, ::Socket::TCP_NODELAY, 1)
 | 
			
		||||
 | 
			
		||||
            sock.connect_nonblock(sockaddr)
 | 
			
		||||
          sock.connect_nonblock(sockaddr)
 | 
			
		||||
 | 
			
		||||
            # If that hasn't raised an exception, we somehow managed to connect
 | 
			
		||||
            # immediately, close pending sockets and return immediately
 | 
			
		||||
            socks.each(&:close)
 | 
			
		||||
            return sock
 | 
			
		||||
          rescue IO::WaitWritable
 | 
			
		||||
            socks << sock
 | 
			
		||||
            addr_by_socket[sock] = sockaddr
 | 
			
		||||
          rescue => e
 | 
			
		||||
            outer_e = e
 | 
			
		||||
          end
 | 
			
		||||
          # If that hasn't raised an exception, we somehow managed to connect
 | 
			
		||||
          # immediately, close pending sockets and return immediately
 | 
			
		||||
          socks.each(&:close)
 | 
			
		||||
          return sock
 | 
			
		||||
        rescue IO::WaitWritable
 | 
			
		||||
          socks << sock
 | 
			
		||||
          addr_by_socket[sock] = sockaddr
 | 
			
		||||
        rescue => e
 | 
			
		||||
          outer_e = e
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        until socks.empty?
 | 
			
		||||
@@ -279,9 +277,7 @@ class Request
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def private_address_exceptions
 | 
			
		||||
        @private_address_exceptions = begin
 | 
			
		||||
          (ENV['ALLOWED_PRIVATE_ADDRESSES'] || '').split(',').map { |addr| IPAddr.new(addr) }
 | 
			
		||||
        end
 | 
			
		||||
        @private_address_exceptions = (ENV['ALLOWED_PRIVATE_ADDRESSES'] || '').split(',').map { |addr| IPAddr.new(addr) }
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -459,13 +459,12 @@ class Account < ApplicationRecord
 | 
			
		||||
      return [] if text.blank?
 | 
			
		||||
 | 
			
		||||
      text.scan(MENTION_RE).map { |match| match.first.split('@', 2) }.uniq.filter_map do |(username, domain)|
 | 
			
		||||
        domain = begin
 | 
			
		||||
          if TagManager.instance.local_domain?(domain)
 | 
			
		||||
            nil
 | 
			
		||||
          else
 | 
			
		||||
            TagManager.instance.normalize_domain(domain)
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
        domain = if TagManager.instance.local_domain?(domain)
 | 
			
		||||
                   nil
 | 
			
		||||
                 else
 | 
			
		||||
                   TagManager.instance.normalize_domain(domain)
 | 
			
		||||
                 end
 | 
			
		||||
 | 
			
		||||
        EntityCache.instance.mention(username, domain)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 
 | 
			
		||||
@@ -25,13 +25,11 @@ class Account::Field < ActiveModelSerializers::Model
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def value_for_verification
 | 
			
		||||
    @value_for_verification ||= begin
 | 
			
		||||
      if account.local?
 | 
			
		||||
        value
 | 
			
		||||
      else
 | 
			
		||||
        extract_url_from_html
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    @value_for_verification ||= if account.local?
 | 
			
		||||
                                  value
 | 
			
		||||
                                else
 | 
			
		||||
                                  extract_url_from_html
 | 
			
		||||
                                end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def verifiable?
 | 
			
		||||
 
 | 
			
		||||
@@ -166,13 +166,11 @@ class Admin::AccountAction
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def reports
 | 
			
		||||
    @reports ||= begin
 | 
			
		||||
      if type == 'none'
 | 
			
		||||
        with_report? ? [report] : []
 | 
			
		||||
      else
 | 
			
		||||
        Report.where(target_account: target_account).unresolved
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    @reports ||= if type == 'none'
 | 
			
		||||
                   with_report? ? [report] : []
 | 
			
		||||
                 else
 | 
			
		||||
                   Report.where(target_account: target_account).unresolved
 | 
			
		||||
                 end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def warning_preset
 | 
			
		||||
 
 | 
			
		||||
@@ -54,13 +54,11 @@ class Announcement < ApplicationRecord
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def statuses
 | 
			
		||||
    @statuses ||= begin
 | 
			
		||||
      if status_ids.nil?
 | 
			
		||||
        []
 | 
			
		||||
      else
 | 
			
		||||
        Status.where(id: status_ids, visibility: [:public, :unlisted])
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    @statuses ||= if status_ids.nil?
 | 
			
		||||
                    []
 | 
			
		||||
                  else
 | 
			
		||||
                    Status.where(id: status_ids, visibility: [:public, :unlisted])
 | 
			
		||||
                  end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def tags
 | 
			
		||||
 
 | 
			
		||||
@@ -21,11 +21,9 @@ module AccountMerging
 | 
			
		||||
 | 
			
		||||
    owned_classes.each do |klass|
 | 
			
		||||
      klass.where(account_id: other_account.id).find_each do |record|
 | 
			
		||||
        begin
 | 
			
		||||
          record.update_attribute(:account_id, id)
 | 
			
		||||
        rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
          next
 | 
			
		||||
        end
 | 
			
		||||
        record.update_attribute(:account_id, id)
 | 
			
		||||
      rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
        next
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
@@ -36,11 +34,9 @@ module AccountMerging
 | 
			
		||||
 | 
			
		||||
    target_classes.each do |klass|
 | 
			
		||||
      klass.where(target_account_id: other_account.id).find_each do |record|
 | 
			
		||||
        begin
 | 
			
		||||
          record.update_attribute(:target_account_id, id)
 | 
			
		||||
        rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
          next
 | 
			
		||||
        end
 | 
			
		||||
        record.update_attribute(:target_account_id, id)
 | 
			
		||||
      rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
        next
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -42,13 +42,11 @@ module PamAuthenticable
 | 
			
		||||
    def self.pam_get_user(attributes = {})
 | 
			
		||||
      return nil unless attributes[:email]
 | 
			
		||||
 | 
			
		||||
      resource = begin
 | 
			
		||||
        if Devise.check_at_sign && !attributes[:email].index('@')
 | 
			
		||||
          joins(:account).find_by(accounts: { username: attributes[:email] })
 | 
			
		||||
        else
 | 
			
		||||
          find_by(email: attributes[:email])
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      resource = if Devise.check_at_sign && !attributes[:email].index('@')
 | 
			
		||||
                   joins(:account).find_by(accounts: { username: attributes[:email] })
 | 
			
		||||
                 else
 | 
			
		||||
                   find_by(email: attributes[:email])
 | 
			
		||||
                 end
 | 
			
		||||
 | 
			
		||||
      if resource.nil?
 | 
			
		||||
        resource = new(email: attributes[:email], agreement: true)
 | 
			
		||||
 
 | 
			
		||||
@@ -69,13 +69,11 @@ class EmailDomainBlock < ApplicationRecord
 | 
			
		||||
 | 
			
		||||
    def extract_uris(domain_or_domains)
 | 
			
		||||
      Array(domain_or_domains).map do |str|
 | 
			
		||||
        domain = begin
 | 
			
		||||
          if str.include?('@')
 | 
			
		||||
            str.split('@', 2).last
 | 
			
		||||
          else
 | 
			
		||||
            str
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
        domain = if str.include?('@')
 | 
			
		||||
                   str.split('@', 2).last
 | 
			
		||||
                 else
 | 
			
		||||
                   str
 | 
			
		||||
                 end
 | 
			
		||||
 | 
			
		||||
        Addressable::URI.new.tap { |u| u.host = domain.strip } if domain.present?
 | 
			
		||||
      rescue Addressable::URI::InvalidURIError, IDN::Idna::IdnaError
 | 
			
		||||
 
 | 
			
		||||
@@ -76,13 +76,11 @@ class Form::AdminSettings
 | 
			
		||||
    define_method(key) do
 | 
			
		||||
      return instance_variable_get("@#{key}") if instance_variable_defined?("@#{key}")
 | 
			
		||||
 | 
			
		||||
      stored_value = begin
 | 
			
		||||
        if UPLOAD_KEYS.include?(key)
 | 
			
		||||
          SiteUpload.where(var: key).first_or_initialize(var: key)
 | 
			
		||||
        else
 | 
			
		||||
          Setting.public_send(key)
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      stored_value = if UPLOAD_KEYS.include?(key)
 | 
			
		||||
                       SiteUpload.where(var: key).first_or_initialize(var: key)
 | 
			
		||||
                     else
 | 
			
		||||
                       Setting.public_send(key)
 | 
			
		||||
                     end
 | 
			
		||||
 | 
			
		||||
      instance_variable_set("@#{key}", stored_value)
 | 
			
		||||
    end
 | 
			
		||||
 
 | 
			
		||||
@@ -36,13 +36,11 @@ class Form::CustomEmojiBatch
 | 
			
		||||
  def update!
 | 
			
		||||
    custom_emojis.each { |custom_emoji| authorize(custom_emoji, :update?) }
 | 
			
		||||
 | 
			
		||||
    category = begin
 | 
			
		||||
      if category_id.present?
 | 
			
		||||
        CustomEmojiCategory.find(category_id)
 | 
			
		||||
      elsif category_name.present?
 | 
			
		||||
        CustomEmojiCategory.find_or_create_by!(name: category_name)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    category = if category_id.present?
 | 
			
		||||
                 CustomEmojiCategory.find(category_id)
 | 
			
		||||
               elsif category_name.present?
 | 
			
		||||
                 CustomEmojiCategory.find_or_create_by!(name: category_name)
 | 
			
		||||
               end
 | 
			
		||||
 | 
			
		||||
    custom_emojis.each do |custom_emoji|
 | 
			
		||||
      custom_emoji.update(category_id: category&.id)
 | 
			
		||||
 
 | 
			
		||||
@@ -87,13 +87,11 @@ class Notification < ApplicationRecord
 | 
			
		||||
 | 
			
		||||
  class << self
 | 
			
		||||
    def browserable(types: [], exclude_types: [], from_account_id: nil)
 | 
			
		||||
      requested_types = begin
 | 
			
		||||
        if types.empty?
 | 
			
		||||
          TYPES
 | 
			
		||||
        else
 | 
			
		||||
          types.map(&:to_sym) & TYPES
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      requested_types = if types.empty?
 | 
			
		||||
                          TYPES
 | 
			
		||||
                        else
 | 
			
		||||
                          types.map(&:to_sym) & TYPES
 | 
			
		||||
                        end
 | 
			
		||||
 | 
			
		||||
      requested_types -= exclude_types.map(&:to_sym)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -36,13 +36,11 @@ class RemoteFollow
 | 
			
		||||
 | 
			
		||||
    username, domain = value.strip.gsub(/\A@/, '').split('@')
 | 
			
		||||
 | 
			
		||||
    domain = begin
 | 
			
		||||
      if TagManager.instance.local_domain?(domain)
 | 
			
		||||
        nil
 | 
			
		||||
      else
 | 
			
		||||
        TagManager.instance.normalize_domain(domain)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    domain = if TagManager.instance.local_domain?(domain)
 | 
			
		||||
               nil
 | 
			
		||||
             else
 | 
			
		||||
               TagManager.instance.normalize_domain(domain)
 | 
			
		||||
             end
 | 
			
		||||
 | 
			
		||||
    [username, domain].compact.join('@')
 | 
			
		||||
  rescue Addressable::URI::InvalidURIError
 | 
			
		||||
 
 | 
			
		||||
@@ -368,13 +368,12 @@ class Status < ApplicationRecord
 | 
			
		||||
      return [] if text.blank?
 | 
			
		||||
 | 
			
		||||
      text.scan(FetchLinkCardService::URL_PATTERN).map(&:second).uniq.filter_map do |url|
 | 
			
		||||
        status = begin
 | 
			
		||||
          if TagManager.instance.local_url?(url)
 | 
			
		||||
            ActivityPub::TagManager.instance.uri_to_resource(url, Status)
 | 
			
		||||
          else
 | 
			
		||||
            EntityCache.instance.status(url)
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
        status = if TagManager.instance.local_url?(url)
 | 
			
		||||
                   ActivityPub::TagManager.instance.uri_to_resource(url, Status)
 | 
			
		||||
                 else
 | 
			
		||||
                   EntityCache.instance.status(url)
 | 
			
		||||
                 end
 | 
			
		||||
 | 
			
		||||
        status&.distributable? ? status : nil
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 
 | 
			
		||||
@@ -51,14 +51,12 @@ class StatusEdit < ApplicationRecord
 | 
			
		||||
  def ordered_media_attachments
 | 
			
		||||
    return @ordered_media_attachments if defined?(@ordered_media_attachments)
 | 
			
		||||
 | 
			
		||||
    @ordered_media_attachments = begin
 | 
			
		||||
      if ordered_media_attachment_ids.nil?
 | 
			
		||||
        []
 | 
			
		||||
      else
 | 
			
		||||
        map = status.media_attachments.index_by(&:id)
 | 
			
		||||
        ordered_media_attachment_ids.map.with_index { |media_attachment_id, index| PreservedMediaAttachment.new(media_attachment: map[media_attachment_id], description: media_descriptions[index]) }
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    @ordered_media_attachments = if ordered_media_attachment_ids.nil?
 | 
			
		||||
                                   []
 | 
			
		||||
                                 else
 | 
			
		||||
                                   map = status.media_attachments.index_by(&:id)
 | 
			
		||||
                                   ordered_media_attachment_ids.map.with_index { |media_attachment_id, index| PreservedMediaAttachment.new(media_attachment: map[media_attachment_id], description: media_descriptions[index]) }
 | 
			
		||||
                                 end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def proper
 | 
			
		||||
 
 | 
			
		||||
@@ -113,13 +113,11 @@ class Trends::Links < Trends::Base
 | 
			
		||||
      max_score = preview_card.max_score
 | 
			
		||||
      max_score = 0 if max_time.nil? || max_time < (at_time - options[:max_score_cooldown])
 | 
			
		||||
 | 
			
		||||
      score = begin
 | 
			
		||||
        if expected > observed || observed < options[:threshold]
 | 
			
		||||
          0
 | 
			
		||||
        else
 | 
			
		||||
          ((observed - expected)**2) / expected
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      score = if expected > observed || observed < options[:threshold]
 | 
			
		||||
                0
 | 
			
		||||
              else
 | 
			
		||||
                ((observed - expected)**2) / expected
 | 
			
		||||
              end
 | 
			
		||||
 | 
			
		||||
      if score > max_score
 | 
			
		||||
        max_score = score
 | 
			
		||||
@@ -129,13 +127,11 @@ class Trends::Links < Trends::Base
 | 
			
		||||
        preview_card.update_columns(max_score: max_score, max_score_at: max_time)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      decaying_score = begin
 | 
			
		||||
        if max_score.zero? || !valid_locale?(preview_card.language)
 | 
			
		||||
          0
 | 
			
		||||
        else
 | 
			
		||||
          max_score * (0.5**((at_time.to_f - max_time.to_f) / options[:max_score_halflife].to_f))
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      decaying_score = if max_score.zero? || !valid_locale?(preview_card.language)
 | 
			
		||||
                         0
 | 
			
		||||
                       else
 | 
			
		||||
                         max_score * (0.5**((at_time.to_f - max_time.to_f) / options[:max_score_halflife].to_f))
 | 
			
		||||
                       end
 | 
			
		||||
 | 
			
		||||
      [decaying_score, preview_card]
 | 
			
		||||
    end
 | 
			
		||||
 
 | 
			
		||||
@@ -99,21 +99,17 @@ class Trends::Statuses < Trends::Base
 | 
			
		||||
      expected  = 1.0
 | 
			
		||||
      observed  = (status.reblogs_count + status.favourites_count).to_f
 | 
			
		||||
 | 
			
		||||
      score = begin
 | 
			
		||||
        if expected > observed || observed < options[:threshold]
 | 
			
		||||
          0
 | 
			
		||||
        else
 | 
			
		||||
          ((observed - expected)**2) / expected
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      score = if expected > observed || observed < options[:threshold]
 | 
			
		||||
                0
 | 
			
		||||
              else
 | 
			
		||||
                ((observed - expected)**2) / expected
 | 
			
		||||
              end
 | 
			
		||||
 | 
			
		||||
      decaying_score = begin
 | 
			
		||||
        if score.zero? || !eligible?(status)
 | 
			
		||||
          0
 | 
			
		||||
        else
 | 
			
		||||
          score * (0.5**((at_time.to_f - status.created_at.to_f) / options[:score_halflife].to_f))
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      decaying_score = if score.zero? || !eligible?(status)
 | 
			
		||||
                         0
 | 
			
		||||
                       else
 | 
			
		||||
                         score * (0.5**((at_time.to_f - status.created_at.to_f) / options[:score_halflife].to_f))
 | 
			
		||||
                       end
 | 
			
		||||
 | 
			
		||||
      [decaying_score, status]
 | 
			
		||||
    end
 | 
			
		||||
 
 | 
			
		||||
@@ -13,13 +13,11 @@ class Trends::TagFilter
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def results
 | 
			
		||||
    scope = begin
 | 
			
		||||
      if params[:status] == 'pending_review'
 | 
			
		||||
        Tag.unscoped
 | 
			
		||||
      else
 | 
			
		||||
        trending_scope
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    scope = if params[:status] == 'pending_review'
 | 
			
		||||
              Tag.unscoped
 | 
			
		||||
            else
 | 
			
		||||
              trending_scope
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
    params.each do |key, value|
 | 
			
		||||
      next if key.to_s == 'page'
 | 
			
		||||
 
 | 
			
		||||
@@ -63,13 +63,11 @@ class Trends::Tags < Trends::Base
 | 
			
		||||
      max_score = tag.max_score
 | 
			
		||||
      max_score = 0 if max_time.nil? || max_time < (at_time - options[:max_score_cooldown])
 | 
			
		||||
 | 
			
		||||
      score = begin
 | 
			
		||||
        if expected > observed || observed < options[:threshold]
 | 
			
		||||
          0
 | 
			
		||||
        else
 | 
			
		||||
          ((observed - expected)**2) / expected
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      score = if expected > observed || observed < options[:threshold]
 | 
			
		||||
                0
 | 
			
		||||
              else
 | 
			
		||||
                ((observed - expected)**2) / expected
 | 
			
		||||
              end
 | 
			
		||||
 | 
			
		||||
      if score > max_score
 | 
			
		||||
        max_score = score
 | 
			
		||||
 
 | 
			
		||||
@@ -53,25 +53,21 @@ class Web::PushSubscription < ApplicationRecord
 | 
			
		||||
  def associated_user
 | 
			
		||||
    return @associated_user if defined?(@associated_user)
 | 
			
		||||
 | 
			
		||||
    @associated_user = begin
 | 
			
		||||
      if user_id.nil?
 | 
			
		||||
        session_activation.user
 | 
			
		||||
      else
 | 
			
		||||
        user
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    @associated_user = if user_id.nil?
 | 
			
		||||
                         session_activation.user
 | 
			
		||||
                       else
 | 
			
		||||
                         user
 | 
			
		||||
                       end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def associated_access_token
 | 
			
		||||
    return @associated_access_token if defined?(@associated_access_token)
 | 
			
		||||
 | 
			
		||||
    @associated_access_token = begin
 | 
			
		||||
      if access_token_id.nil?
 | 
			
		||||
        find_or_create_access_token.token
 | 
			
		||||
      else
 | 
			
		||||
        access_token.token
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    @associated_access_token = if access_token_id.nil?
 | 
			
		||||
                                 find_or_create_access_token.token
 | 
			
		||||
                               else
 | 
			
		||||
                                 access_token.token
 | 
			
		||||
                               end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  class << self
 | 
			
		||||
 
 | 
			
		||||
@@ -4,12 +4,10 @@ class TagRelationshipsPresenter
 | 
			
		||||
  attr_reader :following_map
 | 
			
		||||
 | 
			
		||||
  def initialize(tags, current_account_id = nil, **options)
 | 
			
		||||
    @following_map = begin
 | 
			
		||||
      if current_account_id.nil?
 | 
			
		||||
        {}
 | 
			
		||||
      else
 | 
			
		||||
        TagFollow.select(:tag_id).where(tag_id: tags.map(&:id), account_id: current_account_id).each_with_object({}) { |f, h| h[f.tag_id] = true }.merge(options[:following_map] || {})
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    @following_map = if current_account_id.nil?
 | 
			
		||||
                       {}
 | 
			
		||||
                     else
 | 
			
		||||
                       TagFollow.select(:tag_id).where(tag_id: tags.map(&:id), account_id: current_account_id).each_with_object({}) { |f, h| h[f.tag_id] = true }.merge(options[:following_map] || {})
 | 
			
		||||
                     end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -32,15 +32,13 @@ class AccountSearchService < BaseService
 | 
			
		||||
 | 
			
		||||
    return @exact_match if defined?(@exact_match)
 | 
			
		||||
 | 
			
		||||
    match = begin
 | 
			
		||||
      if options[:resolve]
 | 
			
		||||
        ResolveAccountService.new.call(query)
 | 
			
		||||
      elsif domain_is_local?
 | 
			
		||||
        Account.find_local(query_username)
 | 
			
		||||
      else
 | 
			
		||||
        Account.find_remote(query_username, query_domain)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    match = if options[:resolve]
 | 
			
		||||
              ResolveAccountService.new.call(query)
 | 
			
		||||
            elsif domain_is_local?
 | 
			
		||||
              Account.find_local(query_username)
 | 
			
		||||
            else
 | 
			
		||||
              Account.find_remote(query_username, query_domain)
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
    match = nil if !match.nil? && !account.nil? && options[:following] && !account.following?(match)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -22,14 +22,12 @@ class ActivityPub::FetchFeaturedTagsCollectionService < BaseService
 | 
			
		||||
    collection = fetch_collection(collection['first']) if collection['first'].present?
 | 
			
		||||
 | 
			
		||||
    while collection.is_a?(Hash)
 | 
			
		||||
      items = begin
 | 
			
		||||
        case collection['type']
 | 
			
		||||
        when 'Collection', 'CollectionPage'
 | 
			
		||||
          collection['items']
 | 
			
		||||
        when 'OrderedCollection', 'OrderedCollectionPage'
 | 
			
		||||
          collection['orderedItems']
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      items = case collection['type']
 | 
			
		||||
              when 'Collection', 'CollectionPage'
 | 
			
		||||
                collection['items']
 | 
			
		||||
              when 'OrderedCollection', 'OrderedCollectionPage'
 | 
			
		||||
                collection['orderedItems']
 | 
			
		||||
              end
 | 
			
		||||
 | 
			
		||||
      break if items.blank?
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,13 +9,11 @@ class ActivityPub::FetchRemoteStatusService < BaseService
 | 
			
		||||
  # Should be called when uri has already been checked for locality
 | 
			
		||||
  def call(uri, id: true, prefetched_body: nil, on_behalf_of: nil, expected_actor_uri: nil, request_id: nil)
 | 
			
		||||
    @request_id = request_id || "#{Time.now.utc.to_i}-status-#{uri}"
 | 
			
		||||
    @json = begin
 | 
			
		||||
      if prefetched_body.nil?
 | 
			
		||||
        fetch_resource(uri, id, on_behalf_of)
 | 
			
		||||
      else
 | 
			
		||||
        body_to_json(prefetched_body, compare_id: id ? uri : nil)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    @json = if prefetched_body.nil?
 | 
			
		||||
              fetch_resource(uri, id, on_behalf_of)
 | 
			
		||||
            else
 | 
			
		||||
              body_to_json(prefetched_body, compare_id: id ? uri : nil)
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
    return unless supported_context?
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -69,16 +69,14 @@ class FetchLinkCardService < BaseService
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def parse_urls
 | 
			
		||||
    urls = begin
 | 
			
		||||
      if @status.local?
 | 
			
		||||
        @status.text.scan(URL_PATTERN).map { |array| Addressable::URI.parse(array[1]).normalize }
 | 
			
		||||
      else
 | 
			
		||||
        document = Nokogiri::HTML(@status.text)
 | 
			
		||||
        links    = document.css('a')
 | 
			
		||||
    urls = if @status.local?
 | 
			
		||||
             @status.text.scan(URL_PATTERN).map { |array| Addressable::URI.parse(array[1]).normalize }
 | 
			
		||||
           else
 | 
			
		||||
             document = Nokogiri::HTML(@status.text)
 | 
			
		||||
             links = document.css('a')
 | 
			
		||||
 | 
			
		||||
        links.filter_map { |a| Addressable::URI.parse(a['href']) unless skip_link?(a) }.filter_map(&:normalize)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
             links.filter_map { |a| Addressable::URI.parse(a['href']) unless skip_link?(a) }.filter_map(&:normalize)
 | 
			
		||||
           end
 | 
			
		||||
 | 
			
		||||
    urls.reject { |uri| bad_url?(uri) }.first
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -28,13 +28,11 @@ class ProcessMentionsService < BaseService
 | 
			
		||||
    @status.text = @status.text.gsub(Account::MENTION_RE) do |match|
 | 
			
		||||
      username, domain = Regexp.last_match(1).split('@')
 | 
			
		||||
 | 
			
		||||
      domain = begin
 | 
			
		||||
        if TagManager.instance.local_domain?(domain)
 | 
			
		||||
          nil
 | 
			
		||||
        else
 | 
			
		||||
          TagManager.instance.normalize_domain(domain)
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      domain = if TagManager.instance.local_domain?(domain)
 | 
			
		||||
                 nil
 | 
			
		||||
               else
 | 
			
		||||
                 TagManager.instance.normalize_domain(domain)
 | 
			
		||||
               end
 | 
			
		||||
 | 
			
		||||
      mentioned_account = Account.find_remote(username, domain)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -20,13 +20,11 @@ class ReblogService < BaseService
 | 
			
		||||
 | 
			
		||||
    return reblog unless reblog.nil?
 | 
			
		||||
 | 
			
		||||
    visibility = begin
 | 
			
		||||
      if reblogged_status.hidden?
 | 
			
		||||
        reblogged_status.visibility
 | 
			
		||||
      else
 | 
			
		||||
        options[:visibility] || account.user&.setting_default_privacy
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    visibility = if reblogged_status.hidden?
 | 
			
		||||
                   reblogged_status.visibility
 | 
			
		||||
                 else
 | 
			
		||||
                   options[:visibility] || account.user&.setting_default_privacy
 | 
			
		||||
                 end
 | 
			
		||||
 | 
			
		||||
    reblog = account.statuses.create!(reblog: reblogged_status, text: '', visibility: visibility, rate_limit: options[:with_rate_limit])
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -71,13 +71,11 @@ class ResolveAccountService < BaseService
 | 
			
		||||
      @username, @domain = uri.strip.gsub(/\A@/, '').split('@')
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    @domain = begin
 | 
			
		||||
      if TagManager.instance.local_domain?(@domain)
 | 
			
		||||
        nil
 | 
			
		||||
      else
 | 
			
		||||
        TagManager.instance.normalize_domain(@domain)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    @domain = if TagManager.instance.local_domain?(@domain)
 | 
			
		||||
                nil
 | 
			
		||||
              else
 | 
			
		||||
                TagManager.instance.normalize_domain(@domain)
 | 
			
		||||
              end
 | 
			
		||||
 | 
			
		||||
    @uri = [@username, @domain].compact.join('@')
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -4,13 +4,11 @@ class DomainValidator < ActiveModel::EachValidator
 | 
			
		||||
  def validate_each(record, attribute, value)
 | 
			
		||||
    return if value.blank?
 | 
			
		||||
 | 
			
		||||
    domain = begin
 | 
			
		||||
      if options[:acct]
 | 
			
		||||
        value.split('@').last
 | 
			
		||||
      else
 | 
			
		||||
        value
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    domain = if options[:acct]
 | 
			
		||||
               value.split('@').last
 | 
			
		||||
             else
 | 
			
		||||
               value
 | 
			
		||||
             end
 | 
			
		||||
 | 
			
		||||
    record.errors.add(attribute, I18n.t('domain_validator.invalid_domain')) unless compliant?(domain)
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -4,16 +4,14 @@ class ExistingUsernameValidator < ActiveModel::EachValidator
 | 
			
		||||
  def validate_each(record, attribute, value)
 | 
			
		||||
    return if value.blank?
 | 
			
		||||
 | 
			
		||||
    usernames_and_domains = begin
 | 
			
		||||
      value.split(',').map do |str|
 | 
			
		||||
        username, domain = str.strip.gsub(/\A@/, '').split('@', 2)
 | 
			
		||||
        domain = nil if TagManager.instance.local_domain?(domain)
 | 
			
		||||
    usernames_and_domains = value.split(',').map do |str|
 | 
			
		||||
      username, domain = str.strip.gsub(/\A@/, '').split('@', 2)
 | 
			
		||||
      domain = nil if TagManager.instance.local_domain?(domain)
 | 
			
		||||
 | 
			
		||||
        next if username.blank?
 | 
			
		||||
      next if username.blank?
 | 
			
		||||
 | 
			
		||||
        [str, username, domain]
 | 
			
		||||
      end.compact
 | 
			
		||||
    end
 | 
			
		||||
      [str, username, domain]
 | 
			
		||||
    end.compact
 | 
			
		||||
 | 
			
		||||
    usernames_with_no_accounts = usernames_and_domains.filter_map do |(str, username, domain)|
 | 
			
		||||
      str unless Account.find_remote(username, domain)
 | 
			
		||||
 
 | 
			
		||||
@@ -35,13 +35,11 @@ class ImportValidator < ActiveModel::Validator
 | 
			
		||||
  def validate_following_import(import, row_count)
 | 
			
		||||
    base_limit = FollowLimitValidator.limit_for_account(import.account)
 | 
			
		||||
 | 
			
		||||
    limit = begin
 | 
			
		||||
      if import.overwrite?
 | 
			
		||||
        base_limit
 | 
			
		||||
      else
 | 
			
		||||
        base_limit - import.account.following_count
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    limit = if import.overwrite?
 | 
			
		||||
              base_limit
 | 
			
		||||
            else
 | 
			
		||||
              base_limit - import.account.following_count
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
    import.errors.add(:data, I18n.t('users.follow_limit_reached', limit: base_limit)) if row_count > limit
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -9,12 +9,10 @@ class BackupWorker
 | 
			
		||||
    backup_id = msg['args'].first
 | 
			
		||||
 | 
			
		||||
    ActiveRecord::Base.connection_pool.with_connection do
 | 
			
		||||
      begin
 | 
			
		||||
        backup = Backup.find(backup_id)
 | 
			
		||||
        backup.destroy
 | 
			
		||||
      rescue ActiveRecord::RecordNotFound
 | 
			
		||||
        true
 | 
			
		||||
      end
 | 
			
		||||
      backup = Backup.find(backup_id)
 | 
			
		||||
      backup.destroy
 | 
			
		||||
    rescue ActiveRecord::RecordNotFound
 | 
			
		||||
      true
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,13 +9,11 @@ class PostProcessMediaWorker
 | 
			
		||||
    media_attachment_id = msg['args'].first
 | 
			
		||||
 | 
			
		||||
    ActiveRecord::Base.connection_pool.with_connection do
 | 
			
		||||
      begin
 | 
			
		||||
        media_attachment = MediaAttachment.find(media_attachment_id)
 | 
			
		||||
        media_attachment.processing = :failed
 | 
			
		||||
        media_attachment.save
 | 
			
		||||
      rescue ActiveRecord::RecordNotFound
 | 
			
		||||
        true
 | 
			
		||||
      end
 | 
			
		||||
      media_attachment = MediaAttachment.find(media_attachment_id)
 | 
			
		||||
      media_attachment.processing = :failed
 | 
			
		||||
      media_attachment.save
 | 
			
		||||
    rescue ActiveRecord::RecordNotFound
 | 
			
		||||
      true
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    Sidekiq.logger.error("Processing media attachment #{media_attachment_id} failed with #{msg['error_message']}")
 | 
			
		||||
 
 | 
			
		||||
@@ -19,13 +19,11 @@ class Scheduler::FollowRecommendationsScheduler
 | 
			
		||||
    fallback_recommendations = FollowRecommendation.order(rank: :desc).limit(SET_SIZE)
 | 
			
		||||
 | 
			
		||||
    Trends.available_locales.each do |locale|
 | 
			
		||||
      recommendations = begin
 | 
			
		||||
        if AccountSummary.safe.filtered.localized(locale).exists? # We can skip the work if no accounts with that language exist
 | 
			
		||||
          FollowRecommendation.localized(locale).order(rank: :desc).limit(SET_SIZE).map { |recommendation| [recommendation.account_id, recommendation.rank] }
 | 
			
		||||
        else
 | 
			
		||||
          []
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      recommendations = if AccountSummary.safe.filtered.localized(locale).exists? # We can skip the work if no accounts with that language exist
 | 
			
		||||
                          FollowRecommendation.localized(locale).order(rank: :desc).limit(SET_SIZE).map { |recommendation| [recommendation.account_id, recommendation.rank] }
 | 
			
		||||
                        else
 | 
			
		||||
                          []
 | 
			
		||||
                        end
 | 
			
		||||
 | 
			
		||||
      # Use language-agnostic results if there are not enough language-specific ones
 | 
			
		||||
      missing = SET_SIZE - recommendations.size
 | 
			
		||||
 
 | 
			
		||||
@@ -106,21 +106,17 @@ class FixAccountsUniqueIndex < ActiveRecord::Migration[5.2]
 | 
			
		||||
    # to check for (and skip past) uniqueness errors
 | 
			
		||||
    [Favourite, Follow, FollowRequest, Block, Mute].each do |klass|
 | 
			
		||||
      klass.where(account_id: duplicate_account.id).find_each do |record|
 | 
			
		||||
        begin
 | 
			
		||||
          record.update_attribute(:account_id, main_account.id)
 | 
			
		||||
        rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
          next
 | 
			
		||||
        end
 | 
			
		||||
        record.update_attribute(:account_id, main_account.id)
 | 
			
		||||
      rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
        next
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    [Follow, FollowRequest, Block, Mute].each do |klass|
 | 
			
		||||
      klass.where(target_account_id: duplicate_account.id).find_each do |record|
 | 
			
		||||
        begin
 | 
			
		||||
          record.update_attribute(:target_account_id, main_account.id)
 | 
			
		||||
        rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
          next
 | 
			
		||||
        end
 | 
			
		||||
        record.update_attribute(:target_account_id, main_account.id)
 | 
			
		||||
      rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
        next
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -43,12 +43,10 @@ class CopyStatusStats < ActiveRecord::Migration[5.2]
 | 
			
		||||
    # We cannot use bulk INSERT or overarching transactions here because of possible
 | 
			
		||||
    # uniqueness violations that we need to skip over
 | 
			
		||||
    Status.unscoped.select('id, reblogs_count, favourites_count, created_at, updated_at').find_each do |status|
 | 
			
		||||
      begin
 | 
			
		||||
        params = [[nil, status.id], [nil, status.reblogs_count], [nil, status.favourites_count], [nil, status.created_at], [nil, status.updated_at]]
 | 
			
		||||
        exec_insert('INSERT INTO status_stats (status_id, reblogs_count, favourites_count, created_at, updated_at) VALUES ($1, $2, $3, $4, $5)', nil, params)
 | 
			
		||||
      rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
        next
 | 
			
		||||
      end
 | 
			
		||||
      params = [[nil, status.id], [nil, status.reblogs_count], [nil, status.favourites_count], [nil, status.created_at], [nil, status.updated_at]]
 | 
			
		||||
      exec_insert('INSERT INTO status_stats (status_id, reblogs_count, favourites_count, created_at, updated_at) VALUES ($1, $2, $3, $4, $5)', nil, params)
 | 
			
		||||
    rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
      next
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -43,12 +43,10 @@ class CopyAccountStats < ActiveRecord::Migration[5.2]
 | 
			
		||||
    # We cannot use bulk INSERT or overarching transactions here because of possible
 | 
			
		||||
    # uniqueness violations that we need to skip over
 | 
			
		||||
    Account.unscoped.select('id, statuses_count, following_count, followers_count, created_at, updated_at').find_each do |account|
 | 
			
		||||
      begin
 | 
			
		||||
        params = [[nil, account.id], [nil, account[:statuses_count]], [nil, account[:following_count]], [nil, account[:followers_count]], [nil, account.created_at], [nil, account.updated_at]]
 | 
			
		||||
        exec_insert('INSERT INTO account_stats (account_id, statuses_count, following_count, followers_count, created_at, updated_at) VALUES ($1, $2, $3, $4, $5, $6)', nil, params)
 | 
			
		||||
      rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
        next
 | 
			
		||||
      end
 | 
			
		||||
      params = [[nil, account.id], [nil, account[:statuses_count]], [nil, account[:following_count]], [nil, account[:followers_count]], [nil, account.created_at], [nil, account.updated_at]]
 | 
			
		||||
      exec_insert('INSERT INTO account_stats (account_id, statuses_count, following_count, followers_count, created_at, updated_at) VALUES ($1, $2, $3, $4, $5, $6)', nil, params)
 | 
			
		||||
    rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
      next
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
@@ -490,14 +490,12 @@ module Mastodon
 | 
			
		||||
        scope = Account.where(id: ::Follow.where(account: account).select(:target_account_id))
 | 
			
		||||
 | 
			
		||||
        scope.find_each do |target_account|
 | 
			
		||||
          begin
 | 
			
		||||
            UnfollowService.new.call(account, target_account)
 | 
			
		||||
          rescue => e
 | 
			
		||||
            progress.log pastel.red("Error processing #{target_account.id}: #{e}")
 | 
			
		||||
          ensure
 | 
			
		||||
            progress.increment
 | 
			
		||||
            processed += 1
 | 
			
		||||
          end
 | 
			
		||||
          UnfollowService.new.call(account, target_account)
 | 
			
		||||
        rescue => e
 | 
			
		||||
          progress.log pastel.red("Error processing #{target_account.id}: #{e}")
 | 
			
		||||
        ensure
 | 
			
		||||
          progress.increment
 | 
			
		||||
          processed += 1
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        BootstrapTimelineWorker.perform_async(account.id)
 | 
			
		||||
@@ -507,14 +505,12 @@ module Mastodon
 | 
			
		||||
        scope = Account.where(id: ::Follow.where(target_account: account).select(:account_id))
 | 
			
		||||
 | 
			
		||||
        scope.find_each do |target_account|
 | 
			
		||||
          begin
 | 
			
		||||
            UnfollowService.new.call(target_account, account)
 | 
			
		||||
          rescue => e
 | 
			
		||||
            progress.log pastel.red("Error processing #{target_account.id}: #{e}")
 | 
			
		||||
          ensure
 | 
			
		||||
            progress.increment
 | 
			
		||||
            processed += 1
 | 
			
		||||
          end
 | 
			
		||||
          UnfollowService.new.call(target_account, account)
 | 
			
		||||
        rescue => e
 | 
			
		||||
          progress.log pastel.red("Error processing #{target_account.id}: #{e}")
 | 
			
		||||
        ensure
 | 
			
		||||
          progress.increment
 | 
			
		||||
          processed += 1
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -42,30 +42,28 @@ module Mastodon
 | 
			
		||||
 | 
			
		||||
        items.each do |item|
 | 
			
		||||
          futures << Concurrent::Future.execute(executor: pool) do
 | 
			
		||||
            begin
 | 
			
		||||
              if !progress.total.nil? && progress.progress + 1 > progress.total
 | 
			
		||||
                # The number of items has changed between start and now,
 | 
			
		||||
                # since there is no good way to predict the final count from
 | 
			
		||||
                # here, just change the progress bar to an indeterminate one
 | 
			
		||||
            if !progress.total.nil? && progress.progress + 1 > progress.total
 | 
			
		||||
              # The number of items has changed between start and now,
 | 
			
		||||
              # since there is no good way to predict the final count from
 | 
			
		||||
              # here, just change the progress bar to an indeterminate one
 | 
			
		||||
 | 
			
		||||
                progress.total = nil
 | 
			
		||||
              end
 | 
			
		||||
 | 
			
		||||
              progress.log("Processing #{item.id}") if options[:verbose]
 | 
			
		||||
 | 
			
		||||
              result = ActiveRecord::Base.connection_pool.with_connection do
 | 
			
		||||
                yield(item)
 | 
			
		||||
              ensure
 | 
			
		||||
                RedisConfiguration.pool.checkin if Thread.current[:redis]
 | 
			
		||||
                Thread.current[:redis] = nil
 | 
			
		||||
              end
 | 
			
		||||
 | 
			
		||||
              aggregate.increment(result) if result.is_a?(Integer)
 | 
			
		||||
            rescue => e
 | 
			
		||||
              progress.log pastel.red("Error processing #{item.id}: #{e}")
 | 
			
		||||
            ensure
 | 
			
		||||
              progress.increment
 | 
			
		||||
              progress.total = nil
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            progress.log("Processing #{item.id}") if options[:verbose]
 | 
			
		||||
 | 
			
		||||
            result = ActiveRecord::Base.connection_pool.with_connection do
 | 
			
		||||
              yield(item)
 | 
			
		||||
            ensure
 | 
			
		||||
              RedisConfiguration.pool.checkin if Thread.current[:redis]
 | 
			
		||||
              Thread.current[:redis] = nil
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
            aggregate.increment(result) if result.is_a?(Integer)
 | 
			
		||||
          rescue => e
 | 
			
		||||
            progress.log pastel.red("Error processing #{item.id}: #{e}")
 | 
			
		||||
          ensure
 | 
			
		||||
            progress.increment
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -79,13 +79,11 @@ module Mastodon
 | 
			
		||||
      skipped   = 0
 | 
			
		||||
 | 
			
		||||
      addresses.each do |address|
 | 
			
		||||
        ip_blocks = begin
 | 
			
		||||
          if options[:force]
 | 
			
		||||
            IpBlock.where('ip >>= ?', address)
 | 
			
		||||
          else
 | 
			
		||||
            IpBlock.where('ip <<= ?', address)
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
        ip_blocks = if options[:force]
 | 
			
		||||
                      IpBlock.where('ip >>= ?', address)
 | 
			
		||||
                    else
 | 
			
		||||
                      IpBlock.where('ip <<= ?', address)
 | 
			
		||||
                    end
 | 
			
		||||
 | 
			
		||||
        if ip_blocks.empty?
 | 
			
		||||
          say("#{address} is not yet blocked", :yellow)
 | 
			
		||||
 
 | 
			
		||||
@@ -98,11 +98,9 @@ module Mastodon
 | 
			
		||||
 | 
			
		||||
        owned_classes.each do |klass|
 | 
			
		||||
          klass.where(account_id: other_account.id).find_each do |record|
 | 
			
		||||
            begin
 | 
			
		||||
              record.update_attribute(:account_id, id)
 | 
			
		||||
            rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
              next
 | 
			
		||||
            end
 | 
			
		||||
            record.update_attribute(:account_id, id)
 | 
			
		||||
          rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
            next
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
@@ -111,11 +109,9 @@ module Mastodon
 | 
			
		||||
 | 
			
		||||
        target_classes.each do |klass|
 | 
			
		||||
          klass.where(target_account_id: other_account.id).find_each do |record|
 | 
			
		||||
            begin
 | 
			
		||||
              record.update_attribute(:target_account_id, id)
 | 
			
		||||
            rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
              next
 | 
			
		||||
            end
 | 
			
		||||
            record.update_attribute(:target_account_id, id)
 | 
			
		||||
          rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
            next
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
@@ -601,11 +597,9 @@ module Mastodon
 | 
			
		||||
      owned_classes = [ConversationMute, AccountConversation]
 | 
			
		||||
      owned_classes.each do |klass|
 | 
			
		||||
        klass.where(conversation_id: duplicate_conv.id).find_each do |record|
 | 
			
		||||
          begin
 | 
			
		||||
            record.update_attribute(:account_id, main_conv.id)
 | 
			
		||||
          rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
            next
 | 
			
		||||
          end
 | 
			
		||||
          record.update_attribute(:account_id, main_conv.id)
 | 
			
		||||
        rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
          next
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
@@ -629,47 +623,37 @@ module Mastodon
 | 
			
		||||
      owned_classes << Bookmark if ActiveRecord::Base.connection.table_exists?(:bookmarks)
 | 
			
		||||
      owned_classes.each do |klass|
 | 
			
		||||
        klass.where(status_id: duplicate_status.id).find_each do |record|
 | 
			
		||||
          begin
 | 
			
		||||
            record.update_attribute(:status_id, main_status.id)
 | 
			
		||||
          rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
            next
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      StatusPin.where(account_id: main_status.account_id, status_id: duplicate_status.id).find_each do |record|
 | 
			
		||||
        begin
 | 
			
		||||
          record.update_attribute(:status_id, main_status.id)
 | 
			
		||||
        rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
          next
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      StatusPin.where(account_id: main_status.account_id, status_id: duplicate_status.id).find_each do |record|
 | 
			
		||||
        record.update_attribute(:status_id, main_status.id)
 | 
			
		||||
      rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
        next
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      Status.where(in_reply_to_id: duplicate_status.id).find_each do |record|
 | 
			
		||||
        begin
 | 
			
		||||
          record.update_attribute(:in_reply_to_id, main_status.id)
 | 
			
		||||
        rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
          next
 | 
			
		||||
        end
 | 
			
		||||
        record.update_attribute(:in_reply_to_id, main_status.id)
 | 
			
		||||
      rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
        next
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      Status.where(reblog_of_id: duplicate_status.id).find_each do |record|
 | 
			
		||||
        begin
 | 
			
		||||
          record.update_attribute(:reblog_of_id, main_status.id)
 | 
			
		||||
        rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
          next
 | 
			
		||||
        end
 | 
			
		||||
        record.update_attribute(:reblog_of_id, main_status.id)
 | 
			
		||||
      rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
        next
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def merge_tags!(main_tag, duplicate_tag)
 | 
			
		||||
      [FeaturedTag].each do |klass|
 | 
			
		||||
        klass.where(tag_id: duplicate_tag.id).find_each do |record|
 | 
			
		||||
          begin
 | 
			
		||||
            record.update_attribute(:tag_id, main_tag.id)
 | 
			
		||||
          rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
            next
 | 
			
		||||
          end
 | 
			
		||||
          record.update_attribute(:tag_id, main_tag.id)
 | 
			
		||||
        rescue ActiveRecord::RecordNotUnique
 | 
			
		||||
          next
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 
 | 
			
		||||
@@ -116,13 +116,11 @@ module Mastodon
 | 
			
		||||
 | 
			
		||||
        loop do
 | 
			
		||||
          objects = begin
 | 
			
		||||
            begin
 | 
			
		||||
              bucket.objects(start_after: last_key, prefix: prefix).limit(1000).map { |x| x }
 | 
			
		||||
            rescue => e
 | 
			
		||||
              progress.log(pastel.red("Error fetching list of files: #{e}"))
 | 
			
		||||
              progress.log("If you want to continue from this point, add --start-after=#{last_key} to your command") if last_key
 | 
			
		||||
              break
 | 
			
		||||
            end
 | 
			
		||||
            bucket.objects(start_after: last_key, prefix: prefix).limit(1000).map { |x| x }
 | 
			
		||||
          rescue => e
 | 
			
		||||
            progress.log(pastel.red("Error fetching list of files: #{e}"))
 | 
			
		||||
            progress.log("If you want to continue from this point, add --start-after=#{last_key} to your command") if last_key
 | 
			
		||||
            break
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          break if objects.empty?
 | 
			
		||||
 
 | 
			
		||||
@@ -43,13 +43,11 @@ module Mastodon
 | 
			
		||||
        exit(1)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      indices = begin
 | 
			
		||||
        if options[:only]
 | 
			
		||||
          options[:only].map { |str| "#{str.camelize}Index".constantize }
 | 
			
		||||
        else
 | 
			
		||||
          INDICES
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      indices = if options[:only]
 | 
			
		||||
                  options[:only].map { |str| "#{str.camelize}Index".constantize }
 | 
			
		||||
                else
 | 
			
		||||
                  INDICES
 | 
			
		||||
                end
 | 
			
		||||
 | 
			
		||||
      pool      = Concurrent::FixedThreadPool.new(options[:concurrency], max_queue: options[:concurrency] * 10)
 | 
			
		||||
      importers = indices.index_with { |index| "Importer::#{index.name}Importer".constantize.new(batch_size: options[:batch_size], executor: pool) }
 | 
			
		||||
 
 | 
			
		||||
@@ -50,16 +50,14 @@ module Mastodon
 | 
			
		||||
            styles << :original unless styles.include?(:original)
 | 
			
		||||
 | 
			
		||||
            styles.each do |style|
 | 
			
		||||
              success = begin
 | 
			
		||||
                case Paperclip::Attachment.default_options[:storage]
 | 
			
		||||
                when :s3
 | 
			
		||||
                  upgrade_storage_s3(progress, attachment, style)
 | 
			
		||||
                when :fog
 | 
			
		||||
                  upgrade_storage_fog(progress, attachment, style)
 | 
			
		||||
                when :filesystem
 | 
			
		||||
                  upgrade_storage_filesystem(progress, attachment, style)
 | 
			
		||||
                end
 | 
			
		||||
              end
 | 
			
		||||
              success = case Paperclip::Attachment.default_options[:storage]
 | 
			
		||||
                        when :s3
 | 
			
		||||
                          upgrade_storage_s3(progress, attachment, style)
 | 
			
		||||
                        when :fog
 | 
			
		||||
                          upgrade_storage_fog(progress, attachment, style)
 | 
			
		||||
                        when :filesystem
 | 
			
		||||
                          upgrade_storage_filesystem(progress, attachment, style)
 | 
			
		||||
                        end
 | 
			
		||||
 | 
			
		||||
              upgraded = true if style == :original && success
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -161,13 +161,11 @@ module Paperclip
 | 
			
		||||
    def lighten_or_darken(color, by)
 | 
			
		||||
      hue, saturation, light = rgb_to_hsl(color.r, color.g, color.b)
 | 
			
		||||
 | 
			
		||||
      light = begin
 | 
			
		||||
        if light < 50
 | 
			
		||||
          [100, light + by].min
 | 
			
		||||
        else
 | 
			
		||||
          [0, light - by].max
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      light = if light < 50
 | 
			
		||||
                [100, light + by].min
 | 
			
		||||
              else
 | 
			
		||||
                [0, light - by].max
 | 
			
		||||
              end
 | 
			
		||||
 | 
			
		||||
      ColorDiff::Color::RGB.new(*hsl_to_rgb(hue, saturation, light))
 | 
			
		||||
    end
 | 
			
		||||
 
 | 
			
		||||
@@ -41,13 +41,11 @@ class Sanitize
 | 
			
		||||
 | 
			
		||||
      current_node = env[:node]
 | 
			
		||||
 | 
			
		||||
      scheme = begin
 | 
			
		||||
        if current_node['href'] =~ Sanitize::REGEX_PROTOCOL
 | 
			
		||||
          Regexp.last_match(1).downcase
 | 
			
		||||
        else
 | 
			
		||||
          :relative
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      scheme = if current_node['href'] =~ Sanitize::REGEX_PROTOCOL
 | 
			
		||||
                 Regexp.last_match(1).downcase
 | 
			
		||||
               else
 | 
			
		||||
                 :relative
 | 
			
		||||
               end
 | 
			
		||||
 | 
			
		||||
      current_node.replace(Nokogiri::XML::Text.new(current_node.text, current_node.document)) unless LINK_PROTOCOLS.include?(scheme)
 | 
			
		||||
    end
 | 
			
		||||
 
 | 
			
		||||
@@ -4,16 +4,14 @@ namespace :db do
 | 
			
		||||
  namespace :migrate do
 | 
			
		||||
    desc 'Setup the db or migrate depending on state of db'
 | 
			
		||||
    task setup: :environment do
 | 
			
		||||
      begin
 | 
			
		||||
        if ActiveRecord::Migrator.current_version.zero?
 | 
			
		||||
          Rake::Task['db:migrate'].invoke
 | 
			
		||||
          Rake::Task['db:seed'].invoke
 | 
			
		||||
        end
 | 
			
		||||
      rescue ActiveRecord::NoDatabaseError
 | 
			
		||||
        Rake::Task['db:setup'].invoke
 | 
			
		||||
      else
 | 
			
		||||
      if ActiveRecord::Migrator.current_version.zero?
 | 
			
		||||
        Rake::Task['db:migrate'].invoke
 | 
			
		||||
        Rake::Task['db:seed'].invoke
 | 
			
		||||
      end
 | 
			
		||||
    rescue ActiveRecord::NoDatabaseError
 | 
			
		||||
      Rake::Task['db:setup'].invoke
 | 
			
		||||
    else
 | 
			
		||||
      Rake::Task['db:migrate'].invoke
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user