diff --git a/bot/commands/economy/trivia.ts b/bot/commands/economy/trivia.ts index d1be097..f35a567 100644 --- a/bot/commands/economy/trivia.ts +++ b/bot/commands/economy/trivia.ts @@ -5,13 +5,39 @@ import { getTriviaQuestionView } from "@/modules/trivia/trivia.view"; import { createErrorEmbed } from "@lib/embeds"; import { UserError } from "@/lib/errors"; import { config } from "@shared/lib/config"; +import { TriviaCategory } from "@shared/lib/constants"; export const trivia = createCommand({ data: new SlashCommandBuilder() .setName("trivia") - .setDescription("Play trivia to win currency! Answer correctly within the time limit."), + .setDescription("Play trivia to win currency! Answer correctly within the time limit.") + .addStringOption(option => + option.setName('category') + .setDescription('Select a specific category') + .setRequired(false) + .addChoices( + { name: 'General Knowledge', value: String(TriviaCategory.GENERAL_KNOWLEDGE) }, + { name: 'Books', value: String(TriviaCategory.BOOKS) }, + { name: 'Film', value: String(TriviaCategory.FILM) }, + { name: 'Music', value: String(TriviaCategory.MUSIC) }, + { name: 'Video Games', value: String(TriviaCategory.VIDEO_GAMES) }, + { name: 'Science & Nature', value: String(TriviaCategory.SCIENCE_NATURE) }, + { name: 'Computers', value: String(TriviaCategory.COMPUTERS) }, + { name: 'Mathematics', value: String(TriviaCategory.MATHEMATICS) }, + { name: 'Mythology', value: String(TriviaCategory.MYTHOLOGY) }, + { name: 'Sports', value: String(TriviaCategory.SPORTS) }, + { name: 'Geography', value: String(TriviaCategory.GEOGRAPHY) }, + { name: 'History', value: String(TriviaCategory.HISTORY) }, + { name: 'Politics', value: String(TriviaCategory.POLITICS) }, + { name: 'Art', value: String(TriviaCategory.ART) }, + { name: 'Animals', value: String(TriviaCategory.ANIMALS) }, + { name: 'Anime & Manga', value: String(TriviaCategory.ANIME_MANGA) }, + ) + ), execute: async (interaction) => { try { + const categoryId = interaction.options.getString('category'); + // Check if user can play BEFORE deferring const canPlay = await triviaService.canPlayTrivia(interaction.user.id); @@ -33,7 +59,8 @@ export const trivia = createCommand({ // Start trivia session (deducts entry fee) const session = await triviaService.startTrivia( interaction.user.id, - interaction.user.username + interaction.user.username, + categoryId ? parseInt(categoryId) : undefined ); // Generate Components v2 message diff --git a/shared/lib/constants.ts b/shared/lib/constants.ts index 1df0de0..3d85bad 100644 --- a/shared/lib/constants.ts +++ b/shared/lib/constants.ts @@ -66,3 +66,22 @@ export enum LootType { XP = 'XP', ITEM = 'ITEM', } + +export enum TriviaCategory { + GENERAL_KNOWLEDGE = 9, + BOOKS = 10, + FILM = 11, + MUSIC = 12, + VIDEO_GAMES = 15, + SCIENCE_NATURE = 17, + COMPUTERS = 18, + MATHEMATICS = 19, + MYTHOLOGY = 20, + SPORTS = 21, + GEOGRAPHY = 22, + HISTORY = 23, + POLITICS = 24, + ART = 25, + ANIMALS = 27, + ANIME_MANGA = 31, +} diff --git a/shared/modules/trivia/trivia.service.ts b/shared/modules/trivia/trivia.service.ts index 7531777..6634ff9 100644 --- a/shared/modules/trivia/trivia.service.ts +++ b/shared/modules/trivia/trivia.service.ts @@ -144,7 +144,7 @@ class TriviaService { /** * Start a trivia session - deducts entry fee and creates session */ - async startTrivia(userId: string, username: string): Promise { + async startTrivia(userId: string, username: string, categoryId?: number): Promise { // Check cooldown const cooldownCheck = await this.canPlayTrivia(userId); if (!cooldownCheck.canPlay) { @@ -184,9 +184,12 @@ class TriviaService { }); // Fetch question - const category = config.trivia.categories.length > 0 - ? config.trivia.categories[Math.floor(Math.random() * config.trivia.categories.length)] - : undefined; + let category = categoryId; + if (!category) { + category = config.trivia.categories.length > 0 + ? config.trivia.categories[Math.floor(Math.random() * config.trivia.categories.length)] + : undefined; + } const difficulty = config.trivia.difficulty; const question = await this.fetchQuestion(category, difficulty);