From 26573ad7e67e64d6db222877cf2853920c2c7dae Mon Sep 17 00:00:00 2001 From: David Yip Date: Sun, 3 Jun 2018 19:41:54 -0500 Subject: Thread scopes through #matches?. #454. Also add an apply_to_mentions attribute on Glitch::KeywordMute, which is used to calculate scope. Next up: additions to the test suite to demonstrate how scoping works. --- app/lib/feed_manager.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'app/lib') diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index 3a2dcac68..74794f00c 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -153,7 +153,7 @@ class FeedManager def filter_from_home?(status, receiver_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 keyword_filter?(status, receiver_id) + return true if keyword_filter?(status, receiver_id, Glitch::KeywordMute::Scopes::HomeFeed) check_for_mutes = [status.account_id] check_for_mutes.concat(status.mentions.pluck(:account_id)) @@ -182,8 +182,8 @@ class FeedManager false end - def keyword_filter?(status, receiver_id) - Glitch::KeywordMuteHelper.new(receiver_id).matches?(status) + def keyword_filter?(status, receiver_id, scope) + Glitch::KeywordMuteHelper.new(receiver_id).matches?(status, scope) end def filter_from_mentions?(status, receiver_id) @@ -197,7 +197,7 @@ class FeedManager should_filter = blocks_or_mutes?(receiver_id, check_for_blocks, :mentions) # Filter if it's from someone I blocked, in reply to someone I blocked, or mentioning someone I blocked (or muted) should_filter ||= (status.account.silenced? && !Follow.where(account_id: receiver_id, target_account_id: status.account_id).exists?) # of if the account is silenced and I'm not following them - should_filter ||= keyword_filter?(status, receiver_id) # or if the mention contains a muted keyword + should_filter ||= keyword_filter?(status, receiver_id, Glitch::KeywordMute::Scopes::Mentions) # or if the mention contains a muted keyword should_filter end -- cgit From 908a770d2b344eba9a519de9087997e97d1b626e Mon Sep 17 00:00:00 2001 From: David Yip Date: Tue, 12 Jun 2018 17:14:35 -0500 Subject: 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. --- app/lib/feed_manager.rb | 18 +++++++++++++++++- spec/lib/feed_manager_spec.rb | 8 ++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) (limited to 'app/lib') diff --git a/app/lib/feed_manager.rb b/app/lib/feed_manager.rb index 74794f00c..6eb278871 100644 --- a/app/lib/feed_manager.rb +++ b/app/lib/feed_manager.rb @@ -153,7 +153,7 @@ class FeedManager def filter_from_home?(status, receiver_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 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.concat(status.mentions.pluck(:account_id)) @@ -182,6 +182,22 @@ class FeedManager false 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) Glitch::KeywordMuteHelper.new(receiver_id).matches?(status, scope) end diff --git a/spec/lib/feed_manager_spec.rb b/spec/lib/feed_manager_spec.rb index a958a9afe..db9bf12d1 100644 --- a/spec/lib/feed_manager_spec.rb +++ b/spec/lib/feed_manager_spec.rb @@ -187,6 +187,14 @@ RSpec.describe FeedManager do expect(FeedManager.instance.filter?(:home, status, alice.id)).to be true 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 context 'for mentions feed' do -- cgit