/* Imports */ import axios from "axios"; import fs from "fs"; import toMarkdown from "../utils/toMarkdown.js"; import { calculateStars } from "../utils/stars.js"; import { databaseUpsert } from "../database/database-wrapper.js"; /* Definitions */ let jsonEndPoint = "https://www.metaculus.com/api2/questions/?page="; let now = new Date().toISOString(); let DEBUG_MODE = "off"; let SLEEP_TIME = 500; /* Support functions */ async function fetchMetaculusQuestions(next) { // Numbers about a given address: how many, how much, at what price, etc. let response = await axios({ url: next, method: "GET", headers: { "Content-Type": "application/json" }, }).then((res) => res.data); // console.log(response) return response; } function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } async function fetchMetaculusQuestionDescription(slug) { try { let response = await axios({ method: "get", url: "https://www.metaculus.com" + slug, }).then((response) => response.data); return response; } catch (error) { console.log(error); console.log( `We encountered some error when attempting to fetch a metaculus page. Trying again` ); await sleep(SLEEP_TIME); try { let response = await axios({ method: "get", url: "https://www.metaculus.com" + slug, }).then((response) => response.data); // console.log(response) return response; } catch (error) { console.log( `We encountered some error when attempting to fetch a metaculus page.` ); console.log("Error", error); throw "Giving up"; } } } /* Body */ export async function metaculus() { // let metaculusQuestionsInit = await fetchMetaculusQuestions(1) // let numQueries = Math.round(Number(metaculusQuestionsInit.count) / 20) // console.log(`Downloading... This might take a while. Total number of queries: ${numQueries}`) // for (let i = 4; i <= numQueries; i++) { // change numQueries to 10 if one want to just test let all_questions = []; let next = "https://www.metaculus.com/api2/questions/"; let i = 1; while (next) { if (i % 20 == 0) { console.log("Sleeping for 500ms"); await sleep(SLEEP_TIME); } console.log(`\nQuery #${i}`); let metaculusQuestions = await fetchMetaculusQuestions(next); let results = metaculusQuestions.results; let j = false; for (let result of results) { if (result.publish_time < now && now < result.resolve_time) { await sleep(SLEEP_TIME); let questionPage = await fetchMetaculusQuestionDescription( result.page_url ); if (!questionPage.includes("A public prediction by")) { // console.log(questionPage) let descriptionraw = questionPage.split( `