diff --git a/src/events/raid.ts b/src/events/raid.ts index 6ce24e4..1de2d5d 100644 --- a/src/events/raid.ts +++ b/src/events/raid.ts @@ -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!"); diff --git a/src/events/subscription.ts b/src/events/subscription.ts index 462fd9c..44e40be 100644 --- a/src/events/subscription.ts +++ b/src/events/subscription.ts @@ -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; + }; }); diff --git a/src/index.ts b/src/index.ts index 065c8b2..f635637 100644 --- a/src/index.ts +++ b/src/index.ts @@ -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');