diff --git a/app/models/concerns/account/interactions.rb b/app/models/concerns/account/interactions.rb index d5c232336a..a8c9c1c5e7 100644 --- a/app/models/concerns/account/interactions.rb +++ b/app/models/concerns/account/interactions.rb @@ -186,6 +186,10 @@ module Account::Interactions active_relationships.exists?(target_account: other_account) end + def following_or_self?(other_account) + id == other_account.id || following?(other_account) + end + def following_anyone? active_relationships.exists? end diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb index 4663b9e631..0ec41fef03 100644 --- a/app/services/post_status_service.rb +++ b/app/services/post_status_service.rb @@ -248,12 +248,12 @@ class PostStatusService < BaseService def mention_to_stranger? return @mention_to_stranger if defined?(@mention_to_stranger) - @mention_to_stranger = @status.mentions.map(&:account).to_a.any? { |mentioned_account| mentioned_account.id != @account.id && !mentioned_account.following?(@account) } || - (@in_reply_to && @in_reply_to.account.id != @account.id && !@in_reply_to.account.following?(@account)) + @mention_to_stranger = @status.mentions.map(&:account).to_a.any? { |mentioned_account| !mentioned_account.following_or_self?(@account) } || + (@in_reply_to && !@in_reply_to.account.following_or_self?(@account)) end def reference_to_stranger? - referred_statuses.any? { |status| !status.account.following?(@account) } + referred_statuses.any? { |status| !status.account.following_or_self?(@account) } end def referred_statuses diff --git a/app/services/update_status_service.rb b/app/services/update_status_service.rb index 342c320e82..3feec8c68d 100644 --- a/app/services/update_status_service.rb +++ b/app/services/update_status_service.rb @@ -123,12 +123,12 @@ class UpdateStatusService < BaseService end def mention_to_stranger? - @status.mentions.map(&:account).to_a.any? { |mentioned_account| mentioned_account.id != @status.account.id && !mentioned_account.following?(@status.account) } || - (@status.thread.present? && @status.thread.account.id != @status.account.id && !@status.thread.account.following?(@status.account)) + @status.mentions.map(&:account).to_a.any? { |mentioned_account| !mentioned_account.following_or_self?(@status.account) } || + (@status.thread.present? && !@status.thread.account.following_or_self?(@status.account)) end def reference_to_stranger? - referred_statuses.any? { |status| !status.account.following?(@status.account) } + referred_statuses.any? { |status| !status.account.following_or_self?(@status.account) } end def referred_statuses diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb index 659cecb4e0..1713ddada0 100644 --- a/spec/services/post_status_service_spec.rb +++ b/spec/services/post_status_service_spec.rb @@ -663,6 +663,18 @@ RSpec.describe PostStatusService, type: :service do expect(status.text).to eq text end + it 'does not hit ng words for mention to self' do + account = Fabricate(:account, username: 'cool', domain: nil) + text = 'ng word test @cool' + Form::AdminSettings.new(stranger_mention_from_local_ng: '1').save + Fabricate(:ng_word, keyword: 'test', stranger: true) + + status = subject.call(account, text: text) + + expect(status).to be_persisted + expect(status.text).to eq text + end + it 'hit ng words for reply' do account = Fabricate(:account) text = 'ng word test' @@ -721,6 +733,19 @@ RSpec.describe PostStatusService, type: :service do expect(status.text).to eq text end + it 'does not hit ng words for reference to self' do + target_status = Fabricate(:status) + account = target_status.account + text = "ng word test BT: #{ActivityPub::TagManager.instance.uri_for(target_status)}" + Form::AdminSettings.new(stranger_mention_from_local_ng: '1').save + Fabricate(:ng_word, keyword: 'test', stranger: true) + + status = subject.call(account, text: text) + + expect(status).to be_persisted + expect(status.text).to eq text + end + it 'using hashtag under limit' do account = Fabricate(:account) text = '#a #b'