|
|
|
@ -4,25 +4,32 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity |
|
|
|
|
def perform |
|
|
|
|
return reject_payload! if delete_arrived_first?(@json['id']) || !related_to_local_activity? |
|
|
|
|
|
|
|
|
|
original_status = status_from_object |
|
|
|
|
RedisLock.acquire(lock_options) do |lock| |
|
|
|
|
if lock.acquired? |
|
|
|
|
original_status = status_from_object |
|
|
|
|
|
|
|
|
|
return reject_payload! if original_status.nil? || !announceable?(original_status) |
|
|
|
|
return reject_payload! if original_status.nil? || !announceable?(original_status) |
|
|
|
|
|
|
|
|
|
status = Status.find_by(account: @account, reblog: original_status) |
|
|
|
|
@status = Status.find_by(account: @account, reblog: original_status) |
|
|
|
|
|
|
|
|
|
return status unless status.nil? |
|
|
|
|
return @status unless @status.nil? |
|
|
|
|
|
|
|
|
|
status = Status.create!( |
|
|
|
|
account: @account, |
|
|
|
|
reblog: original_status, |
|
|
|
|
uri: @json['id'], |
|
|
|
|
created_at: @json['published'], |
|
|
|
|
override_timestamps: @options[:override_timestamps], |
|
|
|
|
visibility: visibility_from_audience |
|
|
|
|
) |
|
|
|
|
@status = Status.create!( |
|
|
|
|
account: @account, |
|
|
|
|
reblog: original_status, |
|
|
|
|
uri: @json['id'], |
|
|
|
|
created_at: @json['published'], |
|
|
|
|
override_timestamps: @options[:override_timestamps], |
|
|
|
|
visibility: visibility_from_audience |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
distribute(status) |
|
|
|
|
status |
|
|
|
|
distribute(@status) |
|
|
|
|
else |
|
|
|
|
raise Mastodon::RaceConditionError |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
@status |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
private |
|
|
|
@ -54,4 +61,8 @@ class ActivityPub::Activity::Announce < ActivityPub::Activity |
|
|
|
|
def reblog_of_local_status? |
|
|
|
|
status_from_uri(object_uri)&.account&.local? |
|
|
|
|
end |
|
|
|
|
|
|
|
|
|
def lock_options |
|
|
|
|
{ redis: Redis.current, key: "announce:#{@object['id']}" } |
|
|
|
|
end |
|
|
|
|
end |
|
|
|
|