fix aode-relay compatibility

This commit is contained in:
Namekuji 2023-06-15 20:59:17 -04:00
parent da6f611185
commit 0c9cce7c7c
No known key found for this signature in database
GPG Key ID: B541BD6E646CABC7
3 changed files with 50 additions and 11 deletions

View File

@ -12,7 +12,7 @@ export async function getInstance(response: Entity.Instance) {
uri: response.uri, uri: response.uri,
title: response.title || "Calckey", title: response.title || "Calckey",
short_description: short_description:
response.description.substring(0, 50) || "See real server website", response.description?.substring(0, 50) || "See real server website",
description: description:
response.description || response.description ||
"This is a vanilla Calckey Instance. It doesnt seem to have a description. BTW you are using the Mastodon api to access this server :)", "This is a vanilla Calckey Instance. It doesnt seem to have a description. BTW you are using the Mastodon api to access this server :)",

View File

@ -36,6 +36,7 @@ import {
ChannelFollowings, ChannelFollowings,
Blockings, Blockings,
NoteThreadMutings, NoteThreadMutings,
Relays,
} from "@/models/index.js"; } from "@/models/index.js";
import type { DriveFile } from "@/models/entities/drive-file.js"; import type { DriveFile } from "@/models/entities/drive-file.js";
import type { App } from "@/models/entities/app.js"; import type { App } from "@/models/entities/app.js";
@ -56,7 +57,7 @@ import { checkHitAntenna } from "@/misc/check-hit-antenna.js";
import { getWordHardMute } from "@/misc/check-word-mute.js"; import { getWordHardMute } from "@/misc/check-word-mute.js";
import { addNoteToAntenna } from "../add-note-to-antenna.js"; import { addNoteToAntenna } from "../add-note-to-antenna.js";
import { countSameRenotes } from "@/misc/count-same-renotes.js"; import { countSameRenotes } from "@/misc/count-same-renotes.js";
import { deliverToRelays } from "../relay.js"; import { deliverToRelays, getCachedRelays } from "../relay.js";
import type { Channel } from "@/models/entities/channel.js"; import type { Channel } from "@/models/entities/channel.js";
import { normalizeForSearch } from "@/misc/normalize-for-search.js"; import { normalizeForSearch } from "@/misc/normalize-for-search.js";
import { getAntennas } from "@/misc/antenna-cache.js"; import { getAntennas } from "@/misc/antenna-cache.js";
@ -72,6 +73,7 @@ import meilisearch from "../../db/meilisearch.js";
const mutedWordsCache = new Cache< const mutedWordsCache = new Cache<
{ userId: UserProfile["userId"]; mutedWords: UserProfile["mutedWords"] }[] { userId: UserProfile["userId"]; mutedWords: UserProfile["mutedWords"] }[]
>(1000 * 60 * 5); >(1000 * 60 * 5);
const publishedNoteCache = new Cache<boolean>(1000 * 10);
type NotificationType = "reply" | "renote" | "quote" | "mention"; type NotificationType = "reply" | "renote" | "quote" | "mention";
@ -165,6 +167,7 @@ export default async (
isSilenced: User["isSilenced"]; isSilenced: User["isSilenced"];
createdAt: User["createdAt"]; createdAt: User["createdAt"];
isBot: User["isBot"]; isBot: User["isBot"];
inbox?: User["inbox"];
}, },
data: Option, data: Option,
silent = false, silent = false,
@ -453,7 +456,29 @@ export default async (
} }
if (!dontFederateInitially) { if (!dontFederateInitially) {
publishNotesStream(note); const relays = await getCachedRelays();
if (!note.uri) {
publishNotesStream(note);
} else if (
data.renote?.uri &&
publishedNoteCache.get(data.renote.uri) !== true &&
user.inbox &&
relays.map((relay) => relay.inbox).includes(user.inbox)
) {
const uri = data.renote.uri;
publishNotesStream(data.renote);
publishedNoteCache.set(uri, true);
setTimeout(() => {
publishedNoteCache.delete(uri);
}, 1000 * 10);
} else if (note.uri && publishedNoteCache.get(note.uri) !== true) {
const uri = note.uri;
publishNotesStream(note);
publishedNoteCache.set(uri, true);
setTimeout(() => {
publishedNoteCache.delete(uri);
}, 1000 * 10);
}
} }
if (note.replyId != null) { if (note.replyId != null) {
// Only provide the reply note id here as the recipient may not be authorized to see the note. // Only provide the reply note id here as the recipient may not be authorized to see the note.
@ -524,7 +549,6 @@ export default async (
nm.push(data.renote.userId, type); nm.push(data.renote.userId, type);
} }
} }
// Fetch watchers // Fetch watchers
nmRelatedPromises.push( nmRelatedPromises.push(
notifyToWatchersOfRenotee(data.renote, user, nm, type), notifyToWatchersOfRenotee(data.renote, user, nm, type),
@ -537,8 +561,9 @@ export default async (
}); });
publishMainStream(data.renote.userId, "renote", packedRenote); publishMainStream(data.renote.userId, "renote", packedRenote);
const renote = data.renote;
const webhooks = (await getActiveWebhooks()).filter( const webhooks = (await getActiveWebhooks()).filter(
(x) => x.userId === data.renote!.userId && x.on.includes("renote"), (x) => x.userId === renote.userId && x.on.includes("renote"),
); );
for (const webhook of webhooks) { for (const webhook of webhooks) {
webhookDeliver(webhook, "renote", { webhookDeliver(webhook, "renote", {

View File

@ -37,7 +37,7 @@ export async function addRelay(inbox: string) {
}).then((x) => Relays.findOneByOrFail(x.identifiers[0])); }).then((x) => Relays.findOneByOrFail(x.identifiers[0]));
const relayActor = await getRelayActor(); const relayActor = await getRelayActor();
const follow = await renderFollowRelay(relay, relayActor); const follow = renderFollowRelay(relay, relayActor);
const activity = renderActivity(follow); const activity = renderActivity(follow);
deliver(relayActor, activity, relay.inbox); deliver(relayActor, activity, relay.inbox);
@ -60,6 +60,7 @@ export async function removeRelay(inbox: string) {
deliver(relayActor, activity, relay.inbox); deliver(relayActor, activity, relay.inbox);
await Relays.delete(relay.id); await Relays.delete(relay.id);
await updateRelaysCache();
} }
export async function listRelay() { export async function listRelay() {
@ -67,14 +68,31 @@ export async function listRelay() {
return relays; return relays;
} }
export async function getCachedRelays(): Promise<Relay[]> {
return await relaysCache.fetch(null, () =>
Relays.findBy({
status: "accepted",
}),
);
}
export async function relayAccepted(id: string) { export async function relayAccepted(id: string) {
const result = await Relays.update(id, { const result = await Relays.update(id, {
status: "accepted", status: "accepted",
}); });
await updateRelaysCache();
return JSON.stringify(result); return JSON.stringify(result);
} }
async function updateRelaysCache() {
const relays = await Relays.findBy({
status: "accepted",
});
relaysCache.set(null, relays);
}
export async function relayRejected(id: string) { export async function relayRejected(id: string) {
const result = await Relays.update(id, { const result = await Relays.update(id, {
status: "rejected", status: "rejected",
@ -89,11 +107,7 @@ export async function deliverToRelays(
) { ) {
if (activity == null) return; if (activity == null) return;
const relays = await relaysCache.fetch(null, () => const relays = await getCachedRelays();
Relays.findBy({
status: "accepted",
}),
);
if (relays.length === 0) return; if (relays.length === 0) return;
// TODO // TODO