From 5c2c3fbb535e13697fa7bc72ec0983553161fd50 Mon Sep 17 00:00:00 2001 From: qwerinope Date: Tue, 9 Sep 2025 01:10:03 +0200 Subject: [PATCH] added basic aniv timeouts --- src/db/connection.ts | 8 ++++++++ src/db/dbAnivTimeouts.ts | 14 ++++++++++++++ src/events/message.ts | 4 ++++ src/lib/handleAnivMessage.ts | 19 +++++++++++++++++++ 4 files changed, 45 insertions(+) create mode 100644 src/db/dbAnivTimeouts.ts create mode 100644 src/lib/handleAnivMessage.ts diff --git a/src/db/connection.ts b/src/db/connection.ts index 204c380..3bd016a 100644 --- a/src/db/connection.ts +++ b/src/db/connection.ts @@ -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; collection(idOrName: 'users'): RecordService; @@ -54,6 +61,7 @@ interface TypedPocketBase extends PocketBase { collection(idOrName: 'timeouts'): RecordService; collection(idOrName: 'cheerEvents'): RecordService; collection(idOrName: 'cheers'): RecordService; + collection(idOrName: 'anivTimeouts'): RecordService; }; export default new PocketBase(pocketbaseurl).autoCancellation(false) as TypedPocketBase; diff --git a/src/db/dbAnivTimeouts.ts b/src/db/dbAnivTimeouts.ts new file mode 100644 index 0000000..c070630 --- /dev/null +++ b/src/db/dbAnivTimeouts.ts @@ -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); + }; +}; diff --git a/src/events/message.ts b/src/events/message.ts index 497a923..54f213c 100644 --- a/src/events/message.ts +++ b/src/events/message.ts @@ -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]!; diff --git a/src/lib/handleAnivMessage.ts b/src/lib/handleAnivMessage.ts new file mode 100644 index 0000000..a538fac --- /dev/null +++ b/src/lib/handleAnivMessage.ts @@ -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) + ]); +};