Use a redis-cached feed for the DM timeline
This commit is contained in:
@ -22,6 +22,8 @@ class FeedManager
|
||||
filter_from_home?(status, receiver_id)
|
||||
elsif timeline_type == :mentions
|
||||
filter_from_mentions?(status, receiver_id)
|
||||
elsif timeline_type == :direct
|
||||
filter_from_direct?(status, receiver_id)
|
||||
else
|
||||
false
|
||||
end
|
||||
@ -59,6 +61,18 @@ class FeedManager
|
||||
true
|
||||
end
|
||||
|
||||
def push_to_direct(account, status)
|
||||
return false unless add_to_feed(:direct, account.id, status)
|
||||
trim(:direct, account.id)
|
||||
PushUpdateWorker.perform_async(account.id, status.id, "timeline:direct:#{account.id}")
|
||||
true
|
||||
end
|
||||
|
||||
def unpush_from_direct(account, status)
|
||||
return false unless remove_from_feed(:direct, account.id, status)
|
||||
redis.publish("timeline:direct:#{account.id}", Oj.dump(event: :delete, payload: status.id.to_s))
|
||||
end
|
||||
|
||||
def trim(type, account_id)
|
||||
timeline_key = key(type, account_id)
|
||||
reblog_key = key(type, account_id, 'reblogs')
|
||||
@ -142,6 +156,27 @@ class FeedManager
|
||||
end
|
||||
end
|
||||
|
||||
def populate_direct_feed(account)
|
||||
added = 0
|
||||
limit = FeedManager::MAX_ITEMS / 2
|
||||
max_id = nil
|
||||
|
||||
loop do
|
||||
statuses = Status.as_direct_timeline(account, limit, max_id)
|
||||
|
||||
break if statuses.empty?
|
||||
|
||||
statuses.each do |status|
|
||||
next if filter_from_direct?(status, account)
|
||||
added += 1 if add_to_feed(:direct, account.id, status)
|
||||
end
|
||||
|
||||
break unless added.zero?
|
||||
|
||||
max_id = statuses.last.id
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def push_update_required?(timeline_id)
|
||||
@ -199,6 +234,11 @@ class FeedManager
|
||||
should_filter
|
||||
end
|
||||
|
||||
def filter_from_direct?(status, receiver_id)
|
||||
return false if receiver_id == status.account_id
|
||||
filter_from_mentions?(status, receiver_id)
|
||||
end
|
||||
|
||||
def phrase_filtered?(status, receiver_id, context)
|
||||
active_filters = Rails.cache.fetch("filters:#{receiver_id}") { CustomFilter.where(account_id: receiver_id).active_irreversible.to_a }.to_a
|
||||
|
||||
|
Reference in New Issue
Block a user