/* Imports */ import fs from "fs"; // import axios from "axios" import { GoogleSpreadsheet } from "google-spreadsheet"; import { getCookie, applyIfCookieExists } from "../utils/getCookies.js"; import toMarkdown from "../utils/toMarkdown.js"; import { calculateStars } from "../utils/stars.js"; import { hash } from "../utils/hash.js"; import { databaseUpsert } from "../database/database-wrapper.js"; /* Definitions */ const SHEET_ID = "1xcgYF7Q0D95TPHLLSgwhWBHFrWZUGJn7yTyAhDR4vi0"; // spreadsheet key is the long id in the sheets URL const endpoint = `https://docs.google.com/spreadsheets/d/${SHEET_ID}/edit#gid=0`; // https://docs.google.com/spreadsheets/d/1xcgYF7Q0D95TPHLLSgwhWBHFrWZUGJn7yTyAhDR4vi0/edit#gid=0 /* Support functions */ const formatRow = (row) => { let colNames = [ "Prediction Date", "Prediction", "Odds", "Actual", "Resolution Date", "Prediction Right?", "Brier Score", "Notes", ]; let result = {}; row.forEach((col, i) => { result[colNames[i]] = col; }); return result; }; async function fetchGoogleDoc(google_api_key) { // https://gist.github.com/micalevisk/9bc831bd4b3e5a3f62b9810330129c59 let results = []; const doc = new GoogleSpreadsheet(SHEET_ID); doc.useApiKey(google_api_key); await doc.loadInfo(); // loads document properties and worksheets console.log(">>", doc.title); const sheet = doc.sheetsByIndex[0]; const rows = await sheet.getRows({ offset: 0 }); console.log("# " + rows[0]._sheet.headerValues.join(",")); let isEnd = false; for (let i in rows) { let data = rows[i]._rawData; if (data.length == 0) isEnd = true; if (!isEnd) { let result = { ...formatRow(data), url: endpoint + `&range=A${Number(i) + 2}`, }; // +2: +1 for the header row, +1 for starting at 1 and not at 0. // console.log(result) results.push(result); // console.log(rows[i]) // console.log(rows[i]._rawData) // console.log(rows[i]["Prediction"]) } // console.log(row._rawData.join(',')) // console.log(row._rawData.join(',')) } // console.log(results) return results; } async function processPredictions(predictions) { let currentPredictions = predictions.filter( (prediction) => prediction["Actual"] == "Unknown" ); let results = currentPredictions.map((prediction) => { let title = prediction["Prediction"].replace(" [update]", ""); let id = `wildeford-${hash(title)}`; let probability = Number(prediction["Odds"].replace("%", "")) / 100; let options = [ { name: "Yes", probability: probability, type: "PROBABILITY", }, { name: "No", probability: 1 - probability, type: "PROBABILITY", }, ]; let result = { id: id, title: title, url: prediction["url"], platform: "Peter Wildeford", description: prediction["Notes"] || "", options: options, timestamp: new Date( Date.parse(prediction["Prediction Date"] + "Z") ).toISOString(), qualityindicators: { stars: calculateStars("Peter Wildeford"), }, }; return result; }); results = results.reverse(); let uniqueTitles = []; let uniqueResults = []; results.forEach((result) => { if (!uniqueTitles.includes(result.title)) uniqueResults.push(result); uniqueTitles.push(result.title); }); return uniqueResults; // console.log(results) // console.log(results.map(result => result.options)) // processPredictions() } /* Body */ export async function wildeford_inner(google_api_key) { let predictions = await fetchGoogleDoc(google_api_key); let results = await processPredictions(predictions); // somehow needed // console.log(results.sort((a,b) => (a.title > b.title))) // let string = JSON.stringify(results, null, 2) // fs.writeFileSync('polyprediction-questions.json', string); await databaseUpsert(results, "wildeford-questions"); console.log("Done"); } //example() export async function wildeford() { const GOOGLE_API_KEY = process.env.GOOGLE_API_KEY || getCookie("google-api"); // See: https://developers.google.com/sheets/api/guides/authorizing#APIKey await applyIfCookieExists(GOOGLE_API_KEY, wildeford_inner); }