move itemuses to a seperate table, finish !stats implementation

This commit is contained in:
2025-04-05 19:27:12 +02:00
parent 5b5886e3a1
commit 3bd2cb1038
4 changed files with 108 additions and 19 deletions

View File

@@ -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",

View File

@@ -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] }
}

View File

@@ -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<User>,
collection(idOrName: 'ttvauth'): RecordService<TTVAuth>
collection(idOrName: 'timeouts'): RecordService<Timeout>
collection(idOrName: 'itemuses'): RecordService<UsedItem>
}

View File

@@ -50,7 +50,6 @@ export async function changeBalance(user: HelixUser, amount: number): Promise<ba
}
interface timeoutsGetResult {
user: HelixUser,
hit: {
blaster: number, // I'm going to combine blaster, grenade and tnt into one.
silverbullet: number,
@@ -63,9 +62,7 @@ interface timeoutsGetResult {
const BLASTERS = ['blaster', 'grenade', 'tnt']
async function getTimeouts(user: HelixUser): Promise<timeoutsGetResult> {
await DBValidation(user)
const userDBID = await getDBID(user)
async function getTimeouts(userDBID: string): Promise<timeoutsGetResult> {
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<timeoutsGetResult> {
const silverbulletshot = shot.length - blastershot
return {
user,
hit: {
blaster: blasterhit,
silverbullet: silverbullethit
@@ -87,6 +83,19 @@ async function getTimeouts(user: HelixUser): Promise<timeoutsGetResult> {
}
}
async function getItemUses(userDBID: string): Promise<inventory> {
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<statsGetResult> {
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}"`)