From 0d1a7e12f88c5e20c8bc034e1a5c14b7d8196187 Mon Sep 17 00:00:00 2001 From: Oliver-Akins Date: Thu, 19 Jan 2023 12:47:22 -0600 Subject: [PATCH] Allow multiple word lists --- src/endpoints/new_game.ts | 19 +++++++++++++++---- src/schemas/config.ts | 8 ++++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/endpoints/new_game.ts b/src/endpoints/new_game.ts index 6879483..2d8c497 100644 --- a/src/endpoints/new_game.ts +++ b/src/endpoints/new_game.ts @@ -1,6 +1,8 @@ -import { database } from "$/main"; import { anonymizePhrase, convertToKey, spacePhrase } from "$/utils/game"; +import { config, database } from "$/main"; import { ServerRoute } from "@hapi/hapi"; +import { readFileSync } from "fs"; +import boom from "@hapi/boom"; import Joi from "joi"; const route: ServerRoute = { @@ -10,15 +12,24 @@ const route: ServerRoute = { params: Joi.object({ channel: Joi.string().alphanum(), }), + query: Joi.object({ + word_list: Joi.string(), + }), }, }, async handler(request) { const { channel } = request.params; + const { word_list } = request.query; let data = await database.getChannel(channel); - // TODO: Get the proper phrase - let phrase = "Hello world"; + + if (config.game.files[word_list] == null) { + throw boom.notAcceptable(`Invalid word list`); + }; + let phrases = readFileSync(config.game.files[word_list] as string, `utf-8`).split(`\n`); + let phrase = phrases[Math.floor(Math.random() * phrases.length)].trim(); + let spaced = spacePhrase(phrase.toUpperCase()); let anonymized = anonymizePhrase(spaced); @@ -27,7 +38,7 @@ const route: ServerRoute = { data.incorrect = 0; data.key = convertToKey(spaced); - return `${data.current} (incorrect: ${data.incorrect}/6)`; + return `${data.current} (incorrect: ${data.incorrect}/${config.game.max_incorrect})`; }, }; export default route; \ No newline at end of file diff --git a/src/schemas/config.ts b/src/schemas/config.ts index 15bb2a2..4f7deb6 100644 --- a/src/schemas/config.ts +++ b/src/schemas/config.ts @@ -1,6 +1,13 @@ import Joi from "joi"; +export const gameOptionsSchema = Joi.object({ + files: Joi.object().required().min(1).unknown(true), + max_incorrect: Joi.number().min(1).default(6), +}) +.meta({ className: `gameOptions` }) +.description(`The game-specific options`); + export const serverOptionsSchema = Joi.object({ port: Joi .number() @@ -25,6 +32,7 @@ export const databaseOptionsSchema = Joi.object({ export const configSchema = Joi.object({ server: serverOptionsSchema.required(), database: databaseOptionsSchema.required(), + game: gameOptionsSchema.required(), }) .meta({ className: `config` }) .description(`The configuration format for the server`); \ No newline at end of file