98 lines
2.8 KiB
TypeScript
98 lines
2.8 KiB
TypeScript
import axios from "axios";
|
|
import { JSDOM } from "jsdom";
|
|
|
|
import { average } from "../../utils";
|
|
import toMarkdown from "../utils/toMarkdown";
|
|
import { FetchedQuestion, Platform } from "./";
|
|
|
|
const platformName = "rootclaim";
|
|
const jsonEndpoint =
|
|
"https://live-rootclaim-backend.herokuapp.com/analysis/public-list?limit=1000&offset=0";
|
|
|
|
const fetchAllRootclaims = async () => {
|
|
console.log(`Fetching ${jsonEndpoint}`);
|
|
const response = await axios
|
|
.get(jsonEndpoint)
|
|
.then((response) => response.data);
|
|
|
|
const claims = response.result.main_page_stories;
|
|
if (typeof claims !== "object") {
|
|
throw new Error("Expected result.main_page_stories field in API response");
|
|
}
|
|
return claims;
|
|
};
|
|
|
|
const fetchDescription = async (url: string, isclaim: boolean) => {
|
|
console.log(`Fetching description for ${url}`);
|
|
const response = await axios.get(url).then((response) => response.data);
|
|
|
|
const { document } = new JSDOM(response).window;
|
|
const nextDataEl = document.querySelector("#__NEXT_DATA__");
|
|
if (!nextDataEl) {
|
|
throw new Error(`Couldn't find __NEXT_DATA__ for ${url}`);
|
|
}
|
|
|
|
const data = JSON.parse(nextDataEl.innerHTML);
|
|
const mainData = data?.props?.pageProps?.initialReduxState?.main;
|
|
const info = isclaim
|
|
? mainData?.claim?.background
|
|
: mainData?.analise?.background_info;
|
|
|
|
if (!info) {
|
|
throw new Error(`Couldn't find description for page ${url}`);
|
|
}
|
|
return info;
|
|
};
|
|
|
|
export const rootclaim: Platform = {
|
|
name: platformName,
|
|
label: "Rootclaim",
|
|
color: "#0d1624",
|
|
version: "v1",
|
|
async fetcher() {
|
|
const claims = await fetchAllRootclaims();
|
|
const results: FetchedQuestion[] = [];
|
|
|
|
for (const claim of claims) {
|
|
const id = `${platformName}-${claim.slug.toLowerCase()}`;
|
|
|
|
let options: FetchedQuestion["options"] = [];
|
|
for (let scenario of claim.scenarios) {
|
|
options.push({
|
|
name: toMarkdown(scenario.name || scenario.text)
|
|
.replace("\n", "")
|
|
.replace("'", "'"),
|
|
probability: scenario.net_prob / 100,
|
|
type: "PROBABILITY",
|
|
});
|
|
}
|
|
|
|
let claimUrlPath = claim.isclaim ? "claims" : "analysis";
|
|
const url = `https://www.rootclaim.com/${claimUrlPath}/${claim.slug}`;
|
|
|
|
const description = await fetchDescription(url, claim.isclaim);
|
|
|
|
let obj: FetchedQuestion = {
|
|
id,
|
|
title: toMarkdown(claim.question).replace("\n", ""),
|
|
url,
|
|
description: toMarkdown(description).replace("'", "'"),
|
|
options,
|
|
qualityindicators: {
|
|
numforecasts: 1,
|
|
},
|
|
};
|
|
results.push(obj);
|
|
}
|
|
return results;
|
|
},
|
|
calculateStars(data) {
|
|
let nuno = () => 4;
|
|
let eli = () => null;
|
|
let misha = () => null;
|
|
let starsDecimal = average([nuno() /*, eli(data), misha(data)*/]);
|
|
let starsInteger = Math.round(starsDecimal);
|
|
return starsInteger;
|
|
},
|
|
};
|