mirror of https://github.com/Chocobozzz/PeerTube
				
				
				
			
		
			
				
	
	
		
			101 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			TypeScript
		
	
	
import { Transaction } from 'sequelize'
 | 
						|
import { ActivityAudience } from '../../../shared/models/activitypub'
 | 
						|
import { ACTIVITY_PUB } from '../../initializers/constants'
 | 
						|
import { ActorModel } from '../../models/activitypub/actor'
 | 
						|
import { VideoModel } from '../../models/video/video'
 | 
						|
import { VideoShareModel } from '../../models/video/video-share'
 | 
						|
import { MActorFollowersUrl, MActorLight, MActorUrl, MCommentOwner, MCommentOwnerVideo, MVideoId } from '../../types/models'
 | 
						|
 | 
						|
function getRemoteVideoAudience (accountActor: MActorUrl, actorsInvolvedInVideo: MActorFollowersUrl[]): ActivityAudience {
 | 
						|
  return {
 | 
						|
    to: [ accountActor.url ],
 | 
						|
    cc: actorsInvolvedInVideo.map(a => a.followersUrl)
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function getVideoCommentAudience (
 | 
						|
  videoComment: MCommentOwnerVideo,
 | 
						|
  threadParentComments: MCommentOwner[],
 | 
						|
  actorsInvolvedInVideo: MActorFollowersUrl[],
 | 
						|
  isOrigin = false
 | 
						|
): ActivityAudience {
 | 
						|
  const to = [ ACTIVITY_PUB.PUBLIC ]
 | 
						|
  const cc: string[] = []
 | 
						|
 | 
						|
  // Owner of the video we comment
 | 
						|
  if (isOrigin === false) {
 | 
						|
    cc.push(videoComment.Video.VideoChannel.Account.Actor.url)
 | 
						|
  }
 | 
						|
 | 
						|
  // Followers of the poster
 | 
						|
  cc.push(videoComment.Account.Actor.followersUrl)
 | 
						|
 | 
						|
  // Send to actors we reply to
 | 
						|
  for (const parentComment of threadParentComments) {
 | 
						|
    if (parentComment.isDeleted()) continue
 | 
						|
 | 
						|
    cc.push(parentComment.Account.Actor.url)
 | 
						|
  }
 | 
						|
 | 
						|
  return {
 | 
						|
    to,
 | 
						|
    cc: cc.concat(actorsInvolvedInVideo.map(a => a.followersUrl))
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function getAudienceFromFollowersOf (actorsInvolvedInObject: MActorFollowersUrl[]): ActivityAudience {
 | 
						|
  return {
 | 
						|
    to: [ ACTIVITY_PUB.PUBLIC ].concat(actorsInvolvedInObject.map(a => a.followersUrl)),
 | 
						|
    cc: []
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
async function getActorsInvolvedInVideo (video: MVideoId, t: Transaction) {
 | 
						|
  const actors: MActorLight[] = await VideoShareModel.loadActorsByShare(video.id, t)
 | 
						|
 | 
						|
  const videoAll = video as VideoModel
 | 
						|
 | 
						|
  const videoActor = videoAll.VideoChannel?.Account
 | 
						|
    ? videoAll.VideoChannel.Account.Actor
 | 
						|
    : await ActorModel.loadFromAccountByVideoId(video.id, t)
 | 
						|
 | 
						|
  actors.push(videoActor)
 | 
						|
 | 
						|
  return actors
 | 
						|
}
 | 
						|
 | 
						|
function getAudience (actorSender: MActorFollowersUrl, isPublic = true) {
 | 
						|
  return buildAudience([ actorSender.followersUrl ], isPublic)
 | 
						|
}
 | 
						|
 | 
						|
function buildAudience (followerUrls: string[], isPublic = true) {
 | 
						|
  let to: string[] = []
 | 
						|
  let cc: string[] = []
 | 
						|
 | 
						|
  if (isPublic) {
 | 
						|
    to = [ ACTIVITY_PUB.PUBLIC ]
 | 
						|
    cc = followerUrls
 | 
						|
  } else { // Unlisted
 | 
						|
    to = []
 | 
						|
    cc = []
 | 
						|
  }
 | 
						|
 | 
						|
  return { to, cc }
 | 
						|
}
 | 
						|
 | 
						|
function audiencify<T> (object: T, audience: ActivityAudience) {
 | 
						|
  return Object.assign(object, audience)
 | 
						|
}
 | 
						|
 | 
						|
// ---------------------------------------------------------------------------
 | 
						|
 | 
						|
export {
 | 
						|
  buildAudience,
 | 
						|
  getAudience,
 | 
						|
  getRemoteVideoAudience,
 | 
						|
  getActorsInvolvedInVideo,
 | 
						|
  getAudienceFromFollowersOf,
 | 
						|
  audiencify,
 | 
						|
  getVideoCommentAudience
 | 
						|
}
 |