wip
This commit is contained in:
parent
9dbe7bfbcb
commit
d14c9718a6
@ -31,6 +31,7 @@ import { normalizeForSearch } from '@/misc/normalize-for-search.js';
|
|||||||
import { truncate } from '@/misc/truncate.js';
|
import { truncate } from '@/misc/truncate.js';
|
||||||
import { StatusError } from '@/misc/fetch.js';
|
import { StatusError } from '@/misc/fetch.js';
|
||||||
import { uriPersonCache } from '@/services/user-cache.js';
|
import { uriPersonCache } from '@/services/user-cache.js';
|
||||||
|
import { publishInternalEvent } from '@/services/stream.js';
|
||||||
|
|
||||||
const logger = apLogger;
|
const logger = apLogger;
|
||||||
|
|
||||||
@ -359,6 +360,8 @@ export async function updatePerson(uri: string, resolver?: Resolver | null, hint
|
|||||||
location: person['vcard:Address'] || null,
|
location: person['vcard:Address'] || null,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
publishInternalEvent('remoteUserUpdated', { id: exist.id });
|
||||||
|
|
||||||
// ハッシュタグ更新
|
// ハッシュタグ更新
|
||||||
updateUsertags(exist, tags);
|
updateUsertags(exist, tags);
|
||||||
|
|
||||||
|
@ -1,7 +1,17 @@
|
|||||||
import { IObject } from './type.js';
|
import { IObject } from './type.js';
|
||||||
import { CacheableRemoteUser } from '@/models/entities/user.js';
|
import { CacheableRemoteUser } from '@/models/entities/user.js';
|
||||||
import { performActivity } from './kernel/index.js';
|
import { performActivity } from './kernel/index.js';
|
||||||
|
import { updatePerson } from './models/person.js';
|
||||||
|
|
||||||
export default async (actor: CacheableRemoteUser, activity: IObject): Promise<void> => {
|
export default async (actor: CacheableRemoteUser, activity: IObject): Promise<void> => {
|
||||||
await performActivity(actor, activity);
|
await performActivity(actor, activity);
|
||||||
|
|
||||||
|
// ついでにリモートユーザーの情報が古かったら更新しておく
|
||||||
|
if (actor.uri) {
|
||||||
|
if (actor.lastFetchedAt == null || Date.now() - actor.lastFetchedAt.getTime() > 1000 * 60 * 60 * 24) {
|
||||||
|
setImmediate(() => {
|
||||||
|
updatePerson(actor.uri!);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
@ -1,4 +0,0 @@
|
|||||||
import { Cache } from "@/misc/cache.js";
|
|
||||||
import { User } from "@/models/entities/user.js";
|
|
||||||
|
|
||||||
export const userCache = new Cache<User | null>(1000 * 60 * 30);
|
|
@ -10,7 +10,6 @@ import renderFollowUser from '@/remote/activitypub/renderer/follow-user.js';
|
|||||||
import { setResponseType } from '../activitypub.js';
|
import { setResponseType } from '../activitypub.js';
|
||||||
import { Users, Followings, UserProfiles } from '@/models/index.js';
|
import { Users, Followings, UserProfiles } from '@/models/index.js';
|
||||||
import { LessThan } from 'typeorm';
|
import { LessThan } from 'typeorm';
|
||||||
import { userCache } from './cache.js';
|
|
||||||
|
|
||||||
export default async (ctx: Router.RouterContext) => {
|
export default async (ctx: Router.RouterContext) => {
|
||||||
const userId = ctx.params.user;
|
const userId = ctx.params.user;
|
||||||
@ -28,11 +27,10 @@ export default async (ctx: Router.RouterContext) => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: typeorm 3.0にしたら .then(x => x || null) は消せる
|
const user = await Users.findOne({
|
||||||
const user = await userCache.fetch(userId, () => Users.findOne({
|
|
||||||
id: userId,
|
id: userId,
|
||||||
host: null,
|
host: null,
|
||||||
}).then(x => x || null));
|
});
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
ctx.status = 404;
|
ctx.status = 404;
|
||||||
|
@ -11,7 +11,6 @@ import { setResponseType } from '../activitypub.js';
|
|||||||
import { Users, Followings, UserProfiles } from '@/models/index.js';
|
import { Users, Followings, UserProfiles } from '@/models/index.js';
|
||||||
import { LessThan, FindConditions } from 'typeorm';
|
import { LessThan, FindConditions } from 'typeorm';
|
||||||
import { Following } from '@/models/entities/following.js';
|
import { Following } from '@/models/entities/following.js';
|
||||||
import { userCache } from './cache.js';
|
|
||||||
|
|
||||||
export default async (ctx: Router.RouterContext) => {
|
export default async (ctx: Router.RouterContext) => {
|
||||||
const userId = ctx.params.user;
|
const userId = ctx.params.user;
|
||||||
@ -29,11 +28,10 @@ export default async (ctx: Router.RouterContext) => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: typeorm 3.0にしたら .then(x => x || null) は消せる
|
const user = await Users.findOne({
|
||||||
const user = await userCache.fetch(userId, () => Users.findOne({
|
|
||||||
id: userId,
|
id: userId,
|
||||||
host: null,
|
host: null,
|
||||||
}).then(x => x || null));
|
});
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
ctx.status = 404;
|
ctx.status = 404;
|
||||||
|
@ -15,7 +15,6 @@ import { Users, Notes } from '@/models/index.js';
|
|||||||
import { makePaginationQuery } from '../api/common/make-pagination-query.js';
|
import { makePaginationQuery } from '../api/common/make-pagination-query.js';
|
||||||
import { Brackets } from 'typeorm';
|
import { Brackets } from 'typeorm';
|
||||||
import { Note } from '@/models/entities/note.js';
|
import { Note } from '@/models/entities/note.js';
|
||||||
import { userCache } from './cache.js';
|
|
||||||
|
|
||||||
export default async (ctx: Router.RouterContext) => {
|
export default async (ctx: Router.RouterContext) => {
|
||||||
const userId = ctx.params.user;
|
const userId = ctx.params.user;
|
||||||
@ -36,11 +35,10 @@ export default async (ctx: Router.RouterContext) => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: typeorm 3.0にしたら .then(x => x || null) は消せる
|
const user = await Users.findOne({
|
||||||
const user = await userCache.fetch(userId, () => Users.findOne({
|
|
||||||
id: userId,
|
id: userId,
|
||||||
host: null,
|
host: null,
|
||||||
}).then(x => x || null));
|
});
|
||||||
|
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
ctx.status = 404;
|
ctx.status = 404;
|
||||||
|
@ -22,6 +22,7 @@ export interface InternalStreamTypes {
|
|||||||
userChangeSilencedState: { id: User['id']; isSilenced: User['isSilenced']; };
|
userChangeSilencedState: { id: User['id']; isSilenced: User['isSilenced']; };
|
||||||
userChangeModeratorState: { id: User['id']; isModerator: User['isModerator']; };
|
userChangeModeratorState: { id: User['id']; isModerator: User['isModerator']; };
|
||||||
userTokenRegenerated: { id: User['id']; oldToken: User['token']; newToken: User['token']; };
|
userTokenRegenerated: { id: User['id']; oldToken: User['token']; newToken: User['token']; };
|
||||||
|
remoteUserUpdated: { id: User['id']; };
|
||||||
antennaCreated: Antenna;
|
antennaCreated: Antenna;
|
||||||
antennaDeleted: Antenna;
|
antennaDeleted: Antenna;
|
||||||
antennaUpdated: Antenna;
|
antennaUpdated: Antenna;
|
||||||
|
@ -38,8 +38,6 @@ import { endedPollNotificationQueue } from '@/queue/queues.js';
|
|||||||
import { Cache } from '@/misc/cache.js';
|
import { Cache } from '@/misc/cache.js';
|
||||||
import { UserProfile } from '@/models/entities/user-profile.js';
|
import { UserProfile } from '@/models/entities/user-profile.js';
|
||||||
|
|
||||||
const usersCache = new Cache<MinimumUser>(Infinity);
|
|
||||||
|
|
||||||
const mutedWordsCache = new Cache<{ userId: UserProfile['userId']; mutedWords: UserProfile['mutedWords']; }[]>(1000 * 60 * 5);
|
const mutedWordsCache = new Cache<{ userId: UserProfile['userId']; mutedWords: UserProfile['mutedWords']; }[]>(1000 * 60 * 5);
|
||||||
|
|
||||||
type NotificationType = 'reply' | 'renote' | 'quote' | 'mention';
|
type NotificationType = 'reply' | 'renote' | 'quote' | 'mention';
|
||||||
@ -212,7 +210,7 @@ export default async (user: { id: User['id']; username: User['username']; host:
|
|||||||
tags = tags.filter(tag => Array.from(tag || '').length <= 128).splice(0, 32);
|
tags = tags.filter(tag => Array.from(tag || '').length <= 128).splice(0, 32);
|
||||||
|
|
||||||
if (data.reply && (user.id !== data.reply.userId) && !mentionedUsers.some(u => u.id === data.reply!.userId)) {
|
if (data.reply && (user.id !== data.reply.userId) && !mentionedUsers.some(u => u.id === data.reply!.userId)) {
|
||||||
mentionedUsers.push(await usersCache.fetch(data.reply.userId, () => Users.findOneOrFail(data.reply!.userId)));
|
mentionedUsers.push(await Users.findOneOrFail(data.reply!.userId));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data.visibility === 'specified') {
|
if (data.visibility === 'specified') {
|
||||||
@ -225,7 +223,7 @@ export default async (user: { id: User['id']; username: User['username']; host:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (data.reply && !data.visibleUsers.some(x => x.id === data.reply!.userId)) {
|
if (data.reply && !data.visibleUsers.some(x => x.id === data.reply!.userId)) {
|
||||||
data.visibleUsers.push(await usersCache.fetch(data.reply.userId, () => Users.findOneOrFail(data.reply!.userId)));
|
data.visibleUsers.push(await Users.findOneOrFail(data.reply!.userId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,8 @@ subsdcriber.on('message', async (_, data) => {
|
|||||||
switch (type) {
|
switch (type) {
|
||||||
case 'userChangeSuspendedState':
|
case 'userChangeSuspendedState':
|
||||||
case 'userChangeSilencedState':
|
case 'userChangeSilencedState':
|
||||||
case 'userChangeModeratorState': {
|
case 'userChangeModeratorState':
|
||||||
|
case 'remoteUserUpdated': {
|
||||||
const user = await Users.findOneOrFail(body.id);
|
const user = await Users.findOneOrFail(body.id);
|
||||||
userByIdCache.set(user.id, user);
|
userByIdCache.set(user.id, user);
|
||||||
for (const [k, v] of uriPersonCache.cache.entries()) {
|
for (const [k, v] of uriPersonCache.cache.entries()) {
|
||||||
|
Loading…
Reference in New Issue
Block a user