|
|
|
@ -1,6 +1,9 @@ |
|
|
|
|
# frozen_string_literal: true |
|
|
|
|
|
|
|
|
|
class ActivityPub::Activity::Create < ActivityPub::Activity |
|
|
|
|
SUPPORTED_TYPES = %w(Article Note).freeze |
|
|
|
|
CONVERTED_TYPES = %w(Image Video).freeze |
|
|
|
|
|
|
|
|
|
def perform |
|
|
|
|
return if delete_arrived_first?(object_uri) || unsupported_object_type? |
|
|
|
|
|
|
|
|
@ -41,7 +44,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity |
|
|
|
|
url: object_url || @object['id'], |
|
|
|
|
account: @account, |
|
|
|
|
text: text_from_content || '', |
|
|
|
|
language: language_from_content, |
|
|
|
|
language: detected_language, |
|
|
|
|
spoiler_text: @object['summary'] || '', |
|
|
|
|
created_at: @options[:override_timestamps] ? nil : @object['published'], |
|
|
|
|
reply: @object['inReplyTo'].present?, |
|
|
|
@ -165,40 +168,62 @@ class ActivityPub::Activity::Create < ActivityPub::Activity |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def text_from_content |
|
|
|
|
return Formatter.instance.linkify([text_from_name, object_url || @object['id']].join(' ')) if converted_object_type? |
|
|
|
|
|
|
|
|
|
if @object['content'].present? |
|
|
|
|
@object['content'] |
|
|
|
|
elsif language_map? |
|
|
|
|
elsif content_language_map? |
|
|
|
|
@object['contentMap'].values.first |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def language_from_content |
|
|
|
|
return LanguageDetector.instance.detect(text_from_content, @account) unless language_map? |
|
|
|
|
@object['contentMap'].keys.first |
|
|
|
|
def text_from_name |
|
|
|
|
if @object['name'].present? |
|
|
|
|
@object['name'] |
|
|
|
|
elsif name_language_map? |
|
|
|
|
@object['nameMap'].values.first |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def detected_language |
|
|
|
|
if content_language_map? |
|
|
|
|
@object['contentMap'].keys.first |
|
|
|
|
elsif name_language_map? |
|
|
|
|
@object['nameMap'].keys.first |
|
|
|
|
elsif supported_object_type? |
|
|
|
|
LanguageDetector.instance.detect(text_from_content, @account) |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def object_url |
|
|
|
|
return if @object['url'].blank? |
|
|
|
|
|
|
|
|
|
value = first_of_value(@object['url']) |
|
|
|
|
|
|
|
|
|
return value if value.is_a?(String) |
|
|
|
|
|
|
|
|
|
value['href'] |
|
|
|
|
url_to_href(@object['url'], 'text/html') |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def language_map? |
|
|
|
|
def content_language_map? |
|
|
|
|
@object['contentMap'].is_a?(Hash) && !@object['contentMap'].empty? |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def name_language_map? |
|
|
|
|
@object['nameMap'].is_a?(Hash) && !@object['nameMap'].empty? |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def unsupported_object_type? |
|
|
|
|
@object.is_a?(String) || !%w(Article Note).include?(@object['type']) |
|
|
|
|
@object.is_a?(String) || !(supported_object_type? || converted_object_type?) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def unsupported_media_type?(mime_type) |
|
|
|
|
mime_type.present? && !(MediaAttachment::IMAGE_MIME_TYPES + MediaAttachment::VIDEO_MIME_TYPES).include?(mime_type) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def supported_object_type? |
|
|
|
|
SUPPORTED_TYPES.include?(@object['type']) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def converted_object_type? |
|
|
|
|
CONVERTED_TYPES.include?(@object['type']) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def skip_download? |
|
|
|
|
return @skip_download if defined?(@skip_download) |
|
|
|
|
@skip_download ||= DomainBlock.find_by(domain: @account.domain)&.reject_media? |
|
|
|
@ -210,7 +235,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity |
|
|
|
|
|
|
|
|
|
def forward_for_reply |
|
|
|
|
return unless @json['signature'].present? && reply_to_local? |
|
|
|
|
ActivityPub::RawDistributionWorker.perform_async(Oj.dump(@json), replied_to_status.account_id) |
|
|
|
|
ActivityPub::RawDistributionWorker.perform_async(Oj.dump(@json), replied_to_status.account_id, [@account.preferred_inbox_url]) |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def lock_options |
|
|
|
|