glitch-soc/app/lib/account_reach_finder.rb

70 lines
1.5 KiB
Ruby

# frozen_string_literal: true
class AccountReachFinder
RECENT_LIMIT = 2_000
STATUS_LIMIT = 200
STATUS_SINCE = 2.days
def initialize(account)
@account = account
end
def inboxes
(followers_inboxes + reporters_inboxes + recently_mentioned_inboxes + recently_followed_inboxes + recently_requested_inboxes + relay_inboxes).uniq
end
private
def followers_inboxes
@account.followers.inboxes
end
def reporters_inboxes
Account.where(id: @account.targeted_reports.select(:account_id)).inboxes
end
def recently_mentioned_inboxes
Account
.joins(:mentions)
.where(mentions: { status: recent_statuses })
.inboxes
.take(RECENT_LIMIT)
end
def recently_followed_inboxes
@account
.following
.where(follows: { created_at: recent_date_cutoff... })
.inboxes
.take(RECENT_LIMIT)
end
def recently_requested_inboxes
Account
.where(id: @account.follow_requests.where({ created_at: recent_date_cutoff... }).select(:target_account_id))
.inboxes
.take(RECENT_LIMIT)
end
def relay_inboxes
Relay.enabled.pluck(:inbox_url)
end
def oldest_status_id
Mastodon::Snowflake
.id_at(recent_date_cutoff, with_random: false)
end
def recent_date_cutoff
@account.suspended? && @account.suspension_origin_local? ? @account.suspended_at - STATUS_SINCE : STATUS_SINCE.ago
end
def recent_statuses
@account
.statuses
.recent
.where(id: oldest_status_id...)
.limit(STATUS_LIMIT)
end
end