2018-12-26 03:36:24 -06:00
import { UserNotificationSettingValue , UserNotificationType , UserRight } from '../../shared/models/users'
import { logger } from '../helpers/logger'
import { Emailer } from './emailer'
import { UserNotificationModel } from '../models/account/user-notification'
import { UserModel } from '../models/account/user'
import { PeerTubeSocket } from './peertube-socket'
2019-04-11 04:33:44 -05:00
import { CONFIG } from '../initializers/config'
2018-12-26 03:36:24 -06:00
import { VideoPrivacy , VideoState } from '../../shared/models/videos'
import * as Bluebird from 'bluebird'
2019-01-02 09:37:43 -06:00
import { AccountBlocklistModel } from '../models/account/account-blocklist'
2019-08-15 04:53:26 -05:00
import {
MCommentOwnerVideo ,
MVideoAbuseVideo ,
MVideoAccountLight ,
2019-08-30 09:50:12 -05:00
MVideoBlacklistLightVideo ,
2019-08-15 04:53:26 -05:00
MVideoBlacklistVideo ,
MVideoFullLight
} from '../typings/models/video'
2019-08-30 09:50:12 -05:00
import {
2019-12-19 03:35:47 -06:00
MUser , MUserAccount ,
2019-08-30 09:50:12 -05:00
MUserDefault ,
MUserNotifSettingAccount ,
MUserWithNotificationSetting ,
UserNotificationModelForApi
} from '@server/typings/models/user'
2019-12-19 03:35:47 -06:00
import { MAccountDefault , MActorFollowFull } from '../typings/models'
2019-08-15 04:53:26 -05:00
import { MVideoImportVideo } from '@server/typings/models/video/video-import'
2019-12-19 03:35:47 -06:00
import { ServerBlocklistModel } from '@server/models/server/server-blocklist'
import { getServerActor } from '@server/helpers/utils'
2018-12-26 03:36:24 -06:00
class Notifier {
private static instance : Notifier
private constructor ( ) { }
2019-08-15 04:53:26 -05:00
notifyOnNewVideoIfNeeded ( video : MVideoAccountLight ) : void {
2019-04-02 04:26:47 -05:00
// Only notify on public and published videos which are not blacklisted
2019-07-23 05:04:15 -05:00
if ( video . privacy !== VideoPrivacy . PUBLIC || video . state !== VideoState . PUBLISHED || video . isBlacklisted ( ) ) return
2018-12-26 03:36:24 -06:00
this . notifySubscribersOfNewVideo ( video )
. catch ( err = > logger . error ( 'Cannot notify subscribers of new video %s.' , video . url , { err } ) )
}
2019-08-15 04:53:26 -05:00
notifyOnVideoPublishedAfterTranscoding ( video : MVideoFullLight ) : void {
2019-04-02 04:26:47 -05:00
// don't notify if didn't wait for transcoding or video is still blacklisted/waiting for scheduled update
if ( ! video . waitTranscoding || video . VideoBlacklist || video . ScheduleVideoUpdate ) return
2019-01-02 09:37:43 -06:00
this . notifyOwnedVideoHasBeenPublished ( video )
2019-04-02 04:26:47 -05:00
. catch ( err = > logger . error ( 'Cannot notify owner that its video %s has been published after transcoding.' , video . url , { err } ) )
}
2019-08-15 04:53:26 -05:00
notifyOnVideoPublishedAfterScheduledUpdate ( video : MVideoFullLight ) : void {
2019-04-02 04:26:47 -05:00
// don't notify if video is still blacklisted or waiting for transcoding
if ( video . VideoBlacklist || ( video . waitTranscoding && video . state !== VideoState . PUBLISHED ) ) return
this . notifyOwnedVideoHasBeenPublished ( video )
. catch ( err = > logger . error ( 'Cannot notify owner that its video %s has been published after scheduled update.' , video . url , { err } ) )
}
2019-08-15 04:53:26 -05:00
notifyOnVideoPublishedAfterRemovedFromAutoBlacklist ( video : MVideoFullLight ) : void {
2019-04-02 04:26:47 -05:00
// don't notify if video is still waiting for transcoding or scheduled update
if ( video . ScheduleVideoUpdate || ( video . waitTranscoding && video . state !== VideoState . PUBLISHED ) ) return
this . notifyOwnedVideoHasBeenPublished ( video )
. catch ( err = > logger . error ( 'Cannot notify owner that its video %s has been published after removed from auto-blacklist.' , video . url , { err } ) ) // tslint:disable-line:max-line-length
2019-01-02 09:37:43 -06:00
}
2019-08-15 04:53:26 -05:00
notifyOnNewComment ( comment : MCommentOwnerVideo ) : void {
2018-12-26 03:36:24 -06:00
this . notifyVideoOwnerOfNewComment ( comment )
2019-01-04 01:56:20 -06:00
. catch ( err = > logger . error ( 'Cannot notify video owner of new comment %s.' , comment . url , { err } ) )
this . notifyOfCommentMention ( comment )
. catch ( err = > logger . error ( 'Cannot notify mentions of comment %s.' , comment . url , { err } ) )
2018-12-26 03:36:24 -06:00
}
2019-08-15 04:53:26 -05:00
notifyOnNewVideoAbuse ( videoAbuse : MVideoAbuseVideo ) : void {
2018-12-26 03:36:24 -06:00
this . notifyModeratorsOfNewVideoAbuse ( videoAbuse )
. catch ( err = > logger . error ( 'Cannot notify of new video abuse of video %s.' , videoAbuse . Video . url , { err } ) )
}
2019-08-30 09:50:12 -05:00
notifyOnVideoAutoBlacklist ( videoBlacklist : MVideoBlacklistLightVideo ) : void {
this . notifyModeratorsOfVideoAutoBlacklist ( videoBlacklist )
. catch ( err = > logger . error ( 'Cannot notify of auto-blacklist of video %s.' , videoBlacklist . Video . url , { err } ) )
2019-04-02 04:26:47 -05:00
}
2019-08-15 04:53:26 -05:00
notifyOnVideoBlacklist ( videoBlacklist : MVideoBlacklistVideo ) : void {
2018-12-26 03:36:24 -06:00
this . notifyVideoOwnerOfBlacklist ( videoBlacklist )
. catch ( err = > logger . error ( 'Cannot notify video owner of new video blacklist of %s.' , videoBlacklist . Video . url , { err } ) )
}
2019-08-30 09:50:12 -05:00
notifyOnVideoUnblacklist ( video : MVideoFullLight ) : void {
2018-12-26 03:36:24 -06:00
this . notifyVideoOwnerOfUnblacklist ( video )
2019-04-02 04:26:47 -05:00
. catch ( err = > logger . error ( 'Cannot notify video owner of unblacklist of %s.' , video . url , { err } ) )
2018-12-26 03:36:24 -06:00
}
2019-08-15 04:53:26 -05:00
notifyOnFinishedVideoImport ( videoImport : MVideoImportVideo , success : boolean ) : void {
2019-01-02 09:37:43 -06:00
this . notifyOwnerVideoImportIsFinished ( videoImport , success )
. catch ( err = > logger . error ( 'Cannot notify owner that its video import %s is finished.' , videoImport . getTargetIdentifier ( ) , { err } ) )
}
2019-08-30 09:50:12 -05:00
notifyOnNewUserRegistration ( user : MUserDefault ) : void {
2019-01-04 01:56:20 -06:00
this . notifyModeratorsOfNewUserRegistration ( user )
. catch ( err = > logger . error ( 'Cannot notify moderators of new user registration (%s).' , user . username , { err } ) )
}
2019-08-30 09:50:12 -05:00
notifyOfNewUserFollow ( actorFollow : MActorFollowFull ) : void {
2019-01-04 01:56:20 -06:00
this . notifyUserOfNewActorFollow ( actorFollow )
. catch ( err = > {
logger . error (
'Cannot notify owner of channel %s of a new follow by %s.' ,
actorFollow . ActorFollowing . VideoChannel . getDisplayName ( ) ,
actorFollow . ActorFollower . Account . getDisplayName ( ) ,
2019-04-08 10:26:01 -05:00
{ err }
2019-01-04 01:56:20 -06:00
)
} )
}
2019-08-30 09:50:12 -05:00
notifyOfNewInstanceFollow ( actorFollow : MActorFollowFull ) : void {
2019-04-08 10:26:01 -05:00
this . notifyAdminsOfNewInstanceFollow ( actorFollow )
. catch ( err = > {
logger . error ( 'Cannot notify administrators of new follower %s.' , actorFollow . ActorFollower . url , { err } )
} )
}
2019-08-30 09:50:12 -05:00
notifyOfAutoInstanceFollowing ( actorFollow : MActorFollowFull ) : void {
this . notifyAdminsOfAutoInstanceFollowing ( actorFollow )
. catch ( err = > {
logger . error ( 'Cannot notify administrators of auto instance following %s.' , actorFollow . ActorFollowing . url , { err } )
} )
}
2019-08-15 04:53:26 -05:00
private async notifySubscribersOfNewVideo ( video : MVideoAccountLight ) {
2018-12-26 03:36:24 -06:00
// List all followers that are users
const users = await UserModel . listUserSubscribersOf ( video . VideoChannel . actorId )
logger . info ( 'Notifying %d users of new video %s.' , users . length , video . url )
2019-08-30 09:50:12 -05:00
function settingGetter ( user : MUserWithNotificationSetting ) {
2018-12-26 03:36:24 -06:00
return user . NotificationSetting . newVideoFromSubscription
}
2019-08-30 09:50:12 -05:00
async function notificationCreator ( user : MUserWithNotificationSetting ) {
const notification = await UserNotificationModel . create < UserNotificationModelForApi > ( {
2018-12-26 03:36:24 -06:00
type : UserNotificationType . NEW_VIDEO_FROM_SUBSCRIPTION ,
userId : user.id ,
videoId : video.id
} )
2019-08-30 09:50:12 -05:00
notification . Video = video
2018-12-26 03:36:24 -06:00
return notification
}
function emailSender ( emails : string [ ] ) {
return Emailer . Instance . addNewVideoFromSubscriberNotification ( emails , video )
}
return this . notify ( { users , settingGetter , notificationCreator , emailSender } )
}
2019-08-15 04:53:26 -05:00
private async notifyVideoOwnerOfNewComment ( comment : MCommentOwnerVideo ) {
2019-01-04 01:56:20 -06:00
if ( comment . Video . isOwned ( ) === false ) return
2018-12-26 03:36:24 -06:00
const user = await UserModel . loadByVideoId ( comment . videoId )
// Not our user or user comments its own video
if ( ! user || comment . Account . userId === user . id ) return
2019-12-19 03:35:47 -06:00
if ( await this . isBlockedByServerOrAccount ( user , comment . Account ) ) return
2019-01-02 09:37:43 -06:00
2018-12-26 03:36:24 -06:00
logger . info ( 'Notifying user %s of new comment %s.' , user . username , comment . url )
2019-08-30 09:50:12 -05:00
function settingGetter ( user : MUserWithNotificationSetting ) {
2018-12-26 03:36:24 -06:00
return user . NotificationSetting . newCommentOnMyVideo
}
2019-08-30 09:50:12 -05:00
async function notificationCreator ( user : MUserWithNotificationSetting ) {
const notification = await UserNotificationModel . create < UserNotificationModelForApi > ( {
2018-12-26 03:36:24 -06:00
type : UserNotificationType . NEW_COMMENT_ON_MY_VIDEO ,
userId : user.id ,
commentId : comment.id
} )
2019-08-30 09:50:12 -05:00
notification . Comment = comment
2018-12-26 03:36:24 -06:00
return notification
}
function emailSender ( emails : string [ ] ) {
return Emailer . Instance . addNewCommentOnMyVideoNotification ( emails , comment )
}
return this . notify ( { users : [ user ] , settingGetter , notificationCreator , emailSender } )
}
2019-08-15 04:53:26 -05:00
private async notifyOfCommentMention ( comment : MCommentOwnerVideo ) {
2019-02-15 08:52:18 -06:00
const extractedUsernames = comment . extractMentions ( )
logger . debug (
'Extracted %d username from comment %s.' , extractedUsernames . length , comment . url ,
{ usernames : extractedUsernames , text : comment.text }
)
2019-02-14 04:04:50 -06:00
2019-02-15 08:52:18 -06:00
let users = await UserModel . listByUsernames ( extractedUsernames )
2019-01-04 01:56:20 -06:00
if ( comment . Video . isOwned ( ) ) {
const userException = await UserModel . loadByVideoId ( comment . videoId )
users = users . filter ( u = > u . id !== userException . id )
}
// Don't notify if I mentioned myself
users = users . filter ( u = > u . Account . id !== comment . accountId )
2018-12-26 03:36:24 -06:00
if ( users . length === 0 ) return
2019-12-19 03:35:47 -06:00
const serverAccountId = ( await getServerActor ( ) ) . Account . id
const sourceAccounts = users . map ( u = > u . Account . id ) . concat ( [ serverAccountId ] )
const accountMutedHash = await AccountBlocklistModel . isAccountMutedByMulti ( sourceAccounts , comment . accountId )
const instanceMutedHash = await ServerBlocklistModel . isServerMutedByMulti ( sourceAccounts , comment . Account . Actor . serverId )
2019-01-04 01:56:20 -06:00
logger . info ( 'Notifying %d users of new comment %s.' , users . length , comment . url )
2019-08-30 09:50:12 -05:00
function settingGetter ( user : MUserNotifSettingAccount ) {
2019-12-19 03:35:47 -06:00
const accountId = user . Account . id
if (
accountMutedHash [ accountId ] === true || instanceMutedHash [ accountId ] === true ||
accountMutedHash [ serverAccountId ] === true || instanceMutedHash [ serverAccountId ] === true
) {
return UserNotificationSettingValue . NONE
}
2019-01-04 01:56:20 -06:00
return user . NotificationSetting . commentMention
}
2019-08-30 09:50:12 -05:00
async function notificationCreator ( user : MUserNotifSettingAccount ) {
const notification = await UserNotificationModel . create < UserNotificationModelForApi > ( {
2019-01-04 01:56:20 -06:00
type : UserNotificationType . COMMENT_MENTION ,
userId : user.id ,
commentId : comment.id
} )
2019-08-30 09:50:12 -05:00
notification . Comment = comment
2019-01-04 01:56:20 -06:00
return notification
}
function emailSender ( emails : string [ ] ) {
return Emailer . Instance . addNewCommentMentionNotification ( emails , comment )
}
return this . notify ( { users , settingGetter , notificationCreator , emailSender } )
}
2019-08-30 09:50:12 -05:00
private async notifyUserOfNewActorFollow ( actorFollow : MActorFollowFull ) {
2019-01-04 01:56:20 -06:00
if ( actorFollow . ActorFollowing . isOwned ( ) === false ) return
// Account follows one of our account?
let followType : 'account' | 'channel' = 'channel'
let user = await UserModel . loadByChannelActorId ( actorFollow . ActorFollowing . id )
// Account follows one of our channel?
if ( ! user ) {
user = await UserModel . loadByAccountActorId ( actorFollow . ActorFollowing . id )
followType = 'account'
}
if ( ! user ) return
const followerAccount = actorFollow . ActorFollower . Account
2019-12-19 03:35:47 -06:00
const followerAccountWithActor = Object . assign ( followerAccount , { Actor : actorFollow.ActorFollower } )
2019-01-04 01:56:20 -06:00
2019-12-19 03:35:47 -06:00
if ( await this . isBlockedByServerOrAccount ( user , followerAccountWithActor ) ) return
2019-01-04 01:56:20 -06:00
logger . info ( 'Notifying user %s of new follower: %s.' , user . username , followerAccount . getDisplayName ( ) )
2019-08-30 09:50:12 -05:00
function settingGetter ( user : MUserWithNotificationSetting ) {
2019-01-04 01:56:20 -06:00
return user . NotificationSetting . newFollow
}
2019-08-30 09:50:12 -05:00
async function notificationCreator ( user : MUserWithNotificationSetting ) {
const notification = await UserNotificationModel . create < UserNotificationModelForApi > ( {
2019-01-04 01:56:20 -06:00
type : UserNotificationType . NEW_FOLLOW ,
userId : user.id ,
actorFollowId : actorFollow.id
} )
2019-08-30 09:50:12 -05:00
notification . ActorFollow = actorFollow
2019-01-04 01:56:20 -06:00
return notification
}
function emailSender ( emails : string [ ] ) {
return Emailer . Instance . addNewFollowNotification ( emails , actorFollow , followType )
}
return this . notify ( { users : [ user ] , settingGetter , notificationCreator , emailSender } )
}
2019-08-30 09:50:12 -05:00
private async notifyAdminsOfNewInstanceFollow ( actorFollow : MActorFollowFull ) {
2019-04-08 10:26:01 -05:00
const admins = await UserModel . listWithRight ( UserRight . MANAGE_SERVER_FOLLOW )
logger . info ( 'Notifying %d administrators of new instance follower: %s.' , admins . length , actorFollow . ActorFollower . url )
2019-08-30 09:50:12 -05:00
function settingGetter ( user : MUserWithNotificationSetting ) {
2019-04-08 10:26:01 -05:00
return user . NotificationSetting . newInstanceFollower
}
2019-08-30 09:50:12 -05:00
async function notificationCreator ( user : MUserWithNotificationSetting ) {
const notification = await UserNotificationModel . create < UserNotificationModelForApi > ( {
2019-04-08 10:26:01 -05:00
type : UserNotificationType . NEW_INSTANCE_FOLLOWER ,
userId : user.id ,
actorFollowId : actorFollow.id
} )
2019-08-30 09:50:12 -05:00
notification . ActorFollow = actorFollow
2019-04-08 10:26:01 -05:00
return notification
}
function emailSender ( emails : string [ ] ) {
return Emailer . Instance . addNewInstanceFollowerNotification ( emails , actorFollow )
}
return this . notify ( { users : admins , settingGetter , notificationCreator , emailSender } )
}
2019-08-30 09:50:12 -05:00
private async notifyAdminsOfAutoInstanceFollowing ( actorFollow : MActorFollowFull ) {
const admins = await UserModel . listWithRight ( UserRight . MANAGE_SERVER_FOLLOW )
logger . info ( 'Notifying %d administrators of auto instance following: %s.' , admins . length , actorFollow . ActorFollowing . url )
function settingGetter ( user : MUserWithNotificationSetting ) {
return user . NotificationSetting . autoInstanceFollowing
}
async function notificationCreator ( user : MUserWithNotificationSetting ) {
const notification = await UserNotificationModel . create < UserNotificationModelForApi > ( {
type : UserNotificationType . AUTO_INSTANCE_FOLLOWING ,
userId : user.id ,
actorFollowId : actorFollow.id
} )
notification . ActorFollow = actorFollow
return notification
}
function emailSender ( emails : string [ ] ) {
return Emailer . Instance . addAutoInstanceFollowingNotification ( emails , actorFollow )
}
return this . notify ( { users : admins , settingGetter , notificationCreator , emailSender } )
}
2019-08-15 04:53:26 -05:00
private async notifyModeratorsOfNewVideoAbuse ( videoAbuse : MVideoAbuseVideo ) {
2019-01-04 01:56:20 -06:00
const moderators = await UserModel . listWithRight ( UserRight . MANAGE_VIDEO_ABUSES )
if ( moderators . length === 0 ) return
logger . info ( 'Notifying %s user/moderators of new video abuse %s.' , moderators . length , videoAbuse . Video . url )
2018-12-26 03:36:24 -06:00
2019-08-30 09:50:12 -05:00
function settingGetter ( user : MUserWithNotificationSetting ) {
2018-12-26 03:36:24 -06:00
return user . NotificationSetting . videoAbuseAsModerator
}
2019-08-30 09:50:12 -05:00
async function notificationCreator ( user : MUserWithNotificationSetting ) {
const notification : UserNotificationModelForApi = await UserNotificationModel . create < UserNotificationModelForApi > ( {
2018-12-26 03:36:24 -06:00
type : UserNotificationType . NEW_VIDEO_ABUSE_FOR_MODERATORS ,
userId : user.id ,
videoAbuseId : videoAbuse.id
} )
notification . VideoAbuse = videoAbuse
return notification
}
function emailSender ( emails : string [ ] ) {
return Emailer . Instance . addVideoAbuseModeratorsNotification ( emails , videoAbuse )
}
2019-01-04 01:56:20 -06:00
return this . notify ( { users : moderators , settingGetter , notificationCreator , emailSender } )
2018-12-26 03:36:24 -06:00
}
2019-08-30 09:50:12 -05:00
private async notifyModeratorsOfVideoAutoBlacklist ( videoBlacklist : MVideoBlacklistLightVideo ) {
2019-04-02 04:26:47 -05:00
const moderators = await UserModel . listWithRight ( UserRight . MANAGE_VIDEO_BLACKLIST )
if ( moderators . length === 0 ) return
2019-08-30 09:50:12 -05:00
logger . info ( 'Notifying %s moderators of video auto-blacklist %s.' , moderators . length , videoBlacklist . Video . url )
2019-04-02 04:26:47 -05:00
2019-08-30 09:50:12 -05:00
function settingGetter ( user : MUserWithNotificationSetting ) {
2019-04-02 04:26:47 -05:00
return user . NotificationSetting . videoAutoBlacklistAsModerator
}
2019-08-30 09:50:12 -05:00
async function notificationCreator ( user : MUserWithNotificationSetting ) {
const notification = await UserNotificationModel . create < UserNotificationModelForApi > ( {
2019-04-02 04:26:47 -05:00
type : UserNotificationType . VIDEO_AUTO_BLACKLIST_FOR_MODERATORS ,
userId : user.id ,
2019-08-30 09:50:12 -05:00
videoBlacklistId : videoBlacklist.id
2019-04-02 04:26:47 -05:00
} )
2019-08-30 09:50:12 -05:00
notification . VideoBlacklist = videoBlacklist
2019-04-02 04:26:47 -05:00
return notification
}
function emailSender ( emails : string [ ] ) {
2019-08-30 09:50:12 -05:00
return Emailer . Instance . addVideoAutoBlacklistModeratorsNotification ( emails , videoBlacklist )
2019-04-02 04:26:47 -05:00
}
return this . notify ( { users : moderators , settingGetter , notificationCreator , emailSender } )
}
2019-08-15 04:53:26 -05:00
private async notifyVideoOwnerOfBlacklist ( videoBlacklist : MVideoBlacklistVideo ) {
2018-12-26 03:36:24 -06:00
const user = await UserModel . loadByVideoId ( videoBlacklist . videoId )
if ( ! user ) return
logger . info ( 'Notifying user %s that its video %s has been blacklisted.' , user . username , videoBlacklist . Video . url )
2019-08-30 09:50:12 -05:00
function settingGetter ( user : MUserWithNotificationSetting ) {
2018-12-26 03:36:24 -06:00
return user . NotificationSetting . blacklistOnMyVideo
}
2019-08-30 09:50:12 -05:00
async function notificationCreator ( user : MUserWithNotificationSetting ) {
const notification = await UserNotificationModel . create < UserNotificationModelForApi > ( {
2018-12-26 03:36:24 -06:00
type : UserNotificationType . BLACKLIST_ON_MY_VIDEO ,
userId : user.id ,
videoBlacklistId : videoBlacklist.id
} )
2019-08-30 09:50:12 -05:00
notification . VideoBlacklist = videoBlacklist
2018-12-26 03:36:24 -06:00
return notification
}
function emailSender ( emails : string [ ] ) {
return Emailer . Instance . addVideoBlacklistNotification ( emails , videoBlacklist )
}
return this . notify ( { users : [ user ] , settingGetter , notificationCreator , emailSender } )
}
2019-08-30 09:50:12 -05:00
private async notifyVideoOwnerOfUnblacklist ( video : MVideoFullLight ) {
2018-12-26 03:36:24 -06:00
const user = await UserModel . loadByVideoId ( video . id )
if ( ! user ) return
logger . info ( 'Notifying user %s that its video %s has been unblacklisted.' , user . username , video . url )
2019-08-30 09:50:12 -05:00
function settingGetter ( user : MUserWithNotificationSetting ) {
2018-12-26 03:36:24 -06:00
return user . NotificationSetting . blacklistOnMyVideo
}
2019-08-30 09:50:12 -05:00
async function notificationCreator ( user : MUserWithNotificationSetting ) {
const notification = await UserNotificationModel . create < UserNotificationModelForApi > ( {
2018-12-26 03:36:24 -06:00
type : UserNotificationType . UNBLACKLIST_ON_MY_VIDEO ,
userId : user.id ,
videoId : video.id
} )
2019-08-30 09:50:12 -05:00
notification . Video = video
2018-12-26 03:36:24 -06:00
return notification
}
function emailSender ( emails : string [ ] ) {
return Emailer . Instance . addVideoUnblacklistNotification ( emails , video )
}
return this . notify ( { users : [ user ] , settingGetter , notificationCreator , emailSender } )
}
2019-08-15 04:53:26 -05:00
private async notifyOwnedVideoHasBeenPublished ( video : MVideoFullLight ) {
2019-01-02 09:37:43 -06:00
const user = await UserModel . loadByVideoId ( video . id )
if ( ! user ) return
logger . info ( 'Notifying user %s of the publication of its video %s.' , user . username , video . url )
2019-08-30 09:50:12 -05:00
function settingGetter ( user : MUserWithNotificationSetting ) {
2019-01-02 09:37:43 -06:00
return user . NotificationSetting . myVideoPublished
}
2019-08-30 09:50:12 -05:00
async function notificationCreator ( user : MUserWithNotificationSetting ) {
const notification = await UserNotificationModel . create < UserNotificationModelForApi > ( {
2019-01-02 09:37:43 -06:00
type : UserNotificationType . MY_VIDEO_PUBLISHED ,
userId : user.id ,
videoId : video.id
} )
2019-08-30 09:50:12 -05:00
notification . Video = video
2019-01-02 09:37:43 -06:00
return notification
}
function emailSender ( emails : string [ ] ) {
return Emailer . Instance . myVideoPublishedNotification ( emails , video )
}
return this . notify ( { users : [ user ] , settingGetter , notificationCreator , emailSender } )
}
2019-08-15 04:53:26 -05:00
private async notifyOwnerVideoImportIsFinished ( videoImport : MVideoImportVideo , success : boolean ) {
2019-01-02 09:37:43 -06:00
const user = await UserModel . loadByVideoImportId ( videoImport . id )
if ( ! user ) return
logger . info ( 'Notifying user %s its video import %s is finished.' , user . username , videoImport . getTargetIdentifier ( ) )
2019-08-30 09:50:12 -05:00
function settingGetter ( user : MUserWithNotificationSetting ) {
2019-01-02 09:37:43 -06:00
return user . NotificationSetting . myVideoImportFinished
}
2019-08-30 09:50:12 -05:00
async function notificationCreator ( user : MUserWithNotificationSetting ) {
const notification = await UserNotificationModel . create < UserNotificationModelForApi > ( {
2019-01-02 09:37:43 -06:00
type : success ? UserNotificationType.MY_VIDEO_IMPORT_SUCCESS : UserNotificationType.MY_VIDEO_IMPORT_ERROR ,
userId : user.id ,
videoImportId : videoImport.id
} )
2019-08-30 09:50:12 -05:00
notification . VideoImport = videoImport
2019-01-02 09:37:43 -06:00
return notification
}
function emailSender ( emails : string [ ] ) {
return success
? Emailer . Instance . myVideoImportSuccessNotification ( emails , videoImport )
: Emailer . Instance . myVideoImportErrorNotification ( emails , videoImport )
}
return this . notify ( { users : [ user ] , settingGetter , notificationCreator , emailSender } )
}
2019-08-30 09:50:12 -05:00
private async notifyModeratorsOfNewUserRegistration ( registeredUser : MUserDefault ) {
2019-01-04 01:56:20 -06:00
const moderators = await UserModel . listWithRight ( UserRight . MANAGE_USERS )
if ( moderators . length === 0 ) return
logger . info (
'Notifying %s moderators of new user registration of %s.' ,
2019-08-15 04:53:26 -05:00
moderators . length , registeredUser . username
2019-01-04 01:56:20 -06:00
)
2019-08-30 09:50:12 -05:00
function settingGetter ( user : MUserWithNotificationSetting ) {
2019-01-04 01:56:20 -06:00
return user . NotificationSetting . newUserRegistration
}
2019-08-30 09:50:12 -05:00
async function notificationCreator ( user : MUserWithNotificationSetting ) {
const notification = await UserNotificationModel . create < UserNotificationModelForApi > ( {
2019-01-04 01:56:20 -06:00
type : UserNotificationType . NEW_USER_REGISTRATION ,
userId : user.id ,
accountId : registeredUser.Account.id
} )
2019-08-30 09:50:12 -05:00
notification . Account = registeredUser . Account
2019-01-04 01:56:20 -06:00
return notification
}
function emailSender ( emails : string [ ] ) {
return Emailer . Instance . addNewUserRegistrationNotification ( emails , registeredUser )
}
return this . notify ( { users : moderators , settingGetter , notificationCreator , emailSender } )
}
2019-08-30 09:50:12 -05:00
private async notify < T extends MUserWithNotificationSetting > ( options : {
users : T [ ] ,
notificationCreator : ( user : T ) = > Promise < UserNotificationModelForApi > ,
2018-12-26 03:36:24 -06:00
emailSender : ( emails : string [ ] ) = > Promise < any > | Bluebird < any > ,
2019-08-30 09:50:12 -05:00
settingGetter : ( user : T ) = > UserNotificationSettingValue
2018-12-26 03:36:24 -06:00
} ) {
const emails : string [ ] = [ ]
for ( const user of options . users ) {
if ( this . isWebNotificationEnabled ( options . settingGetter ( user ) ) ) {
const notification = await options . notificationCreator ( user )
PeerTubeSocket . Instance . sendNotification ( user . id , notification )
}
if ( this . isEmailEnabled ( user , options . settingGetter ( user ) ) ) {
emails . push ( user . email )
}
}
if ( emails . length !== 0 ) {
await options . emailSender ( emails )
}
}
2019-08-15 04:53:26 -05:00
private isEmailEnabled ( user : MUser , value : UserNotificationSettingValue ) {
2019-03-19 10:41:41 -05:00
if ( CONFIG . SIGNUP . REQUIRES_EMAIL_VERIFICATION === true && user . emailVerified === false ) return false
2018-12-26 03:36:24 -06:00
2019-01-08 04:26:41 -06:00
return value & UserNotificationSettingValue . EMAIL
2018-12-26 03:36:24 -06:00
}
private isWebNotificationEnabled ( value : UserNotificationSettingValue ) {
2019-01-08 04:26:41 -06:00
return value & UserNotificationSettingValue . WEB
2018-12-26 03:36:24 -06:00
}
2019-12-19 03:35:47 -06:00
private async isBlockedByServerOrAccount ( user : MUserAccount , targetAccount : MAccountDefault ) {
const serverAccountId = ( await getServerActor ( ) ) . Account . id
const sourceAccounts = [ serverAccountId , user . Account . id ]
const accountMutedHash = await AccountBlocklistModel . isAccountMutedByMulti ( sourceAccounts , targetAccount . id )
if ( accountMutedHash [ serverAccountId ] || accountMutedHash [ user . Account . id ] ) return true
const instanceMutedHash = await ServerBlocklistModel . isServerMutedByMulti ( sourceAccounts , targetAccount . Actor . serverId )
if ( instanceMutedHash [ serverAccountId ] || instanceMutedHash [ user . Account . id ] ) return true
return false
}
2018-12-26 03:36:24 -06:00
static get Instance ( ) {
return this . instance || ( this . instance = new this ( ) )
}
}
// ---------------------------------------------------------------------------
export {
Notifier
}