mirror of
https://github.com/aydenjahola/discord-multipurpose-bot.git
synced 2024-11-22 08:45:55 +00:00
trivia: implement logic that checks if the questions exists in the db already and if not then it fetches a new question
This commit is contained in:
parent
99dc71fc60
commit
3efa8eac1b
1 changed files with 37 additions and 9 deletions
|
@ -33,16 +33,13 @@ const fetchTriviaQuestion = async (categoryId, categoryName) => {
|
||||||
category: categoryName,
|
category: categoryName,
|
||||||
}).sort({ last_served: 1 });
|
}).sort({ last_served: 1 });
|
||||||
|
|
||||||
// If no old question or API call interval has passed
|
|
||||||
if (!triviaQuestion || Date.now() - LAST_API_CALL.time >= API_INTERVAL) {
|
if (!triviaQuestion || Date.now() - LAST_API_CALL.time >= API_INTERVAL) {
|
||||||
// Fetch a new question from the API
|
|
||||||
const response = await axios.get(
|
const response = await axios.get(
|
||||||
`https://opentdb.com/api.php?amount=1&category=${categoryId}`
|
`https://opentdb.com/api.php?amount=1&category=${categoryId}`
|
||||||
);
|
);
|
||||||
triviaQuestion = response.data.results[0];
|
triviaQuestion = response.data.results[0];
|
||||||
LAST_API_CALL.time = Date.now();
|
LAST_API_CALL.time = Date.now();
|
||||||
|
|
||||||
// Save the new question to the database
|
|
||||||
await TriviaQuestion.create({
|
await TriviaQuestion.create({
|
||||||
question: decode(triviaQuestion.question),
|
question: decode(triviaQuestion.question),
|
||||||
correct_answer: decode(triviaQuestion.correct_answer),
|
correct_answer: decode(triviaQuestion.correct_answer),
|
||||||
|
@ -51,14 +48,12 @@ const fetchTriviaQuestion = async (categoryId, categoryName) => {
|
||||||
last_served: null,
|
last_served: null,
|
||||||
});
|
});
|
||||||
|
|
||||||
// Fetch the newly created question
|
|
||||||
triviaQuestion = await TriviaQuestion.findOne({
|
triviaQuestion = await TriviaQuestion.findOne({
|
||||||
question: decode(triviaQuestion.question),
|
question: decode(triviaQuestion.question),
|
||||||
category: categoryName,
|
category: categoryName,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the last served timestamp
|
|
||||||
if (triviaQuestion) {
|
if (triviaQuestion) {
|
||||||
triviaQuestion.last_served = new Date();
|
triviaQuestion.last_served = new Date();
|
||||||
await triviaQuestion.save();
|
await triviaQuestion.save();
|
||||||
|
@ -71,6 +66,29 @@ const fetchTriviaQuestion = async (categoryId, categoryName) => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const getShuffledQuestions = async (categoryName) => {
|
||||||
|
try {
|
||||||
|
const questions = await TriviaQuestion.find({
|
||||||
|
category: categoryName,
|
||||||
|
}).sort({ last_served: 1 });
|
||||||
|
|
||||||
|
if (questions.length === 0) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
questions.forEach(async (question) => {
|
||||||
|
question.last_served = new Date();
|
||||||
|
await question.save();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Shuffle questions
|
||||||
|
return questions.sort(() => Math.random() - 0.5);
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error fetching or shuffling questions:", error);
|
||||||
|
throw new Error("Error fetching questions from database");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const createTriviaEmbed = (
|
const createTriviaEmbed = (
|
||||||
categoryName,
|
categoryName,
|
||||||
question,
|
question,
|
||||||
|
@ -224,10 +242,20 @@ module.exports = {
|
||||||
const categoryId = interaction.options.getString("category");
|
const categoryId = interaction.options.getString("category");
|
||||||
const categoryName = CATEGORY_MAP[categoryId] || "Video Games";
|
const categoryName = CATEGORY_MAP[categoryId] || "Video Games";
|
||||||
|
|
||||||
const triviaQuestion = await fetchTriviaQuestion(
|
let triviaQuestion = await fetchTriviaQuestion(categoryId, categoryName);
|
||||||
categoryId,
|
|
||||||
categoryName
|
if (!triviaQuestion) {
|
||||||
);
|
// If all questions have been served, fetch questions from the database
|
||||||
|
const shuffledQuestions = await getShuffledQuestions(categoryName);
|
||||||
|
if (shuffledQuestions.length === 0) {
|
||||||
|
throw new Error("No questions available for this category.");
|
||||||
|
}
|
||||||
|
|
||||||
|
triviaQuestion = shuffledQuestions[0];
|
||||||
|
triviaQuestion.last_served = new Date();
|
||||||
|
await triviaQuestion.save();
|
||||||
|
}
|
||||||
|
|
||||||
if (!triviaQuestion) throw new Error("Failed to fetch trivia question");
|
if (!triviaQuestion) throw new Error("Failed to fetch trivia question");
|
||||||
|
|
||||||
const question = decode(triviaQuestion.question);
|
const question = decode(triviaQuestion.question);
|
||||||
|
|
Loading…
Reference in a new issue