From da1ed70c666f9521cad2d24e22765841201f909f Mon Sep 17 00:00:00 2001 From: Ajay Date: Fri, 29 Jul 2022 11:47:28 -0400 Subject: [PATCH] adjust permissions and use parrallel processing --- src/databases/Postgres.ts | 2 +- src/routes/getSkipSegments.ts | 2 +- src/utils/permissions.ts | 17 ++++++++------ src/utils/{promiseTimeout.ts => promise.ts} | 25 +++++++++++++++++++++ 4 files changed, 37 insertions(+), 9 deletions(-) rename src/utils/{promiseTimeout.ts => promise.ts} (63%) diff --git a/src/databases/Postgres.ts b/src/databases/Postgres.ts index 59c0acb..f145aad 100644 --- a/src/databases/Postgres.ts +++ b/src/databases/Postgres.ts @@ -4,7 +4,7 @@ import { Client, Pool, QueryResult, types } from "pg"; import fs from "fs"; import { CustomPostgresConfig, CustomPostgresReadOnlyConfig } from "../types/config.model"; -import { timeoutPomise, PromiseWithState, savePromiseState, nextFulfilment } from "../utils/promiseTimeout"; +import { timeoutPomise, PromiseWithState, savePromiseState, nextFulfilment } from "../utils/promise"; // return numeric (pg_type oid=1700) as float types.setTypeParser(1700, function(val) { diff --git a/src/routes/getSkipSegments.ts b/src/routes/getSkipSegments.ts index 5c2dd6a..7da485e 100644 --- a/src/routes/getSkipSegments.ts +++ b/src/routes/getSkipSegments.ts @@ -11,7 +11,7 @@ import { Logger } from "../utils/logger"; import { QueryCacher } from "../utils/queryCacher"; import { getReputation } from "../utils/reputation"; import { getService } from "../utils/getService"; -import { promiseOrTimeout } from "../utils/promiseTimeout"; +import { promiseOrTimeout } from "../utils/promise"; async function prepareCategorySegments(req: Request, videoID: VideoID, service: Service, segments: DBSegment[], cache: SegmentCache = { shadowHiddenSegmentIPs: {} }, useCache: boolean): Promise { diff --git a/src/utils/permissions.ts b/src/utils/permissions.ts index 41a30fe..15f8374 100644 --- a/src/utils/permissions.ts +++ b/src/utils/permissions.ts @@ -4,6 +4,7 @@ import { Category } from "../types/segments.model"; import { Feature, HashedUserID } from "../types/user.model"; import { hasFeature } from "./features"; import { isUserVIP } from "./isUserVIP"; +import { oneOf } from "./promise"; import { getReputation } from "./reputation"; interface CanSubmitResult { @@ -15,16 +16,18 @@ export async function canSubmit(userID: HashedUserID, category: Category): Promi switch (category) { case "chapter": return { - canSubmit: (await isUserVIP(userID)) - || (await getReputation(userID)) > config.minReputationToSubmitChapter - || (await hasFeature(userID, Feature.ChapterSubmitter)) + canSubmit: await oneOf([isUserVIP(userID), + (async () => (await getReputation(userID)) > config.minReputationToSubmitChapter)(), + hasFeature(userID, Feature.ChapterSubmitter) + ]) }; case "filler": return { - canSubmit: (await isUserVIP(userID)) - || (await getReputation(userID)) > config.minReputationToSubmitFiller - || (await hasFeature(userID, Feature.FillerSubmitter)) - || (await db.prepare("get", `SELECT count(*) as "submissionCount" FROM "sponsorTimes" WHERE "userID" = ? AND category != 'filler' AND "timeSubmitted" < 1654010691000 LIMIT 4`, [userID], { useReplica: true }))?.submissionCount > 3, + canSubmit: await oneOf([isUserVIP(userID), + (async () => (await getReputation(userID)) > config.minReputationToSubmitFiller)(), + hasFeature(userID, Feature.FillerSubmitter), + (async () => (await db.prepare("get", `SELECT count(*) as "submissionCount" FROM "sponsorTimes" WHERE "userID" = ? AND category != 'filler' AND "timeSubmitted" < 1654010691000 LIMIT 4`, [userID], { useReplica: true }))?.submissionCount > 3)() + ]), reason: "Someone has submitted over 1.9 million spam filler submissions and refuses to stop even after talking with them, so we have to restrict it for now. You can request submission access on chat.sponsor.ajay.app/#filler, discord.gg/SponsorBlock or matrix.to/#/#sponsor:ajay.app" }; } diff --git a/src/utils/promiseTimeout.ts b/src/utils/promise.ts similarity index 63% rename from src/utils/promiseTimeout.ts rename to src/utils/promise.ts index 8a6ecf8..e84e2ff 100644 --- a/src/utils/promiseTimeout.ts +++ b/src/utils/promise.ts @@ -1,3 +1,5 @@ +import { Logger } from "./logger"; + export class PromiseTimeoutError extends Error { promise?: Promise; @@ -47,4 +49,27 @@ export function savePromiseState(promise: Promise): PromiseWithState { */ export function nextFulfilment(promises: PromiseWithState[]): Promise { return Promise.race(promises.filter((p) => !p.isRejected)); +} + +export function oneOf(promises: Promise[]): Promise { + return new Promise((resolve, reject) => { + let fulfilments = 0; + for (const promise of promises) { + promise.then((result) => { + fulfilments++; + + if (result || fulfilments === promises.length) { + resolve(result); + } + }).catch((err) => { + fulfilments++; + + if (fulfilments === promises.length) { + reject(err); + } else { + Logger.error(`oneOf ignore error (promise): ${err}`); + } + }); + } + }); } \ No newline at end of file