add basic redeem handling, nerf silver bullets to 30 minutes

This commit is contained in:
2025-09-24 21:31:36 +02:00
parent 2960ea5242
commit 392c67fb0d
9 changed files with 155 additions and 19 deletions

77
src/pointRedeems/index.ts Normal file
View File

@@ -0,0 +1,77 @@
import { EventSubChannelRedemptionAddEvent } from "@twurple/eventsub-base";
import User from "user";
export type pointRedeemOptions = {
name: string;
title: string;
prompt?: string;
cost: number;
color?: string;
execution: (message: EventSubChannelRedemptionAddEvent, sender: User) => Promise<void>;
};
/** The Command class represents a command */
export default class PointRedeem {
public readonly name: string;
public readonly title: string;
public readonly prompt?: string;
public readonly cost: number;
public readonly color?: string;
public readonly execute: (message: EventSubChannelRedemptionAddEvent, sender: User) => Promise<void>;
constructor(options: pointRedeemOptions) {
this.name = options.name
this.title = options.title;
this.prompt = options.prompt;
this.cost = options.cost;
this.color = options.color;
this.execute = options.execution;
};
};
import { readdir } from 'node:fs/promises';
const pointRedeems = new Map<number, PointRedeem>;
/** A map of all (including inactive) redeems mapped to names */
const namedRedeems = new Map<string, PointRedeem>;
const files = await readdir(import.meta.dir);
for (const file of files) {
if (!file.endsWith('.ts')) continue;
if (file === import.meta.file) continue;
const redeem: PointRedeem = await import(import.meta.dir + '/' + file.slice(0, -3)).then(a => a.default);
pointRedeems.set(redeem.cost, redeem);
namedRedeems.set(redeem.name, redeem);
};
export { namedRedeems };
const activeRedeems = new Map<string, PointRedeem>;
import { streamerApi, streamerId } from "main";
import logger from "lib/logger";
const currentRedeems = new Map<string, string>;
await streamerApi.channelPoints.getCustomRewards(streamerId).then(a => a.map(b => currentRedeems.set(b.title, b.id)));
for (const [_, redeem] of Array.from(pointRedeems)) {
const selection = currentRedeems.get(redeem.title);
if (selection) {
currentRedeems.delete(redeem.title);
activeRedeems.set(selection, redeem);
} else {
const creation = await streamerApi.channelPoints.createCustomReward(streamerId, {
title: redeem.title,
prompt: redeem.prompt,
cost: redeem.cost,
backgroundColor: redeem.color
});
logger.ok(`Created custom point redeem ${redeem.title}`);
activeRedeems.set(creation.id, redeem);
};
};
Array.from(currentRedeems).map(async ([title, redeem]) => { await streamerApi.channelPoints.deleteCustomReward(streamerId, redeem); logger.ok(`Deleted custom point redeem ${title}`); });
logger.ok("Successfully synced all custom point redeems");
export { activeRedeems };

View File

@@ -0,0 +1,16 @@
import { sendMessage } from "commands";
import { getUserRecord } from "db/dbUser";
import { changeBalance } from "lib/changeBalance";
import PointRedeem from "pointRedeems";
export default new PointRedeem({
name: "qbucksredeem",
title: "FREE MONEY",
prompt: "GET 100 QBUCKS!",
color: '#00FF00',
cost: 1000,
execution: async (_msg, user) => {
await changeBalance(user, await getUserRecord(user), 100);
await sendMessage(`${user.displayName} got 100 qbucks for their point redeem`);
}
})