68 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
class AccountSuggestions::SettingSource < AccountSuggestions::Source
 | 
						|
  def key
 | 
						|
    :staff
 | 
						|
  end
 | 
						|
 | 
						|
  def get(account, skip_account_ids: [], limit: 40)
 | 
						|
    return [] unless setting_enabled?
 | 
						|
 | 
						|
    as_ordered_suggestions(
 | 
						|
      scope(account).where(setting_to_where_condition).where.not(id: skip_account_ids),
 | 
						|
      usernames_and_domains
 | 
						|
    ).take(limit)
 | 
						|
  end
 | 
						|
 | 
						|
  def remove(_account, _target_account_id)
 | 
						|
    nil
 | 
						|
  end
 | 
						|
 | 
						|
  private
 | 
						|
 | 
						|
  def scope(account)
 | 
						|
    Account.searchable
 | 
						|
           .followable_by(account)
 | 
						|
           .not_excluded_by_account(account)
 | 
						|
           .not_domain_blocked_by_account(account)
 | 
						|
           .where(locked: false)
 | 
						|
           .where.not(id: account.id)
 | 
						|
  end
 | 
						|
 | 
						|
  def usernames_and_domains
 | 
						|
    @usernames_and_domains ||= setting_to_usernames_and_domains
 | 
						|
  end
 | 
						|
 | 
						|
  def setting_enabled?
 | 
						|
    setting.present?
 | 
						|
  end
 | 
						|
 | 
						|
  def setting_to_where_condition
 | 
						|
    usernames_and_domains.map do |(username, domain)|
 | 
						|
      Arel::Nodes::Grouping.new(
 | 
						|
        Account.arel_table[:username].lower.eq(username.downcase).and(
 | 
						|
          Account.arel_table[:domain].lower.eq(domain&.downcase)
 | 
						|
        )
 | 
						|
      )
 | 
						|
    end.reduce(:or)
 | 
						|
  end
 | 
						|
 | 
						|
  def setting_to_usernames_and_domains
 | 
						|
    setting.split(',').map do |str|
 | 
						|
      username, domain = str.strip.gsub(/\A@/, '').split('@', 2)
 | 
						|
      domain           = nil if TagManager.instance.local_domain?(domain)
 | 
						|
 | 
						|
      next if username.blank?
 | 
						|
 | 
						|
      [username, domain]
 | 
						|
    end.compact
 | 
						|
  end
 | 
						|
 | 
						|
  def setting
 | 
						|
    Setting.bootstrap_timeline_accounts
 | 
						|
  end
 | 
						|
 | 
						|
  def to_ordered_list_key(account)
 | 
						|
    [account.username, account.domain]
 | 
						|
  end
 | 
						|
end
 |