Fix mention notification with a remote account

pull/1635/head
Chocobozzz 2019-02-14 11:04:50 +01:00
parent 72be63e56f
commit 1f6d57e354
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
3 changed files with 42 additions and 16 deletions

View File

@ -148,6 +148,8 @@ class Notifier {
private async notifyOfCommentMention (comment: VideoCommentModel) {
const usernames = comment.extractMentions()
logger.debug('Extracted %d username from comment %s.', usernames.length, comment.url, { usernames, text: comment.text })
let users = await UserModel.listByUsernames(usernames)
if (comment.Video.isOwned()) {

View File

@ -466,31 +466,41 @@ export class VideoCommentModel extends Model<VideoCommentModel> {
}
extractMentions () {
if (!this.text) return []
let result: string[] = []
const localMention = `@(${actorNameAlphabet}+)`
const remoteMention = `${localMention}@${CONFIG.WEBSERVER.HOST}`
const mentionRegex = this.isOwned()
? '(?:(?:' + remoteMention + ')|(?:' + localMention + '))' // Include local mentions?
: '(?:' + remoteMention + ')'
const firstMentionRegex = new RegExp(`^${mentionRegex} `, 'g')
const endMentionRegex = new RegExp(` ${mentionRegex}$`, 'g')
const remoteMentionsRegex = new RegExp(' ' + remoteMention + ' ', 'g')
const localMentionsRegex = new RegExp(' ' + localMention + ' ', 'g')
const firstMentionRegex = new RegExp('^(?:(?:' + remoteMention + ')|(?:' + localMention + ')) ', 'g')
const endMentionRegex = new RegExp(' (?:(?:' + remoteMention + ')|(?:' + localMention + '))$', 'g')
return uniq(
[].concat(
regexpCapture(this.text, remoteMentionsRegex)
.map(([ , username ]) => username),
result = result.concat(
regexpCapture(this.text, firstMentionRegex)
.map(([ , username1, username2 ]) => username1 || username2),
regexpCapture(this.text, localMentionsRegex)
.map(([ , username ]) => username),
regexpCapture(this.text, endMentionRegex)
.map(([ , username1, username2 ]) => username1 || username2),
regexpCapture(this.text, firstMentionRegex)
.map(([ , username1, username2 ]) => username1 || username2),
regexpCapture(this.text, endMentionRegex)
.map(([ , username1, username2 ]) => username1 || username2)
)
regexpCapture(this.text, remoteMentionsRegex)
.map(([ , username ]) => username)
)
// Include local mentions
if (this.isOwned()) {
const localMentionsRegex = new RegExp(' ' + localMention + ' ', 'g')
result = result.concat(
regexpCapture(this.text, localMentionsRegex)
.map(([ , username ]) => username)
)
}
return uniq(result)
}
toFormattedJSON () {

View File

@ -508,6 +508,20 @@ describe('Test users notifications', function () {
await removeAccountFromAccountBlocklist(servers[ 0 ].url, userAccessToken, 'root')
})
it('Should not send a new mention notification if the remote account mention a local account', async function () {
this.timeout(20000)
const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'super video' })
const uuid = resVideo.body.video.uuid
await waitJobs(servers)
const resThread = await addVideoCommentThread(servers[1].url, servers[1].accessToken, uuid, '@user_1 hello')
const threadId = resThread.body.comment.id
await waitJobs(servers)
await checkCommentMention(baseParams, uuid, threadId, threadId, 'super root 2 name', 'absence')
})
it('Should send a new mention notification after local comments', async function () {
this.timeout(10000)