keyword mute: use mentions scope in home feed filtering (#454)

If a status shows up in mentions because all keyword mutes that might
apply to it are marked as "don't apply to mentions", then it ought to
show up in the home feed also.
master
David Yip 6 years ago
parent e931cf656d
commit 908a770d2b
No known key found for this signature in database
GPG Key ID: 7DA0036508FCC0CC
  1. 18
      app/lib/feed_manager.rb
  2. 8
      spec/lib/feed_manager_spec.rb

@ -153,7 +153,7 @@ class FeedManager
def filter_from_home?(status, receiver_id) def filter_from_home?(status, receiver_id)
return false if receiver_id == status.account_id return false if receiver_id == status.account_id
return true if status.reply? && (status.in_reply_to_id.nil? || status.in_reply_to_account_id.nil?) return true if status.reply? && (status.in_reply_to_id.nil? || status.in_reply_to_account_id.nil?)
return true if keyword_filter?(status, receiver_id, Glitch::KeywordMute::Scopes::HomeFeed) return true if keyword_filter_from_home?(status, receiver_id)
check_for_mutes = [status.account_id] check_for_mutes = [status.account_id]
check_for_mutes.concat(status.mentions.pluck(:account_id)) check_for_mutes.concat(status.mentions.pluck(:account_id))
@ -182,6 +182,22 @@ class FeedManager
false false
end end
def keyword_filter_from_home?(status, receiver_id)
# If this status mentions the receiver, use the mentions scope: it's
# possible that the status will show up in the receiver's mentions, which
# means it ought to show up in the home feed as well.
#
# If it doesn't mention the receiver but is still headed for the home feed,
# use the home feed scope.
scope = if status.mentions.pluck(:account_id).include?(receiver_id)
Glitch::KeywordMute::Scopes::Mentions
else
Glitch::KeywordMute::Scopes::HomeFeed
end
return true if keyword_filter?(status, receiver_id, scope)
end
def keyword_filter?(status, receiver_id, scope) def keyword_filter?(status, receiver_id, scope)
Glitch::KeywordMuteHelper.new(receiver_id).matches?(status, scope) Glitch::KeywordMuteHelper.new(receiver_id).matches?(status, scope)
end end

@ -187,6 +187,14 @@ RSpec.describe FeedManager do
expect(FeedManager.instance.filter?(:home, status, alice.id)).to be true expect(FeedManager.instance.filter?(:home, status, alice.id)).to be true
end end
it 'returns false if the status is muted by a keyword mute that does not apply to mentions' do
Fabricate('Glitch::KeywordMute', account: alice, keyword: 'take', apply_to_mentions: false)
status = Fabricate(:status, spoiler_text: 'This is a hot take', account: bob)
status.mentions.create!(account_id: alice.id)
expect(FeedManager.instance.filter?(:home, status, alice.id)).to be false
end
end end
context 'for mentions feed' do context 'for mentions feed' do

Loading…
Cancel
Save