add guard against improperly structured json

This commit is contained in:
Hexugory 2023-03-30 15:52:56 -05:00
parent b7c8f011dc
commit 328d697873
3 changed files with 67 additions and 39 deletions

20
package-lock.json generated
View File

@ -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=="
}
}
}

View File

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

View File

@ -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<typeof TargetEnum>;
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<typeof PotencyStatus>;
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<typeof Effect>;
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<typeof Skill>;
export const CHARACTERS: Collection<number, Character> = new Collection(charactersJSON.map((element, index) => {return [index, element as Character]}));
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<typeof Character>;
const CharacterJSON = z.array(Character);
type CharacterJSON = z.infer<typeof CharacterJSON>;
export const CHARACTERS: Collection<number, Character> = (() => {
return new Collection(CharacterJSON.parse(charactersJSON).map((element, index) => {return [index, element]}));
})();