From f243677c5c2e652c012208636fe505bf89948618 Mon Sep 17 00:00:00 2001 From: qwerinope Date: Tue, 9 Sep 2025 23:56:53 +0200 Subject: [PATCH] add onRaided event and now ignoring chatters from shared chats --- src/events/message.ts | 2 +- src/events/raid.ts | 16 ++++++++++++++++ src/events/streamState.ts | 7 +++++-- src/index.ts | 2 +- 4 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 src/events/raid.ts diff --git a/src/events/message.ts b/src/events/message.ts index 54f213c..bdba2c0 100644 --- a/src/events/message.ts +++ b/src/events/message.ts @@ -31,7 +31,7 @@ async function parseChatMessage(msg: EventSubChannelChatMessageEvent) { if (!await isInvuln(user?.id!)) user?.setVulnerable(); // Make the user vulnerable to explosions if not marked as invuln - if (!await redis.exists(`user:${user?.id}:haschatted`)) { + if (!await redis.exists(`user:${user?.id}:haschatted`) && !msg.sourceMessageId) { await sendMessage(`Welcome ${user?.displayName}. Please note: This chat has PvP, if you get timed out that's part of the qwerinope experience. You have 10 minutes of invincibility. A full list of commands and items can be found here: https://github.com/qwerinope/qweribot/#qweribot`); await redis.set(`user:${user?.id}:haschatted`, "1"); if (!streamerUsers.includes(msg.chatterId)) await setTemporaryInvuln(user?.id!); // This would set the invuln expiration lmao diff --git a/src/events/raid.ts b/src/events/raid.ts new file mode 100644 index 0000000..68e5ba2 --- /dev/null +++ b/src/events/raid.ts @@ -0,0 +1,16 @@ +import { redis } from "bun"; +import { sendMessage } from "commands"; +import { getUserRecord } from "db/dbUser"; +import { changeItemCount } from "items"; +import { eventSub, streamerApi, streamerId } from "main"; +import User from "user"; + +eventSub.onChannelRaidTo(streamerId, async msg => { + await sendMessage(`Ty for raiding ${msg.raidingBroadcasterDisplayName}. You get 10 minutes of invulnerability and 3 pieces of TNT. Enjoy!`); + await streamerApi.chat.shoutoutUser(streamerId, msg.raidingBroadcasterId); + await redis.set(`user:${msg.raidingBroadcasterId}:invuln`, '1'); + await redis.expire(`user:${msg.raidingBroadcasterId}:invuln`, 600); + const raider = await User.initUsername(msg.raidingBroadcasterName); + const result = await changeItemCount(raider!, await getUserRecord(raider!), 'tnt', 3); + if (!result) await sendMessage("oopsies, no tnt for you!"); +}); diff --git a/src/events/streamState.ts b/src/events/streamState.ts index ee3fc4f..12f4ffb 100644 --- a/src/events/streamState.ts +++ b/src/events/streamState.ts @@ -1,10 +1,13 @@ import { redis } from "bun"; +import { sendMessage } from "commands"; import { eventSub, streamerId } from "main"; -eventSub.onStreamOnline(streamerId, async _msg => { +eventSub.onStreamOnline(streamerId, async msg => { await redis.set('streamIsLive', '1'); + await sendMessage(`${msg.broadcasterDisplayName} IS LIVE! START DIGGING!`); }); -eventSub.onStreamOffline(streamerId, async _msg => { +eventSub.onStreamOffline(streamerId, async msg => { await redis.del('streamIsLive'); + await sendMessage(`${msg.broadcasterDisplayName} IS OFFLINE! NO MORE FREE LOOT!`); }); diff --git a/src/index.ts b/src/index.ts index def89d8..09022a7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,7 +10,7 @@ import User from "user"; import { buildTimeString } from "lib/dateManager"; const CHATTERINTENTS = ["user:read:chat", "user:write:chat", "user:bot"]; -const STREAMERINTENTS = ["channel:bot", "user:read:chat", "moderation:read", "channel:manage:moderators", "moderator:manage:banned_users", "bits:read", "channel:moderate"]; +const STREAMERINTENTS = ["channel:bot", "user:read:chat", "moderation:read", "channel:manage:moderators", "moderator:manage:banned_users", "bits:read", "channel:moderate", "moderator:manage:shoutouts"]; export const singleUserMode = process.env.CHATTER_IS_STREAMER === 'true'; export const chatterId = process.env.CHATTER_ID ?? "";