add better raid handling, add real subscription handling, sub data is now also stored in redis

This commit is contained in:
2025-09-25 23:32:59 +02:00
parent 1afac5d5fa
commit b4c56972f1
3 changed files with 126 additions and 13 deletions

View File

@@ -1,12 +1,22 @@
import { redis } from "bun";
import { sendMessage } from "commands";
import { getUserRecord } from "db/dbUser";
import { changeItemCount } from "items";
import logger from "lib/logger";
import { eventSub, streamerApi, streamerId } from "main";
import User from "user";
eventSub.onChannelRaidTo(streamerId, async msg => {
if (await redis.exists(`user:${msg.raidingBroadcasterId}:recentraid`)) { await sendMessage(`Another raid from ${msg.raidedBroadcasterDisplayName}??? SMH`); return; };
await redis.set(`user:${msg.raidingBroadcasterId}:recentraid`, '1');
await redis.expire(`user:${msg.raidingBroadcasterId}:recentraid`, 60 * 30); // raid cooldown is 30 minutes
await sendMessage(`Ty for raiding ${msg.raidingBroadcasterDisplayName}. You get 3 pieces of TNT. Enjoy!`);
await streamerApi.chat.shoutoutUser(streamerId, msg.raidingBroadcasterId);
try {
await streamerApi.chat.shoutoutUser(streamerId, msg.raidingBroadcasterId);
} catch (e) {
logger.warn(`Failed to give automatic shoutout to ${msg.raidedBroadcasterDisplayName}`);
logger.warn(e as string);
};
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!");

View File

@@ -1,32 +1,122 @@
import { redis } from "bun";
import { sendMessage } from "commands";
import { getUserRecord } from "db/dbUser";
import { getUserRecord, updateUserRecord } from "db/dbUser";
import { changeBalance } from "lib/changeBalance";
import { eventSub, streamerId } from "main";
import User from "user";
eventSub.onChannelSubscription(streamerId, async msg => {
await redis.set(`user:${msg.userId}:subbed`, msg.tier.slice(0, 1));
if (msg.isGift) return;
const user = await User.initUsername(msg.userName);
await Promise.all([
sendMessage(`YO THANKS FOR THE SUB ${msg.userDisplayName}! YOU GET 500 QBUCKS`),
changeBalance(user!, await getUserRecord(user!), 500)
]);
const userRecord = await getUserRecord(user!);
switch (msg.tier) {
case "1000":
await Promise.all([
sendMessage(`YO THANKS FOR THE SUB ${msg.userDisplayName}! YOU GET 500 QBUCKS`),
changeBalance(user!, userRecord, 500)
]);
break;
case "2000":
userRecord.balance += 1500;
if (userRecord.inventory.silverbullet) userRecord.inventory.silverbullet += 1
else userRecord.inventory.silverbullet = 1
await Promise.all([
sendMessage(`YO THANKS FOR THE TIER 2 SUB ${msg.userDisplayName}! YOU GET 1500 QBUCKS AND A SILVER BULLET`),
updateUserRecord(user!, userRecord)
]);
break;
case "3000":
userRecord.balance += 3000;
if (userRecord.inventory.silverbullet) userRecord.inventory.silverbullet += 2
else userRecord.inventory.silverbullet = 2;
await Promise.all([
sendMessage(`YO THANKS FOR THE TIER 3 SUB ${msg.userDisplayName}! YOU GET 3000 QBUCKS AND 2 SILVER BULLETS`),
updateUserRecord(user!, userRecord)
]);
break;
};
});
eventSub.onChannelSubscriptionGift(streamerId, async msg => {
if (msg.isAnonymous) { await sendMessage(`YO THANKS ANON FOR THE SCAM SUBS`); return; };
if (msg.isAnonymous) {
switch (msg.tier) {
case "1000":
await sendMessage(`YO THANKS ANON FOR THE SCAM SUB${msg.amount === 1 ? '' : 'S'}`);
break;
case "2000":
await sendMessage(`YO THANKS ANON FOR THE ${msg.amount} TIER 2 SCAM SUB${msg.amount === 1 ? '' : 'S'}`);
break;
case "3000":
await sendMessage(`YO THANKS ANON FOR THE ${msg.amount} TIER 3 SCAM SUB${msg.amount === 1 ? '' : 'S'}`);
break;
};
return;
};
const user = await User.initUsername(msg.gifterName);
const amount = msg.amount;
await Promise.all([
sendMessage(`YO THANKS FOR THE SCAM GIFTS ${msg.gifterDisplayName}! YOU GET ${amount * 500} QBUCKS`),
changeBalance(user!, await getUserRecord(user!), amount * 500)
]);
const userRecord = await getUserRecord(user!);
switch (msg.tier) {
case "1000":
await Promise.all([
sendMessage(`YO THANKS FOR THE SCAM GIFTS ${msg.gifterDisplayName}! YOU GET ${amount * 500} QBUCKS`),
changeBalance(user!, userRecord, amount * 500)
]);
break;
case "2000":
userRecord.balance += 1500 * amount;
if (userRecord.inventory.silverbullet) userRecord.inventory.silverbullet += amount
else userRecord.inventory.silverbullet = amount;
await Promise.all([
sendMessage(`YO THANKS FOR THE SCAM TIER 2 GIFTS ${msg.gifterDisplayName}! YOU GET ${amount * 1500} QBUCKS AND ${amount} SILVER BULLET${amount === 1 ? '' : 'S'}`),
updateUserRecord(user!, userRecord)
]);
break;
case "3000":
userRecord.balance += 3000 * amount;
if (userRecord.inventory.silverbullet) userRecord.inventory.silverbullet += amount * 2
else userRecord.inventory.silverbullet = amount * 2;
await Promise.all([
sendMessage(`YO THANKS FOR THE SCAM TIER 3 GIFTS ${msg.gifterDisplayName}! YOU GET ${amount * 3000} QBUCKS AND ${amount * 2} SILVER BULLETS`),
updateUserRecord(user!, userRecord)
]);
break;
}
});
eventSub.onChannelSubscriptionEnd(streamerId, async msg => {
await redis.del(`user:${msg.userId}:subbed`);
});
eventSub.onChannelSubscriptionMessage(streamerId, async msg => {
await redis.set(`user:${msg.userId}:subbed`, msg.tier.slice(0, 1));
const user = await User.initUsername(msg.userName);
const userRecord = await getUserRecord(user!);
switch (msg.tier) {
case "1000":
await Promise.all([
sendMessage(`YO THANKS FOR THE RESUB ${msg.userDisplayName}! YOU GET 500 QBUCKS`),
changeBalance(user!, userRecord, 500)
]);
break;
case "2000":
userRecord.balance += 1500;
if (userRecord.inventory.silverbullet) userRecord.inventory.silverbullet += 1
else userRecord.inventory.silverbullet = 1
await Promise.all([
sendMessage(`YO THANKS FOR THE TIER 2 RESUB ${msg.userDisplayName}! YOU GET 1500 QBUCKS AND A SILVER BULLET`),
updateUserRecord(user!, userRecord)
]);
break;
case "3000":
userRecord.balance += 3000;
if (userRecord.inventory.silverbullet) userRecord.inventory.silverbullet += 2
else userRecord.inventory.silverbullet = 2;
await Promise.all([
sendMessage(`YO THANKS FOR THE TIER 3 RESUB ${msg.userDisplayName}! YOU GET 3000 QBUCKS AND 2 SILVER BULLETS`),
updateUserRecord(user!, userRecord)
]);
break;
};
});

View File

@@ -67,6 +67,19 @@ for (const remod of bannedmods) {
logger.info(`Set the remod timer for ${target?.displayName} to ${duration} seconds.`);
};
const subs = await streamerApi.subscriptions.getSubscriptions(streamerId).then(a => a.data);
const redisSubs = await redis.keys('user:*:subbed').then(a => a.map(b => b.slice(5, -7)));
for (const sub of subs) {
if (redisSubs.includes(sub.userId)) {
const index = redisSubs.indexOf(sub.userId);
redisSubs.splice(index, 1);
continue;
};
await redis.set(`user:${sub.userId}:subbed`, sub.tier.slice(0, 1));
};
redisSubs.map(async a => await redis.del(`user:${a}:subbed`));
const streamdata = await streamerApi.streams.getStreamByUserId(streamerId);
if (streamdata) await redis.set('streamIsLive', '1');