Add searchability support

This commit is contained in:
KMY 2023-04-06 04:27:52 +09:00
parent a2e674af51
commit af20b1d2aa
43 changed files with 716 additions and 65 deletions

View file

@ -70,6 +70,12 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
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 process_status
@tags = []
@mentions = []
@ -122,6 +128,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
reply: @status_parser.reply,
sensitive: @account.sensitized? || @status_parser.sensitive || false,
visibility: @status_parser.visibility,
searchability: searchability,
thread: replied_to_status,
conversation: conversation_from_uri(@object['conversation']),
media_attachment_ids: process_attachments.take(4).map(&:id),
@ -429,4 +436,32 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
def join_group!
GroupReblogService.new.call(@status)
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?(@account.followers_url)
:private
else
:direct
end
end
def searchability
searchability = searchability_from_audience
return nil if searchability.nil?
visibility = visibility_from_audience_with_silence
if searchability === visibility
searchability
elsif [:public, :private].include?(searchability) && [:public, :unlisted].include?(visibility)
:private
else
:direct
end
end
end

View file

@ -185,4 +185,31 @@ class ActivityPub::TagManager
rescue ActiveRecord::RecordNotFound
nil
end
def searchable_by(status)
searchable_by =
case status.compute_searchability
when 'public'
[COLLECTIONS[:public]]
when 'unlisted', 'private'
[account_followers_url(status.account)]
when 'limited'
status.conversation_id.present? ? [uri_for(status.conversation)] : []
else
[]
end
searchable_by.concat(mentions_uris(status))
end
def account_searchable_by(account)
case account.searchability
when 'public'
[COLLECTIONS[:public]]
when 'unlisted', 'private'
[account_followers_url(account)]
else
[]
end
end
end