added basic aniv timeouts

This commit is contained in:
2025-09-09 01:10:03 +02:00
parent 61da0fd6e0
commit 5c2c3fbb53
4 changed files with 45 additions and 0 deletions

View File

@@ -47,6 +47,13 @@ export type cheerRecord = {
amount: number;
};
export type anivTimeoutRecord = {
id?: string;
message: string;
user: string;
duration: number;
};
interface TypedPocketBase extends PocketBase {
collection(idOrName: 'auth'): RecordService<authRecord>;
collection(idOrName: 'users'): RecordService<userRecord>;
@@ -54,6 +61,7 @@ interface TypedPocketBase extends PocketBase {
collection(idOrName: 'timeouts'): RecordService<timeoutRecord>;
collection(idOrName: 'cheerEvents'): RecordService<cheerEventRecord>;
collection(idOrName: 'cheers'): RecordService<cheerRecord>;
collection(idOrName: 'anivTimeouts'): RecordService<anivTimeoutRecord>;
};
export default new PocketBase(pocketbaseurl).autoCancellation(false) as TypedPocketBase;

14
src/db/dbAnivTimeouts.ts Normal file
View File

@@ -0,0 +1,14 @@
import pocketbase from "db/connection";
import User from "user";
import logger from "lib/logger";
const pb = pocketbase.collection('anivTimeouts');
export async function createAnivTimeoutRecord(message: string, user: User, duration: number) {
try {
await pb.create({ message, user: user.id, duration });
} catch (e) {
logger.err(`Failed to create anivTimeoutRecord: user: ${user.displayName} message: "${message}" duration: ${duration}`);
logger.err(e as string);
};
};

View File

@@ -10,6 +10,7 @@ import { addMessageToChatWidget } from "web/chatWidget/message";
import { isInvuln, setTemporaryInvuln } from "lib/invuln";
import { getUserRecord } from "db/dbUser";
import { createCheerRecord } from "db/dbCheers";
import handleAnivMessage from "lib/handleAnivMessage";
logger.info(`Loaded the following commands: ${commands.keys().toArray().join(', ')}`);
@@ -41,6 +42,9 @@ async function parseChatMessage(msg: EventSubChannelChatMessageEvent) {
};
async function handleChatMessage(msg: EventSubChannelChatMessageEvent, user: User) {
// Aniv message filter
handleAnivMessage(msg, user);
// Parse commands:
if (msg.messageText.startsWith(commandPrefix)) {
const commandSelection = msg.messageText.slice(commandPrefix.length).split(' ')[0]!;

View File

@@ -0,0 +1,19 @@
import { EventSubChannelChatMessageEvent } from "@twurple/eventsub-base"
import { redis } from "bun";
import type User from "user";
import { timeout } from "lib/timeout";
import { sendMessage } from "commands";
import { createAnivTimeoutRecord } from "db/dbAnivTimeouts";
const ANIVNAMES = ['a_n_e_e_v', 'a_n_i_v', 'a_c_a_c'];
export default async function handleMessage(msg: EventSubChannelChatMessageEvent, user: User) {
if (ANIVNAMES.includes(user.displayName)) {
await redis.set('lastanivmessage', msg.messageText);
await redis.expire('lastanivmessage', 120); // store for 2 minutes
} else if (msg.messageText === await redis.get('lastanivmessage')) await Promise.all([
timeout(user, 'copied an aniv message', 30),
sendMessage(`${user.displayName} got timed out for copying an a_n_e_e_v message`),
createAnivTimeoutRecord(msg.messageText, user, 30)
]);
};