diff --git a/pb/migrations/initialize.js b/pb/migrations/initialize.js index a0a4b39..59c1772 100644 --- a/pb/migrations/initialize.js +++ b/pb/migrations/initialize.js @@ -14,6 +14,81 @@ migrate(app => { app.save(record) const data = [ + { + "id": "pbc_279239694", + "listRule": null, + "viewRule": null, + "createRule": null, + "updateRule": null, + "deleteRule": null, + "name": "itemuses", + "type": "base", + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text1579384326", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "cascadeDelete": false, + "collectionId": "pbc_3754236674", + "hidden": false, + "id": "relation1542800728", + "maxSelect": 1, + "minSelect": 0, + "name": "field", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "indexes": [], + "system": false + }, { "id": "pbc_1170220047", "listRule": "", @@ -241,16 +316,6 @@ migrate(app => { "system": false, "type": "json" }, - { - "hidden": false, - "id": "json1357546519", - "maxSize": 0, - "name": "itemuses", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }, { "hidden": false, "id": "number2901680126", diff --git a/src/lib/items.ts b/src/lib/items.ts index 6e07587..bbbf95b 100644 --- a/src/lib/items.ts +++ b/src/lib/items.ts @@ -1,5 +1,5 @@ import { HelixUser } from "@twurple/api" -import { changeBalance, getInventory, updateInventory } from "../lib/userHelper" +import { addUsedItem, changeBalance, getInventory, updateInventory } from "../lib/userHelper" import { timeout, addTimeoutToDB, vulnerableUsers } from "./timeoutHelper" import api, { broadcasterApi } from "./api" @@ -22,6 +22,7 @@ export async function changeItemCount(user: HelixUser, item: string, amount = -1 value: newcount, }) await updateInventory(user, inv) + await addUsedItem(user, item) return { result: true, reason: '', count: inv[item] } } diff --git a/src/lib/pocketbase.ts b/src/lib/pocketbase.ts index 334190b..24f2765 100644 --- a/src/lib/pocketbase.ts +++ b/src/lib/pocketbase.ts @@ -23,11 +23,17 @@ export interface Timeout extends BaseModel { targetname: string } +export interface UsedItem extends BaseModel { + name: string, + user: string +} + interface TypedPocketBase extends PocketBase { collection(idOrName: string): RecordService, collection(idOrName: 'users'): RecordService, collection(idOrName: 'ttvauth'): RecordService collection(idOrName: 'timeouts'): RecordService + collection(idOrName: 'itemuses'): RecordService } diff --git a/src/lib/userHelper.ts b/src/lib/userHelper.ts index c952f44..cb51400 100644 --- a/src/lib/userHelper.ts +++ b/src/lib/userHelper.ts @@ -50,7 +50,6 @@ export async function changeBalance(user: HelixUser, amount: number): Promise { - await DBValidation(user) - const userDBID = await getDBID(user) +async function getTimeouts(userDBID: string): Promise { const hit = await pb.collection('timeouts').getFullList({ filter: `target="${userDBID}"` }) const shot = await pb.collection('timeouts').getFullList({ filter: `attacker="${userDBID}"` }) @@ -75,7 +72,6 @@ async function getTimeouts(user: HelixUser): Promise { const silverbulletshot = shot.length - blastershot return { - user, hit: { blaster: blasterhit, silverbullet: silverbullethit @@ -87,6 +83,19 @@ async function getTimeouts(user: HelixUser): Promise { } } +async function getItemUses(userDBID: string): Promise { + const items = await pb.collection('itemuses').getFullList({ filter: `user="${userDBID}"` }) + return { + version: 1, + blaster: items.filter((item) => item.name === 'blaster').length, + grenade: items.filter((item) => item.name === 'grenade').length, + silverbullet: items.filter((item) => item.name === 'silverbullet').length, + tnt: items.filter((item) => item.name === 'tnt').length, + clipboard: items.filter((item) => item.name === 'clipboard').length, + lootbox: items.filter((item) => item.name === 'lootbox').length + } +} + export interface inventory { version: number, @@ -110,9 +119,11 @@ interface statsGetResult extends timeoutsGetResult { } export async function getStats(user: HelixUser): Promise { - const { hit, shot } = await getTimeouts(user) - const dbuser = await pb.collection('users').getFirstListItem(`twitchid="${user.id}"`) - return { user, hit, shot, used: dbuser.itemuses } + await DBValidation(user) + const userDBID = await getDBID(user) + const { hit, shot } = await getTimeouts(userDBID) + const uses = await getItemUses(userDBID) + return { hit, shot, used: uses } } export async function updateInventory(user: HelixUser, newinv: inventory) { @@ -122,6 +133,12 @@ export async function updateInventory(user: HelixUser, newinv: inventory) { await pb.collection('users').update(recordid, { inventory: newinv }) } +export async function addUsedItem(user: HelixUser, item: string) { + await DBValidation(user) + const userDBID = await getDBID(user) + await pb.collection('itemuses').create({ user: userDBID, name: item }) +} + async function DBValidation(user: HelixUser) { try { await pb.collection('users').getFirstListItem(`twitchid="${user.id}"`)