AP引用でquoteUrlに対応 (#5632)
* Supports quoteUrl * Quote resolveをリトライする * Update src/remote/activitypub/models/note.ts Co-Authored-By: Acid Chicken (硫酸鶏) <root@acid-chicken.com> * Update src/remote/activitypub/models/note.ts Co-Authored-By: Acid Chicken (硫酸鶏) <root@acid-chicken.com> * Update src/remote/activitypub/models/note.ts Co-Authored-By: Acid Chicken (硫酸鶏) <root@acid-chicken.com> * Update src/remote/activitypub/models/note.ts Co-Authored-By: Acid Chicken (硫酸鶏) <root@acid-chicken.com>
This commit is contained in:
		
							parent
							
								
									3e85aad80a
								
							
						
					
					
						commit
						c012f4f880
					
				|  | @ -162,16 +162,42 @@ export async function createNote(value: string | IObject, resolver?: Resolver, s | |||
| 	// 引用
 | ||||
| 	let quote: Note | undefined | null; | ||||
| 
 | ||||
| 	if (note._misskey_quote && typeof note._misskey_quote == 'string') { | ||||
| 		quote = await resolveNote(note._misskey_quote).catch(e => { | ||||
| 			// 4xxの場合は引用してないことにする
 | ||||
| 			if (e.statusCode >= 400 && e.statusCode < 500) { | ||||
| 				logger.warn(`Ignored quote target ${note.inReplyTo} - ${e.statusCode} `); | ||||
| 				return null; | ||||
| 	if (note._misskey_quote || note.quoteUrl) { | ||||
| 		const tryResolveNote = async (uri: string): Promise<{ | ||||
| 			status: 'ok'; | ||||
| 			res: Note | null; | ||||
| 		} | { | ||||
| 			status: 'permerror' | 'temperror'; | ||||
| 		}> => { | ||||
| 			if (typeof uri !== 'string' || !uri.match(/^https?:/)) return { status: 'permerror' }; | ||||
| 			try { | ||||
| 				const res = await resolveNote(uri); | ||||
| 				if (res) { | ||||
| 					return { | ||||
| 						status: 'ok', | ||||
| 						res | ||||
| 					}; | ||||
| 				} else { | ||||
| 					return { | ||||
| 						status: 'permerror' | ||||
| 					}; | ||||
| 				} | ||||
| 			} catch (e) { | ||||
| 				return { | ||||
| 					status: e.statusCode >= 400 && e.statusCode < 500 ? 'permerror' : 'temperror' | ||||
| 				}; | ||||
| 			} | ||||
| 			logger.warn(`Error in quote target ${note.inReplyTo} - ${e.statusCode || e}`); | ||||
| 			throw e; | ||||
| 		}); | ||||
| 		}; | ||||
| 
 | ||||
| 		const uris = unique([note._misskey_quote, note.quoteUrl].filter((x): x is string => typeof x === 'string')); | ||||
| 		const results = await Promise.all(uris.map(uri => tryResolveNote(uri))); | ||||
| 
 | ||||
| 		quote = results.filter((x): x is { status: 'ok', res: Note | null } => x.status === 'ok').map(x => x.res).find(x => x); | ||||
| 		if (!quote) { | ||||
| 			if (results.some(x => x.status === 'temperror')) { | ||||
| 				throw 'quote resolve failed'; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	const cw = note.summary === '' ? null : note.summary; | ||||
|  |  | |||
|  | @ -159,6 +159,7 @@ export default async function renderNote(note: Note, dive = true, isTalk = false | |||
| 		content, | ||||
| 		_misskey_content: text, | ||||
| 		_misskey_quote: quote, | ||||
| 		quoteUrl: quote, | ||||
| 		published: note.createdAt.toISOString(), | ||||
| 		to, | ||||
| 		cc, | ||||
|  |  | |||
|  | @ -75,6 +75,7 @@ export interface INote extends IObject { | |||
| 	type: 'Note' | 'Question' | 'Article' | 'Audio' | 'Document' | 'Image' | 'Page' | 'Video'; | ||||
| 	_misskey_content?: string; | ||||
| 	_misskey_quote?: string; | ||||
| 	quoteUrl?: string; | ||||
| 	_misskey_talk: boolean; | ||||
| } | ||||
| 
 | ||||
|  | @ -82,6 +83,7 @@ export interface IQuestion extends IObject { | |||
| 	type: 'Note' | 'Question'; | ||||
| 	_misskey_content?: string; | ||||
| 	_misskey_quote?: string; | ||||
| 	quoteUrl?: string; | ||||
| 	oneOf?: IQuestionChoice[]; | ||||
| 	anyOf?: IQuestionChoice[]; | ||||
| 	endTime?: Date; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue