trivia: make tokens unique to users

This commit is contained in:
Ayden Jahola 2024-09-10 13:43:19 +01:00
parent 06a477adbb
commit 89a486065a
No known key found for this signature in database
GPG key ID: 71DD90AE4AE92742

View file

@ -4,13 +4,15 @@ const { decode } = require("html-entities");
const TriviaQuestion = require("../../models/TriviaQuestion"); const TriviaQuestion = require("../../models/TriviaQuestion");
const Leaderboard = require("../../models/Leaderboard"); const Leaderboard = require("../../models/Leaderboard");
// WARNING: this code is by means not perfect, and it might have questionable implementation but its still a good starting point and under development. feel free to suggest improvements. // WARNING: this code is by no means perfect, and it might have questionable implementation but it's still a good starting point and under development. Feel free to suggest improvements.
const API_INTERVAL = 5000; // 5 seconds const API_INTERVAL = 5000; // 5 seconds
const QUESTION_EXPIRY = 30 * 24 * 60 * 60 * 1000; // 1 month const QUESTION_EXPIRY = 30 * 24 * 60 * 60 * 1000; // 1 month
const ACTIVE_GAMES = new Set(); // Track users with ongoing trivia const ACTIVE_GAMES = new Set(); // Track users with ongoing trivia
const LAST_API_CALL = { time: 0 }; // Track last API call const LAST_API_CALL = { time: 0 }; // Track last API call
const USER_TOKENS = {}; // Track tokens for each user
const CATEGORY_MAP = { const CATEGORY_MAP = {
15: "Video Games", 15: "Video Games",
31: "Anime & Manga", 31: "Anime & Manga",
@ -36,13 +38,14 @@ const generateSessionToken = async () => {
return response.data.token; return response.data.token;
}; };
const fetchTriviaQuestion = async (categoryId, categoryName) => { const fetchTriviaQuestion = async (userId, categoryId, categoryName) => {
try { try {
let triviaQuestion; let triviaQuestion;
let source = "API"; // Default to API let source = "API"; // Default to API
// Generate a new session token // Get or generate a session token for the user
let sessionToken = await generateSessionToken(); let sessionToken = USER_TOKENS[userId] || (await generateSessionToken());
USER_TOKENS[userId] = sessionToken;
// Attempt to find a question in the database that hasn't been served recently // Attempt to find a question in the database that hasn't been served recently
triviaQuestion = await TriviaQuestion.findOne({ triviaQuestion = await TriviaQuestion.findOne({
@ -61,6 +64,7 @@ const fetchTriviaQuestion = async (categoryId, categoryName) => {
if (response.data.response_code === 3) { if (response.data.response_code === 3) {
// Token exhausted, generate a new one // Token exhausted, generate a new one
sessionToken = await generateSessionToken(); sessionToken = await generateSessionToken();
USER_TOKENS[userId] = sessionToken; // Update the user's token
// Retry fetching the question // Retry fetching the question
const retryResponse = await axios.get( const retryResponse = await axios.get(
`https://opentdb.com/api.php?amount=1&category=${categoryId}&token=${sessionToken}` `https://opentdb.com/api.php?amount=1&category=${categoryId}&token=${sessionToken}`
@ -303,6 +307,7 @@ module.exports = {
const categoryName = CATEGORY_MAP[categoryId] || "Video Games"; const categoryName = CATEGORY_MAP[categoryId] || "Video Games";
const { triviaQuestion, source } = await fetchTriviaQuestion( const { triviaQuestion, source } = await fetchTriviaQuestion(
userId,
categoryId, categoryId,
categoryName categoryName
); );