Add seperate type for dearrow warning

Also add dearrow warning reason as option for user info
This commit is contained in:
Ajay
2023-07-17 22:42:29 -04:00
parent 808066a5ed
commit e9fcf6b445
7 changed files with 31 additions and 7 deletions

View File

@@ -0,0 +1,7 @@
BEGIN TRANSACTION;
ALTER TABLE "warnings" ADD "type" INTEGER default 0;
UPDATE "config" SET value = 36 WHERE key = 'version';
COMMIT;

View File

@@ -78,6 +78,16 @@ async function dbGetWarningsForUser(userID: HashedUserID): Promise<number> {
} }
} }
async function dbGetDeArrowWarningReasonForUser(userID: HashedUserID): Promise<number> {
try {
const row = await db.prepare("get", `SELECT reason FROM "warnings" WHERE "userID" = ? AND "enabled" = 1 AND "type" = 1`, [userID], { useReplica: true });
return row?.reason ?? 0;
} catch (err) /* istanbul ignore next */ {
Logger.error(`Couldn't get warnings for user ${userID}. returning 0`);
return 0;
}
}
async function dbGetLastSegmentForUser(userID: HashedUserID): Promise<SegmentUUID> { async function dbGetLastSegmentForUser(userID: HashedUserID): Promise<SegmentUUID> {
try { try {
const row = await db.prepare("get", `SELECT "UUID" FROM "sponsorTimes" WHERE "userID" = ? ORDER BY "timeSubmitted" DESC LIMIT 1`, [userID], { useReplica: true }); const row = await db.prepare("get", `SELECT "UUID" FROM "sponsorTimes" WHERE "userID" = ? ORDER BY "timeSubmitted" DESC LIMIT 1`, [userID], { useReplica: true });
@@ -153,6 +163,7 @@ const dbGetValue = (userID: HashedUserID, property: string): Promise<string|Segm
ignoredViewCount: () => dbGetIgnoredViewsForUser(userID), ignoredViewCount: () => dbGetIgnoredViewsForUser(userID),
warnings: () => dbGetWarningsForUser(userID), warnings: () => dbGetWarningsForUser(userID),
warningReason: () => dbGetActiveWarningReasonForUser(userID), warningReason: () => dbGetActiveWarningReasonForUser(userID),
deArrowWarningReason: () => dbGetDeArrowWarningReasonForUser(userID),
banned: () => dbGetBanned(userID), banned: () => dbGetBanned(userID),
reputation: () => getReputation(userID), reputation: () => getReputation(userID),
vip: () => isUserVIP(userID), vip: () => isUserVIP(userID),
@@ -171,7 +182,7 @@ async function getUserInfo(req: Request, res: Response): Promise<Response> {
"viewCount", "ignoredViewCount", "warnings", "warningReason", "reputation", "viewCount", "ignoredViewCount", "warnings", "warningReason", "reputation",
"vip", "lastSegmentID"]; "vip", "lastSegmentID"];
const allProperties: string[] = [...defaultProperties, "banned", "permissions", "freeChaptersAccess", const allProperties: string[] = [...defaultProperties, "banned", "permissions", "freeChaptersAccess",
"ignoredSegmentCount", "titleSubmissionCount", "thumbnailSubmissionCount"]; "ignoredSegmentCount", "titleSubmissionCount", "thumbnailSubmissionCount", "deArrowWarningReason"];
let paramValues: string[] = req.query.values let paramValues: string[] = req.query.values
? JSON.parse(req.query.values as string) ? JSON.parse(req.query.values as string)
: req.query.value : req.query.value

View File

@@ -162,7 +162,7 @@ async function checkUserActiveWarning(userID: HashedUserID): Promise<CheckResult
const warnings = (await db.prepare("all", const warnings = (await db.prepare("all",
`SELECT "reason" `SELECT "reason"
FROM warnings FROM warnings
WHERE "userID" = ? AND "issueTime" > ? AND enabled = 1 WHERE "userID" = ? AND "issueTime" > ? AND enabled = 1 AND type = 0
ORDER BY "issueTime" DESC`, ORDER BY "issueTime" DESC`,
[ [
userID, userID,

View File

@@ -6,6 +6,7 @@ import { getHashCache } from "../utils/getHashCache";
import { HashedUserID, UserID } from "../types/user.model"; import { HashedUserID, UserID } from "../types/user.model";
import { config } from "../config"; import { config } from "../config";
import { generateWarningDiscord, warningData, dispatchEvent } from "../utils/webhookUtils"; import { generateWarningDiscord, warningData, dispatchEvent } from "../utils/webhookUtils";
import { WarningType } from "../types/warning.model";
type warningEntry = { type warningEntry = {
userID: HashedUserID, userID: HashedUserID,
@@ -32,6 +33,7 @@ export async function postWarning(req: Request, res: Response): Promise<Response
const issueTime = new Date().getTime(); const issueTime = new Date().getTime();
const enabled: boolean = req.body.enabled ?? true; const enabled: boolean = req.body.enabled ?? true;
const reason: string = req.body.reason ?? ""; const reason: string = req.body.reason ?? "";
const type: WarningType = req.body.type ?? WarningType.SponsorBlock;
if ((!issuerUserID && enabled) || (issuerUserID && !await isUserVIP(issuerUserID))) { if ((!issuerUserID && enabled) || (issuerUserID && !await isUserVIP(issuerUserID))) {
Logger.warn(`Permission violation: User ${issuerUserID} attempted to warn user ${userID}.`); Logger.warn(`Permission violation: User ${issuerUserID} attempted to warn user ${userID}.`);
@@ -46,8 +48,8 @@ export async function postWarning(req: Request, res: Response): Promise<Response
if (!previousWarning) { if (!previousWarning) {
await db.prepare( await db.prepare(
"run", "run",
'INSERT INTO "warnings" ("userID", "issueTime", "issuerUserID", "enabled", "reason") VALUES (?, ?, ?, 1, ?)', 'INSERT INTO "warnings" ("userID", "issueTime", "issuerUserID", "enabled", "reason", "type") VALUES (?, ?, ?, 1, ?, ?)',
[userID, issueTime, issuerUserID, reason] [userID, issueTime, issuerUserID, reason, type]
); );
resultStatus = "issued to"; resultStatus = "issued to";
// check if warning is still within issue time and warning is not enabled // check if warning is still within issue time and warning is not enabled
@@ -61,7 +63,7 @@ export async function postWarning(req: Request, res: Response): Promise<Response
return res.sendStatus(409); return res.sendStatus(409);
} }
} else { } else {
await db.prepare("run", 'UPDATE "warnings" SET "enabled" = 0 WHERE "userID" = ?', [userID]); await db.prepare("run", 'UPDATE "warnings" SET "enabled" = 0 WHERE "userID" = ? AND "type" = ?', [userID, type]);
resultStatus = "removed from"; resultStatus = "removed from";
} }

View File

@@ -366,7 +366,7 @@ export async function vote(ip: IPAddress, UUID: SegmentUUID, paramUserID: UserID
const MILLISECONDS_IN_HOUR = 3600000; const MILLISECONDS_IN_HOUR = 3600000;
const now = Date.now(); const now = Date.now();
const warnings = (await db.prepare("all", `SELECT "reason" FROM warnings WHERE "userID" = ? AND "issueTime" > ? AND enabled = 1`, const warnings = (await db.prepare("all", `SELECT "reason" FROM warnings WHERE "userID" = ? AND "issueTime" > ? AND enabled = 1 AND type = 0`,
[nonAnonUserID, Math.floor(now - (config.hoursAfterWarningExpires * MILLISECONDS_IN_HOUR))], [nonAnonUserID, Math.floor(now - (config.hoursAfterWarningExpires * MILLISECONDS_IN_HOUR))],
)); ));

View File

@@ -0,0 +1,4 @@
export enum WarningType {
SponsorBlock = 0,
DeArrow = 1
}

View File

@@ -7,7 +7,7 @@ import { client } from "../utils/httpClient";
describe("postWarning", () => { describe("postWarning", () => {
// constants // constants
const endpoint = "/api/warnUser"; const endpoint = "/api/warnUser";
const getWarning = (userID: string) => db.prepare("get", `SELECT "userID", "issueTime", "issuerUserID", enabled, "reason" FROM warnings WHERE "userID" = ?`, [userID]); const getWarning = (userID: string, type = 0) => db.prepare("get", `SELECT "userID", "issueTime", "issuerUserID", enabled, "reason" FROM warnings WHERE "userID" = ? AND "type" = ?`, [userID, type]);
const warneduserID = "warning-0"; const warneduserID = "warning-0";
const warnedUserPublicID = getHash(warneduserID); const warnedUserPublicID = getHash(warneduserID);