From 61dcfeb69ff131b1db9a252dddf69c7d2509eae8 Mon Sep 17 00:00:00 2001 From: mini-bomba <55105495+mini-bomba@users.noreply.github.com> Date: Sat, 3 Aug 2024 21:10:06 +0200 Subject: [PATCH 1/3] Don't send to #dearrow-locked-titles when downvoting unlocked title voteType passed to sendWebhooks() function to avoid confusion in the future should someone forget about the if statement --- src/routes/postBranding.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/routes/postBranding.ts b/src/routes/postBranding.ts index 33128e7..7fa2e6b 100644 --- a/src/routes/postBranding.ts +++ b/src/routes/postBranding.ts @@ -113,7 +113,7 @@ export async function postBranding(req: Request, res: Response) { await db.prepare("run", `UPDATE "titleVotes" as tv SET "locked" = 0 FROM "titles" t WHERE tv."UUID" = t."UUID" AND tv."UUID" != ? AND t."videoID" = ?`, [UUID, videoID]); } - sendWebhooks(videoID, UUID).catch((e) => Logger.error(e)); + sendWebhooks(videoID, UUID, voteType).catch((e) => Logger.error(e)); } })(), (async () => { if (thumbnail) { @@ -290,7 +290,9 @@ export async function verifyOldSubmissions(hashedUserID: HashedUserID, verificat } } -async function sendWebhooks(videoID: VideoID, UUID: BrandingUUID) { +async function sendWebhooks(videoID: VideoID, UUID: BrandingUUID, voteType: BrandingVoteType) { + if (voteType === BrandingVoteType.Downvote) return; // Don't send messages to dearrow-locked-titles on downvotes + const lockedSubmission = await db.prepare("get", `SELECT "titleVotes"."votes", "titles"."title", "titles"."userID" FROM "titles" JOIN "titleVotes" ON "titles"."UUID" = "titleVotes"."UUID" WHERE "titles"."videoID" = ? AND "titles"."UUID" != ? AND "titleVotes"."locked" = 1`, [videoID, UUID]); if (lockedSubmission) { @@ -336,4 +338,4 @@ async function checkForWrongVideoDuration(videoID: VideoID, duration: number): P const apiDuration = apiVideoDetails?.duration; return apiDuration && apiDuration > 2 && duration && duration > 2 && Math.abs(apiDuration - duration) > 3; -} \ No newline at end of file +} From 72086b01957b8ff1fe4b947946a795d9e89d592b Mon Sep 17 00:00:00 2001 From: mini-bomba <55105495+mini-bomba@users.noreply.github.com> Date: Sat, 3 Aug 2024 21:38:30 +0200 Subject: [PATCH 2/3] Send webhook messages when a locked title is downvoted also take downvotes & verification into consideration when comparing titles in webhook code --- src/routes/postBranding.ts | 46 ++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) diff --git a/src/routes/postBranding.ts b/src/routes/postBranding.ts index 7fa2e6b..039b788 100644 --- a/src/routes/postBranding.ts +++ b/src/routes/postBranding.ts @@ -85,6 +85,7 @@ export async function postBranding(req: Request, res: Response) { const existingIsLocked = !!existingUUID && (await db.prepare("get", `SELECT "locked" from "titleVotes" where "UUID" = ?`, [existingUUID]))?.locked; if (existingUUID != undefined && isBanned) return; // ignore votes on existing details from banned users if (downvote && existingIsLocked && !isVip) { + sendWebhooks(videoID, existingUUID, voteType).catch((e) => Logger.error(e)); errorCode = 403; return; } @@ -291,15 +292,14 @@ export async function verifyOldSubmissions(hashedUserID: HashedUserID, verificat } async function sendWebhooks(videoID: VideoID, UUID: BrandingUUID, voteType: BrandingVoteType) { - if (voteType === BrandingVoteType.Downvote) return; // Don't send messages to dearrow-locked-titles on downvotes + const currentSubmission = await db.prepare("get", `SELECT "titleVotes"."votes", "titles"."title", "titleVotes"."locked", "titles"."userID", "titleVotes"."votes"-"titleVotes"."downvotes"+"titleVotes"."verification" AS "score" FROM "titles" JOIN "titleVotes" ON "titles"."UUID" = "titleVotes"."UUID" WHERE "titles"."UUID" = ?`, [UUID]); - const lockedSubmission = await db.prepare("get", `SELECT "titleVotes"."votes", "titles"."title", "titles"."userID" FROM "titles" JOIN "titleVotes" ON "titles"."UUID" = "titleVotes"."UUID" WHERE "titles"."videoID" = ? AND "titles"."UUID" != ? AND "titleVotes"."locked" = 1`, [videoID, UUID]); - - if (lockedSubmission) { - const currentSubmission = await db.prepare("get", `SELECT "titleVotes"."votes", "titles"."title" FROM "titles" JOIN "titleVotes" ON "titles"."UUID" = "titleVotes"."UUID" WHERE "titles"."UUID" = ?`, [UUID]); + // Unlocked title getting more upvotes than the locked one + if (voteType === BrandingVoteType.Upvote) { + const lockedSubmission = await db.prepare("get", `SELECT "titleVotes"."votes", "titles"."title", "titles"."userID", "titleVotes"."votes"-"titleVotes"."downvotes"+"titleVotes"."verification" AS "score" FROM "titles" JOIN "titleVotes" ON "titles"."UUID" = "titleVotes"."UUID" WHERE "titles"."videoID" = ? AND "titles"."UUID" != ? AND "titleVotes"."locked" = 1`, [videoID, UUID]); // Time to warn that there may be an issue - if (currentSubmission.votes - lockedSubmission.votes > 2) { + if (lockedSubmission && currentSubmission.score - lockedSubmission.score > 2) { const usernameRow = await db.prepare("get", `SELECT "userName" FROM "userNames" WHERE "userID" = ?`, [lockedSubmission.userID]); const data = await getVideoDetails(videoID); @@ -307,7 +307,7 @@ async function sendWebhooks(videoID: VideoID, UUID: BrandingUUID, voteType: Bran "embeds": [{ "title": data?.title, "url": `https://www.youtube.com/watch?v=${videoID}`, - "description": `**${lockedSubmission.votes}** Votes vs **${currentSubmission.votes}**\ + "description": `**${lockedSubmission.score}** score vs **${currentSubmission.score}**\ \n\n**Locked title:** ${lockedSubmission.title}\ \n**New title:** ${currentSubmission.title}\ \n\n**Submitted by:** ${usernameRow?.userName ?? ""}\n${lockedSubmission.userID}`, @@ -331,6 +331,38 @@ async function sendWebhooks(videoID: VideoID, UUID: BrandingUUID, voteType: Bran }); } } + + // Downvotes on locked title + if (voteType === BrandingVoteType.Downvote && currentSubmission.locked === 1) { + const usernameRow = await db.prepare("get", `SELECT "userName" FROM "userNames" WHERE "userID" = ?`, [currentSubmission.userID]); + + const data = await getVideoDetails(videoID); + axios.post(config.discordDeArrowLockedWebhookURL, { + "embeds": [{ + "title": data?.title, + "url": `https://www.youtube.com/watch?v=${videoID}`, + "description": `Locked title with **${currentSubmission.score}** score received a downvote\ + \n\n**Locked title:** ${currentSubmission.title}\ + \n**Submitted by:** ${usernameRow?.userName ?? ""}\n${currentSubmission.userID}`, + "color": 10813440, + "thumbnail": { + "url": getMaxResThumbnail(videoID), + }, + }], + }) + .then(res => { + if (res.status >= 400) { + Logger.error("Error sending reported submission Discord hook"); + Logger.error(JSON.stringify((res.data))); + Logger.error("\n"); + } + }) + .catch(err => { + Logger.error("Failed to send reported submission Discord hook."); + Logger.error(JSON.stringify(err)); + Logger.error("\n"); + }); + } } async function checkForWrongVideoDuration(videoID: VideoID, duration: number): Promise { From 380ec8d0caaf792fa5ed42ff6739dfddb38224f8 Mon Sep 17 00:00:00 2001 From: mini-bomba <55105495+mini-bomba@users.noreply.github.com> Date: Sat, 3 Aug 2024 22:01:46 +0200 Subject: [PATCH 3/3] Reformat SQL code in postBranding.ts webhook code --- src/routes/postBranding.ts | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/routes/postBranding.ts b/src/routes/postBranding.ts index 039b788..d45d6d0 100644 --- a/src/routes/postBranding.ts +++ b/src/routes/postBranding.ts @@ -292,11 +292,30 @@ export async function verifyOldSubmissions(hashedUserID: HashedUserID, verificat } async function sendWebhooks(videoID: VideoID, UUID: BrandingUUID, voteType: BrandingVoteType) { - const currentSubmission = await db.prepare("get", `SELECT "titleVotes"."votes", "titles"."title", "titleVotes"."locked", "titles"."userID", "titleVotes"."votes"-"titleVotes"."downvotes"+"titleVotes"."verification" AS "score" FROM "titles" JOIN "titleVotes" ON "titles"."UUID" = "titleVotes"."UUID" WHERE "titles"."UUID" = ?`, [UUID]); + const currentSubmission = await db.prepare( + "get", + `SELECT + "titles"."title", + "titleVotes"."locked", + "titles"."userID", + "titleVotes"."votes"-"titleVotes"."downvotes"+"titleVotes"."verification" AS "score" + FROM "titles" JOIN "titleVotes" ON "titles"."UUID" = "titleVotes"."UUID" + WHERE "titles"."UUID" = ?`, + [UUID]); // Unlocked title getting more upvotes than the locked one if (voteType === BrandingVoteType.Upvote) { - const lockedSubmission = await db.prepare("get", `SELECT "titleVotes"."votes", "titles"."title", "titles"."userID", "titleVotes"."votes"-"titleVotes"."downvotes"+"titleVotes"."verification" AS "score" FROM "titles" JOIN "titleVotes" ON "titles"."UUID" = "titleVotes"."UUID" WHERE "titles"."videoID" = ? AND "titles"."UUID" != ? AND "titleVotes"."locked" = 1`, [videoID, UUID]); + const lockedSubmission = await db.prepare( + "get", + `SELECT + "titles"."title", + "titles"."userID", + "titleVotes"."votes"-"titleVotes"."downvotes"+"titleVotes"."verification" AS "score" + FROM "titles" JOIN "titleVotes" ON "titles"."UUID" = "titleVotes"."UUID" + WHERE "titles"."videoID" = ? + AND "titles"."UUID" != ? + AND "titleVotes"."locked" = 1`, + [videoID, UUID]); // Time to warn that there may be an issue if (lockedSubmission && currentSubmission.score - lockedSubmission.score > 2) {