From 7151b223d6aedad8510039e9befba6ab8f2368db Mon Sep 17 00:00:00 2001 From: sherlocksometimes Date: Fri, 17 May 2024 16:16:51 -0500 Subject: [PATCH 1/2] feat: add config to set scanner cooldown by role Allow users to set specific cooldown by roles --- packages/types/lib/server.d.ts | 1 + server/src/configs/default.json | 4 +++- server/src/graphql/resolvers.js | 16 ++++++++++------ server/src/services/DiscordClient.js | 27 +++++++++++++++++++++++---- server/src/services/TelegramClient.js | 18 ++++++++++++++++++ server/src/services/config.js | 8 ++++++++ 6 files changed, 63 insertions(+), 11 deletions(-) diff --git a/packages/types/lib/server.d.ts b/packages/types/lib/server.d.ts index 71b8a97c7..3b5f01e90 100644 --- a/packages/types/lib/server.d.ts +++ b/packages/types/lib/server.d.ts @@ -174,6 +174,7 @@ export interface Permissions { scanner: string[] areaRestrictions: string[] webhooks: string[] + scannerCooldowns: Record } export interface Waypoint { diff --git a/server/src/configs/default.json b/server/src/configs/default.json index 0e3524d38..5f49d0455 100644 --- a/server/src/configs/default.json +++ b/server/src/configs/default.json @@ -615,6 +615,7 @@ "pokemon": false, "gmf": true, "scanNextInstance": "scanNext", + "rules": [], "scanNextDevice": "Device01", "scanNextSleeptime": 5, "userCooldownSeconds": 0, @@ -634,6 +635,7 @@ "gmf": false, "scanZoneMaxSize": 10, "userCooldownSeconds": 0, + "rules": [], "advancedScanZoneOptions": false, "scanZoneRadius": { "pokemon": 70, @@ -1025,4 +1027,4 @@ "tracesSampleRate": 0.1 } } -} \ No newline at end of file +} diff --git a/server/src/graphql/resolvers.js b/server/src/graphql/resolvers.js index 0b4ad74fa..389cad69d 100644 --- a/server/src/graphql/resolvers.js +++ b/server/src/graphql/resolvers.js @@ -384,7 +384,9 @@ const resolvers = { gymRadius: scanner.scanZone.scanZoneRadius.gym, spacing: scanner.scanZone.scanZoneSpacing, maxSize: scanner.scanZone.scanZoneMaxSize, - cooldown: scanner.scanZone.userCooldownSeconds, + cooldown: + perms?.scannerCooldowns?.[mode] ?? + scanner.scanZone.userCooldownSeconds, refreshQueue: scanner.backendConfig.queueRefreshInterval, enabled: scanner[mode].enabled, } @@ -392,7 +394,9 @@ const resolvers = { scannerType: scanner.backendConfig.platform, showScanCount: scanner.scanNext.showScanCount, showScanQueue: scanner.scanNext.showScanQueue, - cooldown: scanner.scanNext.userCooldownSeconds, + cooldown: + perms?.scannerCooldowns?.[mode] ?? + scanner.scanNext.userCooldownSeconds, refreshQueue: scanner.backendConfig.queueRefreshInterval, enabled: scanner[mode].enabled, } @@ -597,11 +601,11 @@ const resolvers = { (!req.session.cooldown || req.session.cooldown < Date.now()) ) { const validCoords = getValidCoords(category, data?.scanCoords, perms) - + const cooldownSeconds = + perms?.scannerCooldowns?.[category] || + config.getSafe(`scanner.${category}.userCooldownSeconds`) const cooldown = - config.getSafe(`scanner.${category}.userCooldownSeconds`) * - validCoords.filter(Boolean).length * - 1000 + + cooldownSeconds * validCoords.filter(Boolean).length * 1000 + Date.now() req.session.cooldown = cooldown return scannerApi( diff --git a/server/src/services/DiscordClient.js b/server/src/services/DiscordClient.js index e81cf5c42..d132a7800 100644 --- a/server/src/services/DiscordClient.js +++ b/server/src/services/DiscordClient.js @@ -131,15 +131,20 @@ class DiscordClient { blockedGuildNames: new Set(), } const scanner = config.getSafe('scanner') + perms.scannerCooldowns = {} + try { const guilds = user.guilds.map((guild) => guild.id) if (this.strategy.allowedUsers.includes(user.id)) { Object.keys(this.perms).forEach((key) => (perms[key] = true)) perms.admin = true config.getSafe('webhooks').forEach((x) => permSets.webhooks.add(x.name)) - Object.keys(scanner).forEach( - (x) => scanner[x]?.enabled && permSets.scanner.add(x), - ) + Object.keys(scanner).forEach((x) => { + if (scanner[x]?.enabled) { + permSets.scanner.add(x) + perms.scannerCooldowns[x] = 0 + } + }) log.info( HELPERS.custom(this.rmStrategy, '#7289da'), `User ${user.username} (${user.id}) in allowed users list, skipping guild and role check.`, @@ -188,7 +193,21 @@ class DiscordClient { (x) => permSets.webhooks.add(x), ) scannerPerms(userRoles, 'discordRoles', trialActive).forEach( - (x) => permSets.scanner.add(x), + (x) => { + permSets.scanner.add(x) + perms.scannerCooldowns[x] = scanner[x].rules.reduce( + (acc, rule) => { + if ( + userRoles.includes(rule?.role) && + rule.cooldown < acc + ) { + return rule.cooldown + } + return acc + }, + scanner[x].userCooldownSeconds, + ) + }, ) } }), diff --git a/server/src/services/TelegramClient.js b/server/src/services/TelegramClient.js index ecd8573f5..d4db45796 100644 --- a/server/src/services/TelegramClient.js +++ b/server/src/services/TelegramClient.js @@ -112,10 +112,28 @@ class TelegramClient { areaRestrictions: areaPerms(groups), webhooks: webhookPerms(groups, 'telegramGroups', trialActive), scanner: scannerPerms(groups, 'telegramGroups', trialActive), + scannerCooldowns: {}, }, } if (this.strategy.allowedUsers?.includes(newUserObj.id)) { newUserObj.perms.admin = true + Object.keys(newUserObj.perms.scanner).forEach((x) => { + newUserObj.perms.scannerCooldowns[x] = 0 + }) + } else { + const scanner = config.getSafe('scanner') + + Object.keys(newUserObj.perms.scanner).forEach((mode) => { + newUserObj.perms.scannerCooldowns[mode] = scanner[mode].rules.reduce( + (acc, rule) => { + if (rule.cooldown < acc) { + return rule.cooldown + } + return acc + }, + scanner[mode].userCooldownSeconds, + ) + }) } return newUserObj } diff --git a/server/src/services/config.js b/server/src/services/config.js index 10003c23f..9c6140e26 100644 --- a/server/src/services/config.js +++ b/server/src/services/config.js @@ -340,6 +340,14 @@ if (Array.isArray(config.webhooks)) { } Object.keys(config.scanner || {}).forEach((key) => { config.scanner[key] = replaceBothAliases(config.scanner[key] || {}) + config.scanner[key]?.rules?.forEach((rule) => { + rule.role = replaceAliases(rule.role) + }) + if (config.scanner[key]?.rules) { + config.scanner[key].rulesObj = Object.fromEntries( + config.scanner[key]?.rules?.map((rule) => [rule.role, rule.cooldown]), + ) + } }) if ( From bf9d3f689f161d4803d882e7dc5a3b3f4b216b40 Mon Sep 17 00:00:00 2001 From: Sherlock Sometimes Date: Sun, 27 Oct 2024 13:39:31 -0500 Subject: [PATCH 2/2] Prettier Format DiscordClient.js --- server/src/services/DiscordClient.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/server/src/services/DiscordClient.js b/server/src/services/DiscordClient.js index 6d9d2c2fa..285a915b5 100644 --- a/server/src/services/DiscordClient.js +++ b/server/src/services/DiscordClient.js @@ -143,12 +143,12 @@ class DiscordClient extends AuthClient { Object.keys(this.perms).forEach((key) => (perms[key] = true)) perms.admin = true config.getSafe('webhooks').forEach((x) => permSets.webhooks.add(x.name)) - Object.keys(scanner).forEach( - (x) => { - if (scanner[x]?.enabled) { - permSets.scanner.add(x) - perms.scannerCooldowns[x] = 0 - }}) + Object.keys(scanner).forEach((x) => { + if (scanner[x]?.enabled) { + permSets.scanner.add(x) + perms.scannerCooldowns[x] = 0 + } + }) this.log.debug( `User ${user.username} (${user.id}) in allowed users list, skipping guild and role check.`, )