feat: add trivia category selection and sync trivia fixes

This commit is contained in:
syntaxbullet
2026-01-11 16:08:11 +01:00
parent 7d68652ea5
commit 3a620a84c5
3 changed files with 55 additions and 6 deletions

View File

@@ -5,13 +5,39 @@ import { getTriviaQuestionView } from "@/modules/trivia/trivia.view";
import { createErrorEmbed } from "@lib/embeds"; import { createErrorEmbed } from "@lib/embeds";
import { UserError } from "@/lib/errors"; import { UserError } from "@/lib/errors";
import { config } from "@shared/lib/config"; import { config } from "@shared/lib/config";
import { TriviaCategory } from "@shared/lib/constants";
export const trivia = createCommand({ export const trivia = createCommand({
data: new SlashCommandBuilder() data: new SlashCommandBuilder()
.setName("trivia") .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) => { execute: async (interaction) => {
try { try {
const categoryId = interaction.options.getString('category');
// Check if user can play BEFORE deferring // Check if user can play BEFORE deferring
const canPlay = await triviaService.canPlayTrivia(interaction.user.id); const canPlay = await triviaService.canPlayTrivia(interaction.user.id);
@@ -33,7 +59,8 @@ export const trivia = createCommand({
// Start trivia session (deducts entry fee) // Start trivia session (deducts entry fee)
const session = await triviaService.startTrivia( const session = await triviaService.startTrivia(
interaction.user.id, interaction.user.id,
interaction.user.username interaction.user.username,
categoryId ? parseInt(categoryId) : undefined
); );
// Generate Components v2 message // Generate Components v2 message

View File

@@ -66,3 +66,22 @@ export enum LootType {
XP = 'XP', XP = 'XP',
ITEM = 'ITEM', 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,
}

View File

@@ -144,7 +144,7 @@ class TriviaService {
/** /**
* Start a trivia session - deducts entry fee and creates session * Start a trivia session - deducts entry fee and creates session
*/ */
async startTrivia(userId: string, username: string): Promise<TriviaSession> { async startTrivia(userId: string, username: string, categoryId?: number): Promise<TriviaSession> {
// Check cooldown // Check cooldown
const cooldownCheck = await this.canPlayTrivia(userId); const cooldownCheck = await this.canPlayTrivia(userId);
if (!cooldownCheck.canPlay) { if (!cooldownCheck.canPlay) {
@@ -184,9 +184,12 @@ class TriviaService {
}); });
// Fetch question // Fetch question
const category = config.trivia.categories.length > 0 let category = categoryId;
if (!category) {
category = config.trivia.categories.length > 0
? config.trivia.categories[Math.floor(Math.random() * config.trivia.categories.length)] ? config.trivia.categories[Math.floor(Math.random() * config.trivia.categories.length)]
: undefined; : undefined;
}
const difficulty = config.trivia.difficulty; const difficulty = config.trivia.difficulty;
const question = await this.fetchQuestion(category, difficulty); const question = await this.fetchQuestion(category, difficulty);