@ -4,6 +4,9 @@ class ActivityPub::Activity
include JsonLdHelper
include JsonLdHelper
include Redisable
include Redisable
SUPPORTED_TYPES = %w( Note ) . freeze
CONVERTED_TYPES = %w( Image Video Article Page ) . freeze
def initialize ( json , account , ** options )
def initialize ( json , account , ** options )
@json = json
@json = json
@account = account
@account = account
@ -71,6 +74,18 @@ class ActivityPub::Activity
@object_uri || = value_or_id ( @object )
@object_uri || = value_or_id ( @object )
end
end
def unsupported_object_type?
@object . is_a? ( String ) || ! ( supported_object_type? || converted_object_type? )
end
def supported_object_type?
equals_or_includes_any? ( @object [ 'type' ] , SUPPORTED_TYPES )
end
def converted_object_type?
equals_or_includes_any? ( @object [ 'type' ] , CONVERTED_TYPES )
end
def distribute ( status )
def distribute ( status )
crawl_links ( status )
crawl_links ( status )
@ -120,6 +135,23 @@ class ActivityPub::Activity
redis . setex ( " delete_upon_arrival: #{ @account . id } : #{ uri } " , 6 . hours . seconds , uri )
redis . setex ( " delete_upon_arrival: #{ @account . id } : #{ uri } " , 6 . hours . seconds , uri )
end
end
def status_from_object
# If the status is already known, return it
status = status_from_uri ( object_uri )
return status unless status . nil?
# If the boosted toot is embedded and it is a self-boost, handle it like a Create
unless unsupported_object_type?
actor_id = value_or_id ( first_of_value ( @object [ 'attributedTo' ] ) ) || @account . uri
if actor_id == @account . uri
return ActivityPub :: Activity . factory ( { 'type' = > 'Create' , 'actor' = > actor_id , 'object' = > @object } , @account ) . perform
end
end
# If the status is not from the actor, try to fetch it
return fetch_remote_original_status if value_or_id ( first_of_value ( @json [ 'attributedTo' ] ) ) == @account . uri
end
def fetch_remote_original_status
def fetch_remote_original_status
if object_uri . start_with? ( 'http' )
if object_uri . start_with? ( 'http' )
return if ActivityPub :: TagManager . instance . local_uri? ( object_uri )
return if ActivityPub :: TagManager . instance . local_uri? ( object_uri )