replace id row in users collection with twitchid

reduce spamming of pocketbase api
This commit is contained in:
2025-04-07 20:34:02 +02:00
parent 17f557f808
commit 9a2ce6b3a4
6 changed files with 33 additions and 64 deletions

View File

@@ -16,9 +16,9 @@ migrate(app => {
const data = [ const data = [
{ {
"id": "pbc_279239694", "id": "pbc_279239694",
"listRule": null, "listRule": "",
"viewRule": null, "viewRule": "",
"createRule": null, "createRule": "",
"updateRule": null, "updateRule": null,
"deleteRule": null, "deleteRule": null,
"name": "itemuses", "name": "itemuses",
@@ -28,8 +28,8 @@ migrate(app => {
"autogeneratePattern": "[a-z0-9]{15}", "autogeneratePattern": "[a-z0-9]{15}",
"hidden": false, "hidden": false,
"id": "text3208210256", "id": "text3208210256",
"max": 15, "max": 0,
"min": 15, "min": 0,
"name": "id", "name": "id",
"pattern": "^[a-z0-9]+$", "pattern": "^[a-z0-9]+$",
"presentable": false, "presentable": false,
@@ -59,7 +59,7 @@ migrate(app => {
"id": "relation1542800728", "id": "relation1542800728",
"maxSelect": 1, "maxSelect": 1,
"minSelect": 0, "minSelect": 0,
"name": "field", "name": "user",
"presentable": false, "presentable": false,
"required": false, "required": false,
"system": false, "system": false,
@@ -103,8 +103,8 @@ migrate(app => {
"autogeneratePattern": "[a-z0-9]{15}", "autogeneratePattern": "[a-z0-9]{15}",
"hidden": false, "hidden": false,
"id": "text3208210256", "id": "text3208210256",
"max": 15, "max": 0,
"min": 15, "min": 0,
"name": "id", "name": "id",
"pattern": "^[a-z0-9]+$", "pattern": "^[a-z0-9]+$",
"presentable": false, "presentable": false,
@@ -268,8 +268,8 @@ migrate(app => {
"autogeneratePattern": "[a-z0-9]{15}", "autogeneratePattern": "[a-z0-9]{15}",
"hidden": false, "hidden": false,
"id": "text3208210256", "id": "text3208210256",
"max": 15, "max": 0,
"min": 15, "min": 0,
"name": "id", "name": "id",
"pattern": "^[a-z0-9]+$", "pattern": "^[a-z0-9]+$",
"presentable": false, "presentable": false,
@@ -278,20 +278,6 @@ migrate(app => {
"system": true, "system": true,
"type": "text" "type": "text"
}, },
{
"autogeneratePattern": "",
"hidden": false,
"id": "text3605594593",
"max": 0,
"min": 0,
"name": "twitchid",
"pattern": "",
"presentable": false,
"primaryKey": false,
"required": true,
"system": false,
"type": "text"
},
{ {
"autogeneratePattern": "", "autogeneratePattern": "",
"hidden": false, "hidden": false,
@@ -302,7 +288,7 @@ migrate(app => {
"pattern": "", "pattern": "",
"presentable": false, "presentable": false,
"primaryKey": false, "primaryKey": false,
"required": true, "required": false,
"system": false, "system": false,
"type": "text" "type": "text"
}, },
@@ -360,9 +346,7 @@ migrate(app => {
"type": "autodate" "type": "autodate"
} }
], ],
"indexes": [ "indexes": [],
"CREATE UNIQUE INDEX `idx_MR0pV8SUAF` ON `users` (`twitchid`)"
],
"system": false "system": false
} }
] ]

View File

@@ -25,7 +25,7 @@ bot.onConnect(async () => {
await broadcasterAuthProvider.refreshAccessTokenForUser(broadcastername?.id!) await broadcasterAuthProvider.refreshAccessTokenForUser(broadcastername?.id!)
} }
setTimeout(() => { setTimeout(async () => {
console.log('Bot is ready to accept commands!') console.log('Bot is ready to accept commands!')
}, 1000 * 5) }, 1000 * 5)
}) })

View File

@@ -2,7 +2,7 @@ import { HelixUser } from "@twurple/api"
import pb, { User } from "./pocketbase" import pb, { User } from "./pocketbase"
export const COOLDOWN = !process.env.COOLDOWN ? 60 * 60 * 24 : Number(process.env.COOLDOWN) export const COOLDOWN = (!process.env.COOLDOWN ? 60 * 60 * 24 : Number(process.env.COOLDOWN)) * 1000
interface lootboxReadyResult { interface lootboxReadyResult {
result: boolean, result: boolean,
@@ -11,7 +11,7 @@ interface lootboxReadyResult {
} }
export async function lootboxReady(user: HelixUser | null): Promise<lootboxReadyResult> { export async function lootboxReady(user: HelixUser | null): Promise<lootboxReadyResult> {
const DBuser = await pb.collection('users').getFirstListItem(`twitchid="${user!.id}"`) const DBuser = await pb.collection('users').getFirstListItem(`id="${user!.id}"`)
if ((Date.parse(DBuser.lastlootbox) + COOLDOWN) > Date.now()) return { result: false, lastlootbox: Date.parse(DBuser.lastlootbox), DBuser } if ((Date.parse(DBuser.lastlootbox) + COOLDOWN) > Date.now()) return { result: false, lastlootbox: Date.parse(DBuser.lastlootbox), DBuser }
return { result: true, lastlootbox: 0, DBuser } return { result: true, lastlootbox: 0, DBuser }
} }

View File

@@ -2,7 +2,6 @@ import PocketBase, { BaseModel, RecordService } from 'pocketbase'
import { inventory } from "./userHelper" import { inventory } from "./userHelper"
export interface User extends BaseModel { export interface User extends BaseModel {
twitchid: string,
firstname: string, firstname: string,
inventory: inventory, inventory: inventory,
itemuses: inventory, itemuses: inventory,

View File

@@ -1,7 +1,7 @@
import { ApiClient, HelixUser } from "@twurple/api"; import { ApiClient, HelixUser } from "@twurple/api";
import api, { broadcasterApi } from "./api"; import api, { broadcasterApi } from "./api";
import pb from "./pocketbase"; import pb from "./pocketbase";
import { getDBID } from "./userHelper"; import { DBValidation } from "./userHelper";
type shooter = 'blaster' | 'grenade' | 'silverbullet' | 'tnt' type shooter = 'blaster' | 'grenade' | 'silverbullet' | 'tnt'
@@ -22,6 +22,7 @@ export async function timeout(broadcasterid: string, target: HelixUser, duration
remodMod(broadcasterid, target, duration, tmpapi) remodMod(broadcasterid, target, duration, tmpapi)
} }
await tmpapi.moderation.banUser(broadcasterid, { duration, reason, user: target }) await tmpapi.moderation.banUser(broadcasterid, { duration, reason, user: target })
await DBValidation(target)
return { status: true, reason: '' } return { status: true, reason: '' }
} catch (err) { } catch (err) {
console.error(err) console.error(err)
@@ -31,13 +32,11 @@ export async function timeout(broadcasterid: string, target: HelixUser, duration
export async function addTimeoutToDB(attacker: HelixUser, target: HelixUser, source: shooter) { export async function addTimeoutToDB(attacker: HelixUser, target: HelixUser, source: shooter) {
// This has passed the existance check so there's no need to check if the users exist (twitch) // This has passed the existance check so there's no need to check if the users exist (twitch)
const attackerDB = await getDBID(attacker)
const targetDB = await getDBID(target)
const timeoutobj = { const timeoutobj = {
source, source,
attacker: attackerDB, attacker: attacker.id,
target: targetDB, target: target.id,
attackername: attacker.name, attackername: attacker.name,
targetname: target.name targetname: target.name
} }

View File

@@ -13,17 +13,6 @@ export const EMPTYINV: inventory = {
lootbox: 0 lootbox: 0
} }
export async function getDBID(user: HelixUser) {
try {
const DBuser = await pb.collection('users').getFirstListItem(`twitchid="${user!.id}"`)
return DBuser.id
} catch (error) {
await createUser(user!)
const DBuser = await pb.collection('users').getFirstListItem(`twitchid="${user!.id}"`)
return DBuser.id
}
}
type balanceGetResult = { type balanceGetResult = {
balance: number, balance: number,
data: User data: User
@@ -31,7 +20,7 @@ type balanceGetResult = {
export async function getBalance(user: HelixUser): Promise<balanceGetResult> { export async function getBalance(user: HelixUser): Promise<balanceGetResult> {
await DBValidation(user) await DBValidation(user)
const data = await pb.collection('users').getFirstListItem(`twitchid="${user!.id}"`) const data = await pb.collection('users').getFirstListItem(`id="${user!.id}"`)
return { balance: data.balance, data } return { balance: data.balance, data }
} }
@@ -62,11 +51,11 @@ interface timeoutsGetResult {
const BLASTERS = ['blaster', 'grenade', 'tnt'] const BLASTERS = ['blaster', 'grenade', 'tnt']
async function getTimeouts(userDBID: string, monthdata?: string): Promise<timeoutsGetResult> { async function getTimeouts(userId: string, monthdata?: string): Promise<timeoutsGetResult> {
let monthquery = '' let monthquery = ''
if (monthdata) monthquery = ` && created~"${monthdata}"` if (monthdata) monthquery = ` && created~"${monthdata}"`
const hit = await pb.collection('timeouts').getFullList({ filter: `target="${userDBID}"${monthquery}` }) const hit = await pb.collection('timeouts').getFullList({ filter: `target="${userId}"${monthquery}` })
const shot = await pb.collection('timeouts').getFullList({ filter: `attacker="${userDBID}"${monthquery}` }) const shot = await pb.collection('timeouts').getFullList({ filter: `attacker="${userId}"${monthquery}` })
const blasterhit = hit.filter((item) => BLASTERS.includes(item.source)).length const blasterhit = hit.filter((item) => BLASTERS.includes(item.source)).length
const silverbullethit = hit.length - blasterhit const silverbullethit = hit.length - blasterhit
@@ -85,10 +74,10 @@ async function getTimeouts(userDBID: string, monthdata?: string): Promise<timeou
} }
} }
async function getItemUses(userDBID: string, monthdata?: string): Promise<inventory> { async function getItemUses(userId: string, monthdata?: string): Promise<inventory> {
let monthquery = '' let monthquery = ''
if (monthdata) monthquery = ` && created~"${monthdata}"` if (monthdata) monthquery = ` && created~"${monthdata}"`
const items = await pb.collection('itemuses').getFullList({ filter: `user="${userDBID}"${monthquery}` }) const items = await pb.collection('itemuses').getFullList({ filter: `user="${userId}"${monthquery}` })
return { return {
version: 1, version: 1,
blaster: items.filter((item) => item.name === 'blaster').length, blaster: items.filter((item) => item.name === 'blaster').length,
@@ -114,7 +103,7 @@ export interface inventory {
export async function getInventory(user: HelixUser): Promise<inventory> { export async function getInventory(user: HelixUser): Promise<inventory> {
await DBValidation(user) await DBValidation(user)
const data = await pb.collection('users').getFirstListItem(`twitchid="${user.id}"`) const data = await pb.collection('users').getFirstListItem(`id="${user.id}"`)
return data.inventory return data.inventory
} }
@@ -124,28 +113,26 @@ interface statsGetResult extends timeoutsGetResult {
export async function getStats(user: HelixUser, monthdata?: string): Promise<statsGetResult> { export async function getStats(user: HelixUser, monthdata?: string): Promise<statsGetResult> {
await DBValidation(user) await DBValidation(user)
const userDBID = await getDBID(user) const { hit, shot } = await getTimeouts(user.id, monthdata)
const { hit, shot } = await getTimeouts(userDBID, monthdata) const uses = await getItemUses(user.id, monthdata)
const uses = await getItemUses(userDBID, monthdata)
return { hit, shot, used: uses } return { hit, shot, used: uses }
} }
export async function updateInventory(user: HelixUser, newinv: inventory) { export async function updateInventory(user: HelixUser, newinv: inventory) {
await DBValidation(user) await DBValidation(user)
const data = await pb.collection('users').getFirstListItem(`twitchid="${user.id}"`) const data = await pb.collection('users').getFirstListItem(`id="${user.id}"`)
const recordid = data.id const recordid = data.id
await pb.collection('users').update(recordid, { inventory: newinv }) await pb.collection('users').update(recordid, { inventory: newinv })
} }
export async function addUsedItem(user: HelixUser, item: string) { export async function addUsedItem(user: HelixUser, item: string) {
await DBValidation(user) await DBValidation(user)
const userDBID = await getDBID(user) await pb.collection('itemuses').create({ user: user.id, name: item })
await pb.collection('itemuses').create({ user: userDBID, name: item })
} }
async function DBValidation(user: HelixUser) { export async function DBValidation(user: HelixUser) {
try { try {
await pb.collection('users').getFirstListItem(`twitchid="${user.id}"`) await pb.collection('users').getFirstListItem(`id="${user.id}"`)
} catch (error) { } catch (error) {
await createUser(user!) await createUser(user!)
} }
@@ -153,7 +140,7 @@ async function DBValidation(user: HelixUser) {
async function createUser(user: HelixUser) { async function createUser(user: HelixUser) {
const data = { const data = {
twitchid: user.id, id: user.id,
firstname: user.name, firstname: user.name,
inventory: EMPTYINV, inventory: EMPTYINV,
itemuses: EMPTYINV, itemuses: EMPTYINV,