forked from syntaxbullet/aurorabot
42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
import {
|
|
handleAddXp,
|
|
handleAddBalance,
|
|
handleReplyMessage,
|
|
handleXpBoost,
|
|
handleTempRole,
|
|
handleColorRole,
|
|
handleLootbox
|
|
} from "./effect.handlers";
|
|
import type { EffectHandler, ValidatedEffectPayload } from "./effect.types";
|
|
import { EffectPayloadSchema } from "./effect.types";
|
|
import { UserError } from "@shared/lib/errors";
|
|
import type { Transaction } from "@shared/lib/types";
|
|
|
|
export const effectHandlers: Record<string, EffectHandler> = {
|
|
'ADD_XP': handleAddXp,
|
|
'ADD_BALANCE': handleAddBalance,
|
|
'REPLY_MESSAGE': handleReplyMessage,
|
|
'XP_BOOST': handleXpBoost,
|
|
'TEMP_ROLE': handleTempRole,
|
|
'COLOR_ROLE': handleColorRole,
|
|
'LOOTBOX': handleLootbox
|
|
};
|
|
|
|
export async function validateAndExecuteEffect(
|
|
effect: unknown,
|
|
userId: string,
|
|
tx: Transaction
|
|
) {
|
|
const result = EffectPayloadSchema.safeParse(effect);
|
|
if (!result.success) {
|
|
throw new UserError(`Invalid effect configuration: ${result.error.message}`);
|
|
}
|
|
|
|
const handler = effectHandlers[result.data.type];
|
|
if (!handler) {
|
|
throw new UserError(`Unknown effect type: ${result.data.type}`);
|
|
}
|
|
|
|
return handler(userId, result.data, tx);
|
|
}
|