opentdb-api
Version:
Easily retrive random trivia questions using the Open Trivia DB API.
144 lines (124 loc) • 5.16 kB
JavaScript
const axios = require('axios');
const methods = require('./methods.js');;
/**
* Retrieves random trivia from the Open Trivia DB
* @param {{amount: Number, difficulty: String, category: String, type: String, token: String}} options Options to get trivia questions with. amount: integer amount of questions to retrieve. difficulty: easy, medium, or hard. category: category of questions. type: multiple or boolean. token: session token to prevent duplicate trivia.
* @returns {Promise<JSON>}
*/
exports.getTrivia = async function (options = {}){
var amount = options.amount !== undefined ? options.amount : 1;
var difficulty = options.difficulty !== undefined ? options.difficulty : 'medium';
var category = options.category !== undefined ? options.category : 'any';
var type = options.type !== undefined ? options.type : 'multiple';
var token = options.token !== undefined ? options.token : '';
return new Promise(async (resolve, reject) => {
try{
const maxCategories = await axios.get('https://opentdb.com/api_category.php');
const cateID = methods.getTriviaCategoryID(category, maxCategories.data.trivia_categories[maxCategories.data.trivia_categories.length - 1].id);
const pamount = methods.getTriviaAmount(amount);
const ptype = methods.getTriviaType(type);
const pdifficulty = methods.getTriviaDifficulty(difficulty);
var finalParams = {
amount: pamount
}
if(cateID !== ''){
finalParams.category = cateID
}
if(pdifficulty !== ''){
finalParams.difficulty = pdifficulty
}
if(ptype !== ''){
finalParams.type = ptype
}
if(token !== ''){
finalParams.token = token
}
const result = await axios.get('https://opentdb.com/api.php', {
params: finalParams
});
if(result.data.response_code !== 0){
reject(new Error('Response code ' + result.data.response_code + ': ' + methods.getReponseError(result.data.response_code)));
}
else{
var filteredResult = JSON.parse(JSON.stringify(result.data.results)
.replace(/"/g, '\\"')
.replace(/'/g, "'")
.replace(/&/g, '&')
.replace(/´/g, '`')
.replace(/é/g, 'é')
.replace(/ó/g, 'ó')
.replace(/£/g, '£')
.replace(/á/g, 'á')
.replace(/Á/g, 'Á')
.replace(/ñ/g, 'ñ')
.replace(/”/g, '\\"')
.replace(/ö/g, 'ö')
);
resolve(filteredResult);
}
}
catch(err){
reject(err);
}
});
}
/**
* Retrieves a session token
* @returns {Promise<String>} Token
*/
exports.getToken = async function(){
return new Promise(async (resolve, reject) => {
try{
const result = await axios.get('https://opentdb.com/api_token.php?command=request');
if(result.data.response_code !== 0){
reject(new Error('Response code ' + result.data.response_code + ': ' + result.data.response_message));
}
else{
resolve(result.data.token);
}
}
catch(err){
reject(err);
}
})
}
/**
* Resets a session token
* @param {String} token Token to reset session for.
* @returns {Promise<Boolean>} Success
*/
exports.resetToken = async function(token){
const result = await axios.get(`https://opentdb.com/api_token.php?command=reset&token=${token}`)
if(result.data.response_code !== 0){
return false;
}
else{
return true;
}
}
/**
* Returns all categories along with their ID
* @returns {Promise<Object>}
*/
exports.getCategories = async function(){
const results = await axios.get('https://opentdb.com/api_category.php');
return results.data.trivia_categories;
}
/**
* Returns the total question account for a category
* @param {String} category Category to get count for.
* @returns {Promse<Object>}
*/
exports.getQuestionCount = function(category){
return new Promise(async (resolve, reject) => {
try{
const maxCategories = await axios.get('https://opentdb.com/api_category.php');
const cateID = methods.getTriviaCategoryID(category, maxCategories.data.trivia_categories[maxCategories.data.trivia_categories.length - 1].id);
const questionCount = await axios.get(`https://opentdb.com/api_count.php?category=${cateID}`);
resolve(questionCount.data.category_question_count);
}
catch(err){
reject(err);
}
});
}