From 328d697873df72e349597fce9b0003bad4eef199 Mon Sep 17 00:00:00 2001 From: Hexugory Date: Thu, 30 Mar 2023 15:52:56 -0500 Subject: [PATCH] add guard against improperly structured json --- package-lock.json | 20 ++++++++++-- package.json | 3 +- src/characters.ts | 83 +++++++++++++++++++++++++++-------------------- 3 files changed, 67 insertions(+), 39 deletions(-) diff --git a/package-lock.json b/package-lock.json index d5d8128..6057c72 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,18 @@ { - "name": "notmudae", + "name": "2023collectabot", "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "notmudae", + "name": "2023collectabot", "version": "1.0.0", "license": "MIT", "dependencies": { "discord.js": "^14.8.0", "sequelize": "^6.30.0", - "sqlite3": "^5.1.6" + "sqlite3": "^5.1.6", + "zod": "^3.21.4" }, "devDependencies": { "@types/node": "^18.15.11", @@ -1600,6 +1601,14 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } }, "dependencies": { @@ -2770,6 +2779,11 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==" } } } diff --git a/package.json b/package.json index c8783d7..49dda7d 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "dependencies": { "discord.js": "^14.8.0", "sequelize": "^6.30.0", - "sqlite3": "^5.1.6" + "sqlite3": "^5.1.6", + "zod": "^3.21.4" } } diff --git a/src/characters.ts b/src/characters.ts index d858914..e7e1509 100644 --- a/src/characters.ts +++ b/src/characters.ts @@ -1,5 +1,6 @@ -import charactersJSON from './characters.json' import { Collection } from 'discord.js' +import charactersJSON from './characters.json'; +import { z } from 'zod' export enum Target { Self = "self", @@ -10,41 +11,53 @@ export enum Target { TrueRandomOpponent = "trueRandomOpponent" } -export interface PotencyStatus { - duration: number - potency: number -} +const TargetEnum = z.nativeEnum(Target); +type TargetEnum = z.infer; -interface Effect { - target: Target - accuracy?: number - damage?: number - heal?: number - poison?: number - regeneration?: number - burn?: number - confusion?: number - stun?: number - resistanceChange?: PotencyStatus - accuracyChange?: PotencyStatus - speedChange?: PotencyStatus - function?: string -} +const PotencyStatus = z.object({ + duration: z.number().int(), + potency: z.number().int() +}); +export type PotencyStatus = z.infer; -interface Skill { - name: string - accuracy?: number - effects: Effect[] -} +const Effect = z.object({ + target: TargetEnum, + accuracy: z.number().int(), + damage: z.optional(z.number().int()), + heal: z.optional(z.number().int()), + poison: z.optional(z.number().int()), + regeneration: z.optional(z.number().int()), + burn: z.optional(z.number().int()), + confusion: z.optional(z.number().int()), + stun: z.optional(z.number().int()), + resistanceChange: z.optional(z.number().int()), + accuracyChange: z.optional(z.number().int()), + speedChange: z.optional(z.number().int()), + function: z.string() +}); +type Effect = z.infer; -export interface Character { - id: number - name: string - nameShort: string - img: string - health: number - speed: number - skills: [Skill, Skill, Skill] -} +const Skill = z.object({ + name: z.string(), + accuracy: z.number().int(), + effects: z.array(Effect) +}); +type Skill = z.infer; -export const CHARACTERS: Collection = new Collection(charactersJSON.map((element, index) => {return [index, element as Character]})); \ No newline at end of file +const Character = z.object({ + id: z.number().int(), + name: z.string(), + nameShort: z.string(), + img: z.string(), + health: z.number().int(), + speed: z.number().int(), + skills: z.array(Skill) +}); +export type Character = z.infer; + +const CharacterJSON = z.array(Character); +type CharacterJSON = z.infer; + +export const CHARACTERS: Collection = (() => { + return new Collection(CharacterJSON.parse(charactersJSON).map((element, index) => {return [index, element]})); +})(); \ No newline at end of file