about summary refs log tree commit diff
path: root/app/models/status.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/status.rb')
-rw-r--r--app/models/status.rb14
1 files changed, 14 insertions, 0 deletions
diff --git a/app/models/status.rb b/app/models/status.rb
index 5fba7b38a..42de5d4c0 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -32,6 +32,7 @@
 #  imported               :boolean
 #  origin                 :string
 #  boostable              :boolean
+#  reject_replies         :boolean
 #
 
 class Status < ApplicationRecord
@@ -46,6 +47,7 @@ class Status < ApplicationRecord
 
   # match both with and without U+FE0F (the emoji variation selector)
   LOCAL_ONLY_TOKENS = /(?:#!|\u{1f441}\ufe0f?)\u200b?\z/
+  REJECT_REPLIES_TOKENS = /\b(?:\:ms_dont_at_me\:|no replies|(?:don't|do not) (?:@|at|reply)(?: (?:me|us))?)\b/i
 
   # If `override_timestamps` is set at creation time, Snowflake ID creation
   # will be based on current time instead of `created_at`
@@ -318,6 +320,7 @@ class Status < ApplicationRecord
   before_validation :set_visibility
   before_validation :set_conversation
   before_validation :set_local
+  before_validation :infer_reject_replies
 
   after_create :set_poll_id
   after_create :process_bangtags, if: :local?
@@ -544,6 +547,13 @@ class Status < ApplicationRecord
     LOCAL_ONLY_TOKENS.match?(content)
   end
 
+  def marked_reject_replies?
+    return true if reject_replies
+    return true if spoiler_text.present? && REJECT_REPLIES_TOKENS.match?(spoiler_text)
+    return true if content.present? && REJECT_REPLIES_TOKENS.match?(content.lines.first)
+    content.present? && REJECT_REPLIES_TOKENS.match?(content.lines.last)
+  end
+
   private
 
   def update_status_stat!(attrs)
@@ -581,6 +591,10 @@ class Status < ApplicationRecord
     end
   end
 
+  def infer_reject_replies
+    self.reject_replies = marked_reject_replies?
+  end
+
   def process_bangtags
     Bangtags.new(self).process
   end