diff --git a/app/services/emoji_react_service.rb b/app/services/emoji_react_service.rb index fa7f8d0f68d84d..719befcdfc3f3d 100644 --- a/app/services/emoji_react_service.rb +++ b/app/services/emoji_react_service.rb @@ -14,6 +14,7 @@ class EmojiReactService < BaseService def call(account, status, name) status = status.reblog if status.reblog? && !status.reblog.nil? authorize_with account, status, :emoji_reaction? + @status = status emoji_reaction = nil @@ -36,6 +37,9 @@ def call(account, status, name) notify_to_followers(emoji_reaction) bump_potential_friendship(account, status) write_stream(emoji_reaction) + forward_for_emoji_reaction!(emoji_reaction) + relay_for_emoji_reaction!(emoji_reaction) + relay_friend_for_emoji_reaction!(emoji_reaction) emoji_reaction end @@ -79,11 +83,33 @@ def bump_potential_friendship(account, status) end def build_json(emoji_reaction) - Oj.dump(serialize_payload(emoji_reaction, ActivityPub::EmojiReactionSerializer, signer: emoji_reaction.account)) + @build_json = Oj.dump(serialize_payload(emoji_reaction, ActivityPub::EmojiReactionSerializer, signer: emoji_reaction.account)) end def render_emoji_reaction(emoji_group) # @rendered_emoji_reaction ||= InlineRenderer.render(HashObject.new(emoji_group), nil, :emoji_reaction) @render_emoji_reaction ||= Oj.dump(event: :emoji_reaction, payload: emoji_group.to_json) end + + def forward_for_emoji_reaction!(emoji_reaction) + return unless @status.local? + + ActivityPub::RawDistributionWorker.perform_async(build_json(emoji_reaction), @status.account.id, [@status.account.preferred_inbox_url]) + end + + def relay_for_emoji_reaction!(emoji_reaction) + return unless @status.local? && @status.public_visibility? + + ActivityPub::DeliveryWorker.push_bulk(Relay.enabled.pluck(:inbox_url)) do |inbox_url| + [build_json(emoji_reaction), @status.account.id, inbox_url] + end + end + + def relay_friend_for_emoji_reaction!(emoji_reaction) + return unless @status.local? && @status.distributable_friend? + + ActivityPub::DeliveryWorker.push_bulk(FriendDomain.distributables.pluck(:inbox_url)) do |inbox_url| + [build_json(emoji_reaction), @status.account.id, inbox_url] + end + end end diff --git a/app/services/un_emoji_react_service.rb b/app/services/un_emoji_react_service.rb index 2f9fa169e366fa..e599c23831f8d9 100644 --- a/app/services/un_emoji_react_service.rb +++ b/app/services/un_emoji_react_service.rb @@ -15,6 +15,10 @@ def call(account_id, status_id, emoji_reaction = nil) create_notification(emoji_reaction) if !@status.account.local? && @status.account.activitypub? notify_to_followers(emoji_reaction) if @status.account.local? write_stream(emoji_reaction) + + forward_for_undo_emoji_reaction!(emoji_reaction) + relay_for_undo_emoji_reaction!(emoji_reaction) + relay_friend_for_undo_emoji_reaction!(emoji_reaction) else account = Account.find(account_id) bulk(account, @status) @@ -52,11 +56,33 @@ def write_stream(emoji_reaction) end def build_json(emoji_reaction) - Oj.dump(serialize_payload(emoji_reaction, ActivityPub::UndoEmojiReactionSerializer, signer: emoji_reaction.account)) + @build_json = Oj.dump(serialize_payload(emoji_reaction, ActivityPub::UndoEmojiReactionSerializer, signer: emoji_reaction.account)) end def render_emoji_reaction(emoji_group) # @rendered_emoji_reaction ||= InlineRenderer.render(emoji_group, nil, :emoji_reaction) Oj.dump(event: :emoji_reaction, payload: emoji_group.to_json) end + + def forward_for_undo_emoji_reaction!(emoji_reaction) + return unless @status.local? + + ActivityPub::RawDistributionWorker.perform_async(build_json(emoji_reaction), @status.account.id, [@status.account.preferred_inbox_url]) + end + + def relay_for_undo_emoji_reaction!(emoji_reaction) + return unless @status.local? && @status.public_visibility? + + ActivityPub::DeliveryWorker.push_bulk(Relay.enabled.pluck(:inbox_url)) do |inbox_url| + [build_json(emoji_reaction), @status.account.id, inbox_url] + end + end + + def relay_friend_for_undo_emoji_reaction!(emoji_reaction) + return unless @status.local? && @status.distributable_friend? + + ActivityPub::DeliveryWorker.push_bulk(FriendDomain.distributables.pluck(:inbox_url)) do |inbox_url| + [build_json(emoji_reaction), @status.account.id, inbox_url] + end + end end