about summary refs log tree commit diff
path: root/app/lib/status_filter.rb
diff options
context:
space:
mode:
authormultiple creatures <dev@multiple-creature.party>2019-01-06 16:06:26 -0600
committermultiple creatures <dev@multiple-creature.party>2019-05-21 03:16:21 -0500
commit5c6a14ca68c3fba3ee778588c080c77a92d53e66 (patch)
tree1a7d46bd85c268731c65186b4281fa39606beff2 /app/lib/status_filter.rb
parentcf557f18497e98aea0dbf8a799186aa92dc34663 (diff)
Prune replies to muted/blocked accounts
Diffstat (limited to 'app/lib/status_filter.rb')
-rw-r--r--app/lib/status_filter.rb41
1 files changed, 40 insertions, 1 deletions
diff --git a/app/lib/status_filter.rb b/app/lib/status_filter.rb
index b6c80b801..0f8841885 100644
--- a/app/lib/status_filter.rb
+++ b/app/lib/status_filter.rb
@@ -21,7 +21,46 @@ class StatusFilter
   end
 
   def filtered_status?
-    blocking_account? || blocking_domain? || muting_account?
+    blocking_account? || blocking_domain? || muting_account? || filtered_reference?
+  end
+
+  def filtered_reference?
+    filtered_reply = reply_to_blocked? || reply_to_muted?
+
+    # I don't think this should happen, but just in case...
+    return filtered_reply if status&.mentions.nil?
+
+    # Grab a list of account IDs mentioned in the status.
+    mentioned_account_ids = status.mentions.pluck(:account_id)
+
+    # Don't filter statuses mentioning you.
+    return false if mentioned_account_ids.include?(account.id)
+
+    # Otherwise, filter replies to someone you've muted or blocked.
+    return true if filtered_reply
+
+    # Otherwise, filter the status if it mentions someone in the preloaded muting relation.
+    return true if @preloaded_relations[:muting] && mentioned_account_ids.any? do |mentioned_account_id|
+      @preloaded_relations[:muting][mentioned_account_id]
+    end
+
+    # Otherwise, filter the status if it mentions someone you've muted.
+    return true if account.muting?(mentioned_account_ids)
+
+    # Same as above, but for blocks:
+    return true if @preloaded_relations[:blocking] && mentioned_account_ids.any? do |mentioned_account_id|
+      @preloaded_relations[:blocking][mentioned_account_id]
+    end
+
+    account.blocking?(mentioned_account_ids)
+  end
+
+  def reply_to_blocked?
+    @preloaded_relations[:blocking] ? @preloaded_relations[:blocking][status.in_reply_to_account_id] : account.blocking?(status.in_reply_to_account_id)
+  end
+
+  def reply_to_muted?
+    @preloaded_relations[:muting] ? @preloaded_relations[:muting][status.in_reply_to_account_id] : account.muting?(status.in_reply_to_account_id)
   end
 
   def blocking_account?