Refactoring searchability to StatusParser

This commit is contained in:
KMY 2023-09-24 20:29:36 +09:00
parent e38eed8855
commit 8a3f2ee0fb
2 changed files with 74 additions and 98 deletions

View file

@ -10,6 +10,7 @@ class ActivityPub::Parser::StatusParser
@json = json
@object = magic_values[:object] || json['object'] || json
@magic_values = magic_values
@account = magic_values[:account]
end
def uri
@ -86,6 +87,14 @@ class ActivityPub::Parser::StatusParser
end
end
def searchability
from_audience = searchability_from_audience
return from_audience if from_audience
return nil if default_searchability_from_bio?
searchability_from_bio || (misskey_software? ? misskey_searchability : nil)
end
def limited_scope
case @object['limitedScope']
when 'Mutual'
@ -117,6 +126,12 @@ class ActivityPub::Parser::StatusParser
as_array(@object['cc'] || @json['cc']).map { |x| value_or_id(x) }
end
def audience_searchable_by
return nil if @object['searchableBy'].nil?
@audience_searchable_by = as_array(@object['searchableBy']).map { |x| value_or_id(x) }
end
def summary_language_map?
@object['summaryMap'].is_a?(Hash) && !@object['summaryMap'].empty?
end
@ -128,4 +143,61 @@ class ActivityPub::Parser::StatusParser
def name_language_map?
@object['nameMap'].is_a?(Hash) && !@object['nameMap'].empty?
end
def instance_info
@instance_info ||= InstanceInfo.find_by(domain: @account.domain)
end
def misskey_software?
info = instance_info
return false if info.nil?
%w(misskey calckey).include?(info.software)
end
def misskey_searchability
%i(public unlisted).include?(visibility) ? :public : :limited
end
SCAN_SEARCHABILITY_RE = /\[searchability:(public|followers|reactors|private)\]/
SCAN_SEARCHABILITY_FEDIBIRD_RE = /searchable_by_(all_users|followers_only|reacted_users_only|nobody)/
def default_searchability_from_bio?
note = @account.note
return false if note.blank?
note.include?('searchable_by_default_range')
end
def searchability_from_bio
note = @account.note
return nil if note.blank?
searchability_bio = note.scan(SCAN_SEARCHABILITY_FEDIBIRD_RE).first || note.scan(SCAN_SEARCHABILITY_RE).first
return nil unless searchability_bio
searchability = searchability_bio[0]
return nil if searchability.nil?
searchability = :public if %w(public all_users).include?(searchability)
searchability = :private if %w(followers followers_only).include?(searchability)
searchability = :direct if %w(reactors reacted_users_only).include?(searchability)
searchability = :limited if %w(private nobody).include?(searchability)
searchability
end
def searchability_from_audience
if audience_searchable_by.nil?
nil
elsif audience_searchable_by.any? { |uri| ActivityPub::TagManager.instance.public_collection?(uri) }
:public
elsif audience_searchable_by.include?('as:Limited')
:limited
elsif audience_searchable_by.include?(@account.followers_url)
:private
else
:direct
end
end
end