mirror of
https://iceshrimp.dev/limepotato/jormungandr-bite.git
synced 2024-11-27 04:17:51 -07:00
This commit is contained in:
parent
3bec8c48d3
commit
19e9d71316
2 changed files with 86 additions and 1 deletions
|
@ -6,7 +6,7 @@ import Resolver from '../resolver';
|
|||
import Note, { INote } from '../../../models/note';
|
||||
import post from '../../../services/note/create';
|
||||
import { INote as INoteActivityStreamsObject, IObject } from '../type';
|
||||
import { resolvePerson } from './person';
|
||||
import { resolvePerson, updatePerson } from './person';
|
||||
import { resolveImage } from './image';
|
||||
import { IRemoteUser } from '../../../models/user';
|
||||
|
||||
|
@ -75,6 +75,11 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
|
|||
|
||||
const { window } = new JSDOM(note.content);
|
||||
|
||||
// ユーザーの情報が古かったらついでに更新しておく
|
||||
if (actor.updatedAt && Date.now() - actor.updatedAt.getTime() > 1000 * 60 * 60 * 24) {
|
||||
updatePerson(note.attributedTo);
|
||||
}
|
||||
|
||||
return await post(actor, {
|
||||
createdAt: new Date(note.published),
|
||||
media,
|
||||
|
|
|
@ -119,6 +119,86 @@ export async function createPerson(value: any, resolver?: Resolver): Promise<IUs
|
|||
return user;
|
||||
}
|
||||
|
||||
/**
|
||||
* Personの情報を更新します。
|
||||
*
|
||||
* Misskeyに対象のPersonが登録されていなければ無視します。
|
||||
*/
|
||||
export async function updatePerson(value: string | IObject, resolver?: Resolver): Promise<void> {
|
||||
const uri = typeof value == 'string' ? value : value.id;
|
||||
|
||||
// URIがこのサーバーを指しているならスキップ
|
||||
if (uri.startsWith(config.url + '/')) {
|
||||
return;
|
||||
}
|
||||
|
||||
//#region このサーバーに既に登録されているか
|
||||
const exist = await User.findOne({ uri }) as IRemoteUser;
|
||||
|
||||
if (exist == null) {
|
||||
return;
|
||||
}
|
||||
//#endregion
|
||||
|
||||
if (resolver == null) resolver = new Resolver();
|
||||
|
||||
const object = await resolver.resolve(value) as any;
|
||||
|
||||
if (
|
||||
object == null ||
|
||||
object.type !== 'Person'
|
||||
) {
|
||||
log(`invalid person: ${JSON.stringify(object, null, 2)}`);
|
||||
throw new Error('invalid person');
|
||||
}
|
||||
|
||||
const person: IPerson = object;
|
||||
|
||||
log(`Updating the Person: ${person.id}`);
|
||||
|
||||
const [followersCount = 0, followingCount = 0, notesCount = 0] = await Promise.all([
|
||||
resolver.resolve(person.followers).then(
|
||||
resolved => isCollectionOrOrderedCollection(resolved) ? resolved.totalItems : undefined,
|
||||
() => undefined
|
||||
),
|
||||
resolver.resolve(person.following).then(
|
||||
resolved => isCollectionOrOrderedCollection(resolved) ? resolved.totalItems : undefined,
|
||||
() => undefined
|
||||
),
|
||||
resolver.resolve(person.outbox).then(
|
||||
resolved => isCollectionOrOrderedCollection(resolved) ? resolved.totalItems : undefined,
|
||||
() => undefined
|
||||
)
|
||||
]);
|
||||
|
||||
const summaryDOM = JSDOM.fragment(person.summary);
|
||||
|
||||
// アイコンとヘッダー画像をフェッチ
|
||||
const [avatarId, bannerId] = (await Promise.all([
|
||||
person.icon,
|
||||
person.image
|
||||
].map(img =>
|
||||
img == null
|
||||
? Promise.resolve(null)
|
||||
: resolveImage(exist, img)
|
||||
))).map(file => file != null ? file._id : null);
|
||||
|
||||
// Update user
|
||||
await User.update({ _id: exist._id }, {
|
||||
$set: {
|
||||
updatedAt: new Date(),
|
||||
avatarId,
|
||||
bannerId,
|
||||
description: summaryDOM.textContent,
|
||||
followersCount,
|
||||
followingCount,
|
||||
notesCount,
|
||||
name: person.name,
|
||||
url: person.url
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Personを解決します。
|
||||
*
|
||||
|
|
Loading…
Reference in a new issue