# 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