diff --git a/README.md b/README.md index 1a47057..195f633 100644 --- a/README.md +++ b/README.md @@ -170,6 +170,7 @@ COMMAND|FUNCTION|USER|ALIASES|DISABLEABLE `anivtimeouts`|Get the amount of timeouts, dodges and dodge percentage from aniv timeouts [(info)](#aniv-timeouts)|anyone|`anivtimeouts` `anivtimeout`|:white_check_mark: `racetime`|Get the racetime.gg room the streamer is currently in. Needs to have twitch linked to racetime account|anyone|`racetime` `raceroom`|:white_check_mark: `randomchatter`|Get a random chatter for whatever reason|moderators|`randomchatter`|:white_check_mark: +`economy`|Get a count of all items in circulation|anyone|`economy` `eco`|:white_check_mark: ### Qweribucks/Item commands @@ -225,7 +226,7 @@ NAME|COMMAND|FUNCTION|ALIASES|COST -|-|-|-|- Blaster|`blaster {target}`|Times targeted user out for 60 seconds|`blaster` `blast`|100 Grenade|`grenade`|Times a random vulnerable chatter out for 60 seconds|`grenade`|99 -Silver Bullet|`silverbullet [target]`|Times targeted or random vulnerable user out for 30 minutes|`silverbullet` `execute` `{blastin}`|666 +Silver Bullet|`silverbullet [target]`|Times targeted or random vulnerable user out for 30 minutes|`silverbullet` `execute` `{blastin}` `{fuck}`|666 TNT|`tnt`|Give 5-10 random chatters 60 second timeouts|`tnt`|1000 ## Cheers diff --git a/biome.json b/biome.json index 6d04103..1bb4791 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.3.8/schema.json", + "$schema": "https://biomejs.dev/schemas/2.3.10/schema.json", "vcs": { "enabled": true, "clientKind": "git", diff --git a/src/commands/economy.ts b/src/commands/economy.ts new file mode 100644 index 0000000..d5c46cf --- /dev/null +++ b/src/commands/economy.ts @@ -0,0 +1,22 @@ +import { getTotalItemCounts } from "db/dbUser"; +import itemAliasMap from "items"; +import { Command, sendMessage } from "lib/commandUtils"; + +export default new Command({ + name: "economy", + aliases: ["economy", "eco"], + usertype: "chatter", + execution: async (msg) => { + const allitems = await getTotalItemCounts(); + const itemList = Object.entries(allitems) + .sort(([, a], [, b]) => b - a) + .map(([item, count]) => { + const itemobj = itemAliasMap.get(item); + if (itemobj) return `${itemobj.prettyName}: ${count}`; + return `${item}: ${count}`; // Fallback if an item doesn't have their name as an alias + }) + .join(" | "); + + await sendMessage(`Total Items in circulation: ${itemList}`, msg.messageId); + }, +}); diff --git a/src/db/dbUser.ts b/src/db/dbUser.ts index 190c65a..9caf558 100644 --- a/src/db/dbUser.ts +++ b/src/db/dbUser.ts @@ -12,7 +12,8 @@ import { type SQL, sql, } from "drizzle-orm"; -import { itemarray } from "items"; +import { itemarray, type items } from "items"; +import { ANIVNAMES } from "lib/handleAnivMessage"; import type User from "user"; /** Use this function to both ensure existance and to retreive data */ @@ -120,3 +121,25 @@ export async function getKDLeaderboard(monthData?: string) { return result; } + +type ItemCounts = Record; + +export async function getTotalItemCounts(): Promise { + const allUsers = await db + .select({ username: users.username, inventory: users.inventory }) + .from(users); + + const filteredUsers = allUsers.filter( + (user) => + !Array.from(ANIVNAMES).includes(user.username.toLowerCase()), + ); + + const counts = itemarray.reduce((acc, item) => { + acc[item] = filteredUsers.reduce((sum, user) => { + return sum + (user.inventory[item] || 0); + }, 0); + return acc; + }, {} as ItemCounts); + + return counts; +} diff --git a/src/items/blaster.ts b/src/items/blaster.ts index dd66b66..2f7cb41 100644 --- a/src/items/blaster.ts +++ b/src/items/blaster.ts @@ -28,7 +28,7 @@ export default new Item({ } const target = await User.initUsername(messagequery[0].toLowerCase()); if (!target) { - await sendMessage(`${messagequery[0]} doesn't exist`); + await sendMessage(`${messagequery[0]} doesn't exist`, msg.messageId); return; } await getUserRecord(target); // make sure the user record exist in the database diff --git a/src/items/silverbullet.ts b/src/items/silverbullet.ts index b0271c8..6b38be0 100644 --- a/src/items/silverbullet.ts +++ b/src/items/silverbullet.ts @@ -18,7 +18,7 @@ export default new Item({ plural: "s", description: "Times targeted or random vulnerable user out for 30 minutes", aliases: ["execute", "silverbullet"], - specialaliases: ["blastin"], + specialaliases: ["blastin", "fuck"], price: 666, execution: async (msg, user, specialargs) => { const messagequery = parseCommandArgs( @@ -67,7 +67,7 @@ export default new Item({ } if (!target) { await user.clearLock(); - await sendMessage(`${messagequery[0]} doesn't exist`); + await sendMessage(`${messagequery[0]} doesn't exist`, msg.messageId); return; } @@ -78,21 +78,25 @@ export default new Item({ `You got blasted by ${user.displayName}!`, 60 * 30, ); - if (result.status) + if (result.status) { await Promise.all([ sendMessage( `KEKPOINT KEKPOINT KEKPOINT ${target.displayName.toUpperCase()} RIPBOZO RIPBOZO RIPBOZO RIPBOZO RIPBOZO RIPBOZO RIPBOZO`, ), - changeItemCount(user, userObj, ITEMNAME), - createTimeoutRecord(user, target, ITEMNAME), - createUsedItemRecord(user, ITEMNAME), playAlert({ name: "userExecution", user: user.displayName, target: target.displayName, }), ]); - else { + if (user.id !== streamerId) + // streamer doesn't consume bullets and doesn't count for timeouts + await Promise.all([ + changeItemCount(user, userObj, ITEMNAME), + createTimeoutRecord(user, target, ITEMNAME), + createUsedItemRecord(user, ITEMNAME), + ]); + } else { switch (result.reason) { case "banned": await sendMessage(