From 4e50b6a1c9a3eb261e04ede73241648e6edf21d6 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Mon, 27 Nov 2017 14:44:51 +0100 Subject: Add shares forward and collection on videos/video channels --- server/lib/activitypub/send/send-announce.ts | 86 ++++++++++++++++++++++++---- 1 file changed, 76 insertions(+), 10 deletions(-) (limited to 'server/lib/activitypub/send/send-announce.ts') diff --git a/server/lib/activitypub/send/send-announce.ts b/server/lib/activitypub/send/send-announce.ts index b8ea51bc0..efc23af46 100644 --- a/server/lib/activitypub/send/send-announce.ts +++ b/server/lib/activitypub/send/send-announce.ts @@ -1,34 +1,96 @@ import { Transaction } from 'sequelize' import { ActivityAdd } from '../../../../shared/index' -import { ActivityAnnounce, ActivityCreate } from '../../../../shared/models/activitypub/activity' +import { ActivityAnnounce, ActivityAudience, ActivityCreate } from '../../../../shared/models/activitypub/activity' import { AccountInstance, VideoInstance } from '../../../models' import { VideoChannelInstance } from '../../../models/video/video-channel-interface' import { getAnnounceActivityPubUrl } from '../url' -import { broadcastToFollowers } from './misc' +import { + broadcastToFollowers, + getAccountsInvolvedInVideo, + getAccountsInvolvedInVideoChannel, + getAudience, + getObjectFollowersAudience, + getOriginVideoAudience, + getOriginVideoChannelAudience, + unicastTo +} from './misc' import { addActivityData } from './send-add' import { createActivityData } from './send-create' -async function sendVideoAnnounce (byAccount: AccountInstance, video: VideoInstance, t: Transaction) { +async function buildVideoAnnounceToFollowers (byAccount: AccountInstance, video: VideoInstance, t: Transaction) { const url = getAnnounceActivityPubUrl(video.url, byAccount) const videoChannel = video.VideoChannel const announcedActivity = await addActivityData(url, videoChannel.Account, video, videoChannel.url, video.toActivityPubObject()) - const data = await announceActivityData(url, byAccount, announcedActivity) + const accountsToForwardView = await getAccountsInvolvedInVideo(video) + const audience = getObjectFollowersAudience(accountsToForwardView) + const data = await announceActivityData(url, byAccount, announcedActivity, audience) + + return data +} + +async function sendVideoAnnounceToFollowers (byAccount: AccountInstance, video: VideoInstance, t: Transaction) { + const data = await buildVideoAnnounceToFollowers(byAccount, video, t) + return broadcastToFollowers(data, byAccount, [ byAccount ], t) } -async function sendVideoChannelAnnounce (byAccount: AccountInstance, videoChannel: VideoChannelInstance, t: Transaction) { +async function sendVideoAnnounceToOrigin (byAccount: AccountInstance, video: VideoInstance, t: Transaction) { + const url = getAnnounceActivityPubUrl(video.url, byAccount) + + const videoChannel = video.VideoChannel + const announcedActivity = await addActivityData(url, videoChannel.Account, video, videoChannel.url, video.toActivityPubObject()) + + const accountsInvolvedInVideo = await getAccountsInvolvedInVideo(video) + const audience = getOriginVideoAudience(video, accountsInvolvedInVideo) + const data = await createActivityData(url, byAccount, announcedActivity, audience) + + return unicastTo(data, byAccount, videoChannel.Account.sharedInboxUrl, t) +} + +async function buildVideoChannelAnnounceToFollowers (byAccount: AccountInstance, videoChannel: VideoChannelInstance, t: Transaction) { const url = getAnnounceActivityPubUrl(videoChannel.url, byAccount) const announcedActivity = await createActivityData(url, videoChannel.Account, videoChannel.toActivityPubObject()) - const data = await announceActivityData(url, byAccount, announcedActivity) + const accountsToForwardView = await getAccountsInvolvedInVideoChannel(videoChannel) + const audience = getObjectFollowersAudience(accountsToForwardView) + const data = await announceActivityData(url, byAccount, announcedActivity, audience) + + return data +} + +async function sendVideoChannelAnnounceToFollowers (byAccount: AccountInstance, videoChannel: VideoChannelInstance, t: Transaction) { + const data = await buildVideoChannelAnnounceToFollowers(byAccount, videoChannel, t) + return broadcastToFollowers(data, byAccount, [ byAccount ], t) } -async function announceActivityData (url: string, byAccount: AccountInstance, object: ActivityCreate | ActivityAdd) { +async function sendVideoChannelAnnounceToOrigin (byAccount: AccountInstance, videoChannel: VideoChannelInstance, t: Transaction) { + const url = getAnnounceActivityPubUrl(videoChannel.url, byAccount) + const announcedActivity = await createActivityData(url, videoChannel.Account, videoChannel.toActivityPubObject()) + + const accountsInvolvedInVideo = await getAccountsInvolvedInVideoChannel(videoChannel) + const audience = getOriginVideoChannelAudience(videoChannel, accountsInvolvedInVideo) + const data = await createActivityData(url, byAccount, announcedActivity, audience) + + return unicastTo(data, byAccount, videoChannel.Account.sharedInboxUrl, t) +} + +async function announceActivityData ( + url: string, + byAccount: AccountInstance, + object: ActivityCreate | ActivityAdd, + audience?: ActivityAudience +) { + if (!audience) { + audience = await getAudience(byAccount) + } + const activity: ActivityAnnounce = { type: 'Announce', + to: audience.to, + cc: audience.cc, id: url, actor: byAccount.url, object @@ -40,7 +102,11 @@ async function announceActivityData (url: string, byAccount: AccountInstance, ob // --------------------------------------------------------------------------- export { - sendVideoAnnounce, - sendVideoChannelAnnounce, - announceActivityData + sendVideoAnnounceToFollowers, + sendVideoChannelAnnounceToFollowers, + sendVideoAnnounceToOrigin, + sendVideoChannelAnnounceToOrigin, + announceActivityData, + buildVideoAnnounceToFollowers, + buildVideoChannelAnnounceToFollowers } -- cgit v1.2.3