From 4c2f31e1f8826045e97762136eceff3edd8fb191 Mon Sep 17 00:00:00 2001 From: qwerinope Date: Sun, 29 Jun 2025 16:32:15 +0200 Subject: [PATCH] add some documentation, add timeout and itemuses tracking system --- bot/commands/index.ts | 4 ++-- bot/db/connection.ts | 23 +++++++++++++++++++---- bot/db/dbTimeouts.ts | 12 ++++++++++++ bot/db/dbUsedItems.ts | 12 ++++++++++++ bot/db/dbUser.ts | 4 ++-- bot/items/blaster.ts | 9 +++++++-- bot/items/grenade.ts | 9 ++++++++- 7 files changed, 62 insertions(+), 11 deletions(-) create mode 100644 bot/db/dbTimeouts.ts create mode 100644 bot/db/dbUsedItems.ts diff --git a/bot/commands/index.ts b/bot/commands/index.ts index 83f2127..d30a61a 100644 --- a/bot/commands/index.ts +++ b/bot/commands/index.ts @@ -20,8 +20,8 @@ export class Command { }; import { readdir } from 'node:fs/promises'; -const commands = new Map; -const basecommands = new Map; +const commands = new Map; // This map has all command/item aliases mapped to commands/items (many-to-one) +const basecommands = new Map; // This map has all command names mapped to commands (one-to-one) (no items) const files = await readdir(import.meta.dir); for (const file of files) { diff --git a/bot/db/connection.ts b/bot/db/connection.ts index fb91cbf..de73205 100644 --- a/bot/db/connection.ts +++ b/bot/db/connection.ts @@ -12,17 +12,32 @@ export type authRecord = { export type userRecord = { id: string; - username: string; + username: string; // Don't use this, Use User.username or User.displayName. This is just to make the pocketbase data easier to read. balance: number; inventory: inventory; lastlootbox: string; }; +export type usedItemRecord = { + id?: string; + user: string; + item: string; + created: string; +}; + +export type timeoutRecord = { + id?: string; + user: string; + target: string; + item: string; + created: string; +}; + interface TypedPocketBase extends PocketBase { collection(idOrName: 'auth'): RecordService; collection(idOrName: 'users'): RecordService; + collection(idOrName: 'usedItems'): RecordService; + collection(idOrName: 'timeouts'): RecordService; }; -const pb = new PocketBase(pocketbaseurl) as TypedPocketBase; -export default pb.autoCancellation(false); - +export default new PocketBase(pocketbaseurl).autoCancellation(false) as TypedPocketBase; diff --git a/bot/db/dbTimeouts.ts b/bot/db/dbTimeouts.ts new file mode 100644 index 0000000..3f6587d --- /dev/null +++ b/bot/db/dbTimeouts.ts @@ -0,0 +1,12 @@ +import pocketbase from "./connection"; +import { User } from "../user"; +const pb = pocketbase.collection('timeouts'); + +export async function createTimeoutRecord(user: User, target: User, item: string): Promise { + try { + await pb.create({ user: user.id, target: target.id, item }); + } catch (err) { + console.error(`Failed to create timeout record in database: user: ${user.id}, target: ${target.id}, item: ${item}`); + console.error(err); + }; +}; diff --git a/bot/db/dbUsedItems.ts b/bot/db/dbUsedItems.ts new file mode 100644 index 0000000..152953b --- /dev/null +++ b/bot/db/dbUsedItems.ts @@ -0,0 +1,12 @@ +import pocketbase from "./connection"; +import { User } from "../user"; +const pb = pocketbase.collection('usedItems'); + +export async function createUsedItemRecord(user: User, item: string): Promise { + try { + await pb.create({ user: user.id, item }); + } catch (err) { + console.error(`Failed to create usedItem record in database: user: ${user.id}, item: ${item}`); + console.error(err); + }; +}; diff --git a/bot/db/dbUser.ts b/bot/db/dbUser.ts index 7cbff27..e403517 100644 --- a/bot/db/dbUser.ts +++ b/bot/db/dbUser.ts @@ -6,7 +6,7 @@ const pb = pocketbase.collection('users'); /** Use this function to both ensure existance and to retreive data */ export async function getUserRecord(user: User): Promise { try { - const data = await pb.getOne(user.id); + const data = await pb.getOne(user.id); if (Object.keys(data.inventory).sort().toString() !== itemarray.sort().toString()) { // If the items in the user inventory are missing an item. itemarray.forEach(key => { @@ -22,7 +22,7 @@ export async function getUserRecord(user: User): Promise { }; async function createUserRecord(user: User): Promise { - const data = await pb.create({ + const data = await pb.create({ id: user.id, username: user.username, balance: 0, diff --git a/bot/items/blaster.ts b/bot/items/blaster.ts index 44c770d..1a6b635 100644 --- a/bot/items/blaster.ts +++ b/bot/items/blaster.ts @@ -1,5 +1,7 @@ import { changeItemCount, Item } from "."; import { sendMessage } from "../commands"; +import { createTimeoutRecord } from "../db/dbTimeouts"; +import { createUsedItemRecord } from "../db/dbUsedItems"; import { getUserRecord } from "../db/dbUser"; import parseCommandArgs from "../lib/parseCommandArgs"; import { timeout } from "../lib/timeout"; @@ -17,13 +19,16 @@ export default new Item(ITEMNAME, 'Blaster', 's', if (!messagequery[0]) { await sendMessage('Please specify a target'); return; }; const target = await User.initUsername(messagequery[0].toLowerCase()); if (!target) { await sendMessage(`${messagequery[0]} doesn't exist`); return; }; - await getUserRecord(target); + await getUserRecord(target); // make sure the user record exist in the database + if (await user.itemLock()) { await sendMessage('Can\'t use two items at once pepeW', msg.messageId); return; }; await user.setLock(); const result = await timeout(target, `You got blasted by ${user.displayName}!`, 60); if (result.status) await Promise.all([ sendMessage(`GOTTEM ${target.displayName} got BLASTED by ${user.displayName} GOTTEM`), - changeItemCount(user, userObj, ITEMNAME) + changeItemCount(user, userObj, ITEMNAME), + createTimeoutRecord(user, target, ITEMNAME), + createUsedItemRecord(user, ITEMNAME) ]); else { switch (result.reason) { diff --git a/bot/items/grenade.ts b/bot/items/grenade.ts index 1e240a6..5632260 100644 --- a/bot/items/grenade.ts +++ b/bot/items/grenade.ts @@ -4,6 +4,8 @@ import { timeout } from "../lib/timeout"; import { changeItemCount, Item } from "."; import { User } from "../user"; import { getUserRecord } from "../db/dbUser"; +import { createTimeoutRecord } from "../db/dbTimeouts"; +import { createUsedItemRecord } from "../db/dbUsedItems"; const ITEMNAME = 'grenade'; @@ -17,13 +19,18 @@ export default new Item(ITEMNAME, 'Grenade', 's', if (targets.length === 0) { await sendMessage('No vulnerable chatters to blow up', msg.messageId); return; }; const selection = targets[Math.floor(Math.random() * targets.length)]!; const target = await User.initUserId(selection.split(':')[1]!); + + await getUserRecord(target!); // make sure the user record exist in the database + if (await user.itemLock()) { await sendMessage('Can\'t use two items at once pepeW', msg.messageId); return; }; await user.setLock(); await Promise.all([ timeout(target!, `You got hit by ${user.displayName}'s grenade!`, 60), redis.del(selection), sendMessage(`wybuh ${target?.displayName} got hit by ${user.displayName}'s grenade wybuh`), - changeItemCount(user, userObj, ITEMNAME) + changeItemCount(user, userObj, ITEMNAME), + createTimeoutRecord(user, target!, ITEMNAME), + createUsedItemRecord(user, ITEMNAME) ]); await user.clearLock(); }