mirror of
https://github.com/ajayyy/SponsorBlockServer.git
synced 2025-12-14 15:37:07 +03:00
Merge pull request #210 from MRuy/feat/limit-reward-time-per-segment
Limit reward time per segment
This commit is contained in:
@@ -39,6 +39,7 @@
|
|||||||
"statusCode": 200
|
"statusCode": 200
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"maxRewardTimePerSegmentInSeconds": 86400, // maximum time a user get rewarded in the leaderboard for a single segment
|
||||||
"dumpDatabase": {
|
"dumpDatabase": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"minTimeBetweenMs": 60000, // 1 minute between dumps
|
"minTimeBetweenMs": 60000, // 1 minute between dumps
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ addDefaults(config, {
|
|||||||
},
|
},
|
||||||
userCounterURL: null,
|
userCounterURL: null,
|
||||||
youtubeAPIKey: null,
|
youtubeAPIKey: null,
|
||||||
|
maxRewardTimePerSegmentInSeconds: 86400,
|
||||||
postgres: null,
|
postgres: null,
|
||||||
dumpDatabase: {
|
dumpDatabase: {
|
||||||
enabled: true,
|
enabled: true,
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
import {db} from '../databases/databases';
|
import {db} from '../databases/databases';
|
||||||
import {Request, Response} from 'express';
|
import {Request, Response} from 'express';
|
||||||
import {getHash} from '../utils/getHash';
|
import {getHash} from '../utils/getHash';
|
||||||
|
import {config} from '../config';
|
||||||
import { Logger } from '../utils/logger';
|
import { Logger } from '../utils/logger';
|
||||||
|
|
||||||
|
const maxRewardTimePerSegmentInSeconds = config.maxRewardTimePerSegmentInSeconds ?? 86400;
|
||||||
|
|
||||||
export async function getSavedTimeForUser(req: Request, res: Response) {
|
export async function getSavedTimeForUser(req: Request, res: Response) {
|
||||||
let userID = req.query.userID as string;
|
let userID = req.query.userID as string;
|
||||||
|
|
||||||
@@ -16,7 +19,7 @@ export async function getSavedTimeForUser(req: Request, res: Response) {
|
|||||||
userID = getHash(userID);
|
userID = getHash(userID);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
let row = await db.prepare("get", 'SELECT SUM(("endTime" - "startTime") / 60 * "views") as "minutesSaved" FROM "sponsorTimes" WHERE "userID" = ? AND "votes" > -1 AND "shadowHidden" != 1 ', [userID]);
|
let row = await db.prepare("get", 'SELECT SUM(((CASE WHEN "endTime" - "startTime" > ' + maxRewardTimePerSegmentInSeconds + ' THEN ' + maxRewardTimePerSegmentInSeconds + ' ELSE "endTime" - "startTime" END) / 60) * "views") as "minutesSaved" FROM "sponsorTimes" WHERE "userID" = ? AND "votes" > -1 AND "shadowHidden" != 1 ', [userID]);
|
||||||
|
|
||||||
if (row.minutesSaved != null) {
|
if (row.minutesSaved != null) {
|
||||||
res.send({
|
res.send({
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import {Request, Response} from 'express';
|
|||||||
|
|
||||||
const MILLISECONDS_IN_MINUTE = 60000;
|
const MILLISECONDS_IN_MINUTE = 60000;
|
||||||
const getTopUsersWithCache = createMemoryCache(generateTopUsersStats, config.getTopUsersCacheTimeMinutes * MILLISECONDS_IN_MINUTE);
|
const getTopUsersWithCache = createMemoryCache(generateTopUsersStats, config.getTopUsersCacheTimeMinutes * MILLISECONDS_IN_MINUTE);
|
||||||
|
const maxRewardTimePerSegmentInSeconds = config.maxRewardTimePerSegmentInSeconds ?? 86400;
|
||||||
|
|
||||||
async function generateTopUsersStats(sortBy: string, categoryStatsEnabled: boolean = false) {
|
async function generateTopUsersStats(sortBy: string, categoryStatsEnabled: boolean = false) {
|
||||||
const userNames = [];
|
const userNames = [];
|
||||||
@@ -24,14 +25,14 @@ async function generateTopUsersStats(sortBy: string, categoryStatsEnabled: boole
|
|||||||
}
|
}
|
||||||
|
|
||||||
const rows = await db.prepare('all', `SELECT COUNT(*) as "totalSubmissions", SUM(views) as "viewCount",
|
const rows = await db.prepare('all', `SELECT COUNT(*) as "totalSubmissions", SUM(views) as "viewCount",
|
||||||
SUM(("sponsorTimes"."endTime" - "sponsorTimes"."startTime") / 60 * "sponsorTimes"."views") as "minutesSaved",
|
SUM(((CASE WHEN "sponsorTimes"."endTime" - "sponsorTimes"."startTime" > ${maxRewardTimePerSegmentInSeconds} THEN ${maxRewardTimePerSegmentInSeconds} ELSE "sponsorTimes"."endTime" - "sponsorTimes"."startTime" END) / 60) * "sponsorTimes"."views") as "minutesSaved",
|
||||||
SUM("votes") as "userVotes", ` +
|
SUM("votes") as "userVotes", ` +
|
||||||
additionalFields +
|
additionalFields +
|
||||||
`IFNULL("userNames"."userName", "sponsorTimes"."userID") as "userName" FROM "sponsorTimes" LEFT JOIN "userNames" ON "sponsorTimes"."userID"="userNames"."userID"
|
`IFNULL("userNames"."userName", "sponsorTimes"."userID") as "userName" FROM "sponsorTimes" LEFT JOIN "userNames" ON "sponsorTimes"."userID"="userNames"."userID"
|
||||||
LEFT JOIN "privateDB"."shadowBannedUsers" ON "sponsorTimes"."userID"="privateDB"."shadowBannedUsers"."userID"
|
LEFT JOIN "privateDB"."shadowBannedUsers" ON "sponsorTimes"."userID"="privateDB"."shadowBannedUsers"."userID"
|
||||||
WHERE "sponsorTimes"."votes" > -1 AND "sponsorTimes"."shadowHidden" != 1 AND "privateDB"."shadowBannedUsers"."userID" IS NULL
|
WHERE "sponsorTimes"."votes" > -1 AND "sponsorTimes"."shadowHidden" != 1 AND "privateDB"."shadowBannedUsers"."userID" IS NULL
|
||||||
GROUP BY IFNULL("userName", "sponsorTimes"."userID") HAVING "userVotes" > 20
|
GROUP BY IFNULL("userName", "sponsorTimes"."userID") HAVING "userVotes" > 20
|
||||||
ORDER BY "` + sortBy + `" DESC LIMIT 100`, []);
|
ORDER BY "${sortBy}" DESC LIMIT 100`, []);
|
||||||
|
|
||||||
for (let i = 0; i < rows.length; i++) {
|
for (let i = 0; i < rows.length; i++) {
|
||||||
userNames[i] = rows[i].userName;
|
userNames[i] = rows[i].userName;
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ export interface SBSConfig {
|
|||||||
minimumPrefix?: string;
|
minimumPrefix?: string;
|
||||||
maximumPrefix?: string;
|
maximumPrefix?: string;
|
||||||
redis?: redis.ClientOpts;
|
redis?: redis.ClientOpts;
|
||||||
|
maxRewardTimePerSegmentInSeconds?: number;
|
||||||
postgres?: PoolConfig;
|
postgres?: PoolConfig;
|
||||||
dumpDatabase?: DumpDatabase;
|
dumpDatabase?: DumpDatabase;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user