about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDavid Yip <yipdw@member.fsf.org>2018-06-12 17:14:35 -0500
committerDavid Yip <yipdw@member.fsf.org>2018-06-12 17:14:35 -0500
commit908a770d2b344eba9a519de9087997e97d1b626e (patch)
treebd7177fcffeca605c0b66ef53e1252a0f8388646
parente931cf656d1de6d89b5b048d8f1de15be7b52690 (diff)
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.
-rw-r--r--app/lib/feed_manager.rb18
-rw-r--r--spec/lib/feed_manager_spec.rb8
2 files changed, 25 insertions, 1 deletions
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