fix: clamp counter values in config

This commit is contained in:
Dragory 2024-01-27 14:57:57 +02:00
parent 48507499bc
commit 6840fb4646
No known key found for this signature in database
3 changed files with 10 additions and 6 deletions

View file

@ -12,7 +12,8 @@ import { CounterValue } from "./entities/CounterValue";
const DELETE_UNUSED_COUNTERS_AFTER = 1 * DAYS; const DELETE_UNUSED_COUNTERS_AFTER = 1 * DAYS;
const DELETE_UNUSED_COUNTER_TRIGGERS_AFTER = 1 * DAYS; const DELETE_UNUSED_COUNTER_TRIGGERS_AFTER = 1 * DAYS;
const MAX_COUNTER_VALUE = 2147483647; // 2^31-1, for MySQL INT export const MIN_COUNTER_VALUE = 0;
export const MAX_COUNTER_VALUE = 2147483647; // 2^31-1, for MySQL INT
const decayQueue = new Queue(); const decayQueue = new Queue();
@ -115,7 +116,9 @@ export class GuildCounters extends BaseGuildRepository {
userId = userId || "0"; userId = userId || "0";
const rawUpdate = const rawUpdate =
change >= 0 ? `value = LEAST(value + ${change}, ${MAX_COUNTER_VALUE})` : `value = GREATEST(value ${change}, 0)`; change >= 0
? `value = LEAST(value + ${change}, ${MAX_COUNTER_VALUE})`
: `value = GREATEST(value ${change}, ${MIN_COUNTER_VALUE})`;
await this.counterValues.query( await this.counterValues.query(
` `
@ -173,7 +176,7 @@ export class GuildCounters extends BaseGuildRepository {
const rawUpdate = const rawUpdate =
decayAmountToApply >= 0 decayAmountToApply >= 0
? `GREATEST(value - ${decayAmountToApply}, 0)` ? `GREATEST(value - ${decayAmountToApply}, ${MIN_COUNTER_VALUE})`
: `LEAST(value + ${Math.abs(decayAmountToApply)}, ${MAX_COUNTER_VALUE})`; : `LEAST(value + ${Math.abs(decayAmountToApply)}, ${MAX_COUNTER_VALUE})`;
// Using an UPDATE with ORDER BY in an attempt to avoid deadlocks from simultaneous decays // Using an UPDATE with ORDER BY in an attempt to avoid deadlocks from simultaneous decays

View file

@ -1,4 +1,5 @@
import z from "zod"; import z from "zod";
import { MAX_COUNTER_VALUE, MIN_COUNTER_VALUE } from "../../../data/GuildCounters";
import { zBoundedCharacters } from "../../../utils"; import { zBoundedCharacters } from "../../../utils";
import { CountersPlugin } from "../../Counters/CountersPlugin"; import { CountersPlugin } from "../../Counters/CountersPlugin";
import { LogsPlugin } from "../../Logs/LogsPlugin"; import { LogsPlugin } from "../../Logs/LogsPlugin";
@ -7,7 +8,7 @@ import { automodAction } from "../helpers";
export const SetCounterAction = automodAction({ export const SetCounterAction = automodAction({
configSchema: z.strictObject({ configSchema: z.strictObject({
counter: zBoundedCharacters(0, 100), counter: zBoundedCharacters(0, 100),
value: z.number(), value: z.number().min(MIN_COUNTER_VALUE).max(MAX_COUNTER_VALUE),
}), }),
async apply({ pluginData, contexts, actionConfig, ruleName }) { async apply({ pluginData, contexts, actionConfig, ruleName }) {

View file

@ -1,7 +1,7 @@
import { EventEmitter } from "events"; import { EventEmitter } from "events";
import { BasePluginType } from "knub"; import { BasePluginType } from "knub";
import z from "zod"; import z from "zod";
import { GuildCounters } from "../../data/GuildCounters"; import { GuildCounters, MAX_COUNTER_VALUE, MIN_COUNTER_VALUE } from "../../data/GuildCounters";
import { import {
CounterTrigger, CounterTrigger,
buildCounterConditionString, buildCounterConditionString,
@ -93,7 +93,7 @@ export const zCounter = z.strictObject({
pretty_name: zBoundedCharacters(0, 100).nullable().default(null), pretty_name: zBoundedCharacters(0, 100).nullable().default(null),
per_channel: z.boolean().default(false), per_channel: z.boolean().default(false),
per_user: z.boolean().default(false), per_user: z.boolean().default(false),
initial_value: z.number().default(0), initial_value: z.number().min(MIN_COUNTER_VALUE).max(MAX_COUNTER_VALUE).default(0),
triggers: zBoundedRecord(z.record(zBoundedCharacters(0, 100), zTriggerInput), 1, MAX_TRIGGERS_PER_COUNTER), triggers: zBoundedRecord(z.record(zBoundedCharacters(0, 100), zTriggerInput), 1, MAX_TRIGGERS_PER_COUNTER),
decay: z decay: z
.strictObject({ .strictObject({