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", "version": "1.0.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "notmudae", "name": "2023collectabot",
"version": "1.0.0", "version": "1.0.0",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"discord.js": "^14.8.0", "discord.js": "^14.8.0",
"sequelize": "^6.30.0", "sequelize": "^6.30.0",
"sqlite3": "^5.1.6" "sqlite3": "^5.1.6",
"zod": "^3.21.4"
}, },
"devDependencies": { "devDependencies": {
"@types/node": "^18.15.11", "@types/node": "^18.15.11",
@ -1600,6 +1601,14 @@
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" "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": { "dependencies": {
@ -2770,6 +2779,11 @@
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" "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": { "dependencies": {
"discord.js": "^14.8.0", "discord.js": "^14.8.0",
"sequelize": "^6.30.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 { Collection } from 'discord.js'
import charactersJSON from './characters.json';
import { z } from 'zod'
export enum Target { export enum Target {
Self = "self", Self = "self",
@ -10,41 +11,53 @@ export enum Target {
TrueRandomOpponent = "trueRandomOpponent" TrueRandomOpponent = "trueRandomOpponent"
} }
export interface PotencyStatus { const TargetEnum = z.nativeEnum(Target);
duration: number type TargetEnum = z.infer<typeof TargetEnum>;
potency: number
}
interface Effect { const PotencyStatus = z.object({
target: Target duration: z.number().int(),
accuracy?: number potency: z.number().int()
damage?: number });
heal?: number export type PotencyStatus = z.infer<typeof PotencyStatus>;
poison?: number
regeneration?: number
burn?: number
confusion?: number
stun?: number
resistanceChange?: PotencyStatus
accuracyChange?: PotencyStatus
speedChange?: PotencyStatus
function?: string
}
interface Skill { const Effect = z.object({
name: string target: TargetEnum,
accuracy?: number accuracy: z.number().int(),
effects: Effect[] 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 { const Skill = z.object({
id: number name: z.string(),
name: string accuracy: z.number().int(),
nameShort: string effects: z.array(Effect)
img: string });
health: number type Skill = z.infer<typeof Skill>;
speed: number
skills: [Skill, Skill, 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]}));
})();