フォロワーではないリモートユーザーに削除通知が配信されない問題を修正 (#6475)
* フォロワーではないリモートユーザーに削除通知が配信されない問題を修正 * 同じ処理を一つにまとめた * Inのエラー修正, Renote/Quote対応 Co-authored-by: mei23 <m@m544.net>
This commit is contained in:
		
							parent
							
								
									66d6e71f06
								
							
						
					
					
						commit
						91648d1bd4
					
				
					 1 changed files with 40 additions and 8 deletions
				
			
		|  | @ -6,14 +6,14 @@ import { renderActivity } from '../../remote/activitypub/renderer'; | ||||||
| import renderTombstone from '../../remote/activitypub/renderer/tombstone'; | import renderTombstone from '../../remote/activitypub/renderer/tombstone'; | ||||||
| import config from '../../config'; | import config from '../../config'; | ||||||
| import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc'; | import { registerOrFetchInstanceDoc } from '../register-or-fetch-instance-doc'; | ||||||
| import { User } from '../../models/entities/user'; | import { User, ILocalUser, IRemoteUser } from '../../models/entities/user'; | ||||||
| import { Note } from '../../models/entities/note'; | import { Note, IMentionedRemoteUsers } from '../../models/entities/note'; | ||||||
| import { Notes, Users, Instances } from '../../models'; | import { Notes, Users, Instances } from '../../models'; | ||||||
| import { notesChart, perUserNotesChart, instanceChart } from '../chart'; | import { notesChart, perUserNotesChart, instanceChart } from '../chart'; | ||||||
| import { deliverToFollowers } from '../../remote/activitypub/deliver-manager'; | import { deliverToFollowers, deliverToUser } from '../../remote/activitypub/deliver-manager'; | ||||||
| import { countSameRenotes } from '../../misc/count-same-renotes'; | import { countSameRenotes } from '../../misc/count-same-renotes'; | ||||||
| import { deliverToRelays } from '../relay'; | import { deliverToRelays } from '../relay'; | ||||||
| import { Brackets } from 'typeorm'; | import { Brackets, In } from 'typeorm'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * 投稿を削除します。 |  * 投稿を削除します。 | ||||||
|  | @ -49,8 +49,7 @@ export default async function(user: User, note: Note, quiet = false) { | ||||||
| 				? renderUndo(renderAnnounce(renote.uri || `${config.url}/notes/${renote.id}`, note), user) | 				? renderUndo(renderAnnounce(renote.uri || `${config.url}/notes/${renote.id}`, note), user) | ||||||
| 				: renderDelete(renderTombstone(`${config.url}/notes/${note.id}`), user)); | 				: renderDelete(renderTombstone(`${config.url}/notes/${note.id}`), user)); | ||||||
| 
 | 
 | ||||||
| 			deliverToFollowers(user, content); | 			deliverToConcerned(user, note, content); | ||||||
| 			deliverToRelays(user, content); |  | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		// also deliever delete activity to cascaded notes
 | 		// also deliever delete activity to cascaded notes
 | ||||||
|  | @ -59,8 +58,7 @@ export default async function(user: User, note: Note, quiet = false) { | ||||||
| 			if (!cascadingNote.user) continue; | 			if (!cascadingNote.user) continue; | ||||||
| 			if (!Users.isLocalUser(cascadingNote.user)) continue; | 			if (!Users.isLocalUser(cascadingNote.user)) continue; | ||||||
| 			const content = renderActivity(renderDelete(renderTombstone(`${config.url}/notes/${cascadingNote.id}`), cascadingNote.user)); | 			const content = renderActivity(renderDelete(renderTombstone(`${config.url}/notes/${cascadingNote.id}`), cascadingNote.user)); | ||||||
| 			deliverToFollowers(cascadingNote.user, content); | 			deliverToConcerned(cascadingNote.user, cascadingNote, content); | ||||||
| 			deliverToRelays(cascadingNote.user, content); |  | ||||||
| 		} | 		} | ||||||
| 		//#endregion
 | 		//#endregion
 | ||||||
| 
 | 
 | ||||||
|  | @ -103,3 +101,37 @@ async function findCascadingNotes(note: Note) { | ||||||
| 
 | 
 | ||||||
| 	return cascadingNotes.filter(note => note.userHost === null); // filter out non-local users
 | 	return cascadingNotes.filter(note => note.userHost === null); // filter out non-local users
 | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | async function getMentionedRemoteUsers(note: Note) { | ||||||
|  | 	const where = [] as any[]; | ||||||
|  | 
 | ||||||
|  | 	// mention / reply / dm
 | ||||||
|  | 	const uris = (JSON.parse(note.mentionedRemoteUsers) as IMentionedRemoteUsers).map(x => x.uri); | ||||||
|  | 	if (uris.length > 0) { | ||||||
|  | 		where.push( | ||||||
|  | 			{ uri: In(uris) } | ||||||
|  | 		); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// renote / quote
 | ||||||
|  | 	if (note.renoteUserId) { | ||||||
|  | 		where.push({ | ||||||
|  | 			id: note.renoteUserId | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (where.length === 0) return []; | ||||||
|  | 
 | ||||||
|  | 	return await Users.find({ | ||||||
|  | 		where | ||||||
|  | 	}) as IRemoteUser[]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | async function deliverToConcerned(user: ILocalUser, note: Note, content: any) { | ||||||
|  | 	deliverToFollowers(user, content); | ||||||
|  | 	deliverToRelays(user, content); | ||||||
|  | 	const remoteUsers = await getMentionedRemoteUsers(note); | ||||||
|  | 	for (const remoteUser of remoteUsers) { | ||||||
|  | 		deliverToUser(user, content, remoteUser); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue